aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Annex/Locations.hs35
-rw-r--r--debian/changelog3
-rw-r--r--doc/forum/Wrong_symlink_target_on_usb_drive/comment_5_e5a152cef3c48ef05cb183907377f128._comment24
3 files changed, 46 insertions, 16 deletions
diff --git a/Annex/Locations.hs b/Annex/Locations.hs
index 52753fca8..bdd603d94 100644
--- a/Annex/Locations.hs
+++ b/Annex/Locations.hs
@@ -137,25 +137,28 @@ gitAnnexLocationDepth config = hashlevels + 1
- the actual location of the file's content.
-}
gitAnnexLocation :: Key -> Git.Repo -> GitConfig -> IO FilePath
-gitAnnexLocation key r config = gitAnnexLocation' key r config (annexCrippledFileSystem config) doesFileExist (Git.localGitDir r)
-gitAnnexLocation' :: Key -> Git.Repo -> GitConfig -> Bool -> (FilePath -> IO Bool) -> FilePath -> IO FilePath
-gitAnnexLocation' key r config crippled checker gitdir
+gitAnnexLocation key r config = gitAnnexLocation' key r config (annexCrippledFileSystem config) (coreSymlinks config) doesFileExist (Git.localGitDir r)
+gitAnnexLocation' :: Key -> Git.Repo -> GitConfig -> Bool -> Bool -> (FilePath -> IO Bool) -> FilePath -> IO FilePath
+gitAnnexLocation' key r config crippled symlinkssupported checker gitdir
{- Bare repositories default to hashDirLower for new
- - content, as it's more portable.
- -
- - Repositories on filesystems that are crippled also use
- - hashDirLower, since they do not use symlinks and it's
- - more portable.
- -}
- | Git.repoIsLocalBare r || crippled =
- check $ map inrepo $ annexLocations config key
- | hasDifference ObjectHashLower (annexDifferences config) =
- return $ inrepo $ annexLocation config key hashDirLower
- {- Non-bare repositories only use hashDirMixed, so
+ - content, as it's more portable. But check all locations. -}
+ | Git.repoIsLocalBare r = checkall
+ | hasDifference ObjectHashLower (annexDifferences config) =
+ only hashDirLower
+ {- Repositories on crippled filesystems use hashDirLower
+ - for new content, unless symlinks are supported too.
+ - Then hashDirMixed is used. But, the content could be
+ - in either location so check both. -}
+ | symlinkssupported = check $ map inrepo $ reverse $ annexLocations config key
+ | crippled = checkall
+ {- Regular repositories only use hashDirMixed, so
- don't need to do any work to check if the file is
- present. -}
- | otherwise = return $ inrepo $ annexLocation config key hashDirMixed
+ | otherwise = only hashDirMixed
where
+ only = return . inrepo . annexLocation config key
+ checkall = check $ map inrepo $ annexLocations config key
+
inrepo d = gitdir </> d
check locs@(l:_) = fromMaybe l <$> firstM checker locs
check [] = error "internal"
@@ -166,7 +169,7 @@ gitAnnexLink file key r config = do
currdir <- getCurrentDirectory
let absfile = fromMaybe whoops $ absNormPathUnix currdir file
let gitdir = getgitdir currdir
- loc <- gitAnnexLocation' key r config False (\_ -> return True) gitdir
+ loc <- gitAnnexLocation' key r config False False (\_ -> return True) gitdir
toInternalGitPath <$> relPathDirToFile (parentDir absfile) loc
where
getgitdir currdir
diff --git a/debian/changelog b/debian/changelog
index 6a031b7e8..4381f5810 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -25,6 +25,9 @@ git-annex (6.20160420) UNRELEASED; urgency=medium
when it's decrypting data.
* fsck: When a key is not previously known in the location log,
record something so that reinject --known will work.
+ * In the unusual configuration where annex.crippledfilesystem=true but
+ core.symlinks=true, store object contents in mixed case hash
+ directories so that symlinks will point to them.
-- Joey Hess <id@joeyh.name> Thu, 28 Apr 2016 13:17:04 -0400
diff --git a/doc/forum/Wrong_symlink_target_on_usb_drive/comment_5_e5a152cef3c48ef05cb183907377f128._comment b/doc/forum/Wrong_symlink_target_on_usb_drive/comment_5_e5a152cef3c48ef05cb183907377f128._comment
new file mode 100644
index 000000000..8a5dd5530
--- /dev/null
+++ b/doc/forum/Wrong_symlink_target_on_usb_drive/comment_5_e5a152cef3c48ef05cb183907377f128._comment
@@ -0,0 +1,24 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 5"""
+ date="2016-05-10T18:08:10Z"
+ content="""
+Ok, I reproduced the problem. Normally core.symlinks will be false
+by on NTFS. You have to manually set it to true to experience
+this problem AFAICS.
+
+I was able to lock a file (resulting in a broken symlink) and then successfully
+unlock it and the content was back in place.
+
+git-annex always uses the lower case hash directory names when on a
+crippled filesystem, since that's more portable and avoids lots of
+potential problems. By configuring core.symlinks=true, you make git-annex
+support locking files using symlinks, but these symlinks can't point to the
+actual content location.
+
+I think it makes sense for git-annex to use the the mixed case hash
+directory names when core.symlinks=true even if the filesystem is crippled.
+There's some foot-shooting potential, since some crippled fileystems
+don't support the mixed-case hash directories. But, you have to manually
+set up this configuration. I've made a change along these lines.
+"""]]