Please describe the problem.
Thanks for the improvements in Windows long file support but it turns out that Git-annex commit 54ad1b4cf doesn't quite compile on Windows without a small fix to Remote.Git and Utility.DirWatcher.Win32Notify regarding imports.
What steps will reproduce the problem?
stack setup && stack build
What version of git-annex are you using? On what operating system?
git-annex version: 10.20230228-g54ad1b4cf
build flags: Assistant Webapp Pairing TorrentParser Benchmark Feeds Testsuite S3 WebDAV
dependency versions: aws-0.22 bloomfilter-2.0.1.0 cryptonite-0.29 DAV-1.3.4 feed-1.3.2.0 ghc-8.10.7 http-client-0.7.9 persistent-sqlite-2.13.0.3 torrent-10000.1.1 uuid-1.3.15 yesod-1.6.1.2
key/value backends: SHA256E SHA256 SHA512E SHA512 SHA224E SHA224 SHA384E SHA384 SHA3_256E SHA3_256 SHA3_512E SHA3_512 SHA3_224E SHA3_224 SHA3_384E SHA3_384 SKEIN256E SKEIN256 SKEIN512E SKEIN512 BLAKE2B256E BLAKE2B256 BLAKE2B512E BLAKE2B512 BLAKE2B160E BLAKE2B160 BLAKE2B224E BLAKE2B224 BLAKE2B384E BLAKE2B384 BLAKE2BP512E BLAKE2BP512 BLAKE2S256E BLAKE2S256 BLAKE2S160E BLAKE2S160 BLAKE2S224E BLAKE2S224 BLAKE2SP256E BLAKE2SP256 BLAKE2SP224E BLAKE2SP224 SHA1E SHA1 MD5E MD5 WORM URL X*
remote types: git gcrypt p2p S3 bup directory rsync web bittorrent webdav adb tahoe glacier ddar git-lfs httpalso borg hook external
operating system: mingw32 x86_64
supported repository versions: 8 9 10
upgrade supported from repository versions: 2 3 4 5 6 7 8 9 10
A successful build that passes the testsuite on Windows is achieved with the patch below.
Windows 10 version 22H2 (build 19045.2486), 64 bit.
Please provide any additional information below.
Relevant parts of the build log:
jkniiv@AINESIS MINGW64 /c/annx
$ tail -n 35 stack.build.LOG~102
[143 of 676] Compiling Types.Backend
[144 of 676] Compiling Database.Handle
[145 of 676] Compiling Database.Queue
[146 of 676] Compiling Database.Keys.Handle
[147 of 676] Compiling Utility.Gpg
[148 of 676] Compiling Types.Crypto
[149 of 676] Compiling Utility.DirWatcher.Types
[150 of 676] Compiling Utility.DirWatcher.Win32Notify
Utility\DirWatcher\Win32Notify.hs:54:51: error:
* Variable not in scope: isRegularFile :: FileStatus -> Bool
* Perhaps you meant `System.PosixCompat.Files.isRegularFile' (imported from System.PosixCompat.Files)
|
54 | | isRegularFile s ->
| ^^^^^^^^^^^^^
Utility\DirWatcher\Win32Notify.hs:62:36: error:
Variable not in scope: getFileStatus :: a -> m a1
|
62 | getstatus = catchMaybeIO . getFileStatus
| ^^^^^^^^^^^^^
Error: [S-7282]
Stack failed to execute the build plan.
While executing the build plan, Stack encountered the following errors:
[S-7011]
While building package git-annex-10.20230227 (scroll up to its section to see the error)
using:
C:\Users\jkniiv\Projektit\git-annex.branchable.com\git-annex--BUILD-230302-54ad1b4cf\.stack-work\dist\274b403a\setup\setup --verbose=1 --builddir=.stack-work\dist\274b403a build exe:git-annex --ghc-options " -fdiagnostics-color=always"
Process exited with code: ExitFailure 1
# End of transcript.
The change I made was the following:
diff --git a/Remote/Git.hs b/Remote/Git.hs
index c65d1388d..0e5fbe8df 100644
--- a/Remote/Git.hs
+++ b/Remote/Git.hs
@@ -65,9 +65,7 @@ import Types.ProposedAccepted
import Annex.Action
import Messages.Progress
-#ifndef mingw32_HOST_OS
import qualified Utility.RawFilePath as R
-#endif
import Control.Concurrent
import qualified Data.Map as M
diff --git a/Utility/DirWatcher/Win32Notify.hs b/Utility/DirWatcher/Win32Notify.hs
index 7eba40de9..acc6bd3af 100644
--- a/Utility/DirWatcher/Win32Notify.hs
+++ b/Utility/DirWatcher/Win32Notify.hs
@@ -11,7 +11,7 @@ import Common hiding (isDirectory)
import Utility.DirWatcher.Types
import System.Win32.Notify
-import qualified System.PosixCompat.Files (isRegularFile)
+import System.PosixCompat.Files (isRegularFile, getFileStatus)
watchDir :: FilePath -> (FilePath -> Bool) -> Bool -> WatchHooks -> IO WatchManager
watchDir dir ignored scanevents hooks = do
This then compiled cleanly and completed the test suite ok.
Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)
Git Annex is great. I use it several times a week with my multigigabyte backups, where it gives structure to my image-based backup routines, so you could say I'm a believer.
Kind of expected there would be something! The patch is almost right, but we're avoiding using System.PosixCompat.Files.getFileStatus since it doesn't support long paths, so have to use Utility.RawFilePath.getFileStatus instead. [[done]] --Joey
Sorry, I had to reopen the bug as Joey's commit didn't quite compile. See page comments for details. --jkniiv
@Joey, unfortunately commit 398633c12bfb6201ba1fcd9b50e5e8055bfff89e wasn't quite enough to resolve my issue. :) First of all I wondered why you would employ
fromRawFilePath
instead oftoRawFilePath
considering that the argument ofgetstatus
seems to be a FilePath, and indeed Utility.DirWatcher.Win32Notify didn't compile without replacing the former with the latter. Also you didn't notice that I had changed a qualified import into a regular one because otherwiseisRegularFile
wouldn't be available.Here's the tail end of my build log trying to build commit 398633c12:
So, I ended up with the following simple fix (although this situation left me wondering if
watchDir
ought to be rewritten to deal with RawFilePaths directly but then that's beyond my abilities):On a positive note I can confirm that my compiled versions of commits 54ad1b4cf and 398633c12 pass their test suite even in a subdirectory some 64 characters deep (for instance in a directory named like
c:/Users/jkniiv/annx/annx.10.20230228-g505f1a654--test-test-test
) whereas the commit just prior to "Windows: Support long filenames in more (possibly all) of the code" (54ad1b4cf), or 505f1a654, fails some one third to one half of its tests in said directory. Shortening the test directory name to sayc:/Users/jkniiv/annx/annx
allows the test suite to pass in older versions of git-annex all other things considered equal. So far I have been running the built-in tests always in 'c:/annx' (/c/annx in Git Bash) but here on forward I'll probably start using a deeper path somewhere in my user folder / home directory just to catch possible future regressions in long path handling. In any case, @Joey, congratulations 🎉 are in order for your fine achievement from a Windows user point of view.That's great news about the test suite in a deep directory. That was a longstanding problem indeed and a good indication it's fully supporting long filenames now.
I often mix up fromRawFilePath/toRawFilePath. Luckily the compiler will notice. Should be fixed now.
As for converting the whole
watchDir
to RawFilePath, there is probably not much benefit in doing that in such windows-specific code, but the goal is to do such a conversion in as much of git-annex as possible, since it is faster on unix to use RawFilePath end-to-end.Doing it is as simple as juggling the use of fromRawFilePath/toRawFilePath as the compiler allows, while converting code to use functions from Utility.RawFilePath or System.FilePath.ByteString or that otherwise use RawFilePath. I think you would be capable of that for sure!