Skip to content

Commit

Permalink
Merge pull request #1 from dscho/git-for-windows
Browse files Browse the repository at this point in the history
Assorted fixes for Git for windows
  • Loading branch information
dscho authored and Git for Windows Build Agent committed Apr 30, 2019
2 parents 47a0530 + 945d5fd commit 16df3ed
Show file tree
Hide file tree
Showing 6 changed files with 93 additions and 13 deletions.
2 changes: 1 addition & 1 deletion newlib/libc/stdlib/mbtowc_r.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ __ascii_mbtowc (struct _reent *r,
if (n == 0)
return -2;

#ifdef __CYGWIN__
#ifdef STRICTLY_7BIT_ASCII
if ((wchar_t)*t >= 0x80)
{
r->_errno = EILSEQ;
Expand Down
2 changes: 1 addition & 1 deletion newlib/libc/stdlib/wctomb_r.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ __ascii_wctomb (struct _reent *r,
if (s == NULL)
return 0;

#ifdef __CYGWIN__
#ifdef STRICTLY_7BIT_ASCII
if ((size_t)wchar >= 0x80)
#else
if ((size_t)wchar >= 0x100)
Expand Down
12 changes: 10 additions & 2 deletions winsup/cygwin/environ.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1192,7 +1192,15 @@ build_env (const char * const *envp, PWCHAR &envblock, int &envc,
{
/* Don't pass timezone environment to non-msys applications */
if (ascii_strncasematch(*srcp, "TZ=", 3))
goto next1;
{
const char *v = *srcp + 3;
if (*v == ':')
goto next1;
for (; *v; v++)
if (!isalpha(*v) && !isdigit(*v) &&
*v != '-' && *v != '+' && *v != ':')
goto next1;
}
else if (ascii_strncasematch(*srcp, "MSYS2_ENV_CONV_EXCL=", 20))
{
msys2_env_conv_excl_env = (char*)alloca (strlen(&(*srcp)[20])+1);
Expand Down Expand Up @@ -1304,7 +1312,7 @@ build_env (const char * const *envp, PWCHAR &envblock, int &envc,
Note that this doesn't stop invalid strings without '=' in it
etc., but we're opting for speed here for now. Adding complete
checking would be pretty expensive. */
if (len == 1 || !*rest)
if (len == 1)
continue;

/* See if this entry requires posix->win32 conversion. */
Expand Down
6 changes: 6 additions & 0 deletions winsup/cygwin/how-to-debug-cygwin.txt
Original file line number Diff line number Diff line change
Expand Up @@ -126,3 +126,9 @@ set CYGWIN_DEBUG=cat.exe:gdb.exe
program will crash, probably in small_printf. At that point, a 'bt'
command should show you the offending call to strace_printf with the
improper format string.

9. Debug output without strace

If you cannot use gdb, or if the program behaves differently using strace
for whatever reason, you can still use the small_printf() function to
output debugging messages directly to stderr.
80 changes: 71 additions & 9 deletions winsup/cygwin/msys2_path_conv.cc
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ void ppl_convert(const char** from, const char* to, char** dst, const char* dste


void find_end_of_posix_list(const char** to, int* in_string) {
for (; **to != '\0' && (in_string ? (**to != *in_string) : **to != ' '); ++*to) {
for (; **to != '\0' && (!in_string || **to != *in_string); ++*to) {
}

if (**to == *in_string) {
Expand Down Expand Up @@ -238,6 +238,7 @@ void find_end_of_rooted_path(const char** from, const char** to, int* in_string)
void sub_convert(const char** from, const char** to, char** dst, const char* dstend, int* in_string) {
const char* copy_from = *from;
path_type type = find_path_start_and_type(from, false, *to);
debug_printf("found type %d for path %s", type, copy_from);

if (type == POSIX_PATH_LIST) {
find_end_of_posix_list(to, in_string);
Expand Down Expand Up @@ -301,12 +302,6 @@ const char* convert(char *dst, size_t dstlen, const char *src) {
}
continue;
}

if (isspace(*srcit)) {
//sub_convert(&srcbeg, &srcit, &dstit, dstend, &in_string);
//srcbeg = srcit + 1;
break;
}
}

sub_convert(&srcbeg, &srcit, &dstit, dstend, &in_string);
Expand Down Expand Up @@ -346,8 +341,67 @@ path_type find_path_start_and_type(const char** src, int recurse, const char* en

if (*it == '\0' || it == end) return NONE;

if (!isalnum(*it) && *it != '/' && *it != '\\' && *it != ':' && *it != '-' && *it != '.') {
return find_path_start_and_type(move(src, 1), true, end);
/* Let's not convert ~/.file to ~C:\msys64\.file */
if (*it == '~') {
skip_p2w:
*src = end;
return NONE;
}

/*
* Skip path mangling when environment indicates it.
*/
const char *no_pathconv = getenv ("MSYS_NO_PATHCONV");

if (no_pathconv)
goto skip_p2w;

/*
* Prevent Git's :file.txt and :/message syntax from beeing modified.
*/
if (*it == ':')
goto skip_p2w;

while (it != end && *it) {
switch (*it) {
case '`':
case '\'':
case '"':
case '*':
case '?':
case '[':
case ']':
goto skip_p2w;
case '/':
if (it + 1 < end && it[1] == '~')
goto skip_p2w;
break;
case ':':
// Avoid mangling IPv6 addresses
if (it + 1 < end && it[1] == ':')
goto skip_p2w;

// Leave Git's <rev>:./name syntax alone
if (it + 1 < end && it[1] == '.') {
if (it + 2 < end && it[2] == '/')
goto skip_p2w;
if (it + 3 < end && it[2] == '.' && it[3] == '/')
goto skip_p2w;
}
break;
case '@':
// Paths do not contain '@@'
if (it + 1 < end && it[1] == '@')
goto skip_p2w;
}
++it;
}
it = *src;

while (!isalnum(*it) && !(0x80 & *it) && *it != '/' && *it != '\\' && *it != ':' && *it != '-' && *it != '.') {
recurse = true;
it = ++*src;
if (it == end || *it == '\0') return NONE;
}

path_type result = NONE;
Expand Down Expand Up @@ -409,6 +463,8 @@ path_type find_path_start_and_type(const char** src, int recurse, const char* en

int starts_with_minus = 0;
int starts_with_minus_alpha = 0;
int only_dots = *it == '.';
int has_slashes = 0;
if (*it == '-') {
starts_with_minus = 1;
it += 1;
Expand Down Expand Up @@ -452,11 +508,17 @@ path_type find_path_start_and_type(const char** src, int recurse, const char* en
if (ch == '/' && *(it2 + 1) == '/') {
return URL;
} else {
if (!only_dots && !has_slashes)
goto skip_p2w;
return POSIX_PATH_LIST;
}
} else if (memchr(it2, '=', end - it) == NULL) {
return SIMPLE_WINDOWS_PATH;
}
} else if (ch != '.') {
only_dots = 0;
if (ch == '/' || ch == '\\')
has_slashes = 1;
}
}

Expand Down
4 changes: 4 additions & 0 deletions winsup/cygwin/strfuncs.cc
Original file line number Diff line number Diff line change
Expand Up @@ -641,7 +641,11 @@ sys_cp_mbstowcs (mbtowc_p f_mbtowc, wchar_t *dst, size_t dlen,
to store them in a symmetric way. */
bytes = 1;
if (dst)
#ifdef STRICTLY_7BIT_ASCII
*ptr = L'\xf000' | *pmbs;
#else
*ptr = *pmbs;
#endif
memset (&ps, 0, sizeof ps);
}

Expand Down

0 comments on commit 16df3ed

Please sign in to comment.