Merge branch 'duplicate'
Conflicts: debian/changelog
This commit is contained in:
commit
e240cb99f7
4 changed files with 71 additions and 10 deletions
|
@ -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
2
debian/changelog
vendored
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in a new issue