patch command incorrectly capitalizes filenames that live on external USB flash drives

Jason Gross jasongross9@gmail.com
Tue Apr 28 19:27:06 GMT 2020


Consider the following script in foo.sh:
```
#!/usr/bin/env bash

set -ex

cd "$1"
rm -rf foo
mkdir foo
cd foo
cat > Makefile <<EOF
a
b
c
d
e
EOF
cat > diff <<EOF
diff --git a/Makefile b/Makefile
index 9405325..86d2f8c 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
 a
 b
-c
+ccc
 d
 e
EOF
patch -p1 -i ./diff
ls
```

If I run `./foo.sh /cygdrive/c/`, I get, as expected,
```
+ cd /cygdrive/c/
+ rm -rf foo
+ mkdir foo
+ cd foo
+ cat
+ cat
+ patch -p1 -i ./diff
patching file Makefile
+ ls
diff  Makefile
```

If I instead run `./foo.sh /cygdrive/h/`, I get
```
+ cd /cygdrive/h/
+ rm -rf foo
+ mkdir foo
+ cd foo
+ cat
+ cat
+ patch -p1 -i ./diff
patching file Makefile
+ ls
diff  MAKEFILE
```

My C drive is an internal SSD (NTFS), my H drive is an external flash
drive (FAT32).  I installed cygwin with the commands:
```
powershell -Command "(New-Object
Net.WebClient).DownloadFile('http://www.cygwin.com/setup-x86_64.exe',
'setup-x86_64.exe')"
SET CYGMIRROR=http://mirror.easyname.at/cygwin
SET CYGROOT=H:\cygwin64
SET CYGCACHE=%CYGROOT%\var\cache\setup
setup-x86_64.exe -qnNdO -R %CYGROOT% -l %CYGCACHE% -s %CYGMIRROR% -P
rsync -P patch -P diffutils -P make -P unzip -P m4 -P findutils -P
time -P wget -P curl -P git -P
mingw64-x86_64-binutils,mingw64-x86_64-gcc-core,mingw64-x86_64-gcc-g++,mingw64-x86_64-pkg-config,mingw64-x86_64-windows_default_manifest
-P mingw64-x86_64-headers,mingw64-x86_64-runtime,mingw64-x86_64-pthreads,mingw64-x86_64-zlib
-P python3
```

Running `patch -v` says `GNU patch 2.7.4`.  Note that this happens
regardless of whether I install cygwin itself on my external flash
drive or on my internal HD.

This came up when trying to run `opam install findlib` (which fails
when the home directory is on an external USB drive).

-Jason


More information about the Cygwin mailing list