77 lines
2.8 KiB
Haskell
77 lines
2.8 KiB
Haskell
{- git-annex command data types
|
|
-
|
|
- Copyright 2010-2011 Joey Hess <joey@kitenet.net>
|
|
-
|
|
- Licensed under the GNU GPL version 3 or higher.
|
|
-}
|
|
|
|
module Types.Command where
|
|
|
|
import Data.Ord
|
|
|
|
import Types
|
|
|
|
{- A command runs in these stages.
|
|
-
|
|
- a. The check stage runs checks, that error out if
|
|
- anything prevents the command from running. -}
|
|
data CommandCheck = CommandCheck { idCheck :: Int, runCheck :: Annex () }
|
|
{- b. The seek stage takes the parameters passed to the command,
|
|
- looks through the repo to find the ones that are relevant
|
|
- to that command (ie, new files to add), and generates
|
|
- a list of start stage actions. -}
|
|
type CommandSeek = [String] -> Annex [CommandStart]
|
|
{- c. The start stage is run before anything is printed about the
|
|
- command, is passed some input, and can early abort it
|
|
- if the input does not make sense. It should run quickly and
|
|
- should not modify Annex state. -}
|
|
type CommandStart = Annex (Maybe CommandPerform)
|
|
{- d. The perform stage is run after a message is printed about the command
|
|
- being run, and it should be where the bulk of the work happens. -}
|
|
type CommandPerform = Annex (Maybe CommandCleanup)
|
|
{- e. The cleanup stage is run only if the perform stage succeeds, and it
|
|
- returns the overall success/fail of the command. -}
|
|
type CommandCleanup = Annex Bool
|
|
|
|
{- A command is defined by specifying these things. -}
|
|
data Command = Command
|
|
{ cmdoptions :: [Option] -- command-specific options
|
|
, cmdnorepo :: Maybe (IO ()) -- an action to run when not in a repo
|
|
, cmdcheck :: [CommandCheck] -- check stage
|
|
, cmdnocommit :: Bool -- don't commit journalled state changes
|
|
, cmdnomessages :: Bool -- don't output normal messages
|
|
, cmdname :: String
|
|
, cmdparamdesc :: String -- description of params for usage
|
|
, cmdseek :: [CommandSeek] -- seek stage
|
|
, cmdsection :: CommandSection
|
|
, cmddesc :: String -- description of command for usage
|
|
}
|
|
|
|
{- CommandCheck functions can be compared using their unique id. -}
|
|
instance Eq CommandCheck where
|
|
a == b = idCheck a == idCheck b
|
|
|
|
instance Eq Command where
|
|
a == b = cmdname a == cmdname b
|
|
|
|
{- Order commands by name. -}
|
|
instance Ord Command where
|
|
compare = comparing cmdname
|
|
|
|
{- The same sections are listed in doc/git-annex.mdwn -}
|
|
data CommandSection
|
|
= SectionCommon
|
|
| SectionSetup
|
|
| SectionMaintenance
|
|
| SectionQuery
|
|
| SectionUtility
|
|
| SectionPlumbing
|
|
deriving (Eq, Ord, Enum, Bounded)
|
|
|
|
descSection :: CommandSection -> String
|
|
descSection SectionCommon = "Commonly used commands"
|
|
descSection SectionSetup = "Repository setup commands"
|
|
descSection SectionMaintenance = "Repository maintenance commands"
|
|
descSection SectionQuery = "Query commands"
|
|
descSection SectionUtility = "Utility commands"
|
|
descSection SectionPlumbing = "Plumbing commands"
|