include info for sameas repos
authorJoey Hess <joeyh@joeyh.name>
Mon, 17 May 2021 18:04:14 +0000 (14:04 -0400)
committerJoey Hess <joeyh@joeyh.name>
Mon, 17 May 2021 18:04:14 +0000 (14:04 -0400)
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
doc/git-annex-filter-branch.mdwn

index c26aeb3890f77349601d46b850370790ae4a62b9..acd72c82b28e5ecb940971f2160ba788b3b052d0 100644 (file)
@@ -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
index 328a26ee0ea45c8f3600d361e59fe8abd90a7a4e..9f6e2c4fcf73e95623678698581aeac089d52307 100644 (file)
@@ -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`