aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2016-04-04 13:17:24 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2016-04-04 13:17:24 -0400
commit9b3a2e6c91afb886f1743769a5100fcf056d6ea7 (patch)
tree282232aee8154832c631d9c7efc87062140051fe
parentf312b66a5cfc99ca5f01a07755f645659e75564a (diff)
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.
-rw-r--r--Annex/AdjustedBranch.hs1
-rw-r--r--Git/Branch.hs14
-rw-r--r--Git/Ref.hs6
-rw-r--r--Upgrade/V5.hs22
-rw-r--r--debian/changelog4
-rw-r--r--doc/design/adjusted_branches.mdwn1
-rw-r--r--doc/upgrades.mdwn49
7 files changed, 54 insertions, 43 deletions
diff --git a/Annex/AdjustedBranch.hs b/Annex/AdjustedBranch.hs
index c757eae1d..7254c8c4b 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 6258939cb..76097fe13 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 7f21b0ab8..6cd56271f 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 ab6df6689..ee213b613 100644
--- a/Upgrade/V5.hs
+++ b/Upgrade/V5.hs
@@ -1,6 +1,6 @@
{- git-annex v5 -> v6 upgrade support
-
- - Copyright 2015 Joey Hess <id@joeyh.name>
+ - Copyright 2015-2016 Joey Hess <id@joeyh.name>
-
- 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 53b894627..71744bfef 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 a4fd40650..6f71112b2 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 fd4accc69..f3646a46b 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.
-
-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.
+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.
-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)