fix hard links when upgrading from direct mode

When upgrading a direct mode repo to v7 with adjusted unlocked branches,
fix a bug that prevented annex.thin from taking effect for the files in
working tree.

The hard links used to be ok, but commit 8e22114735 accidentially
broke them. It repopulates the worktree file, which is already a hard link,
and when it's creating the new file, the link count is already 2, and so it
doesn't make a hard link then.
This commit is contained in:
Joey Hess 2019-08-26 13:46:58 -04:00
parent 1e02360283
commit 5877a15d7b
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
4 changed files with 48 additions and 35 deletions

View file

@ -113,7 +113,7 @@ initialize' mversion = checkCanInitialize $ do
) )
whenM versionSupportsUnlockedPointers $ do whenM versionSupportsUnlockedPointers $ do
configureSmudgeFilter configureSmudgeFilter
scanUnlockedFiles scanUnlockedFiles True
unlessM isBareRepo $ do unlessM isBareRepo $ do
hookWrite postCheckoutHook hookWrite postCheckoutHook
hookWrite postMergeHook hookWrite postMergeHook

View file

@ -75,10 +75,11 @@ ifAnnexed file yes no = maybe no yes =<< lookupFile file
- when initializing/upgrading a v6+ mode repository. - when initializing/upgrading a v6+ mode repository.
- -
- Also, the content for the unlocked file may already be present as - Also, the content for the unlocked file may already be present as
- an annex object. If so, make the unlocked file use that content. - an annex object. If so, make the unlocked file use that content
- when replacefiles is True.
-} -}
scanUnlockedFiles :: Annex () scanUnlockedFiles :: Bool -> Annex ()
scanUnlockedFiles = whenM (inRepo Git.Ref.headExists) $ do scanUnlockedFiles replacefiles = whenM (inRepo Git.Ref.headExists) $ do
showSideAction "scanning for unlocked files" showSideAction "scanning for unlocked files"
Database.Keys.runWriter $ Database.Keys.runWriter $
liftIO . Database.Keys.SQL.dropAllAssociatedFiles liftIO . Database.Keys.SQL.dropAllAssociatedFiles
@ -97,7 +98,7 @@ scanUnlockedFiles = whenM (inRepo Git.Ref.headExists) $ do
let tf = Git.LsTree.file i let tf = Git.LsTree.file i
Database.Keys.runWriter $ Database.Keys.runWriter $
liftIO . Database.Keys.SQL.addAssociatedFileFast (toIKey k) tf liftIO . Database.Keys.SQL.addAssociatedFileFast (toIKey k) tf
whenM (inAnnex k) $ do whenM (pure replacefiles <&&> inAnnex k) $ do
f <- fromRepo $ fromTopFilePath tf f <- fromRepo $ fromTopFilePath tf
destmode <- liftIO $ catchMaybeIO $ fileMode <$> getFileStatus f destmode <- liftIO $ catchMaybeIO $ fileMode <$> getFileStatus f
ic <- replaceFile f $ \tmp -> ic <- replaceFile f $ \tmp ->

View file

@ -5,6 +5,9 @@ git-annex (7.20190820) UNRELEASED; urgency=medium
so error out to avoid confusion. so error out to avoid confusion.
* assistant: When creating a new repository, no longer use direct * assistant: When creating a new repository, no longer use direct
mode, instead use v7 adjusted branches with annex.thin. mode, instead use v7 adjusted branches with annex.thin.
* When upgrading a direct mode repo to v7 with adjusted unlocked branches,
fix a bug that prevented annex.thin from taking effect for the files
in working tree.
-- Joey Hess <id@joeyh.name> Sat, 24 Aug 2019 12:54:35 -0400 -- Joey Hess <id@joeyh.name> Sat, 24 Aug 2019 12:54:35 -0400

View file

@ -1,6 +1,6 @@
{- git-annex v5 -> v6 upgrade support {- git-annex v5 -> v6 upgrade support
- -
- Copyright 2015-2016 Joey Hess <id@joeyh.name> - Copyright 2015-2019 Joey Hess <id@joeyh.name>
- -
- Licensed under the GNU AGPL version 3 or higher. - Licensed under the GNU AGPL version 3 or higher.
-} -}
@ -35,35 +35,14 @@ upgrade :: Bool -> Annex Bool
upgrade automatic = do upgrade automatic = do
unless automatic $ unless automatic $
showAction "v5 to v6" showAction "v5 to v6"
whenM isDirect $ do ifM isDirect
{- Direct mode makes the same tradeoff of using less disk ( do
- space, with less preservation of old versions of files convertDirect automatic
- as does annex.thin. -} -- Worktree files are already populated, so don't
setConfig (annexConfig "thin") (boolConfig True) -- have this try to populate them again.
Annex.changeGitConfig $ \c -> c { annexThin = True } scanUnlockedFiles False
{- Since upgrade from direct mode changes how files , scanUnlockedFiles True
- are represented in git, by checking out an adjusted )
- branch, commit any changes in the work tree first. -}
whenM stageDirect $ do
unless automatic $
showAction "committing first"
upgradeDirectCommit automatic
"commit before upgrade to annex.version 6"
setDirect False
cur <- fromMaybe (error "Somehow no branch is checked out")
<$> inRepo Git.Branch.current
upgradeDirectWorkTree
removeDirectCruft
{- Create adjusted branch where all files are unlocked.
- This should have the same content for each file as
- have been staged in upgradeDirectWorkTree. -}
AdjBranch b <- adjustBranch (LinkAdjustment UnlockAdjustment) cur
{- Since the work tree was already set up by
- upgradeDirectWorkTree, and contains unlocked file
- contents too, don't use git checkout to check out the
- adjust branch. Instead, update HEAD manually. -}
inRepo $ setHeadRef b
scanUnlockedFiles
configureSmudgeFilter configureSmudgeFilter
-- Inode sentinal file was only used in direct mode and when -- Inode sentinal file was only used in direct mode and when
-- locking down files as they were added. In v6, it's used more -- locking down files as they were added. In v6, it's used more
@ -73,6 +52,36 @@ upgrade automatic = do
createInodeSentinalFile True createInodeSentinalFile True
return True return True
convertDirect :: Bool -> Annex ()
convertDirect automatic = do
{- Direct mode makes the same tradeoff of using less disk
- space, with less preservation of old versions of files
- as does annex.thin. -}
setConfig (annexConfig "thin") (boolConfig True)
Annex.changeGitConfig $ \c -> c { annexThin = True }
{- Since upgrade from direct mode changes how files
- are represented in git, by checking out an adjusted
- branch, commit any changes in the work tree first. -}
whenM stageDirect $ do
unless automatic $
showAction "committing first"
upgradeDirectCommit automatic
"commit before upgrade to annex.version 6"
setDirect False
cur <- fromMaybe (error "Somehow no branch is checked out")
<$> inRepo Git.Branch.current
upgradeDirectWorkTree
removeDirectCruft
{- Create adjusted branch where all files are unlocked.
- This should have the same content for each file as
- have been staged in upgradeDirectWorkTree. -}
AdjBranch b <- adjustBranch (LinkAdjustment UnlockAdjustment) cur
{- Since the work tree was already set up by
- upgradeDirectWorkTree, and contains unlocked file
- contents too, don't use git checkout to check out the
- adjust branch. Instead, update HEAD manually. -}
inRepo $ setHeadRef b
upgradeDirectCommit :: Bool -> String -> Annex () upgradeDirectCommit :: Bool -> String -> Annex ()
upgradeDirectCommit automatic msg = upgradeDirectCommit automatic msg =
void $ inRepo $ Git.Branch.commitCommand commitmode void $ inRepo $ Git.Branch.commitCommand commitmode