Merge branch 'duplicate'

Conflicts:
	debian/changelog
This commit is contained in:
Joey Hess 2013-08-20 10:27:24 -04:00
commit e240cb99f7
4 changed files with 71 additions and 10 deletions

View file

@ -1,6 +1,6 @@
{- git-annex command {- 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. - Licensed under the GNU GPL version 3 or higher.
-} -}
@ -13,30 +13,66 @@ import Common.Annex
import Command import Command
import qualified Annex import qualified Annex
import qualified Command.Add import qualified Command.Add
import qualified Option
import Utility.CopyFile
def :: [Command] 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"] SectionCommon "move and add files from outside git working copy"]
seek :: [CommandSeek] opts :: [Option]
seek = [withPathContents start] opts =
[ duplicateOption
, deduplicateOption
, cleanDuplicatesOption
]
start :: (FilePath, FilePath) -> CommandStart duplicateOption :: Option
start (srcfile, destfile) = 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 = [withValue getDuplicateMode $ \mode -> withPathContents $ start mode]
start :: DuplicateMode -> (FilePath, FilePath) -> CommandStart
start mode (srcfile, destfile) =
ifM (liftIO $ isRegularFile <$> getSymbolicLinkStatus srcfile) ifM (liftIO $ isRegularFile <$> getSymbolicLinkStatus srcfile)
( do ( do
showStart "import" destfile showStart "import" destfile
next $ perform srcfile destfile next $ perform mode srcfile destfile
, stop , stop
) )
perform :: FilePath -> FilePath -> CommandPerform perform :: DuplicateMode -> FilePath -> FilePath -> CommandPerform
perform srcfile destfile = do perform mode srcfile destfile = do
whenM (liftIO $ doesFileExist destfile) $ whenM (liftIO $ doesFileExist destfile) $
unlessM (Annex.getState Annex.force) $ unlessM (Annex.getState Annex.force) $
error $ "not overwriting existing " ++ destfile ++ error $ "not overwriting existing " ++ destfile ++
" (use --force to override)" " (use --force to override)"
liftIO $ createDirectoryIfMissing True (parentDir destfile) 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 Command.Add.perform destfile

2
debian/changelog vendored
View file

@ -4,6 +4,8 @@ git-annex (4.20130816) UNRELEASED; urgency=low
* Debian: Recommend ssh-askpass, which ssh will use when the assistant * Debian: Recommend ssh-askpass, which ssh will use when the assistant
is run w/o a tty. Closes: #719832 is run w/o a tty. Closes: #719832
* sync, merge: Bug fix: Don't try to merge into master when in a bare repo. * 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 -- Joey Hess <joeyh@debian.org> Thu, 15 Aug 2013 15:47:52 +0200

View file

@ -190,6 +190,28 @@ subdirectories).
git annex import /media/camera/DCIM/ 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 ...] * importfeed [url ...]
Imports the contents of podcast feeds. Only downloads files whose Imports the contents of podcast feeds. Only downloads files whose

View file

@ -9,3 +9,4 @@ designed to interoperate with it.
is git-annex aware. is git-annex aware.
* [sizes](http://hackage.haskell.org/package/sizes) is another du-like * [sizes](http://hackage.haskell.org/package/sizes) is another du-like
utility, with a `-A` switch that enables git-annex support. utility, with a `-A` switch that enables git-annex support.
* Emacs Org mode can auto-commit attached files to git-annex.