summaryrefslogtreecommitdiff
path: root/Command/Import.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2013-08-20 11:00:52 -0400
committerGravatar Joey Hess <joey@kitenet.net>2013-08-20 11:00:52 -0400
commite7c735c80eaabcb322b6d8f7ef63b7eb774bcdde (patch)
tree1bed6f3a5d0ce28e0799c27b22d6a0fae9a13634 /Command/Import.hs
parent3254d62ee15c438d3276b73bb71895567737910e (diff)
implement import --deduplicate and import --clean-duplicates
Note that --deduplicate currently checksums each file twice, once to see if it's a known key, and once when importing it. Perhaps this could be revisited and the extra checksum gotten rid of, at the cost of not locking down the file when adding it.
Diffstat (limited to 'Command/Import.hs')
-rw-r--r--Command/Import.hs48
1 files changed, 37 insertions, 11 deletions
diff --git a/Command/Import.hs b/Command/Import.hs
index 56fe9c7ab..dcadd96ce 100644
--- a/Command/Import.hs
+++ b/Command/Import.hs
@@ -15,6 +15,9 @@ import qualified Annex
import qualified Command.Add
import qualified Option
import Utility.CopyFile
+import Backend
+import Remote
+import Types.KeySource
def :: [Command]
def = [withOptions opts $ notBareRepo $ command "import" paramPaths seek
@@ -65,14 +68,37 @@ start mode (srcfile, destfile) =
)
perform :: DuplicateMode -> FilePath -> FilePath -> CommandPerform
-perform mode srcfile destfile = do
- whenM (liftIO $ doesFileExist destfile) $
- unlessM (Annex.getState Annex.force) $
- error $ "not overwriting existing " ++ destfile ++
- " (use --force to override)"
-
- liftIO $ createDirectoryIfMissing True (parentDir destfile)
- liftIO $ if mode == Duplicate
- then void $ copyFileExternal srcfile destfile
- else moveFile srcfile destfile
- Command.Add.perform destfile
+perform mode srcfile destfile =
+ case mode of
+ DeDuplicate -> ifM isdup
+ ( deletedup
+ , go
+ )
+ CleanDuplicates -> ifM isdup
+ ( deletedup
+ , next $ return True
+ )
+ _ -> go
+ where
+ isdup = do
+ backend <- chooseBackend destfile
+ let ks = KeySource srcfile srcfile Nothing
+ v <- genKey ks backend
+ case v of
+ Just (k, _) -> not . null <$> keyLocations k
+ _ -> return False
+ deletedup = do
+ showNote "duplicate"
+ liftIO $ removeFile srcfile
+ next $ return True
+ go = do
+ whenM (liftIO $ doesFileExist destfile) $
+ unlessM (Annex.getState Annex.force) $
+ error $ "not overwriting existing " ++ destfile ++
+ " (use --force to override)"
+
+ liftIO $ createDirectoryIfMissing True (parentDir destfile)
+ liftIO $ if mode == Duplicate
+ then void $ copyFileExternal srcfile destfile
+ else moveFile srcfile destfile
+ Command.Add.perform destfile