From cdddad27e44443177b7878821a057c6eaf16cc05 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 4 Apr 2016 13:51:42 -0400 Subject: deal with cloning a repo that has an ajdusted branch checked out --- Annex/AdjustedBranch.hs | 15 +++++++++++++++ Annex/Init.hs | 1 + doc/design/adjusted_branches.mdwn | 2 -- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Annex/AdjustedBranch.hs b/Annex/AdjustedBranch.hs index 9de345895..43af5d372 100644 --- a/Annex/AdjustedBranch.hs +++ b/Annex/AdjustedBranch.hs @@ -18,6 +18,7 @@ module Annex.AdjustedBranch ( adjustToCrippledFileSystem, updateAdjustedBranch, propigateAdjustedCommits, + checkAdjustedClone, ) where import Annex.Common @@ -419,3 +420,17 @@ diffTreeToTreeItem dti = TreeItem (Git.DiffTree.file dti) (Git.DiffTree.dstmode dti) (Git.DiffTree.dstsha dti) + +{- Cloning a repository that has an adjusted branch checked out will + - result in the clone having the same adjusted branch checked out -- but + - the origbranch won't exist in the clone. Create the origbranch. -} +checkAdjustedClone :: Annex () +checkAdjustedClone = go =<< inRepo Git.Branch.current + where + go Nothing = return () + go (Just currbranch) = case adjustedToOriginal currbranch of + Nothing -> return () + Just (_adj, origbranch) -> + unlessM (inRepo $ Git.Ref.exists origbranch) $ do + let remotebranch = Git.Ref.underBase "refs/remotes/origin" origbranch + inRepo $ Git.Branch.update' origbranch remotebranch diff --git a/Annex/Init.hs b/Annex/Init.hs index 99f8ece2c..4edc9c914 100644 --- a/Annex/Init.hs +++ b/Annex/Init.hs @@ -105,6 +105,7 @@ initialize' mversion = do , unlessM isBare switchHEADBack ) + checkAdjustedClone createInodeSentinalFile False uninitialize :: Annex () diff --git a/doc/design/adjusted_branches.mdwn b/doc/design/adjusted_branches.mdwn index 17c04d254..90f880e64 100644 --- a/doc/design/adjusted_branches.mdwn +++ b/doc/design/adjusted_branches.mdwn @@ -351,8 +351,6 @@ into adjusted view worktrees.] will make copies of the content of annexed files, so this would need to checkout the adjusted branch some other way. Maybe generalize so this more efficient checkout is available as a git-annex command? -* Cloning a repo that has an adjusted branch checked out gets into an ugly - state. * There are potentially races in code that assumes a branch like master is not being changed by someone else. In particular, propigateAdjustedCommits rebases the adjusted branch on top of master. -- cgit v1.2.3