This adds back a python 2 version of setuptools but with all dependencies vendored (the upstream default..). To allow users to install Python 2 packages we no longer have in the repo etc which should help them transitioning. This also adds conflicts between py2/3 setuptools because of the esy_install rename. See #4993
105 lines
3.8 KiB
Diff
105 lines
3.8 KiB
Diff
--- setuptools-5.4.1/launcher.c.orig 2014-06-29 02:40:09.000000000 +0100
|
|
+++ setuptools-5.4.1/launcher.c 2014-10-19 13:37:21.272787900 +0100
|
|
@@ -104,9 +104,19 @@
|
|
}
|
|
|
|
|
|
-char *find_exe(char *exename, char *script) {
|
|
+int file_exists(char* path)
|
|
+{
|
|
+ DWORD attrib = GetFileAttributes(path);
|
|
+
|
|
+ if ((attrib == INVALID_FILE_ATTRIBUTES) || (attrib & FILE_ATTRIBUTE_DIRECTORY)) return 0;
|
|
+ return 1;
|
|
+}
|
|
+
|
|
+char *find_exe(char *exename, char *script, int search_in_path) {
|
|
char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
|
|
char path[_MAX_PATH], c, *result;
|
|
+ char *path_env, *path_env_start;
|
|
+ int maximum, needs_exe = 0;
|
|
|
|
/* convert slashes to backslashes for uniform search below */
|
|
result = exename;
|
|
@@ -116,6 +126,34 @@
|
|
if (drive[0] || dir[0]=='\\') {
|
|
return loadable_exe(exename); /* absolute path, use directly */
|
|
}
|
|
+
|
|
+ if (search_in_path) {
|
|
+ if (strstr(exename, ".exe") == NULL) needs_exe = 1;
|
|
+ char *path_env = getenv("PATH");
|
|
+ while (path_env != NULL) {
|
|
+ path_env_start = path_env;
|
|
+ path_env = strchr(path_env, ';');
|
|
+ maximum = _MAX_PATH - 2 - strlen(exename) - (needs_exe * strlen(".exe"));
|
|
+ if (path_env == NULL) {
|
|
+ strncpy(path, path_env_start, maximum);
|
|
+ }
|
|
+ else {
|
|
+ maximum = path_env - path_env_start < maximum ? path_env - path_env_start : maximum;
|
|
+ memcpy(path, path_env_start, maximum);
|
|
+ ++path_env;
|
|
+ }
|
|
+ path[maximum] = '\0';
|
|
+ strcat(path, "\\");
|
|
+ strcat(path, exename);
|
|
+ if (needs_exe) strcat(path, ".exe");
|
|
+ /* printf("Checking %s\n", path); */
|
|
+ if (file_exists(path)) {
|
|
+ /* printf("Found\n"); */
|
|
+ return loadable_exe(path);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
/* Use the script's parent directory, which should be the Python home
|
|
(This should only be used for bdist_wininst-installed scripts, because
|
|
easy_install-ed scripts use the absolute path to python[w].exe
|
|
@@ -206,7 +244,7 @@
|
|
// set-up control handler callback funciotn
|
|
SetConsoleCtrlHandler((PHANDLER_ROUTINE) control_handler, TRUE);
|
|
if (!CreateProcessA(NULL, commandline, NULL, NULL, TRUE, 0, NULL, NULL, &s_info, &p_info)) {
|
|
- fprintf(stderr, "failed to create process.\n");
|
|
+ fprintf(stderr, "failed to create process (%s).\n", commandline);
|
|
return 0;
|
|
}
|
|
child_pid = p_info.dwProcessId;
|
|
@@ -256,6 +294,9 @@
|
|
char *ptr, *end; /* working pointers for string manipulation */
|
|
char *cmdline;
|
|
int i, parsedargc; /* loop counter */
|
|
+ char *env, *first_space;
|
|
+ int skip = 2;
|
|
+ int search_in_path = 0;
|
|
|
|
/* compute script name from our .exe name*/
|
|
GetModuleFileNameA(NULL, script, sizeof(script));
|
|
@@ -284,12 +325,24 @@
|
|
strcpy(python, "#!python.exe");
|
|
}
|
|
|
|
- parsedargs = parse_argv(python+2, &parsedargc);
|
|
+ /* Check if "env" appears before the first space and skip
|
|
+ ahead to the next space. */
|
|
+ env = strstr(python+skip, "env");
|
|
+ first_space = strchr(python+skip, ' ');
|
|
+ if (env != NULL && (first_space == NULL || env < first_space)) {
|
|
+ search_in_path = 1;
|
|
+ env += 3;
|
|
+ while (*env && *env != ' ')
|
|
+ ++env;
|
|
+ skip = env - python;
|
|
+ }
|
|
+
|
|
+ parsedargs = parse_argv(python+skip, &parsedargc);
|
|
|
|
/* Using spawnv() can fail strangely if you e.g. find the Cygwin
|
|
Python, so we'll make sure Windows can find and load it */
|
|
|
|
- ptr = find_exe(parsedargs[0], script);
|
|
+ ptr = find_exe(parsedargs[0], script, search_in_path);
|
|
if (!ptr) {
|
|
return fail("Cannot find Python executable %s\n", parsedargs[0]);
|
|
}
|