summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2015-03-15 14:07:43 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2015-03-15 14:07:43 -0400
commit96af58d9e0f73ad78f09651e855b20cc27f9113a (patch)
tree2a939a600e11870caf511cf592819282f0d25c63
parent5f7979ffe85e036451bb869e29ca161ad3aa0272 (diff)
fromkey: Add stdin mode.
-rw-r--r--Command/FromKey.hs25
-rw-r--r--debian/changelog1
-rw-r--r--doc/git-annex.mdwn6
3 files changed, 27 insertions, 5 deletions
diff --git a/Command/FromKey.hs b/Command/FromKey.hs
index 7176d97a5..d18fa16cc 100644
--- a/Command/FromKey.hs
+++ b/Command/FromKey.hs
@@ -5,6 +5,8 @@
- Licensed under the GNU GPL version 3 or higher.
-}
+{-# LANGUAGE BangPatterns #-}
+
module Command.FromKey where
import Common.Annex
@@ -33,16 +35,31 @@ start force (keyname:file:[]) = do
"key ("++ keyname ++") is not present in backend (use --force to override this sanity check)"
showStart "fromkey" file
next $ perform key file
+start _ [] = do
+ showStart "fromkey" "stdin"
+ next massAdd
start _ _ = error "specify a key and a dest file"
+massAdd :: CommandPerform
+massAdd = go True =<< map words . lines <$> liftIO getContents
+ where
+ go status [] = next $ return status
+ go status ([keyname,f]:rest) = do
+ let key = fromMaybe (error $ "bad key " ++ keyname) $ file2key keyname
+ ok <- perform' key f
+ let !status' = status && ok
+ go status' rest
+ go status (_:rest) = error "Expected pairs of key and file on stdin, but got something else."
+
perform :: Key -> FilePath -> CommandPerform
perform key file = do
+ ok <- perform' key file
+ next $ return ok
+
+perform' :: Key -> FilePath -> Annex Bool
+perform' key file = do
link <- calcRepo $ gitAnnexLink file key
liftIO $ createDirectoryIfMissing True (parentDir file)
liftIO $ createSymbolicLink link file
- next $ cleanup file
-
-cleanup :: FilePath -> CommandCleanup
-cleanup file = do
Annex.Queue.addCommand "add" [Param "--"] [file]
return True
diff --git a/debian/changelog b/debian/changelog
index d238a32bf..22e7cd6fc 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -36,6 +36,7 @@ git-annex (5.2015022) UNRELEASED; urgency=medium
* git-annex-shell: Improve error message when the specified repository
doesn't exist or git config fails for some reason.
* fromkey --force: Skip test that the key has its content in the annex.
+ * fromkey: Add stdin mode.
-- Joey Hess <id@joeyh.name> Thu, 19 Feb 2015 14:16:03 -0400
diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn
index 254e0883b..3af9bbb8c 100644
--- a/doc/git-annex.mdwn
+++ b/doc/git-annex.mdwn
@@ -952,7 +952,7 @@ subdirectories).
git annex examinekey --format='.git/annex/objects/${hashdirmixed}${key}/${key}'
-* `fromkey key file`
+* `fromkey [key file]`
This plumbing-level command can be used to manually set up a file
in the git repository to link to a specified key.
@@ -960,6 +960,10 @@ subdirectories).
Normally, the annex needs to already contain the content object for the
key. To override this, use --force.
+ If the key and file are not specified on the command line, they are
+ instead read from stdin. Any number of lines can be provided in this
+ mode, each containing a key and filename, sepearated by whitespace.
+
* `dropkey [key ...]`
This plumbing-level command drops the annexed data for the specified