To: vim_dev@googlegroups.com Subject: Patch 8.1.0534 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.0534 Problem: MS-Windows installer uses different $HOME than Vim. Solution: Use the Vim logic also in the MS-Windows installer. (Ken Takata, closes #3564) Files: src/dosinst.c, src/misc1.c *** ../vim-8.1.0533/src/dosinst.c 2018-10-13 17:25:24.112718312 +0200 --- src/dosinst.c 2018-11-16 19:39:24.551085683 +0100 *************** *** 115,128 **** vimfiles_dir_vim, vimfiles_dir_home }; ! static char *(vimfiles_dir_choices[]) = { "\nCreate plugin directories:", "No", "In the VIM directory", "In your HOME directory", }; - static int vimfiles_dir_choice; /* non-zero when selected to install the popup menu entry. */ static int install_popup = 0; --- 115,127 ---- vimfiles_dir_vim, vimfiles_dir_home }; ! static char *(vimfiles_dir_choices[]) = { "\nCreate plugin directories:", "No", "In the VIM directory", "In your HOME directory", }; /* non-zero when selected to install the popup menu entry. */ static int install_popup = 0; *************** *** 741,747 **** choices[choice_count].installfunc = NULL; choices[choice_count].active = 0; choices[choice_count].changefunc = NULL; ! choices[choice_count].installfunc = NULL; ++choice_count; } --- 740,747 ---- choices[choice_count].installfunc = NULL; choices[choice_count].active = 0; choices[choice_count].changefunc = NULL; ! choices[choice_count].text = NULL; ! choices[choice_count].arg = 0; ++choice_count; } *************** *** 2089,2094 **** --- 2089,2096 ---- static void set_directories_text(int idx) { + int vimfiles_dir_choice = choices[idx].arg; + if (vimfiles_dir_choice == (int)vimfiles_dir_none) alloc_text(idx, "Do NOT create plugin directories%s", ""); else *************** *** 2097,2102 **** --- 2099,2189 ---- } /* + * To get the "real" home directory: + * - get value of $HOME + * - if not found, get value of $HOMEDRIVE$HOMEPATH + * - if not found, get value of $USERPROFILE + * + * This code is based on init_homedir() in misc1.c, keep in sync! + */ + static char *homedir = NULL; + + void + init_homedir(void) + { + char *var; + char buf[MAX_PATH]; + + if (homedir != NULL) + { + free(homedir); + homedir = NULL; + } + + var = getenv("HOME"); + + /* + * Typically, $HOME is not defined on Windows, unless the user has + * specifically defined it for Vim's sake. However, on Windows NT + * platforms, $HOMEDRIVE and $HOMEPATH are automatically defined for + * each user. Try constructing $HOME from these. + */ + if (var == NULL || *var == NUL) + { + char *homedrive, *homepath; + + homedrive = getenv("HOMEDRIVE"); + homepath = getenv("HOMEPATH"); + if (homepath == NULL || *homepath == NUL) + homepath = "\\"; + if (homedrive != NULL + && strlen(homedrive) + strlen(homepath) < MAX_PATH) + { + sprintf(buf, "%s%s", homedrive, homepath); + if (buf[0] != NUL) + var = buf; + } + } + + if (var == NULL) + var = getenv("USERPROFILE"); + + /* + * Weird but true: $HOME may contain an indirect reference to another + * variable, esp. "%USERPROFILE%". Happens when $USERPROFILE isn't set + * when $HOME is being set. + */ + if (var != NULL && *var == '%') + { + char *p; + char *exp; + + p = strchr(var + 1, '%'); + if (p != NULL) + { + strncpy(buf, var + 1, p - (var + 1)); + buf[p - (var + 1)] = NUL; + exp = getenv(buf); + if (exp != NULL && *exp != NUL + && strlen(exp) + strlen(p) < MAX_PATH) + { + _snprintf(buf, MAX_PATH, "%s%s", exp, p + 1); + buf[MAX_PATH - 1] = NUL; + var = buf; + } + } + } + + if (var != NULL && *var == NUL) // empty is same as not set + var = NULL; + + if (var == NULL) + homedir = NULL; + else + homedir = _strdup(var); + } + + /* * Change the directory that the vim plugin directories will be created in: * $HOME, $VIM or nowhere. */ *************** *** 2106,2114 **** int choice_count = TABLE_SIZE(vimfiles_dir_choices); /* Don't offer the $HOME choice if $HOME isn't set. */ ! if (getenv("HOME") == NULL) --choice_count; ! vimfiles_dir_choice = get_choice(vimfiles_dir_choices, choice_count); set_directories_text(idx); } --- 2193,2201 ---- int choice_count = TABLE_SIZE(vimfiles_dir_choices); /* Don't offer the $HOME choice if $HOME isn't set. */ ! if (homedir == NULL) --choice_count; ! choices[idx].arg = get_choice(vimfiles_dir_choices, choice_count); set_directories_text(idx); } *************** *** 2120,2125 **** --- 2207,2213 ---- install_vimfilesdir(int idx) { int i; + int vimfiles_dir_choice = choices[idx].arg; char *p; char vimdir_path[BUFSIZE]; char vimfiles_path[BUFSIZE]; *************** *** 2144,2151 **** } case vimfiles_dir_home: { ! /* Find the $HOME directory. Its existence was already checked. */ ! p = getenv("HOME"); if (p == NULL) { printf("Internal error: $HOME is NULL\n"); --- 2232,2239 ---- } case vimfiles_dir_home: { ! // Find the $HOME directory. Its existence was already checked. ! p = homedir; if (p == NULL) { printf("Internal error: $HOME is NULL\n"); *************** *** 2156,2162 **** } case vimfiles_dir_none: { ! /* Do not create vim plugin directory */ return; } } --- 2244,2250 ---- } case vimfiles_dir_none: { ! // Do not create vim plugin directory. return; } } *************** *** 2185,2198 **** struct stat st; char tmp_dirname[BUFSIZE]; char *p; choices[choice_count].text = alloc(150); choices[choice_count].changefunc = change_directories_choice; choices[choice_count].installfunc = install_vimfilesdir; choices[choice_count].active = 1; ! /* Check if the "compiler" directory already exists. That's a good ! * indication that the plugin directories were already created. */ if (getenv("HOME") != NULL) { vimfiles_dir_choice = (int)vimfiles_dir_home; --- 2273,2287 ---- struct stat st; char tmp_dirname[BUFSIZE]; char *p; + int vimfiles_dir_choice; choices[choice_count].text = alloc(150); choices[choice_count].changefunc = change_directories_choice; choices[choice_count].installfunc = install_vimfilesdir; choices[choice_count].active = 1; ! // Check if the "compiler" directory already exists. That's a good ! // indication that the plugin directories were already created. if (getenv("HOME") != NULL) { vimfiles_dir_choice = (int)vimfiles_dir_home; *************** *** 2204,2210 **** { vimfiles_dir_choice = (int)vimfiles_dir_vim; p = getenv("VIM"); ! if (p == NULL) /* No $VIM in path, use the install dir */ dir_remove_last(installdir, tmp_dirname); else strcpy(tmp_dirname, p); --- 2293,2299 ---- { vimfiles_dir_choice = (int)vimfiles_dir_vim; p = getenv("VIM"); ! if (p == NULL) // No $VIM in path, use the install dir. dir_remove_last(installdir, tmp_dirname); else strcpy(tmp_dirname, p); *************** *** 2213,2218 **** --- 2302,2308 ---- vimfiles_dir_choice = (int)vimfiles_dir_none; } + choices[choice_count].arg = vimfiles_dir_choice; set_directories_text(choice_count); ++choice_count; } *************** *** 2369,2374 **** --- 2459,2466 ---- } else if (strcmp(argv[i], "-create-directories") == 0) { + int vimfiles_dir_choice; + init_directories_choice(); if (argv[i + 1][0] != '-') { *************** *** 2377,2384 **** vimfiles_dir_choice = (int)vimfiles_dir_vim; else if (strcmp(argv[i], "home") == 0) { ! if (getenv("HOME") == NULL) /* No $HOME in environment */ ! vimfiles_dir_choice = (int)vimfiles_dir_vim; else vimfiles_dir_choice = (int)vimfiles_dir_home; } --- 2469,2476 ---- vimfiles_dir_choice = (int)vimfiles_dir_vim; else if (strcmp(argv[i], "home") == 0) { ! if (homedir == NULL) // No $HOME in environment ! vimfiles_dir_choice = (int)vimfiles_dir_none; else vimfiles_dir_choice = (int)vimfiles_dir_home; } *************** *** 2391,2396 **** --- 2483,2489 ---- } else /* No choice specified, default to vim directory */ vimfiles_dir_choice = (int)vimfiles_dir_vim; + choices[choice_count - 1].arg = vimfiles_dir_choice; } else if (strcmp(argv[i], "-register-OLE") == 0) { *************** *** 2589,2594 **** --- 2682,2688 ---- /* Initialize this program. */ do_inits(argv); + init_homedir(); if (argc > 1 && strcmp(argv[1], "-uninstall-check") == 0) { *** ../vim-8.1.0533/src/misc1.c 2018-10-07 23:16:33.138616197 +0200 --- src/misc1.c 2018-11-16 19:37:57.095655169 +0100 *************** *** 3905,3910 **** --- 3905,3912 ---- * - do mch_dirname() to get the real name of that directory. * This also works with mounts and links. * Don't do this for MS-DOS, it will change the "current dir" for a drive. + * For Windows: + * This code is duplicated in init_homedir() in dosinst.c. Keep in sync! */ static char_u *homedir = NULL; *** ../vim-8.1.0533/src/version.c 2018-11-16 18:50:13.346534543 +0100 --- src/version.c 2018-11-16 19:33:13.893507996 +0100 *************** *** 794,795 **** --- 794,797 ---- { /* Add new patch number below this line */ + /**/ + 534, /**/ -- Two cows are standing together in a field. One asks the other: "So what do you think about this Mad Cow Disease?" The other replies: "That doesn't concern me. I'm a helicopter." /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///