diff options
author | Joey Hess <joey@kitenet.net> | 2013-08-20 10:27:24 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2013-08-20 10:27:24 -0400 |
commit | 3254d62ee15c438d3276b73bb71895567737910e (patch) | |
tree | d458a75e364ee26d8fe14f81455dc7fddb7a2e75 | |
parent | 546a90ac59c8ddb687e7fd8ba7f22e0022dd501a (diff) | |
parent | 3a2dfa4044875a73c7c96275304fda8ffe4dc637 (diff) |
Merge branch 'duplicate'
Conflicts:
debian/changelog
-rw-r--r-- | Command/Import.hs | 54 | ||||
-rw-r--r-- | debian/changelog | 2 | ||||
-rw-r--r-- | doc/git-annex.mdwn | 22 | ||||
-rw-r--r-- | doc/related_software.mdwn | 1 |
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. |