vicfg: Include the numcopies configuation.
authorJoey Hess <joeyh@joeyh.name>
Mon, 30 Jan 2017 19:11:26 +0000 (15:11 -0400)
committerJoey Hess <joeyh@joeyh.name>
Mon, 30 Jan 2017 19:27:25 +0000 (15:27 -0400)
Docs say vicfg can configure everything from git-annex branch,
so it ought to configure numcopies.

Note that commenting out existing numcopies does not unset it.

This commit was sponsored by Thom May on Patreon.

CHANGELOG
Command/Vicfg.hs
Logs/NumCopies.hs
doc/git-annex-numcopies.mdwn
doc/git-annex-vicfg.mdwn

index 16601dfeaee5160df665778b7dd7cdb424534ad8..57994f156085aa8eb742ccc4c0cf93bcce8716fc 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -5,6 +5,7 @@ git-annex (6.20170102) UNRELEASED; urgency=medium
     remotes when possible.
   * Remove -j short option for --json-progress; that option was already
     taken for --json.
+  * vicfg: Include the numcopies configuation.
 
  -- Joey Hess <id@joeyh.name>  Fri, 06 Jan 2017 15:22:06 -0400
 
index d9e8b88232b94c2658905c8dd07b20683d9603f1..55aa21e46a6c33560a09fc453588e250bbd30ccf 100644 (file)
@@ -1,6 +1,6 @@
 {- git-annex command
  -
- - Copyright 2012-2014 Joey Hess <id@joeyh.name>
+ - Copyright 2012-2017 Joey Hess <id@joeyh.name>
  -
  - Licensed under the GNU GPL version 3 or higher.
  -}
@@ -24,12 +24,14 @@ import Logs.Trust
 import Logs.Group
 import Logs.PreferredContent
 import Logs.Schedule
+import Logs.NumCopies
 import Types.StandardGroups
 import Types.ScheduledActivity
+import Types.NumCopies
 import Remote
 
 cmd :: Command
-cmd = command "vicfg" SectionSetup "edit git-annex's configuration"
+cmd = command "vicfg" SectionSetup "edit configuration in git-annex branch"
        paramNothing (withParams seek)
 
 seek :: CmdParams -> CommandSeek
@@ -66,6 +68,7 @@ data Cfg = Cfg
        , cfgRequiredContentMap :: M.Map UUID PreferredContentExpression
        , cfgGroupPreferredContentMap :: M.Map Group PreferredContentExpression
        , cfgScheduleMap :: M.Map UUID [ScheduledActivity]
+       , cfgNumCopies :: Maybe NumCopies
        }
 
 getCfg :: Annex Cfg
@@ -76,6 +79,7 @@ getCfg = Cfg
        <*> requiredContentMapRaw
        <*> groupPreferredContentMapRaw
        <*> scheduleMap
+       <*> getGlobalNumCopies
 
 setCfg :: Cfg -> Cfg -> Annex ()
 setCfg curcfg newcfg = do
@@ -86,6 +90,7 @@ setCfg curcfg newcfg = do
        mapM_ (uncurry requiredContentSet) $ M.toList $ cfgRequiredContentMap diff
        mapM_ (uncurry groupPreferredContentSet) $ M.toList $ cfgGroupPreferredContentMap diff
        mapM_ (uncurry scheduleSet) $ M.toList $ cfgScheduleMap diff
+       maybe noop setGlobalNumCopies $ cfgNumCopies diff
 
 {- Default config has all the keys from the input config, but with their
  - default values. -}
@@ -97,6 +102,7 @@ defCfg curcfg = Cfg
        , cfgRequiredContentMap = mapdef $ cfgRequiredContentMap curcfg
        , cfgGroupPreferredContentMap = mapdef $ cfgGroupPreferredContentMap curcfg
        , cfgScheduleMap = mapdef $ cfgScheduleMap curcfg
+       , cfgNumCopies = Nothing
        }
   where
        mapdef :: forall k v. Default v => M.Map k v -> M.Map k v
@@ -110,6 +116,7 @@ diffCfg curcfg newcfg = Cfg
        , cfgRequiredContentMap = diff cfgRequiredContentMap
        , cfgGroupPreferredContentMap = diff cfgGroupPreferredContentMap
        , cfgScheduleMap = diff cfgScheduleMap
+       , cfgNumCopies = cfgNumCopies newcfg
        }
   where
        diff f = M.differenceWith (\x y -> if x == y then Nothing else Just x)
@@ -125,6 +132,7 @@ genCfg cfg descs = unlines $ intercalate [""]
        , standardgroups
        , requiredcontent
        , schedule
+       , others
        ]
   where
        intro =
@@ -201,6 +209,14 @@ genCfg cfg descs = unlines $ intercalate [""]
                [ com $ "(for " ++ fromMaybe "" (M.lookup u descs) ++ ")"
                , unwords [setting, fromUUID u, "=", val]
                ]
+
+       line' setting Nothing = com $ unwords [setting, "default", "="]
+       line' setting (Just val) = unwords [setting, "default", "=", val]
+
+       others =
+               [ com "Other configuration"
+               , line' "numcopies" (show . fromNumCopies <$> cfgNumCopies cfg)
+               ]
        
 settings :: Ord v => Cfg -> M.Map UUID String -> (Cfg -> M.Map UUID v) -> [String] -> ((v, UUID) -> [String]) -> (UUID -> [String]) -> [String]
 settings cfg descs = settings' cfg (M.keysSet descs)
@@ -274,6 +290,9 @@ parseCfg defcfg = go [] defcfg . lines
                        Right l -> 
                                let m = M.insert u l (cfgScheduleMap cfg)
                                in Right $ cfg { cfgScheduleMap = m }
+               | setting == "numcopies" = case readish val of
+                       Nothing -> Left "parse error (expected an integer)"
+                       Just n -> Right $ cfg { cfgNumCopies = Just (NumCopies n) }
                | otherwise = badval "setting" setting
          where
                u = toUUID f
index a4bca5b078c0c50622100fcd34496cc01af4a2df..7593d6c03703d29c201dd4689415dc160eae92cb 100644 (file)
@@ -24,7 +24,10 @@ instance SingleValueSerializable NumCopies where
        deserialize = NumCopies <$$> readish
 
 setGlobalNumCopies :: NumCopies -> Annex ()
-setGlobalNumCopies = setLog numcopiesLog
+setGlobalNumCopies new = do
+       curr <- getGlobalNumCopies
+       when (curr /= Just new) $
+               setLog numcopiesLog new
 
 {- Value configured in the numcopies log. Cached for speed. -}
 getGlobalNumCopies :: Annex (Maybe NumCopies)
index b29cbb8bf795f06d8adc83be840264601ac93f0f..96701e1ef5a3dc4f53d9401985f3cf5e918d6a42 100644 (file)
@@ -9,10 +9,13 @@ git annex numcopies `N`
 # DESCRIPTION
 
 Tells git-annex how many copies it should preserve of files, over all
-repositories. The default is 1.
+repositories. The default is 1. 
 
 Run without a number to get the current value.
 
+This configuration is stored in the git-annex branch, so it will be seen
+by all clones of the repository.
+
 When git-annex is asked to drop a file, it first verifies that the
 required number of copies can be satisfied among all the other
 repositories that have a copy of the file.
index 171a4acefe43dec01e4ab7bd03e7446ecc9542af..45bbb9b7fb1217838a32756e4594aab1c263b826 100644 (file)
@@ -1,6 +1,6 @@
 # NAME
 
-git-annex vicfg - edit git-annex's configuration
+git-annex vicfg - edit configuration in git-annex branch
 
 # SYNOPSIS
 
@@ -8,14 +8,19 @@ git annex vicfg
 
 # DESCRIPTION
 
-Opens EDITOR on a temp file containing all of git-annex's global 
-configuration settings, and when it exits, stores any
-changes made back to the git-annex branch.
+Opens EDITOR on a temp file containing all of git-annex's 
+configuration settings that are stored in the git-annex branch, 
+and when it exits, stores any changes made back to the git-annex branch.
+
+Unlike git config settings, these configuration settings can be seen
+by all clones of the repository.
 
 # SEE ALSO
 
 [[git-annex]](1)
 
+git-config(1)
+
 # AUTHOR
 
 Joey Hess <id@joeyh.name>