diff options
author | Joey Hess <joey@kitenet.net> | 2014-02-18 17:38:23 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2014-02-18 18:22:20 -0400 |
commit | 2fb1cfc4ae0cfb3f012e074f2f855c592f866b05 (patch) | |
tree | 7416b03c25e431898042fef6ad2e5ab27e6882d0 /Types | |
parent | 6f7ff00cb67546008918ed735f8be66b65cf9ce8 (diff) |
add git annex view command
(And a vpop command, which is still a bit buggy.)
Still need to do vadd and vrm, though this also adds their documentation.
Currently not very happy with the view log data serialization. I had to
lose the TDFA regexps temporarily, so I can have Read/Show instances of
View. I expect the view log format will change in some incompatable way
later, probably adding last known refs for the parent branch to View
or something like that.
Anyway, it basically works, although it's a bit slow looking up the
metadata. The actual git branch construction is about as fast as it can be
using the current git plumbing.
This commit was sponsored by Peter Hogg.
Diffstat (limited to 'Types')
-rw-r--r-- | Types/MetaData.hs | 6 | ||||
-rw-r--r-- | Types/View.hs | 51 |
2 files changed, 20 insertions, 37 deletions
diff --git a/Types/MetaData.hs b/Types/MetaData.hs index 248a96abb..601757315 100644 --- a/Types/MetaData.hs +++ b/Types/MetaData.hs @@ -53,13 +53,13 @@ newtype MetaData = MetaData (M.Map MetaField (S.Set MetaValue)) {- A metadata value can be currently be set (True), or may have been - set before and we're remembering it no longer is (False). -} newtype CurrentlySet = CurrentlySet Bool - deriving (Show, Eq, Ord, Arbitrary) + deriving (Read, Show, Eq, Ord, Arbitrary) newtype MetaField = MetaField String - deriving (Show, Eq, Ord) + deriving (Read, Show, Eq, Ord) data MetaValue = MetaValue CurrentlySet String - deriving (Show) + deriving (Read, Show) {- Metadata values compare and order the same whether currently set or not. -} instance Eq MetaValue where diff --git a/Types/View.hs b/Types/View.hs index 2c30541fa..f1759e0e0 100644 --- a/Types/View.hs +++ b/Types/View.hs @@ -5,29 +5,31 @@ - Licensed under the GNU GPL version 3 or higher. -} -{-# LANGUAGE CPP #-} - module Types.View where import Common.Annex import Types.MetaData import Utility.QuickCheck +import qualified Git import qualified Data.Set as S -#ifdef WITH_TDFA -import Text.Regex.TDFA -#else -#endif +{- A view is a list of fields with filters on their allowed values, + - which are applied to files in a parent git branch. -} +data View = View + { viewParentBranch :: Git.Branch + , viewComponents :: [ViewComponent] + } + deriving (Eq, Show) -{- A view is a list of fields with filters on their allowed values. -} -type View = [ViewComponent] +instance Arbitrary View where + arbitrary = View <$> pure (Git.Ref "master") <*> arbitrary data ViewComponent = ViewComponent { viewField :: MetaField , viewFilter :: ViewFilter } - deriving (Show, Eq) + deriving (Eq, Show, Read) instance Arbitrary ViewComponent where arbitrary = ViewComponent <$> arbitrary <*> arbitrary @@ -38,34 +40,15 @@ type MkFileView = FilePath -> FileView data ViewFilter = FilterValues (S.Set MetaValue) - | FilterGlob Glob - -instance Show ViewFilter where - show (FilterValues s) = show s - show (FilterGlob g) = getGlob g - -instance Eq ViewFilter where - FilterValues x == FilterValues y = x == y - FilterGlob x == FilterGlob y = x == y - _ == _ = False + | FilterGlob String + deriving (Eq, Show, Read) instance Arbitrary ViewFilter where arbitrary = do size <- arbitrarySizedBoundedIntegral `suchThat` (< 100) FilterValues . S.fromList <$> vector size -#ifdef WITH_TDFA -data Glob = Glob String Regex -#else -data Glob = Glob String -#endif - -instance Eq Glob where - a == b = getGlob a == getGlob b - -getGlob :: Glob -> String -#ifdef WITH_TDFA -getGlob (Glob g _) = g -#else -getGlob (Glob g) = g -#endif +{- Can a ViewFilter match multiple different MetaValues? -} +multiValue :: ViewFilter -> Bool +multiValue (FilterValues s) = S.size s > 1 +multiValue (FilterGlob _) = True |