avoid hard linking object from other repository when annex.thin is set

This is simpler and less expensive than checking if the src file has a
link count >= 2, and also is unlocked.
This commit is contained in:
Joey Hess 2016-01-13 14:19:31 -04:00
parent 2513c1dfd0
commit ecd0684bfc
Failed to extract signature
2 changed files with 7 additions and 10 deletions

View file

@ -672,7 +672,12 @@ commitOnCleanup r a = go `after` a
toCommand shellparams
wantHardLink :: Annex Bool
wantHardLink = (annexHardLink <$> Annex.getGitConfig) <&&> (not <$> isDirect)
wantHardLink = (annexHardLink <$> Annex.getGitConfig)
-- Not direct mode files because they can be modified at any time.
<&&> (not <$> isDirect)
-- Not unlocked files that are hard linked in the work tree,
-- because they can be modified at any time.
<&&> (not <$> annexThin <$> Annex.getGitConfig)
-- Copies from src to dest, updating a meter. If the copy finishes
-- successfully, calls a final check action, which must also succeed, or
@ -694,7 +699,7 @@ mkCopier remotewanthardlink rsyncparams = do
#ifndef mingw32_HOST_OS
localwanthardlink <- wantHardLink
let linker = \src dest -> createLink src dest >> return True
ifM (pure (remotewanthardlink || localwanthardlink))
ifM (pure (remotewanthardlink || localwanthardlink) <&&> not <$> isDirect)
( return $ \src dest p check ->
ifM (liftIO (catchBoolIO (linker src dest)))
( return (True, Verified)

View file

@ -2,14 +2,6 @@ git-annex should use smudge/clean filters.
### implementation todo list
* Interaction with shared clones. Should avoid hard linking from/to a
object in a shared clone if either repository has the object unlocked
with a hard link in place.
(And should avoid unlocking an object with a hard link if it's hard
linked to a shared clone, but that's already accomplished because it
avoids unlocking an object if it's hard linked at all)
**release blocker**
* Reconcile staged changes into the associated files database, whenever
the database is queried. This is needed to handle eg:
git add largefile