summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2013-08-20 10:27:24 -0400
committerGravatar Joey Hess <joey@kitenet.net>2013-08-20 10:27:24 -0400
commit3254d62ee15c438d3276b73bb71895567737910e (patch)
treed458a75e364ee26d8fe14f81455dc7fddb7a2e75
parent546a90ac59c8ddb687e7fd8ba7f22e0022dd501a (diff)
parent3a2dfa4044875a73c7c96275304fda8ffe4dc637 (diff)
Merge branch 'duplicate'
Conflicts: debian/changelog
-rw-r--r--Command/Import.hs54
-rw-r--r--debian/changelog2
-rw-r--r--doc/git-annex.mdwn22
-rw-r--r--doc/related_software.mdwn1
4 files changed, 70 insertions, 9 deletions
diff --git a/Command/Import.hs b/Command/Import.hs
index 518666af9..56fe9c7ab 100644
--- a/Command/Import.hs
+++ b/Command/Import.hs
@@ -1,6 +1,6 @@
{- git-annex command
-
- - Copyright 2012 Joey Hess <joey@kitenet.net>
+ - Copyright 2012-2013 Joey Hess <joey@kitenet.net>
-
- Licensed under the GNU GPL version 3 or higher.
-}
@@ -13,30 +13,66 @@ import Common.Annex
import Command
import qualified Annex
import qualified Command.Add
+import qualified Option
+import Utility.CopyFile
def :: [Command]
-def = [notBareRepo $ command "import" paramPaths seek
+def = [withOptions opts $ notBareRepo $ command "import" paramPaths seek
SectionCommon "move and add files from outside git working copy"]
+opts :: [Option]
+opts =
+ [ duplicateOption
+ , deduplicateOption
+ , cleanDuplicatesOption
+ ]
+
+duplicateOption :: Option
+duplicateOption = Option.flag [] "duplicate" "do not delete outside files"
+
+deduplicateOption :: Option
+deduplicateOption = Option.flag [] "deduplicate" "do not add files whose content has been seen"
+
+cleanDuplicatesOption :: Option
+cleanDuplicatesOption = Option.flag [] "clean-duplicates" "delete outside duplicate files (import nothing)"
+
+data DuplicateMode = Default | Duplicate | DeDuplicate | CleanDuplicates
+ deriving (Eq)
+
+getDuplicateMode :: Annex DuplicateMode
+getDuplicateMode = gen
+ <$> getflag duplicateOption
+ <*> getflag deduplicateOption
+ <*> getflag cleanDuplicatesOption
+ where
+ getflag = Annex.getFlag . Option.name
+ gen False False False = Default
+ gen True False False = Duplicate
+ gen False True False = DeDuplicate
+ gen False False True = CleanDuplicates
+ gen _ _ _ = error "bad combination of --duplicate, --deduplicate, --clean-duplicates"
+
seek :: [CommandSeek]
-seek = [withPathContents start]
+seek = [withValue getDuplicateMode $ \mode -> withPathContents $ start mode]
-start :: (FilePath, FilePath) -> CommandStart
-start (srcfile, destfile) =
+start :: DuplicateMode -> (FilePath, FilePath) -> CommandStart
+start mode (srcfile, destfile) =
ifM (liftIO $ isRegularFile <$> getSymbolicLinkStatus srcfile)
( do
showStart "import" destfile
- next $ perform srcfile destfile
+ next $ perform mode srcfile destfile
, stop
)
-perform :: FilePath -> FilePath -> CommandPerform
-perform srcfile destfile = do
+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 $ moveFile srcfile destfile
+ liftIO $ if mode == Duplicate
+ then void $ copyFileExternal srcfile destfile
+ else moveFile srcfile destfile
Command.Add.perform destfile
diff --git a/debian/changelog b/debian/changelog
index 150307c22..7d1abbf67 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -4,6 +4,8 @@ git-annex (4.20130816) UNRELEASED; urgency=low
* Debian: Recommend ssh-askpass, which ssh will use when the assistant
is run w/o a tty. Closes: #719832
* sync, merge: Bug fix: Don't try to merge into master when in a bare repo.
+ * import: Add options to control handling of duplicate files:
+ --duplicate, --deduplicate, and --clean-duplicates
-- Joey Hess <joeyh@debian.org> Thu, 15 Aug 2013 15:47:52 +0200
diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn
index 60736d579..44abd6943 100644
--- a/doc/git-annex.mdwn
+++ b/doc/git-annex.mdwn
@@ -190,6 +190,28 @@ subdirectories).
git annex import /media/camera/DCIM/
+ By default, importing two files with the same contents from two different
+ locations will result in both files being added to the repository.
+ (With all checksumming backends, including the default SHA256E,
+ only one copy of the data will be stored.)
+
+ To not delete files from the import location, use the
+ --duplicate option. This could allow importing the same files repeatedly
+ to different locations in a repository. More likely, it could be used to
+ import the same files to a number of different branches or separate git
+ repositories.
+
+ To only import files whose content has not been seen before by git-annex,
+ use the --deduplicate option. Duplicate files will be deleted from the
+ import location.
+
+ The --clean-duplicates option does not import any new files, but any files
+ found in the import location that are duplicates of content in the annex
+ are deleted.
+
+ (Note that using --deduplicate or --clean-duplicates with the WORM
+ backend does not look at file content, but filename and mtime.)
+
* importfeed [url ...]
Imports the contents of podcast feeds. Only downloads files whose
diff --git a/doc/related_software.mdwn b/doc/related_software.mdwn
index 4a8bc78ac..024a155e3 100644
--- a/doc/related_software.mdwn
+++ b/doc/related_software.mdwn
@@ -9,3 +9,4 @@ designed to interoperate with it.
is git-annex aware.
* [sizes](http://hackage.haskell.org/package/sizes) is another du-like
utility, with a `-A` switch that enables git-annex support.
+* Emacs Org mode can auto-commit attached files to git-annex.