From 2420910ab83ad1111e40deb42a10beb659e3fc0d Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 17 May 2021 14:04:14 -0400 Subject: [PATCH] include info for sameas repos It's not currently possible to exclude a sameas repo using its annex-config-uuid. (Remote.nameToUUID rejects them). Since there's no real documented way to learn those, this seems ok, at least for now. Also it avoids the problem of someone excluding the parent but including the sameas, which would probably make the sameas repo not usable when using the filtered branch. --- Command/FilterBranch.hs | 24 ++++++++++++++++++------ doc/git-annex-filter-branch.mdwn | 10 +++++++--- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/Command/FilterBranch.hs b/Command/FilterBranch.hs index c26aeb3890..acd72c82b2 100644 --- a/Command/FilterBranch.hs +++ b/Command/FilterBranch.hs @@ -15,7 +15,10 @@ import qualified Annex.Branch import Annex.Branch.Transitions (filterBranch, FileTransition(..)) import Annex.HashObject import Annex.Tmp +import Annex.SpecialRemote.Config +import Types.ProposedAccepted import Logs +import Logs.Remote import Git.Types import Git.FilePath import Git.Index @@ -25,6 +28,7 @@ import qualified Git.LsTree as LsTree import qualified Git.Branch as Git import Utility.RawFilePath +import qualified Data.Map as M import qualified Data.Set as S import qualified Data.ByteString.Lazy as L import Data.ByteString.Builder @@ -91,18 +95,27 @@ parseRepositoryOption s h = parseUUIDOption <$> strOption ) mkUUIDMatcher :: [IncludeExclude (DeferredParse UUID)] -> Annex (UUID -> Bool) -mkUUIDMatcher l = mkUUIDMatcher' <$> mapM get l +mkUUIDMatcher l = do + sameasmap <- M.mapMaybe + (toUUID . fromProposedAccepted <$$> M.lookup sameasUUIDField) + <$> remoteConfigMap + mkUUIDMatcher' sameasmap <$> mapM get l where get (Include v) = Include <$> getParsed v get (Exclude v) = Exclude <$> getParsed v get IncludeAll = pure IncludeAll -mkUUIDMatcher' :: [IncludeExclude UUID] -> (UUID -> Bool) -mkUUIDMatcher' l = \u -> - (S.member (Include u) includes || S.member IncludeAll includes) +mkUUIDMatcher' :: M.Map UUID UUID -> [IncludeExclude UUID] -> (UUID -> Bool) +mkUUIDMatcher' sameasmap l = \u -> + let sameas = M.lookup u sameasmap + in ( S.member (Include u) includes + || S.member IncludeAll includes + || maybe False (\u' -> S.member (Include u') includes) sameas + ) && S.notMember (Exclude u) excludes + && maybe True (\u' -> S.notMember (Exclude u') excludes) sameas where - (includes, excludes) = S.partition isInclude (S.fromList l) + (includes, excludes) = (S.partition isInclude (S.fromList l)) seek :: FilterBranchOptions -> CommandSeek seek o = withOtherTmp $ \tmpdir -> do @@ -159,7 +172,6 @@ seek o = withOtherTmp $ \tmpdir -> do -- Add repository configs for all repositories that are -- being included. - -- TODO need to include configs for sameas remotes forM_ topLevelUUIDBasedLogs $ \f -> filterbanch repoconfigmatcher f =<< Annex.Branch.get f diff --git a/doc/git-annex-filter-branch.mdwn b/doc/git-annex-filter-branch.mdwn index 328a26ee0e..9f6e2c4fcf 100644 --- a/doc/git-annex-filter-branch.mdwn +++ b/doc/git-annex-filter-branch.mdwn @@ -26,11 +26,15 @@ branch. Use options to specify what to include. All options can be specified multiple times. Note that, when the repository contains information about a private -repository (due to `annex.private` being set, or `--private` being used -with [[git-annex-initremote](1)), that private information will be included -when allowed by the options, even though it is not recorded on the git-annex +repository (due to `annex.private` being set, or `git-annex initremote +--private` being used), that private information will be included when +allowed by the options, even though it is not recorded on the git-annex branch. +When a repository was created with `git annex initremote --sameas=foo`, +its information will be included when the information for foo is, +and excluded when foo is excluded. + # OPTIONS * `path`