64738ea157
* config: Added the --show-origin and --for-file options. * config: Support annex.numcopies and annex.mincopies. There is a little bit of redundancy here with other code elsewhere that combines the various configs and selects which to use. But really only for the special case of annex.numcopies, which is a git config that does not override the annex branch setting and for annex.mincopies, which does not have a git config but does have gitattributes settings as well as the annex branch setting. That seems small enough, and unlikely enough to grow into a mess that it was worth supporting annex.numcopies and annex.mincopies in git-annex config --show-origin. Because these settings are a prime thing that someone might get confused about and want to know where they were configured. And, it followed that git-annex config might as well support those two for --set and --get as well. While this is redundant with the speclialized commands, it's only a little code and it makes it more consistent. Note that --set does not have as nice output as numcopies/mincopies commands in some special cases like setting to 0 or a negative number. It does avoid setting to a bad value thanks to the smart constructors (eg configuredNumCopies). As for other git-annex branch configurations that are not set by git-annex config, things like trust and wanted that are specific to a repository don't map to a git config name, so don't really fit into git-annex config. And they are only configured in the git-annex branch with no local override (at least so far), so --show-origin would not be useful for them. Sponsored-by: Dartmouth College's DANDI project
74 lines
2.1 KiB
Haskell
74 lines
2.1 KiB
Haskell
{- git check-attr interface
|
|
-
|
|
- Copyright 2012-2020 Joey Hess <id@joeyh.name>
|
|
-
|
|
- Licensed under the GNU AGPL version 3 or higher.
|
|
-}
|
|
|
|
module Annex.CheckAttr (
|
|
annexAttrs,
|
|
checkAttr,
|
|
checkAttrs,
|
|
checkAttrStop,
|
|
mkConcurrentCheckAttrHandle,
|
|
) where
|
|
|
|
import Annex.Common
|
|
import qualified Git.CheckAttr as Git
|
|
import qualified Annex
|
|
import Utility.ResourcePool
|
|
import Types.Concurrency
|
|
import Annex.Concurrent.Utility
|
|
|
|
{- All gitattributes used by git-annex. -}
|
|
annexAttrs :: [Git.Attr]
|
|
annexAttrs =
|
|
[ "annex.backend"
|
|
, "annex.largefiles"
|
|
, "annex.numcopies"
|
|
, "annex.mincopies"
|
|
]
|
|
|
|
checkAttr :: Git.Attr -> RawFilePath -> Annex String
|
|
checkAttr attr file = withCheckAttrHandle $ \h -> do
|
|
r <- liftIO $ Git.checkAttr h attr file
|
|
if r == Git.unspecifiedAttr
|
|
then return ""
|
|
else return r
|
|
|
|
checkAttrs :: [Git.Attr] -> RawFilePath -> Annex [String]
|
|
checkAttrs attrs file = withCheckAttrHandle $ \h ->
|
|
liftIO $ Git.checkAttrs h attrs file
|
|
|
|
withCheckAttrHandle :: (Git.CheckAttrHandle -> Annex a) -> Annex a
|
|
withCheckAttrHandle a =
|
|
maybe mkpool go =<< Annex.getState Annex.checkattrhandle
|
|
where
|
|
go p = withResourcePool p start a
|
|
start = inRepo $ Git.checkAttrStart annexAttrs
|
|
mkpool = do
|
|
-- This only runs in non-concurrent code paths;
|
|
-- a concurrent pool is set up earlier when needed.
|
|
p <- mkResourcePoolNonConcurrent start
|
|
Annex.changeState $ \s -> s { Annex.checkattrhandle = Just p }
|
|
go p
|
|
|
|
mkConcurrentCheckAttrHandle :: Concurrency -> Annex (ResourcePool Git.CheckAttrHandle)
|
|
mkConcurrentCheckAttrHandle c =
|
|
Annex.getState Annex.checkattrhandle >>= \case
|
|
Just p@(ResourcePool {}) -> return p
|
|
_ -> mkResourcePool =<< liftIO (maxCheckAttrs c)
|
|
|
|
{- git check-attr is typically CPU bound, and is not likely to be the main
|
|
- bottleneck for any command. So limit to the number of CPU cores, maximum,
|
|
- while respecting the -Jn value.
|
|
-}
|
|
maxCheckAttrs :: Concurrency -> IO Int
|
|
maxCheckAttrs = concurrencyUpToCpus
|
|
|
|
checkAttrStop :: Annex ()
|
|
checkAttrStop = maybe noop stop =<< Annex.getState Annex.checkattrhandle
|
|
where
|
|
stop p = do
|
|
liftIO $ freeResourcePool p Git.checkAttrStop
|
|
Annex.changeState $ \s -> s { Annex.checkattrhandle = Nothing }
|