summaryrefslogtreecommitdiff
path: root/Command/LookupKey.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Command/LookupKey.hs')
-rw-r--r--Command/LookupKey.hs20
1 files changed, 16 insertions, 4 deletions
diff --git a/Command/LookupKey.hs b/Command/LookupKey.hs
index 609fe562e..1a2a57f22 100644
--- a/Command/LookupKey.hs
+++ b/Command/LookupKey.hs
@@ -1,6 +1,6 @@
{- git-annex command
-
- - Copyright 2013 Joey Hess <id@joeyh.name>
+ - Copyright 2013-2017 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU GPL version 3 or higher.
-}
@@ -9,6 +9,7 @@ module Command.LookupKey where
import Command
import Annex.CatFile
+import qualified Git.LsFiles
cmd :: Command
cmd = notBareRepo $ noCommit $ noMessages $
@@ -18,10 +19,21 @@ cmd = notBareRepo $ noCommit $ noMessages $
(batchable run (pure ()))
run :: () -> String -> Annex Bool
-run _ file = do
- mk <- catKeyFile file
- case mk of
+run _ file = seekSingleGitFile file >>= \case
+ Nothing -> return False
+ Just file' -> catKeyFile file' >>= \case
Just k -> do
liftIO $ putStrLn $ key2file k
return True
Nothing -> return False
+
+-- To support absolute filenames, pass through git ls-files.
+-- But, this plumbing command does not recurse through directories.
+seekSingleGitFile :: FilePath -> Annex (Maybe FilePath)
+seekSingleGitFile file = do
+ (l, cleanup) <- inRepo (Git.LsFiles.inRepo [file])
+ r <- case l of
+ (f:[]) | takeFileName f == takeFileName file -> return (Just f)
+ _ -> return Nothing
+ void $ liftIO cleanup
+ return r