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
|
{- 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
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
|
* 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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Add table
Reference in a new issue