add standard group selector to repo edit form

This commit is contained in:
Joey Hess 2012-10-10 16:04:28 -04:00
parent bf72760af2
commit 39be7eea40
7 changed files with 33 additions and 10 deletions

View file

@ -16,6 +16,8 @@ import Assistant.WebApp.SideBar
import Utility.Yesod import Utility.Yesod
import qualified Remote import qualified Remote
import Logs.UUID import Logs.UUID
import Logs.Group
import Types.StandardGroups
import Yesod import Yesod
import Data.Text (Text) import Data.Text (Text)
@ -24,16 +26,23 @@ import qualified Data.Map as M
data RepoConfig = RepoConfig data RepoConfig = RepoConfig
{ repoDescription :: Text { repoDescription :: Text
, repoGroup :: Maybe StandardGroup
} }
deriving (Show) deriving (Show)
editRepositoryAForm :: RepoConfig -> AForm WebApp WebApp RepoConfig editRepositoryAForm :: RepoConfig -> AForm WebApp WebApp RepoConfig
editRepositoryAForm def = RepoConfig editRepositoryAForm def = RepoConfig
<$> areq textField "Description" (Just $ repoDescription def) <$> areq textField "Description" (Just $ repoDescription def)
<*> aopt (selectFieldList standardgroups) "Repository group" (Just $ repoGroup def)
where
standardgroups :: [(Text, StandardGroup)]
standardgroups = map (\g -> (T.pack $ descStandardGroup g , g))
[minBound :: StandardGroup .. maxBound :: StandardGroup]
getRepoConfig :: UUID -> Annex RepoConfig getRepoConfig :: UUID -> Annex RepoConfig
getRepoConfig uuid = RepoConfig getRepoConfig uuid = RepoConfig
<$> (T.pack . fromMaybe "" . M.lookup uuid <$> uuidMap) <$> (T.pack . fromMaybe "" . M.lookup uuid <$> uuidMap)
<*> (getStandardGroup uuid <$> groupMap)
getEditRepositoryR :: UUID -> Handler RepHtml getEditRepositoryR :: UUID -> Handler RepHtml
getEditRepositoryR uuid = bootstrap (Just Config) $ do getEditRepositoryR uuid = bootstrap (Just Config) $ do

View file

@ -29,7 +29,7 @@ import Utility.DataUnits
import Utility.Network import Utility.Network
import Remote (prettyListUUIDs) import Remote (prettyListUUIDs)
import Annex.UUID import Annex.UUID
import Annex.StandardGroups import Types.StandardGroups
import Logs.PreferredContent import Logs.PreferredContent
import Yesod import Yesod

View file

@ -21,7 +21,7 @@ import qualified Remote.S3 as S3
import Logs.Remote import Logs.Remote
import qualified Remote import qualified Remote
import Types.Remote (RemoteConfig) import Types.Remote (RemoteConfig)
import Annex.StandardGroups import Types.StandardGroups
import Logs.PreferredContent import Logs.PreferredContent
import Yesod import Yesod

View file

@ -20,7 +20,7 @@ import Utility.Rsync (rsyncUrlIsShell)
import Logs.Remote import Logs.Remote
import Remote import Remote
import Logs.PreferredContent import Logs.PreferredContent
import Annex.StandardGroups import Types.StandardGroups
import Yesod import Yesod
import Data.Text (Text) import Data.Text (Text)

View file

@ -10,6 +10,7 @@ module Logs.Group (
groupSet, groupSet,
lookupGroups, lookupGroups,
groupMap, groupMap,
getStandardGroup
) where ) where
import qualified Data.Map as M import qualified Data.Map as M
@ -21,6 +22,7 @@ import qualified Annex.Branch
import qualified Annex import qualified Annex
import Logs.UUIDBased import Logs.UUIDBased
import Types.Group import Types.Group
import Types.StandardGroups
{- Filename of group.log. -} {- Filename of group.log. -}
groupLog :: FilePath groupLog :: FilePath
@ -64,3 +66,11 @@ makeGroupMap byuuid = GroupMap byuuid bygroup
bygroup = M.fromListWith S.union $ bygroup = M.fromListWith S.union $
concat $ map explode $ M.toList byuuid concat $ map explode $ M.toList byuuid
explode (u, s) = map (\g -> (g, S.singleton u)) (S.toList s) explode (u, s) = map (\g -> (g, S.singleton u)) (S.toList s)
{- If a repository is in exactly one standard group, returns it. -}
getStandardGroup :: UUID -> GroupMap -> Maybe StandardGroup
getStandardGroup u m = maybe Nothing go $ u `M.lookup` groupsByUUID m
where
go s = case catMaybes $ map toStandardGroup $ S.toList s of
[g] -> Just g
_ -> Nothing

View file

@ -29,7 +29,7 @@ import Annex.UUID
import Git.FilePath import Git.FilePath
import Types.Group import Types.Group
import Logs.Group import Logs.Group
import Annex.StandardGroups import Types.StandardGroups
{- Filename of preferred-content.log. -} {- Filename of preferred-content.log. -}
preferredContentLog :: FilePath preferredContentLog :: FilePath
@ -89,12 +89,9 @@ makeMatcher groupmap u s
{- Standard matchers are pre-defined for some groups. If none is defined, {- Standard matchers are pre-defined for some groups. If none is defined,
- or a repository is in multiple groups with standard matchers, match all. -} - or a repository is in multiple groups with standard matchers, match all. -}
standardMatcher :: GroupMap -> UUID -> Utility.Matcher.Matcher MatchFiles standardMatcher :: GroupMap -> UUID -> Utility.Matcher.Matcher MatchFiles
standardMatcher groupmap u = standardMatcher m u = maybe matchAll use (getStandardGroup u m)
maybe matchAll findmatcher $ u `M.lookup` groupsByUUID groupmap
where where
findmatcher s = case catMaybes $ map toStandardGroup $ S.toList s of use = makeMatcher m u . preferredContent
[g] -> makeMatcher groupmap u $ preferredContent g
_ -> matchAll
matchAll :: Utility.Matcher.Matcher MatchFiles matchAll :: Utility.Matcher.Matcher MatchFiles
matchAll = Utility.Matcher.generate [] matchAll = Utility.Matcher.generate []

View file

@ -5,9 +5,10 @@
- Licensed under the GNU GPL version 3 or higher. - Licensed under the GNU GPL version 3 or higher.
-} -}
module Annex.StandardGroups where module Types.StandardGroups where
data StandardGroup = ClientGroup | TransferGroup | ArchiveGroup | BackupGroup data StandardGroup = ClientGroup | TransferGroup | ArchiveGroup | BackupGroup
deriving (Eq, Ord, Enum, Bounded, Show)
fromStandardGroup :: StandardGroup -> String fromStandardGroup :: StandardGroup -> String
fromStandardGroup ClientGroup = "client" fromStandardGroup ClientGroup = "client"
@ -22,6 +23,12 @@ toStandardGroup "archive" = Just ArchiveGroup
toStandardGroup "backup" = Just BackupGroup toStandardGroup "backup" = Just BackupGroup
toStandardGroup _ = Nothing toStandardGroup _ = Nothing
descStandardGroup :: StandardGroup -> String
descStandardGroup ClientGroup = "client: a repository on your computer"
descStandardGroup TransferGroup = "transfer: distributes data to clients"
descStandardGroup ArchiveGroup = "archive: collect content that is not archived elsewhere"
descStandardGroup BackupGroup = "backup: collects all content"
{- See doc/preferred_content.mdwn for explanations of these expressions. -} {- See doc/preferred_content.mdwn for explanations of these expressions. -}
preferredContent :: StandardGroup -> String preferredContent :: StandardGroup -> String
preferredContent ClientGroup = "exclude=*/archive/*" preferredContent ClientGroup = "exclude=*/archive/*"