3cd3757236
The git add behavior changes could be avoided if it turns out to be really annoying, but then it would need to behave the old way when annex.dotfiles=false and the new way when annex.dotfiles=true. I'd rather not have the config option result in such divergent behavior as `git annex add .` skipping a dotfile (old) vs adding to annex (new). Note that the assistant always adds dotfiles to the annex. This is surprising, but not new behavior. Might be worth making it also honor annex.dotfiles, but I wonder if perhaps some user somewhere uses it and keeps large files in a directory that happens to begin with a dot. Since dotfiles and dotdirs are a unix culture thing, and the assistant users may not be part of that culture, it seems best to keep its current behavior for now.
58 lines
2 KiB
Haskell
58 lines
2 KiB
Haskell
{- Git smudge filter configuration
|
|
-
|
|
- Copyright 2011-2019 Joey Hess <id@joeyh.name>
|
|
-
|
|
- Licensed under the GNU AGPL version 3 or higher.
|
|
-}
|
|
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
module Config.Smudge where
|
|
|
|
import Annex.Common
|
|
import qualified Annex
|
|
import qualified Git
|
|
import qualified Git.Command
|
|
import Git.Types
|
|
import Config
|
|
|
|
configureSmudgeFilter :: Annex ()
|
|
configureSmudgeFilter = unlessM (fromRepo Git.repoIsLocalBare) $ do
|
|
-- If this is run in a newly cloned repository, git may not have
|
|
-- cached file information in the index yet, and so after
|
|
-- configuring the clean filter, the next git status would want to
|
|
-- run it on every file. That is expensive and can also result in
|
|
-- unexpected changes when the file is checked into git or annex
|
|
-- counter to the annex.largefiles configuration.
|
|
-- Avoid that problem by running git status now.
|
|
inRepo $ Git.Command.runQuiet [Param "status", Param "--porcelain"]
|
|
|
|
setConfig (ConfigKey "filter.annex.smudge") "git-annex smudge -- %f"
|
|
setConfig (ConfigKey "filter.annex.clean") "git-annex smudge --clean -- %f"
|
|
lf <- Annex.fromRepo Git.attributesLocal
|
|
gf <- Annex.fromRepo Git.attributes
|
|
lfs <- readattr lf
|
|
gfs <- readattr gf
|
|
liftIO $ unless ("filter=annex" `isInfixOf` (lfs ++ gfs)) $ do
|
|
createDirectoryIfMissing True (takeDirectory lf)
|
|
writeFile lf (lfs ++ "\n" ++ unlines stdattr)
|
|
where
|
|
readattr = liftIO . catchDefaultIO "" . readFileStrict
|
|
|
|
stdattr :: [String]
|
|
stdattr =
|
|
[ "* filter=annex"
|
|
]
|
|
|
|
-- Note that this removes the local git attributes for filtering,
|
|
-- which is what git-annex installed, but it does not change anything
|
|
-- that may have been committed to a .gitattributes in the repository.
|
|
-- git-annex does not commit that.
|
|
deconfigureSmudgeFilter :: Annex ()
|
|
deconfigureSmudgeFilter = do
|
|
lf <- Annex.fromRepo Git.attributesLocal
|
|
ls <- liftIO $ catchDefaultIO [] $ lines <$> readFileStrict lf
|
|
liftIO $ writeFile lf $ unlines $
|
|
filter (\l -> l `notElem` stdattr && not (null l)) ls
|
|
unsetConfig (ConfigKey "filter.annex.smudge")
|
|
unsetConfig (ConfigKey "filter.annex.clean")
|