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.
This commit is contained in:
Joey Hess 2016-04-04 13:17:24 -04:00
parent c7b06b879b
commit c3e0859846
Failed to extract signature
7 changed files with 54 additions and 43 deletions

View file

@ -14,6 +14,7 @@ module Annex.AdjustedBranch (
fromAdjustedBranch,
getAdjustment,
enterAdjustedBranch,
adjustBranch,
adjustToCrippledFileSystem,
updateAdjustedBranch,
propigateAdjustedCommits,

View file

@ -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. -}

View file

@ -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

View file

@ -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

4
debian/changelog vendored
View file

@ -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

View file

@ -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.

View file

@ -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)