avoid sync pushing view branches to remotes, and better view branch names

* sync: Avoid pushing view branches to remotes.
* Changed the name of view branches to include the parent branch.
  Existing view branches checked out using an old name will still work.

It does not seem useful for sync to push view branches around, because
the information in a view branch can entirely be derived from other
information in git. And sync doesn't push adjusted branches around either.

The better view branch names make it more in line with adjusted branch
names, but were also needed to make fromViewBranch be able to return the
original branch name.

Kept the old view branch names still working. But, when those branches
exist in a repo, sync will still try to push them as before. Avoiding
that would need more complicated and/or expensive changes to sync.

Sponsored-By: Boyd Stephen Smith Jr. on Patreon
This commit is contained in:
Joey Hess 2023-02-08 13:55:55 -04:00
parent b9d59cf721
commit a11d6e0baf
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
3 changed files with 49 additions and 17 deletions

View file

@ -4,7 +4,7 @@
-
- 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.
-}
@ -17,6 +17,7 @@ module Logs.View (
removeView,
recentViews,
branchView,
fromViewBranch,
is_branchView,
prop_branchView_legal,
) where
@ -58,7 +59,8 @@ currentView :: Annex (Maybe View)
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
@ -67,17 +69,28 @@ branchViewPrefix = "refs/heads/views"
{- 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))
@ -96,9 +109,22 @@ branchView view
| 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