Add a Windows-specific fallback to getenv("HOME");

This fixes msysGit issue 482 properly.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This commit is contained in:
Johannes Schindelin
2010-06-02 00:41:33 +02:00
committed by Stepan Kasal
parent 4620246f73
commit 8dfd8dc634
5 changed files with 51 additions and 3 deletions

View File

@@ -1969,6 +1969,23 @@ pid_t waitpid(pid_t pid, int *status, int options)
return -1;
}
const char *get_windows_home_directory(void)
{
static const char *home_directory = NULL;
struct strbuf buf = STRBUF_INIT;
if (home_directory)
return home_directory;
home_directory = getenv("HOME");
if (home_directory && *home_directory)
return home_directory;
strbuf_addf(&buf, "%s/%s", getenv("HOMEDRIVE"), getenv("HOMEPATH"));
home_directory = strbuf_detach(&buf, NULL);
return home_directory;
}
int xutftowcsn(wchar_t *wcs, const char *utfs, size_t wcslen, int utflen)
{
int upos = 0, wpos = 0;
@@ -2158,3 +2175,27 @@ void mingw_startup()
/* initialize Unicode console */
winansi_init();
}
int mingw_offset_1st_component(const char *path)
{
int offset = 0;
if (has_dos_drive_prefix(path))
offset = 2;
/* unc paths */
else if (is_dir_sep(path[0]) && is_dir_sep(path[1])) {
/* skip server name */
char *pos = strpbrk(path + 2, "\\/");
if (!pos)
return 0; /* Error: malformed unc path */
do {
pos++;
} while (*pos && !is_dir_sep(*pos));
offset = pos - path;
}
return offset + is_dir_sep(path[offset]);
}

View File

@@ -487,3 +487,6 @@ static int mingw_main(c,v)
* Used by Pthread API implementation for Windows
*/
extern int err_win_to_posix(DWORD winerr);
extern const char *get_windows_home_directory();
#define get_home_directory() get_windows_home_directory()

View File

@@ -727,4 +727,8 @@ struct tm *git_gmtime_r(const time_t *, struct tm *);
#define mark_as_git_dir(x) /* noop */
#endif
#ifndef get_home_directory
#define get_home_directory() getenv("HOME")
#endif
#endif

4
path.c
View File

@@ -133,7 +133,7 @@ char *git_path(const char *fmt, ...)
void home_config_paths(char **global, char **xdg, char *file)
{
char *xdg_home = getenv("XDG_CONFIG_HOME");
char *home = getenv("HOME");
const char *home = get_home_directory();
char *to_free = NULL;
if (!home) {
@@ -274,7 +274,7 @@ char *expand_user_path(const char *path)
const char *username = path + 1;
size_t username_len = first_slash - username;
if (username_len == 0) {
const char *home = getenv("HOME");
const char *home = get_home_directory();
if (!home)
goto return_null;
strbuf_add(&user_path, home, strlen(home));

View File

@@ -55,7 +55,7 @@ static char *make_cmd(const char *prog)
static void cd_to_homedir(void)
{
const char *home = getenv("HOME");
const char *home = get_home_directory();
if (!home)
die("could not determine user's home directory; HOME is unset");
if (chdir(home) == -1)