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
-
- 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"]
seek :: [CommandSeek]
seek = [withPathContents start]
opts :: [Option]
opts =
[ duplicateOption
, deduplicateOption
, cleanDuplicatesOption
]
start :: (FilePath, FilePath) -> CommandStart
start (srcfile, destfile) =
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 = [withValue getDuplicateMode $ \mode -> withPathContents $ start mode]
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

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
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

View file

@ -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

View file

@ -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.