summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2016-04-04 13:51:42 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2016-04-04 13:51:42 -0400
commitcdddad27e44443177b7878821a057c6eaf16cc05 (patch)
tree8a417dd20a01554e60d7c208d816c7ec8261f0cd
parent2f8436cd9bb2a9f16b0bbbf5a30043b911576317 (diff)
deal with cloning a repo that has an ajdusted branch checked out
-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.