use GIT keys for export of non-annexed files
This solves the problem that import of such files gets confused and converts them back to annexed files. The import code already used GIT keys internally when it determined a file should not be annexed. So now when it sees a GIT key that export used, it already does the right thing. This also means that even older version of git-annex can import and will do the right thing, once a fixed version has exported. Still, there may be other complications around upgrades; still need to think it all through. Moved gitShaKey and keyGitSha from Key to Annex.Export since they're only used for export/import. Documented GIT keys in backends, since they do appear in the git-annex branch now. This commit was sponsored by Graham Spencer on Patreon.
This commit is contained in:
parent
deac6f12b5
commit
fc61915230
6 changed files with 80 additions and 88 deletions
|
@ -1,10 +1,12 @@
|
|||
{- git-annex exports
|
||||
-
|
||||
- Copyright 2017 Joey Hess <id@joeyh.name>
|
||||
- Copyright 2017-2021 Joey Hess <id@joeyh.name>
|
||||
-
|
||||
- Licensed under the GNU AGPL version 3 or higher.
|
||||
-}
|
||||
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
|
||||
module Annex.Export where
|
||||
|
||||
import Annex
|
||||
|
@ -15,31 +17,36 @@ import qualified Git
|
|||
import qualified Types.Remote as Remote
|
||||
import Messages
|
||||
|
||||
import Control.Applicative
|
||||
import Data.Maybe
|
||||
import Prelude
|
||||
|
||||
-- An export includes both annexed files and files stored in git.
|
||||
-- For the latter, a SHA1 key is synthesized.
|
||||
data ExportKey = AnnexKey Key | GitKey Key
|
||||
deriving (Show, Eq, Ord)
|
||||
|
||||
asKey :: ExportKey -> Key
|
||||
asKey (AnnexKey k) = k
|
||||
asKey (GitKey k) = k
|
||||
|
||||
exportKey :: Git.Sha -> Annex ExportKey
|
||||
-- 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
|
||||
-- that.
|
||||
exportKey :: Git.Sha -> Annex Key
|
||||
exportKey sha = mk <$> catKey sha
|
||||
where
|
||||
mk (Just k) = AnnexKey k
|
||||
mk Nothing = GitKey $ mkKey $ \k -> k
|
||||
{ keyName = Git.fromRef' sha
|
||||
, keyVariety = SHA1Key (HasExt False)
|
||||
, keySize = Nothing
|
||||
, keyMtime = Nothing
|
||||
, keyChunkSize = Nothing
|
||||
, keyChunkNum = Nothing
|
||||
}
|
||||
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
|
||||
, keyVariety = OtherKey "GIT"
|
||||
}
|
||||
|
||||
-- Reverse of gitShaKey
|
||||
keyGitSha :: Key -> Maybe Git.Sha
|
||||
keyGitSha k
|
||||
| fromKey keyVariety k == OtherKey "GIT" =
|
||||
Just (Git.Ref (fromKey keyName k))
|
||||
| otherwise = Nothing
|
||||
|
||||
warnExportImportConflict :: Remote -> Annex ()
|
||||
warnExportImportConflict r = do
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue