summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Command/Fsck.hs40
-rw-r--r--GitAnnex/Options.hs4
-rw-r--r--Seek.hs20
-rw-r--r--debian/changelog5
-rw-r--r--doc/git-annex.mdwn12
5 files changed, 56 insertions, 25 deletions
diff --git a/Command/Fsck.hs b/Command/Fsck.hs
index ce1a28989..dd2d81ecf 100644
--- a/Command/Fsck.hs
+++ b/Command/Fsck.hs
@@ -33,6 +33,7 @@ import qualified Option
import Types.Key
import Utility.HumanTime
import Git.FilePath
+import GitAnnex.Options
#ifndef __WINDOWS__
import System.Posix.Process (getProcessID)
@@ -45,7 +46,7 @@ import System.Posix.Types (EpochTime)
import System.Locale
def :: [Command]
-def = [withOptions options $ command "fsck" paramPaths seek
+def = [withOptions fsckOptions $ command "fsck" paramPaths seek
SectionMaintenance "check for problems"]
fromOption :: Option
@@ -61,9 +62,10 @@ incrementalScheduleOption :: Option
incrementalScheduleOption = Option.field [] "incremental-schedule" paramTime
"schedule incremental fscking"
-options :: [Option]
-options =
- [ fromOption
+fsckOptions :: [Option]
+fsckOptions =
+ [ allOption
+ , fromOption
, startIncrementalOption
, moreIncrementalOption
, incrementalScheduleOption
@@ -72,8 +74,9 @@ options =
seek :: [CommandSeek]
seek =
[ withField fromOption Remote.byNameWithUUID $ \from ->
- withIncremental $ \i -> withFilesInGit $ whenAnnexed $ start from i
- , withIncremental $ \i -> withBarePresentKeys $ startBare i
+ withIncremental $ \i ->
+ withAll (startAll i) $
+ withFilesInGit $ whenAnnexed $ start from i
]
withIncremental :: (Incremental -> CommandSeek) -> CommandSeek
@@ -170,26 +173,15 @@ performRemote key file backend numcopies remote =
)
dummymeter _ = noop
-{- To fsck a bare repository, fsck each key in the location log. -}
-withBarePresentKeys :: (Key -> CommandStart) -> CommandSeek
-withBarePresentKeys a params = isBareRepo >>= go
- where
- go False = return []
- go True = do
- unless (null params) $
- error "fsck should be run without parameters in a bare repository"
- map a <$> loggedKeys
-
-startBare :: Incremental -> Key -> CommandStart
-startBare inc key = case Backend.maybeLookupBackendName (Types.Key.keyBackendName key) of
+startAll :: Incremental -> Key -> CommandStart
+startAll inc key = case Backend.maybeLookupBackendName (Types.Key.keyBackendName key) of
Nothing -> stop
- Just backend -> runFsck inc (key2file key) key $ performBare key backend
+ Just backend -> runFsck inc (key2file key) key $ performAll key backend
-{- Note that numcopies cannot be checked in a bare repository, because
- - getting the numcopies value requires a working copy with .gitattributes
- - files. -}
-performBare :: Key -> Backend -> Annex Bool
-performBare key backend = check
+{- Note that numcopies cannot be checked in --all mode, since we do not
+ - have associated filenames to look up in the .gitattributes file. -}
+performAll :: Key -> Backend -> Annex Bool
+performAll key backend = check
[ verifyLocationLog key (key2file key)
, checkKeySize key
, checkBackend backend key Nothing
diff --git a/GitAnnex/Options.hs b/GitAnnex/Options.hs
index 7710c2ff2..350e54513 100644
--- a/GitAnnex/Options.hs
+++ b/GitAnnex/Options.hs
@@ -58,3 +58,7 @@ options = Option.common ++
setgitconfig v = Annex.changeGitRepo =<< inRepo (Git.Config.store v)
trustArg t = ReqArg (Remote.forceTrust t) paramRemote
+
+allOption :: Option
+allOption = Option ['A'] ["all"] (NoArg (Annex.setFlag "all"))
+ "operate on all versions of all files"
diff --git a/Seek.hs b/Seek.hs
index 76b3ed3a4..4cd4c10a2 100644
--- a/Seek.hs
+++ b/Seek.hs
@@ -4,7 +4,7 @@
- the values a user passes to a command, and prepare actions operating
- on them.
-
- - Copyright 2010-2012 Joey Hess <joey@kitenet.net>
+ - Copyright 2010-2013 Joey Hess <joey@kitenet.net>
-
- Licensed under the GNU GPL version 3 or higher.
-}
@@ -24,6 +24,7 @@ import qualified Git.LsFiles as LsFiles
import qualified Limit
import qualified Option
import Config
+import Logs.Location
seekHelper :: ([FilePath] -> Git.Repo -> IO ([FilePath], IO Bool)) -> [FilePath] -> Annex [FilePath]
seekHelper a params = do
@@ -121,6 +122,23 @@ withNothing :: CommandStart -> CommandSeek
withNothing a [] = return [a]
withNothing _ _ = error "This command takes no parameters."
+{- If --all is specified, runs an action on all logged keys.
+ - Otherwise, fall back to a regular CommandSeek action on
+ - whatever params were passed. -}
+withAll :: (Key -> CommandStart) -> CommandSeek -> CommandSeek
+withAll allop fallbackop params = go =<< (Annex.getFlag "all" <||> isbare)
+ where
+ go False = fallbackop params
+ go True = do
+ whenM (Annex.getState Annex.auto) $
+ ifM isbare
+ ( error "Cannot use --auto in a bare repository."
+ , error "Cannot use --auto with --all."
+ )
+ unless (null params) $
+ error "Cannot mix --all with file names."
+ map allop <$> loggedKeys
+ isbare = fromRepo Git.repoIsLocalBare
prepFiltered :: (FilePath -> CommandStart) -> Annex [FilePath] -> Annex [CommandStart]
prepFiltered a fs = do
diff --git a/debian/changelog b/debian/changelog
index 7a3f647dc..e02188bd6 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,5 +1,10 @@
git-annex (4.20130628) UNRELEASED; urgency=low
+ * --all: New switch that makes git-annex operate on all data stored
+ in the git annex, including old versions of files. Supported by
+ fsck, get, drop, move, copy, migrate.
+ * get, drop, move, copy, migrate: Can now be run in a bare repository,
+ like fsck already could. --all is enabled automatically in this case.
* webapp: Fix ssh setup with nonstandard port, broken in last release.
-- Joey Hess <joeyh@debian.org> Tue, 02 Jul 2013 15:40:55 -0400
diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn
index 7d77d8b71..e3d6ef4dc 100644
--- a/doc/git-annex.mdwn
+++ b/doc/git-annex.mdwn
@@ -602,6 +602,18 @@ subdirectories).
will only do so when needed to help satisfy the setting of annex.numcopies,
and preferred content configuration.
+* --all
+
+ Operate on all data that has been stored in the git annex,
+ including old versions of files. This is the default behavior when
+ running git-annex in a bare repository; in a non-bare repository the
+ normal behavior is to only operate on specified files in the working
+ tree.
+
+ Note that using --all makes .gitattributes annex.numcopies settings
+ not be honored. Other numcopies settings are still taken into account.
+ --all cannot be combined with --auto.
+
* --quiet
Avoid the default verbose display of what is done; only show errors