diff options
author | Joey Hess <joey@kitenet.net> | 2013-12-15 14:46:29 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2013-12-15 14:52:09 -0400 |
commit | 0ca7ec1752419b9245373f5063c7c86e52ef2e9a (patch) | |
tree | d368bc5367f5549c75ddbed0bf10407ce66e41f5 | |
parent | 3d1b94998a0aff3d08cf8648ae977614412e8138 (diff) |
Add plumbing-level lookupkey examinekey command.
find --format: Added hashdirlower, hashdirmixed, keyname, and mtime format
variables.
-rw-r--r-- | Command/ExamineKey.hs | 27 | ||||
-rw-r--r-- | Command/Find.hs | 46 | ||||
-rw-r--r-- | Command/LookupKey.hs | 2 | ||||
-rw-r--r-- | GitAnnex.hs | 2 | ||||
-rw-r--r-- | debian/changelog | 4 | ||||
-rw-r--r-- | doc/git-annex.mdwn | 19 | ||||
-rw-r--r-- | doc/internals/hashing.mdwn | 16 |
7 files changed, 91 insertions, 25 deletions
diff --git a/Command/ExamineKey.hs b/Command/ExamineKey.hs new file mode 100644 index 000000000..7dfdadd3d --- /dev/null +++ b/Command/ExamineKey.hs @@ -0,0 +1,27 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess <joey@kitenet.net> + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.ExamineKey where + +import Common.Annex +import Command +import qualified Utility.Format +import Command.Find (formatOption, withFormat, showFormatted, keyVars) +import Types.Key + +def :: [Command] +def = [noCommit $ noMessages $ withOptions [formatOption] $ + command "examinekey" (paramRepeating paramKey) seek + SectionPlumbing "prints information from a key"] + +seek :: [CommandSeek] +seek = [withFormat $ \f -> withKeys $ start f] + +start :: Maybe Utility.Format.Format -> Key -> CommandStart +start format key = do + showFormatted format (key2file key) (keyVars key) + stop diff --git a/Command/Find.hs b/Command/Find.hs index 4b8c7ce0e..0591e657e 100644 --- a/Command/Find.hs +++ b/Command/Find.hs @@ -26,6 +26,9 @@ def = [noCommit $ noMessages $ withOptions [formatOption, print0Option] $ formatOption :: Option formatOption = Option.field [] "format" paramFormat "control format of output" +withFormat :: (Maybe Utility.Format.Format -> CommandSeek) -> CommandSeek +withFormat = withField formatOption $ return . fmap Utility.Format.gen + print0Option :: Option print0Option = Option.Option [] ["print0"] (Option.NoArg set) "terminate output with null" @@ -33,29 +36,36 @@ print0Option = Option.Option [] ["print0"] (Option.NoArg set) set = Annex.setField (Option.name formatOption) "${file}\0" seek :: [CommandSeek] -seek = [withField formatOption formatconverter $ \f -> - withFilesInGit $ whenAnnexed $ start f] - where - formatconverter = return . fmap Utility.Format.gen +seek = [withFormat $ \f -> withFilesInGit $ whenAnnexed $ start f] start :: Maybe Utility.Format.Format -> FilePath -> (Key, Backend) -> CommandStart start format file (key, _) = do -- only files inAnnex are shown, unless the user has requested -- others via a limit whenM (limited <||> inAnnex key) $ - unlessM (showFullJSON vars) $ - case format of - Nothing -> liftIO $ putStrLn file - Just formatter -> liftIO $ putStr $ - Utility.Format.format formatter $ - M.fromList vars + showFormatted format file $ ("file", file) : keyVars key stop + +showFormatted :: Maybe Utility.Format.Format -> String -> [(String, String)] -> Annex () +showFormatted format unformatted vars = + unlessM (showFullJSON vars) $ + case format of + Nothing -> liftIO $ putStrLn unformatted + Just formatter -> liftIO $ putStr $ + Utility.Format.format formatter $ + M.fromList vars + +keyVars :: Key -> [(String, String)] +keyVars key = + [ ("key", key2file key) + , ("backend", keyBackendName key) + , ("bytesize", size show) + , ("humansize", size $ roughSize storageUnits True) + , ("keyname", keyName key) + , ("hashdirlower", hashDirLower key) + , ("hashdirmixed", hashDirMixed key) + , ("mtime", whenavail show $ keyMtime key) + ] where - vars = - [ ("file", file) - , ("key", key2file key) - , ("backend", keyBackendName key) - , ("bytesize", size show) - , ("humansize", size $ roughSize storageUnits True) - ] - size c = maybe "unknown" c $ keySize key + size c = whenavail c $ keySize key + whenavail = maybe "unknown" diff --git a/Command/LookupKey.hs b/Command/LookupKey.hs index 7964213fe..aa83266cb 100644 --- a/Command/LookupKey.hs +++ b/Command/LookupKey.hs @@ -13,7 +13,7 @@ import Annex.CatFile import Types.Key def :: [Command] -def = [notBareRepo $ +def = [notBareRepo $ noCommit $ noMessages $ command "lookupkey" (paramRepeating paramFile) seek SectionPlumbing "looks up key used for file"] diff --git a/GitAnnex.hs b/GitAnnex.hs index 8ea0c9569..326b7641c 100644 --- a/GitAnnex.hs +++ b/GitAnnex.hs @@ -21,6 +21,7 @@ import qualified Command.Move import qualified Command.Copy import qualified Command.Get import qualified Command.LookupKey +import qualified Command.ExamineKey import qualified Command.FromKey import qualified Command.DropKey import qualified Command.TransferKey @@ -126,6 +127,7 @@ cmds = concat , Command.Ungroup.def , Command.Vicfg.def , Command.LookupKey.def + , Command.ExamineKey.def , Command.FromKey.def , Command.DropKey.def , Command.TransferKey.def diff --git a/debian/changelog b/debian/changelog index f39df1f8d..2fabec04f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,7 +1,9 @@ git-annex (5.20131214) UNRELEASED; urgency=low * Fix test suite to cover lock --force change. - * Add plumbing-level lookupkey command. + * Add plumbing-level lookupkey and examinekey commands. + * find --format: Added hashdirlower, hashdirmixed, keyname, and mtime + format variables. -- Joey Hess <joeyh@debian.org> Sun, 15 Dec 2013 13:32:49 -0400 diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn index 5d61b8b40..692641caf 100644 --- a/doc/git-annex.mdwn +++ b/doc/git-annex.mdwn @@ -601,7 +601,7 @@ subdirectories). `--format`. The default output format is the same as `--format='${file}\\n'` These variables are available for use in formats: file, key, backend, - bytesize, humansize + bytesize, humansize, keyname, hashdirlower, hashdirmixed, mtime. * `whereis [path ...]` @@ -734,6 +734,23 @@ subdirectories). the file is not added to git, or is not a git-annex managed file), nothing is output, and it exits nonzero. +* `examinekey [key ...]` + + This plumbing-level command is given a key, and prints information + that can be determined purely by looking at the key. + + To specify what information to print, use `--format`. Or use `--json` + to get all available information in JSON format. + + The same variables can be used in the format string as can be used in + the format string of git annex find (except there is no file option + here). + + For example, the location a key's value is stored (in indirect mode) + can be looked up by running: + + git annex examinekey --format='.git/annex/objects/${hashdirmixed}${key}/${key}' + * `fromkey key file` This plumbing-level command can be used to manually set up a file diff --git a/doc/internals/hashing.mdwn b/doc/internals/hashing.mdwn index f479cfc47..cc4bc6456 100644 --- a/doc/internals/hashing.mdwn +++ b/doc/internals/hashing.mdwn @@ -2,10 +2,18 @@ In both the .git/annex directory and the git-annex branch, two levels of hash directories are used, to avoid issues with too many files in one directory. -Two separate hash methods are used. One, the old hash format, is only used -for non-bare git repositories. The other, the new hash format, is used for -bare git repositories, the git-annex branch, and on special remotes as -well. +Two separate hash methods are used. + +* hashdirmixed is only used for non-bare git repositories. + (We'd like to stop using this, but it'd be too annoying to change + all the git-annex symlinks!) + +* hashdirlower is used for bare git repositories, the + git-annex branch, and on special remotes as well. + +Note that `git annex find` and `git annex examinekey` can be used with +the `--format` option to find the hash directories. The explanation +below is only for completeness. ## new hash format |