Skip to content

Commit

Permalink
Merge pull request git-for-windows#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 committed May 12, 2023
2 parents 43f2d91 + 09e6db7 commit a01fd10
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 3 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)
{
_REENT_ERRNO(r) = 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
6 changes: 6 additions & 0 deletions winsup/cygwin/DevDocs/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.
67 changes: 66 additions & 1 deletion winsup/cygwin/msys2_path_conv.cc
Original file line number Diff line number Diff line change
Expand Up @@ -341,7 +341,64 @@ path_type find_path_start_and_type(const char** src, int recurse, const char* en

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

while (!isalnum(*it) && *it != '/' && *it != '\\' && *it != ':' && *it != '-' && *it != '.') {
/* 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;
Expand Down Expand Up @@ -406,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 @@ -449,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 @@ -616,7 +616,11 @@ _sys_mbstowcs (mbtowc_p f_mbtowc, wchar_t *dst, size_t dlen, const char *src,
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 a01fd10

Please sign in to comment.