Changeset b0b707b12891…
Parent d82692de648b…
by
Changes to 3 files · Browse files at b0b707b12891 Showing diff from parent d82692de648b Diff from another changeset...
@@ -18,7 +18,6 @@ std::string hgcmd = Quote(dir + "\\hgtk.exe") + " " + cmd;
std::string cwd;
- std::string filelist;
if (!myFolder.empty())
{
cwd = myFolder;
@@ -26,11 +25,27 @@ else if (!myFiles.empty())
{
cwd = IsDirectory(myFiles[0])? myFiles[0] : DirName(myFiles[0]);
- for( DWORD i = 0 ; i < myFiles.size() ; i++ )
+
+ std::string tempfile = GetTemporaryFile();
+ SECURITY_ATTRIBUTES sa;
+ memset(&sa, 0, sizeof(sa));
+ sa.nLength = sizeof(sa);
+ sa.bInheritHandle = TRUE;
+
+ TDEBUG_TRACE("DoHgProc: temp file = " << tempfile);
+ HANDLE tempfileHandle = CreateFileA(tempfile.c_str(), GENERIC_WRITE,
+ FILE_SHARE_READ, &sa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
+
+ for (int i=0; i<myFiles.size(); i++)
{
- filelist += myFiles[i];
- filelist += "\n";
+ DWORD dwWritten;
+ TDEBUG_TRACE("DoHgProc: temp file adding " << myFiles[i]);
+ WriteFile(tempfileHandle, myFiles[i].c_str(),
+ static_cast<DWORD>(myFiles[i].size()), &dwWritten, 0);
+ WriteFile(tempfileHandle, "\n", 1, &dwWritten, 0);
}
+ CloseHandle(tempfileHandle);
+ hgcmd += " --listfile " + Quote(tempfile);
}
else
{
@@ -38,13 +53,7 @@ return;
}
- if ( !filelist.empty() )
- {
- TDEBUG_TRACE("filelist: " << filelist);
- hgcmd += " --listfile -";
- }
-
- LaunchCommand(hgcmd, cwd, filelist);
+ LaunchCommand(hgcmd, cwd);
}
STDMETHODIMP
|
@@ -91,40 +91,14 @@ // Note: if the command is a batch file and the [full] path to the
// batch contains spaces, the path must be double-quoted.
// (see http://www.encocoservices.com/createprocess.html)
-bool LaunchCommand(const std::string& command, const std::string& cwd, const std::string& filelist)
+bool LaunchCommand(const std::string& command, const std::string& cwd)
{
TDEBUG_TRACE("LaunchCommand: " << command);
PROCESS_INFORMATION processInfo;
memset(&processInfo, 0, sizeof(processInfo));
- HANDLE hChildStd_IN_Rd = NULL;
- HANDLE hChildStd_IN_Wr = NULL;
-
- SECURITY_ATTRIBUTES saAttr;
- // Set the bInheritHandle flag so pipe handles are inherited.
- saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
- saAttr.bInheritHandle = TRUE;
- saAttr.lpSecurityDescriptor = NULL;
-
- // Create a pipe for the child process's STDIN.
- if (!CreatePipe(&hChildStd_IN_Rd, &hChildStd_IN_Wr, &saAttr, 0))
- {
- TDEBUG_TRACE("LaunchCommand: unable to create stdin pipe");
- return false;
- }
-
- // Ensure the write handle to the pipe for STDIN is not inherited.
- if (!SetHandleInformation(hChildStd_IN_Wr, HANDLE_FLAG_INHERIT, 0) )
- {
- TDEBUG_TRACE("LaunchCommand: unable to clear stdin write handle");
- return false;
- }
-
STARTUPINFOA startupInfo;
memset(&startupInfo, 0, sizeof(startupInfo));
- startupInfo.cb = sizeof(startupInfo);
- startupInfo.hStdInput = hChildStd_IN_Rd;
- startupInfo.dwFlags |= STARTF_USESTDHANDLES;
int res = CreateProcessA(NULL, // No module name, use command line
const_cast<char*>(command.c_str()),
@@ -142,17 +116,6 @@ return false;
}
- if( !filelist.empty() )
- {
- DWORD dwWritten;
- WriteFile(hChildStd_IN_Wr, filelist.c_str(), filelist.size(), &dwWritten, NULL);
- }
-
- if ( !CloseHandle(hChildStd_IN_Wr) )
- {
- TDEBUG_TRACE("LaunchCommand: Unable to close process stdin");
- }
-
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
return true;
|
@@ -31,7 +31,7 @@ bool IsDirectory(const std::string&);
std::string DirName(const std::string&);
std::string BaseName(const std::string&);
-bool LaunchCommand(const std::string& command, const std::string& cwd, const std::string& filelist);
+bool LaunchCommand(const std::string& command, const std::string& cwd);
HICON GetTortoiseIcon(const std::string & iconname);
std::string GetHgRepoRoot(const std::string& path);
bool IsHgRepo(const std::string& path);
|
Loading...