diff options
author | Joey Hess <joey@kitenet.net> | 2013-07-03 13:02:42 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2013-07-03 13:12:53 -0400 |
commit | e5eeb401d1743372102ec4064b6f87453fdc8597 (patch) | |
tree | e514cd35000d83fe79c58f687ca32cc96f726072 | |
parent | 2850dd6ad6aeb37e03d0746c10dfeb453a5e2aad (diff) |
Add --all option, and support it for fsck
-rw-r--r-- | Command/Fsck.hs | 40 | ||||
-rw-r--r-- | GitAnnex/Options.hs | 4 | ||||
-rw-r--r-- | Seek.hs | 20 | ||||
-rw-r--r-- | debian/changelog | 5 | ||||
-rw-r--r-- | doc/git-annex.mdwn | 12 |
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" @@ -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 |