From c3e085984624db0db025104e7a809fd17a84690e Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 4 Apr 2016 13:17:24 -0400 Subject: [PATCH] Upgrading a direct mode repository to v6 has changed to enter an adjusted unlocked branch. This makes the direct mode to v6 upgrade able to be performed in one clone of a repository without affecting other clones, which can continue using v5 and direct mode. --- Annex/AdjustedBranch.hs | 1 + Git/Branch.hs | 14 ++++----- Git/Ref.hs | 6 ++++ Upgrade/V5.hs | 22 ++++++++++---- debian/changelog | 4 +++ doc/design/adjusted_branches.mdwn | 1 - doc/upgrades.mdwn | 49 +++++++++++++------------------ 7 files changed, 54 insertions(+), 43 deletions(-) diff --git a/Annex/AdjustedBranch.hs b/Annex/AdjustedBranch.hs index c757eae1dd..7254c8c4b6 100644 --- a/Annex/AdjustedBranch.hs +++ b/Annex/AdjustedBranch.hs @@ -14,6 +14,7 @@ module Annex.AdjustedBranch ( fromAdjustedBranch, getAdjustment, enterAdjustedBranch, + adjustBranch, adjustToCrippledFileSystem, updateAdjustedBranch, propigateAdjustedCommits, diff --git a/Git/Branch.hs b/Git/Branch.hs index 6258939cb1..76097fe133 100644 --- a/Git/Branch.hs +++ b/Git/Branch.hs @@ -184,21 +184,21 @@ commitTree commitmode message parentrefs tree repo = forcePush :: String -> String forcePush b = "+" ++ b -{- Updates a branch (or other ref) to a new Sha. -} -update :: String -> Branch -> Sha -> Repo -> IO () -update message branch sha = run +{- Updates a branch (or other ref) to a new Sha or branch Ref. -} +update :: String -> Branch -> Ref -> Repo -> IO () +update message branch r = run [ Param "update-ref" , Param "-m" , Param message , Param $ fromRef branch - , Param $ fromRef sha + , Param $ fromRef r ] -update' :: Branch -> Sha -> Repo -> IO () -update' branch sha = run +update' :: Branch -> Ref -> Repo -> IO () +update' branch r = run [ Param "update-ref" , Param $ fromRef branch - , Param $ fromRef sha + , Param $ fromRef r ] {- Checks out a branch, creating it if necessary. -} diff --git a/Git/Ref.hs b/Git/Ref.hs index 7f21b0ab81..6cd56271ff 100644 --- a/Git/Ref.hs +++ b/Git/Ref.hs @@ -18,6 +18,12 @@ import Data.Char (chr) headRef :: Ref headRef = Ref "HEAD" +headFile :: Repo -> FilePath +headFile r = localGitDir r "HEAD" + +setHeadRef :: Ref -> Repo -> IO () +setHeadRef ref r = writeFile (headFile r) ("ref: " ++ fromRef ref) + {- Converts a fully qualified git ref into a user-visible string. -} describe :: Ref -> String describe = fromRef . base diff --git a/Upgrade/V5.hs b/Upgrade/V5.hs index ab6df6689c..ee213b613f 100644 --- a/Upgrade/V5.hs +++ b/Upgrade/V5.hs @@ -1,6 +1,6 @@ {- git-annex v5 -> v6 upgrade support - - - Copyright 2015 Joey Hess + - Copyright 2015-2016 Joey Hess - - Licensed under the GNU GPL version 3 or higher. -} @@ -23,7 +23,9 @@ import qualified Git.Branch import Git.FilePath import Git.FileMode import Git.Config +import Git.Ref import Utility.InodeCache +import Annex.AdjustedBranch upgrade :: Bool -> Annex Bool upgrade automatic = do @@ -37,19 +39,27 @@ upgrade automatic = do setConfig (annexConfig "thin") (boolConfig True) Annex.changeGitConfig $ \c -> c { annexThin = True } {- Since upgrade from direct mode changes how files - - are represented in git, commit any changes in the - - work tree first. -} + - 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 - showLongNote "Upgraded repository out of direct mode." - showLongNote "Changes have been staged for all annexed files in this repository; you should run `git commit` to commit these changes." - showLongNote "Any other clones of this repository that use direct mode need to be upgraded now, too." + {- Create adjusted branch where all files are unlocked. + - This should have the same content for each file as + - have been staged in upgradeDirectWorkTree. -} + adjbranch <- adjustBranch 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 adjbranch configureSmudgeFilter -- Inode sentinal file was only used in direct mode and when -- locking down files as they were added. In v6, it's used more diff --git a/debian/changelog b/debian/changelog index 53b8946273..71744bfef2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,6 +2,10 @@ git-annex (6.20160319) UNRELEASED; urgency=medium * adjust --unlock: Enters an adjusted branch in which all annexed files are unlocked. The v6 equivilant of direct mode, but much cleaner! + * Upgrading a direct mode repository to v6 has changed to enter + an adjusted unlocked branch. This makes the direct mode to v6 upgrade + able to be performed in one clone of a repository without affecting + other clones, which can continue using v5 and direct mode. * init --version=6: Automatically enter the adjusted unlocked branch when filesystem doesn't support symlinks. * ddar remote: fix ssh calls diff --git a/doc/design/adjusted_branches.mdwn b/doc/design/adjusted_branches.mdwn index a4fd406507..6f71112b22 100644 --- a/doc/design/adjusted_branches.mdwn +++ b/doc/design/adjusted_branches.mdwn @@ -347,7 +347,6 @@ into adjusted view worktrees.] ## TODOs * Interface in webapp to enable adjustments. -* Upgrade from direct mode to v6 in unlocked branch. * Honor annex.thin when entering an adjusted branch. * Cloning a repo that has an adjusted branch checked out gets into an ugly state. diff --git a/doc/upgrades.mdwn b/doc/upgrades.mdwn index fd4accc69e..f3646a46b4 100644 --- a/doc/upgrades.mdwn +++ b/doc/upgrades.mdwn @@ -45,47 +45,38 @@ The upgrade events, so far: ## v5 -> v6 (git-annex version 6.x) -The upgrade from v5 to v6 is handled manually. Run `git-annex upgrade` -performs the upgrade. +The upgrade from v5 to v6 is handled manually for now. +Run `git-annex upgrade` to perform the upgrade. -Warning: All places that a direct mode repository is cloned to should be -running git-annex version 6.x before you upgrade the repository. -This is necessary because the contents of the repository are changed -in the upgrade, and the old version of git-annex won't be able to -access files after the repo is upgraded. - -This upgrade does away with the direct mode/indirect mode distinction. -A v6 git-annex repository can have some files locked and other files +A v6 git-annex repository can have some files locked while other files are unlocked, and all git and git-annex commands can be used on both locked and -unlocked files. (Although for locked files to work, the filesystem -must support symbolic links..) +unlocked files. (Although for locked files to be accessible, the filesystem +must support symbolic links.. + +Direct mode repositories are upgraded to instead use the new +[[adjusted branches feature|git-annex-adjust]], which transparently unlocks +all locked files in the local repository. The behavior of some commands changes in an upgraded repository: -* `git add` will add files to the annex, in unlocked mode, rather than - adding them directly to the git repository. To cause some files to be - added directly to git, you can configure `annex.largefiles`. For - example: +* `git add` will add files to the annex, rather than adding them directly + to the git repository. To cause some files to be added directly + to git, you can configure `annex.largefiles`. For example: git config annex.largefiles "largerthan=100kb and not (include=*.c or include=*.h)" * `git annex unlock` and `git annex lock` change how the pointer to the annexed content is stored in git. -There is also a new `annex.thin` setting, which makes unlocked files in v6 repositories -be hard linked to their content, instead of a copy. This saves disk -space but means any modification of an unlocked file will lose the local -(and possibly only) copy of the old version. +There is also a new `annex.thin` setting, which makes unlocked files in v6 +repositories be hard linked to their content, instead of a copy. This saves +disk space but means any modification of an unlocked file will lose the +local (and possibly only) copy of the old version. This is automatically +enabled when upgrading a direct mode repository, since direct mode made the +same tradeoff. -On upgrade, all files in a direct mode repository will be converted to -unlocked files with the `annex.thin` setting enabled. -The upgrade will stage changes to all annexed files in -the git repository, which you can then commit. - -If a repository has some clones using direct mode and some using indirect -mode, all the files will end up unlocked in all clones after the upgrade. - -See [[tips/unlocked_files/]] for more details about locked files and thin mode. +See [[tips/unlocked_files/]] for more details about locked files and thin +mode. ## v4 -> v5 (git-annex version 5.x)