summaryrefslogtreecommitdiff
path: root/Types
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2011-10-29 23:48:46 -0400
committerGravatar Joey Hess <joey@kitenet.net>2011-10-30 00:28:22 -0400
commit4e9be0d1f86893a469b33b763b55edfe75bdb3aa (patch)
treee721a64007bc52df419a720caf2907dcf62e54ef /Types
parentef5330120c0b522ff159a5b3caba7a926236947b (diff)
refactoring and cleanup
No code changes.
Diffstat (limited to 'Types')
-rw-r--r--Types/Command.hs45
1 files changed, 45 insertions, 0 deletions
diff --git a/Types/Command.hs b/Types/Command.hs
new file mode 100644
index 000000000..d39876a7a
--- /dev/null
+++ b/Types/Command.hs
@@ -0,0 +1,45 @@
+{- 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 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 {
+ cmdcheck :: [CommandCheck],
+ cmdname :: String,
+ cmdparams :: String,
+ cmdseek :: [CommandSeek],
+ cmddesc :: String
+}
+
+{- CommandCheck functions can be compared using their unique id. -}
+instance Eq CommandCheck where
+ a == b = idCheck a == idCheck b