aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Annex/AdjustedBranch.hs15
-rw-r--r--Annex/Init.hs1
-rw-r--r--doc/design/adjusted_branches.mdwn2
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.