From: Alexey Borzenkov Date: Mon, 9 Apr 2012 19:39:59 +0000 (-0400) Subject: cmd/dist: don't fail when Mercurial is a batch file on Windows X-Git-Tag: go1.1rc2~3418 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=0669261af107eddb13d71293d654b595417f8053;p=gostls13.git cmd/dist: don't fail when Mercurial is a batch file on Windows On windows Mercurial installed with easy_install typically creates an hg.bat batch file in Python Scripts directory, which cannot be used with CreateProcess unless full path is specified. Work around by launching hg via cmd.exe /c. Additionally, fix a rare FormatMessageW crash. Fixes #3093. R=golang-dev, rsc, alex.brainman, aram, jdpoirier, mattn.jp CC=golang-dev https://golang.org/cl/5937043 --- diff --git a/src/cmd/dist/windows.c b/src/cmd/dist/windows.c index 557e4b0031..0caee73f53 100644 --- a/src/cmd/dist/windows.c +++ b/src/cmd/dist/windows.c @@ -115,7 +115,7 @@ errstr(void) binit(&b); code = GetLastError(); r = nil; - FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, + FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, nil, code, 0, (Rune*)&r, 0, nil); toutf(&b, r); return bstr(&b); // leak but we're dying anyway @@ -285,9 +285,11 @@ genrun(Buf *b, char *dir, int mode, Vec *argv, int wait) binit(&cmd); for(i=0; ilen; i++) { + q = argv->p[i]; + if(i == 0 && streq(q, "hg")) + bwritestr(&cmd, "cmd.exe /c "); if(i > 0) bwritestr(&cmd, " "); - q = argv->p[i]; if(contains(q, " ") || contains(q, "\t") || contains(q, "\"") || contains(q, "\\\\") || hassuffix(q, "\\")) { bwritestr(&cmd, "\""); nslash = 0;