summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Annex/AdjustedBranch.hs23
-rw-r--r--Command/Sync.hs25
-rw-r--r--doc/design/adjusted_branches.mdwn21
3 files changed, 45 insertions, 24 deletions
diff --git a/Annex/AdjustedBranch.hs b/Annex/AdjustedBranch.hs
index ef6d873df..65f95a13f 100644
--- a/Annex/AdjustedBranch.hs
+++ b/Annex/AdjustedBranch.hs
@@ -222,28 +222,27 @@ adjustedBranchCommitMessage = "git-annex adjusted branch"
- branch into it. -}
updateAdjustedBranch :: Branch -> (OrigBranch, Adjustment) -> Git.Branch.CommitMode -> Annex Bool
updateAdjustedBranch tomerge (origbranch, adj) commitmode = catchBoolIO $
- join $ preventCommits $ \commitsprevented -> go commitsprevented =<< (,)
+ join $ preventCommits $ \_ -> go =<< (,)
<$> inRepo (Git.Ref.sha tomerge)
<*> inRepo Git.Branch.current
where
- go commitsprevented (Just mergesha, Just currbranch) =
+ go (Just mergesha, Just currbranch) =
ifM (inRepo $ Git.Branch.changed currbranch mergesha)
( do
- propigateAdjustedCommits' origbranch (adj, currbranch) commitsprevented
adjustedtomerge <- adjust adj mergesha
ifM (inRepo $ Git.Branch.changed currbranch adjustedtomerge)
- ( return $ do
+ ( return $
-- Run after commit lock is dropped.
ifM (autoMergeFrom adjustedtomerge (Just currbranch) commitmode)
- ( preventCommits $ \commitsprevented' ->
- recommit commitsprevented' currbranch mergesha =<< catCommit currbranch
+ ( preventCommits $ \_ ->
+ recommit currbranch mergesha =<< catCommit currbranch
, return False
)
, nochangestomerge
)
, nochangestomerge
)
- go _ _ = return $ return False
+ go _ = return $ return False
nochangestomerge = return $ return True
{- Once a merge commit has been made, re-do it, removing
- the old version of the adjusted branch as a parent, and
@@ -251,13 +250,15 @@ updateAdjustedBranch tomerge (origbranch, adj) commitmode = catchBoolIO $
-
- Doing this ensures that the same commit Sha is
- always arrived at for a given commit from the merged in branch.
+
+ - Also, update the origbranch.
-}
- recommit commitsprevented currbranch parent (Just commit) = do
+ recommit currbranch parent (Just commit) = do
commitsha <- commitAdjustedTree (commitTree commit) parent
- inRepo $ Git.Branch.update "merging into adjusted branch" currbranch commitsha
- propigateAdjustedCommits' origbranch (adj, currbranch) commitsprevented
+ inRepo $ Git.Branch.update "updating original branch" origbranch parent
+ inRepo $ Git.Branch.update "rebasing adjusted branch on top of updated original branch after merge" currbranch commitsha
return True
- recommit _ _ _ Nothing = return False
+ recommit _ _ Nothing = return False
{- Check for any commits present on the adjusted branch that have not yet
- been propigated to the orig branch, and propigate them.
diff --git a/Command/Sync.hs b/Command/Sync.hs
index 4753a8fdc..42484e3ba 100644
--- a/Command/Sync.hs
+++ b/Command/Sync.hs
@@ -1,7 +1,7 @@
{- git-annex command
-
- Copyright 2011 Joachim Breitner <mail@joachim-breitner.de>
- - Copyright 2011-2014 Joey Hess <id@joeyh.name>
+ - Copyright 2011-2016 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU GPL version 3 or higher.
-}
@@ -243,21 +243,28 @@ commitStaged commitmode commitmessage = do
return True
mergeLocal :: CurrBranch -> CommandStart
-mergeLocal currbranch@(Just branch, _) = go =<< needmerge
+mergeLocal currbranch@(Just branch, madj) = do
+ proptoorig
+ go =<< needmerge
where
syncbranch = syncBranch branch
needmerge = ifM isBareRepo
( return False
, ifM (inRepo $ Git.Ref.exists syncbranch)
- ( inRepo $ Git.Branch.changed branch syncbranch
+ ( inRepo $ Git.Branch.changed branch' syncbranch
, return False
)
)
go False = stop
go True = do
showStart "merge" $ Git.Ref.describe syncbranch
- next $ next $
- merge currbranch Git.Branch.ManualCommit syncbranch
+ next $ next $ merge currbranch Git.Branch.ManualCommit syncbranch
+ branch' = maybe branch (originalToAdjusted branch) madj
+ -- When in an adjusted branch, propigate any changes made to it
+ -- back to the original branch.
+ proptoorig = case madj of
+ Just adj -> propigateAdjustedCommits branch (adj, branch')
+ Nothing -> return ()
mergeLocal (Nothing, _) = stop
pushLocal :: CurrBranch -> CommandStart
@@ -267,13 +274,7 @@ pushLocal b = do
updateSyncBranch :: CurrBranch -> Annex ()
updateSyncBranch (Nothing, _) = noop
-updateSyncBranch (Just branch, madj) = do
- -- When in an adjusted branch, propigate any changes to it back to
- -- the original branch.
- case madj of
- Just adj -> propigateAdjustedCommits branch
- (adj, originalToAdjusted branch adj)
- Nothing -> return ()
+updateSyncBranch (Just branch, _) = do
-- Update the sync branch to match the new state of the branch
inRepo $ updateBranch (syncBranch branch) branch
-- In direct mode, we're operating on some special direct mode
diff --git a/doc/design/adjusted_branches.mdwn b/doc/design/adjusted_branches.mdwn
index 6bc55a177..4d5e40929 100644
--- a/doc/design/adjusted_branches.mdwn
+++ b/doc/design/adjusted_branches.mdwn
@@ -171,7 +171,7 @@ adjust that commit so it does not have adjusted/master as its parent.
|--------------->B''
| |
-Finally, update master, by reverse filtering B''. TODO
+Finally, update master, by reverse filtering B''.
Notice how similar this is to the commit graph. So, "fast-forward"
merging the same B commit from origin/master will lead to an identical
@@ -301,3 +301,22 @@ into adjusted view worktrees.]
* 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.
+
+Bug running git-annex sync in adjusted branch when there is a local change
+that gets committed (or already has been), and remote changes available.
+Both propigateAdjustedCommits and updateAdjustedBranch
+get called in this scenario. Neither order of calling the two works entirely.
+
+The reflog has:
+
+d585d7f HEAD@{1}: rebasing adjusted branch on top of updated original branch
+e51daec HEAD@{2}: merge f7f2b9f3b1d1c97a1ab24f4a94d4a27d84898992: Merge made by the 'recursive' strategy.
+9504e7b HEAD@{3}: rebasing adjusted branch on top of updated original branch
+6c6fd41 HEAD@{4}: commit: add
+
+e51daec has ok correct history; it gets messed up in d585d7f
+
+Problem is just, that the commit made to the adjusted branch
+is left out of the history.