Mercurial > hg
annotate mercurial/exewrapper.c @ 28238:b57d45ec33b2
test: update test-bundle2-format.t comment
Now that bundle2 is used by default for all exchanges, this comment is obviously
out of date. Having deep testing of the API and expected behavior of the format
and its processing is still valuable, so the comment is updated.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Thu, 25 Feb 2016 10:34:31 +0100 |
parents | 640b807dcce0 |
children | 210bb28ca4fb |
rev | line source |
---|---|
17058
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
1 /* |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
2 exewrapper.c - wrapper for calling a python script on Windows |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
3 |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
4 Copyright 2012 Adrian Buehlmann <adrian@cadifra.com> and others |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
5 |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
6 This software may be used and distributed according to the terms of the |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
7 GNU General Public License version 2 or any later version. |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
8 */ |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
9 |
17732
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
10 #include <stdio.h> |
17058
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
11 #include <windows.h> |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
12 |
17732
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
13 #include "hgpythonlib.h" |
17058
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
14 |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
15 #ifdef __GNUC__ |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
16 int strcat_s(char *d, size_t n, const char *s) |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
17 { |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
18 return !strncat(d, s, n); |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
19 } |
17732
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
20 int strcpy_s(char *d, size_t n, const char *s) |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
21 { |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
22 return !strncpy(d, s, n); |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
23 } |
17058
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
24 #endif |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
25 |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
26 |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
27 static char pyscript[MAX_PATH + 10]; |
17732
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
28 static char pyhome[MAX_PATH + 10]; |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
29 static char envpyhome[MAX_PATH + 10]; |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
30 static char pydllfile[MAX_PATH + 10]; |
17058
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
31 |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
32 int main(int argc, char *argv[]) |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
33 { |
17732
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
34 char *p; |
17058
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
35 int ret; |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
36 int i; |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
37 int n; |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
38 char **pyargv; |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
39 WIN32_FIND_DATA fdata; |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
40 HANDLE hfind; |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
41 const char *err; |
17732
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
42 HMODULE pydll; |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
43 void (__cdecl *Py_SetPythonHome)(char *home); |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
44 int (__cdecl *Py_Main)(int argc, char *argv[]); |
17058
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
45 |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
46 if (GetModuleFileName(NULL, pyscript, sizeof(pyscript)) == 0) |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
47 { |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
48 err = "GetModuleFileName failed"; |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
49 goto bail; |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
50 } |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
51 |
17732
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
52 p = strrchr(pyscript, '.'); |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
53 if (p == NULL) { |
17058
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
54 err = "malformed module filename"; |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
55 goto bail; |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
56 } |
17732
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
57 *p = 0; /* cut trailing ".exe" */ |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
58 strcpy_s(pyhome, sizeof(pyhome), pyscript); |
17058
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
59 |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
60 hfind = FindFirstFile(pyscript, &fdata); |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
61 if (hfind != INVALID_HANDLE_VALUE) { |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
62 /* pyscript exists, close handle */ |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
63 FindClose(hfind); |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
64 } else { |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
65 /* file pyscript isn't there, take <pyscript>exe.py */ |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
66 strcat_s(pyscript, sizeof(pyscript), "exe.py"); |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
67 } |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
68 |
17732
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
69 pydll = NULL; |
26664
640b807dcce0
exewrapper: add comments about PYTHONHOME
Adrian Buehlmann <adrian@cadifra.com>
parents:
26663
diff
changeset
|
70 /* |
640b807dcce0
exewrapper: add comments about PYTHONHOME
Adrian Buehlmann <adrian@cadifra.com>
parents:
26663
diff
changeset
|
71 We first check, that environment variable PYTHONHOME is *not* set. |
640b807dcce0
exewrapper: add comments about PYTHONHOME
Adrian Buehlmann <adrian@cadifra.com>
parents:
26663
diff
changeset
|
72 This just mimicks the behavior of the regular python.exe, which uses |
640b807dcce0
exewrapper: add comments about PYTHONHOME
Adrian Buehlmann <adrian@cadifra.com>
parents:
26663
diff
changeset
|
73 PYTHONHOME to find its installation directory (if it has been set). |
640b807dcce0
exewrapper: add comments about PYTHONHOME
Adrian Buehlmann <adrian@cadifra.com>
parents:
26663
diff
changeset
|
74 Note: Users of HackableMercurial are expected to *not* set PYTHONHOME! |
640b807dcce0
exewrapper: add comments about PYTHONHOME
Adrian Buehlmann <adrian@cadifra.com>
parents:
26663
diff
changeset
|
75 */ |
17732
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
76 if (GetEnvironmentVariable("PYTHONHOME", envpyhome, |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
77 sizeof(envpyhome)) == 0) |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
78 { |
26664
640b807dcce0
exewrapper: add comments about PYTHONHOME
Adrian Buehlmann <adrian@cadifra.com>
parents:
26663
diff
changeset
|
79 /* |
640b807dcce0
exewrapper: add comments about PYTHONHOME
Adrian Buehlmann <adrian@cadifra.com>
parents:
26663
diff
changeset
|
80 Environment var PYTHONHOME is *not* set. Let's see if we are |
640b807dcce0
exewrapper: add comments about PYTHONHOME
Adrian Buehlmann <adrian@cadifra.com>
parents:
26663
diff
changeset
|
81 running inside a HackableMercurial. |
640b807dcce0
exewrapper: add comments about PYTHONHOME
Adrian Buehlmann <adrian@cadifra.com>
parents:
26663
diff
changeset
|
82 */ |
17732
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
83 |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
84 p = strrchr(pyhome, '\\'); |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
85 if (p == NULL) { |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
86 err = "can't find backslash in module filename"; |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
87 goto bail; |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
88 } |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
89 *p = 0; /* cut at directory */ |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
90 |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
91 /* check for private Python of HackableMercurial */ |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
92 strcat_s(pyhome, sizeof(pyhome), "\\hg-python"); |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
93 |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
94 hfind = FindFirstFile(pyhome, &fdata); |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
95 if (hfind != INVALID_HANDLE_VALUE) { |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
96 /* path pyhome exists, let's use it */ |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
97 FindClose(hfind); |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
98 strcpy_s(pydllfile, sizeof(pydllfile), pyhome); |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
99 strcat_s(pydllfile, sizeof(pydllfile), "\\" HGPYTHONLIB); |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
100 pydll = LoadLibrary(pydllfile); |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
101 if (pydll == NULL) { |
26663
fa6858be3c61
exewrapper: report name of failed private DLL in error message
Adrian Buehlmann <adrian@cadifra.com>
parents:
26662
diff
changeset
|
102 err = "failed to load private Python DLL " |
fa6858be3c61
exewrapper: report name of failed private DLL in error message
Adrian Buehlmann <adrian@cadifra.com>
parents:
26662
diff
changeset
|
103 HGPYTHONLIB ".dll"; |
17732
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
104 goto bail; |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
105 } |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
106 Py_SetPythonHome = (void*)GetProcAddress(pydll, |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
107 "Py_SetPythonHome"); |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
108 if (Py_SetPythonHome == NULL) { |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
109 err = "failed to get Py_SetPythonHome"; |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
110 goto bail; |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
111 } |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
112 Py_SetPythonHome(pyhome); |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
113 } |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
114 } |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
115 |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
116 if (pydll == NULL) { |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
117 pydll = LoadLibrary(HGPYTHONLIB); |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
118 if (pydll == NULL) { |
26662
d215def59c3b
exewrapper: report name of failed DLL in error message
Adrian Buehlmann <adrian@cadifra.com>
parents:
17732
diff
changeset
|
119 err = "failed to load Python DLL " HGPYTHONLIB ".dll"; |
17732
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
120 goto bail; |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
121 } |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
122 } |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
123 |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
124 Py_Main = (void*)GetProcAddress(pydll, "Py_Main"); |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
125 if (Py_Main == NULL) { |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
126 err = "failed to get Py_Main"; |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
127 goto bail; |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
128 } |
93d97a212559
exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents:
17063
diff
changeset
|
129 |
17058
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
130 /* |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
131 Only add the pyscript to the args, if it's not already there. It may |
17063
3fbc6e3abdbd
exewrapper: use generic term script
Adrian Buehlmann <adrian@cadifra.com>
parents:
17058
diff
changeset
|
132 already be there, if the script spawned a child process of itself, in |
17058
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
133 the same way as it got called, that is, with the pyscript already in |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
134 place. So we optionally accept the pyscript as the first argument |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
135 (argv[1]), letting our exe taking the role of the python interpreter. |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
136 */ |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
137 if (argc >= 2 && strcmp(argv[1], pyscript) == 0) { |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
138 /* |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
139 pyscript is already in the args, so there is no need to copy |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
140 the args and we can directly call the python interpreter with |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
141 the original args. |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
142 */ |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
143 return Py_Main(argc, argv); |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
144 } |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
145 |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
146 /* |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
147 Start assembling the args for the Python interpreter call. We put the |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
148 name of our exe (argv[0]) in the position where the python.exe |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
149 canonically is, and insert the pyscript next. |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
150 */ |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
151 pyargv = malloc((argc + 5) * sizeof(char*)); |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
152 if (pyargv == NULL) { |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
153 err = "not enough memory"; |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
154 goto bail; |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
155 } |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
156 n = 0; |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
157 pyargv[n++] = argv[0]; |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
158 pyargv[n++] = pyscript; |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
159 |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
160 /* copy remaining args from the command line */ |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
161 for (i = 1; i < argc; i++) |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
162 pyargv[n++] = argv[i]; |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
163 /* argv[argc] is guaranteed to be NULL, so we forward that guarantee */ |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
164 pyargv[n] = NULL; |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
165 |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
166 ret = Py_Main(n, pyargv); /* The Python interpreter call */ |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
167 |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
168 free(pyargv); |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
169 return ret; |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
170 |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
171 bail: |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
172 fprintf(stderr, "abort: %s\n", err); |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
173 return 255; |
d5422faf648c
exewrapper: adding new exewrapper.c
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff
changeset
|
174 } |