diff --git a/Annex/Export.hs b/Annex/Export.hs index 60039ef3b9..4ce30e2fca 100644 --- a/Annex/Export.hs +++ b/Annex/Export.hs @@ -11,16 +11,13 @@ module Annex.Export where import Annex import Annex.CatFile +import Annex.GitShaKey import Types -import Types.Key import qualified Git import qualified Types.Remote as Remote import Git.Quote import Messages -import Data.Maybe -import qualified Data.ByteString.Short as S (fromShort, toShort) - -- From a sha pointing to the content of a file to the key -- to use to export it. When the file is annexed, it's the annexed key. -- When the file is stored in git, it's a special type of key to indicate @@ -31,31 +28,6 @@ exportKey sha = mk <$> catKey sha mk (Just k) = k mk Nothing = gitShaKey sha --- Encodes a git sha as a key. This is used to represent a non-annexed --- file that is stored on a special remote, which necessarily needs a --- key. --- --- This is not the same as a SHA1 key, because the mapping needs to be --- bijective, also because git may not always use SHA1, and because git --- takes a SHA1 of the file size + content, while git-annex SHA1 keys --- only checksum the content. -gitShaKey :: Git.Sha -> Key -gitShaKey (Git.Ref s) = mkKey $ \kd -> kd - { keyName = S.toShort s - , keyVariety = OtherKey "GIT" - } - --- Reverse of gitShaKey -keyGitSha :: Key -> Maybe Git.Sha -keyGitSha k - | fromKey keyVariety k == OtherKey "GIT" = - Just (Git.Ref (S.fromShort (fromKey keyName k))) - | otherwise = Nothing - --- Is a key storing a git sha, and not used for an annexed file? -isGitShaKey :: Key -> Bool -isGitShaKey = isJust . keyGitSha - warnExportImportConflict :: Remote -> Annex () warnExportImportConflict r = do isimport <- Remote.isImportSupported r diff --git a/Annex/GitShaKey.hs b/Annex/GitShaKey.hs new file mode 100644 index 0000000000..1413039c51 --- /dev/null +++ b/Annex/GitShaKey.hs @@ -0,0 +1,41 @@ +{- Encoding a git sha as a Key + - + - Copyright 2017-2025 Joey Hess + - + - Licensed under the GNU AGPL version 3 or higher. + -} + +{-# LANGUAGE OverloadedStrings #-} + +module Annex.GitShaKey where + +import Types +import Types.Key +import qualified Git + +import Data.Maybe +import qualified Data.ByteString.Short as S (fromShort, toShort) + +-- Encodes a git sha as a Key. This is used to represent a non-annexed +-- file. For example, when storing a git sha on a special remote. +-- +-- This is not the same as a SHA1 key, because the mapping needs to be +-- bijective, also because git may not always use SHA1, and because git +-- takes a SHA1 of the file size + content, while git-annex SHA1 keys +-- only checksum the content. +gitShaKey :: Git.Sha -> Key +gitShaKey (Git.Ref s) = mkKey $ \kd -> kd + { keyName = S.toShort s + , keyVariety = OtherKey "GIT" + } + +-- Reverse of gitShaKey +keyGitSha :: Key -> Maybe Git.Sha +keyGitSha k + | fromKey keyVariety k == OtherKey "GIT" = + Just (Git.Ref (S.fromShort (fromKey keyName k))) + | otherwise = Nothing + +-- Is a key storing a git sha, and not used for an annexed file? +isGitShaKey :: Key -> Bool +isGitShaKey = isJust . keyGitSha diff --git a/Annex/Import.hs b/Annex/Import.hs index 2e86df920d..2d2526a544 100644 --- a/Annex/Import.hs +++ b/Annex/Import.hs @@ -38,12 +38,12 @@ import qualified Annex import Annex.Link import Annex.LockFile import Annex.Content -import Annex.Export import Annex.RemoteTrackingBranch import Annex.HashObject import Annex.Transfer import Annex.CheckIgnore import Annex.CatFile +import Annex.GitShaKey import Annex.VectorClock import Annex.SpecialRemote.Config import Command diff --git a/Command/Export.hs b/Command/Export.hs index b4acaac401..3be1a67c93 100644 --- a/Command/Export.hs +++ b/Command/Export.hs @@ -26,6 +26,7 @@ import Types.Remote import Types.Export import Annex.Export import Annex.Content +import Annex.GitShaKey import Annex.Transfer import Annex.CatFile import Annex.FileMatcher diff --git a/git-annex.cabal b/git-annex.cabal index 88203be956..2123b73663 100644 --- a/git-annex.cabal +++ b/git-annex.cabal @@ -562,6 +562,7 @@ Executable git-annex Annex.FileMatcher Annex.Fixup Annex.GitOverlay + Annex.GitShaKey Annex.HashObject Annex.Hook Annex.Import