commitMsg,
pushBranch,
updateBranch,
- syncBranch,
updateBranches,
seekExportContent,
parseUnrelatedHistoriesOption,
import Logs.UUID
import Logs.Export
import Logs.PreferredContent
+import Logs.View (fromViewBranch)
import Annex.AutoMerge
import Annex.AdjustedBranch
import Annex.AdjustedBranch.Merge
(b, _) -> autoMergeFrom tomerge b mergeconfig commitmode canresolvemerge
syncBranch :: Git.Branch -> Git.Branch
-syncBranch = Git.Ref.underBase "refs/heads/synced" . fromAdjustedBranch
+syncBranch = Git.Ref.underBase "refs/heads/synced" . origBranch
+
+origBranch :: Git.Branch -> Git.Branch
+origBranch = fromViewBranch . fromAdjustedBranch
remoteBranch :: Remote -> Git.Ref -> Git.Ref
remoteBranch remote = Git.Ref.underBase $ "refs/remotes/" ++ Remote.name remote
(mapM (merge currbranch mergeconfig o Git.Branch.ManualCommit . remoteBranch remote) =<< getlist)
tomerge = filterM (changed remote)
branchlist Nothing = []
- branchlist (Just branch) = [fromAdjustedBranch branch, syncBranch branch]
+ branchlist (Just branch) = [origBranch branch, syncBranch branch]
pushRemote :: SyncOptions -> Remote -> CurrBranch -> CommandStart
pushRemote _o _remote (Nothing, _) = stop
pushBranch remote mbranch ms g = directpush `after` annexpush `after` syncpush
where
syncpush = flip Git.Command.runBool g $ pushparams $ catMaybes
- [ (refspec . fromAdjustedBranch) <$> mbranch
+ [ (refspec . origBranch) <$> mbranch
, Just $ Git.Branch.forcePush $ refspec Annex.Branch.name
]
annexpush = void $ tryIO $ flip Git.Command.runQuiet g $ pushparams
-- will want to see that one.
Just branch -> do
let p = flip Git.Command.gitCreateProcess g $ pushparams
- [ Git.fromRef $ Git.Ref.base $ fromAdjustedBranch branch ]
+ [ Git.fromRef $ Git.Ref.base $ origBranch branch ]
(transcript, ok) <- processTranscript' p Nothing
when (not ok && not ("denyCurrentBranch" `isInfixOf` transcript)) $
hPutStr stderr transcript
-
- This file is stored locally in .git/annex/, not in the git-annex branch.
-
- - Copyright 2014 Joey Hess <id@joeyh.name>
+ - Copyright 2014-2023 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU AGPL version 3 or higher.
-}
removeView,
recentViews,
branchView,
+ fromViewBranch,
is_branchView,
prop_branchView_legal,
) where
currentView = go =<< inRepo Git.Branch.current
where
go (Just b) | branchViewPrefix `B.isPrefixOf` fromRef' b =
- headMaybe . filter (\v -> branchView v == b) <$> recentViews
+ headMaybe . filter (\v -> branchView v == b || branchViewOld v == b)
+ <$> recentViews
go _ = return Nothing
branchViewPrefix :: B.ByteString
{- Generates a git branch name for a View.
-
- There is no guarantee that each view gets a unique branch name,
- - but the branch name is used to express the view as well as possible.
+ - but the branch name is used to express the view as well as possible
+ - given the constraints on git branch names. It includes the name of the
+ - parent branch, and what metadata is used.
-}
branchView :: View -> Git.Branch
-branchView view
- | B.null name = Git.Ref branchViewPrefix
- | otherwise = Git.Ref $ branchViewPrefix <> "/" <> name
+branchView view = Git.Ref $
+ branchViewPrefix <> "/" <> basebranch
+ <> "(" <> branchViewDesc view False <> ")"
+ where
+ basebranch = fromRef' (Git.Ref.base (viewParentBranch view))
+
+{- Old name used for a view did not include the name of the parent branch. -}
+branchViewOld :: View -> Git.Branch
+branchViewOld view = Git.Ref $
+ branchViewPrefix <> "/" <> branchViewDesc view True
+
+branchViewDesc :: View -> Bool -> B.ByteString
+branchViewDesc view pareninvisibles = encodeBS $
+ intercalate ";" $ map branchcomp (viewComponents view)
where
- name = encodeBS $
- intercalate ";" $ map branchcomp (viewComponents view)
branchcomp c
- | viewVisible c = branchcomp' c
+ | viewVisible c || not pareninvisibles = branchcomp' c
| otherwise = "(" ++ branchcomp' c ++ ")"
branchcomp' (ViewComponent metafield viewfilter _) = concat
[ forcelegal (T.unpack (fromMetaField metafield))
| otherwise = map (\c -> if isAlphaNum c then c else '_') s
is_branchView :: Git.Branch -> Bool
-is_branchView (Ref b)
- | b == branchViewPrefix = True
- | otherwise = (branchViewPrefix <> "/") `B.isPrefixOf` b
+is_branchView (Ref b) = (branchViewPrefix <> "/") `B.isPrefixOf` b
+
+{- Converts a view branch as generated by branchView (but not by
+ - branchViewOld) back to the parent branch.
+ - Has no effect on other branches. -}
+fromViewBranch :: Git.Branch -> Git.Branch
+fromViewBranch b =
+ let bs = fromRef' b
+ in if (branchViewPrefix <> "/") `B.isPrefixOf` bs
+ then
+ let (branch, _desc) = separate' (== openparen) (B.drop prefixlen bs)
+ in Ref branch
+ else b
+ where
+ prefixlen = B.length branchViewPrefix + 1
+ openparen = fromIntegral (ord '(')
prop_branchView_legal :: View -> Bool
prop_branchView_legal = Git.Ref.legal False . fromRef . branchView