Added --smallerthan and --largerthan limits

This commit is contained in:
Joey Hess 2012-10-08 13:39:18 -04:00
parent 71fd18a97f
commit 7cd81bd978
6 changed files with 38 additions and 9 deletions

View file

@ -147,6 +147,10 @@ options = Option.common ++
"skip files with fewer copies"
, Option ['B'] ["inbackend"] (ReqArg Limit.addInBackend paramName)
"skip files not using a key-value backend"
, Option [] ["largerthan"] (ReqArg Limit.addLargerThan paramName)
"skip files larger than a size"
, Option [] ["smallerthan"] (ReqArg Limit.addSmallerThan paramName)
"skip files smaller than a size"
, Option ['T'] ["time-limit"] (ReqArg Limit.addTimeLimit paramTime)
"stop after the specified amount of time"
] ++ Option.matcher

View file

@ -21,8 +21,10 @@ import Annex.Content
import Annex.UUID
import Logs.Trust
import Types.TrustLevel
import Types.Key
import Logs.Group
import Utility.HumanTime
import Utility.DataUnits
type MatchFiles = AssumeNotPresent -> FilePath -> Annex Bool
type MkLimit = String -> Either String MatchFiles
@ -143,6 +145,21 @@ limitInBackend name = Right $ const $ Backend.lookupFile >=> check
wanted = Backend.lookupBackendName name
check = return . maybe False ((==) wanted . snd)
{- Adds a limit to skip files that are too large or too small -}
addLargerThan :: String -> Annex ()
addLargerThan = addLimit . limitSize (>)
addSmallerThan :: String -> Annex ()
addSmallerThan = addLimit . limitSize (<)
limitSize :: (Maybe Integer -> Maybe Integer -> Bool) -> MkLimit
limitSize vs s = case readSize dataUnits s of
Nothing -> Left "bad size"
Just sz -> Right $ const $ Backend.lookupFile >=> check sz
where
check _ Nothing = return False
check sz (Just (key, _)) = return $ keySize key `vs` Just sz
addTimeLimit :: String -> Annex ()
addTimeLimit s = do
let seconds = fromMaybe (error "bad time-limit") $ parseDuration s

View file

@ -21,7 +21,7 @@ import Common.Annex
import qualified Annex.Branch
import qualified Annex
import Logs.UUIDBased
import Limit (MatchFiles, AssumeNotPresent, limitInclude, limitExclude, limitIn, limitCopies, limitInBackend)
import Limit
import qualified Utility.Matcher
import Annex.UUID
import Git.FilePath
@ -96,6 +96,8 @@ parseToken t
, ("in", limitIn)
, ("copies", limitCopies)
, ("backend", limitInBackend)
, ("largerthan", limitSize (>))
, ("smallerthan", limitSize (<))
]
use a = Utility.Matcher.Operation <$> a v

3
debian/changelog vendored
View file

@ -12,7 +12,8 @@ git-annex (3.20121002) UNRELEASED; urgency=low
* get --auto, copy --auto: If the local repository has preferred content
configured, only get that content.
* drop --auto: If the local repository has preferred content configured,
drop content that is not preferred, if numcopies allows.
drop content that is not preferred, when numcopies allows.
* Added --smallerthan and --largerthan limits.
* Only build-depend on libghc-clientsession-dev on arches that will have
the webapp.
* uninit: Unset annex.version. Closes: #689852

View file

@ -8,9 +8,9 @@ But often the remote is just a removable drive or a cloud remote,
that has a limited size. This page is about making the assistant do
something smart with such remotes.
## specifying what data belongs on a remote
## specifying what data a remote prefers to contain **done**
Imagine a per-remote `annex-accept` setting, that matches things that
Imagine a per-remote preferred content setting, that matches things that
should be stored on the remote.
For example, a MP3 player might use:
@ -23,14 +23,10 @@ A USB drive that is carried between three laptops and used to sync data
between them might use: `not (in=laptop1 and in=laptop2 and in=laptop3)`
In this case, transferring data from the usb repo should
check if `annex-accept` then rejects the data, and if so, drop it
check if preferred content settings rejects the data, and if so, drop it
from the repo. So once all three laptops have the data, it is
pruned from the transfer drive.
It may make sense to have annex-accept info also be stored in the git-annex
branch, for settings that should apply to a repo globally. Does it make
sense to have local configuration too?
## repo groups
Seems like git-annex needs a way to know the groups of repos. Some

View file

@ -643,6 +643,15 @@ file contents are present at either of two repositories.
Matches only files whose content is stored using the specified key-value
backend.
* --smallerthan=size
* --largerthan=size
Matches only files whose content is smaller than, or larger than the
specified size.
The size can be specified with any commonly used units, for example,
"0.5 gb" or "100 KiloBytes"
* --not
Inverts the next file matching option. For example, to only act on