2011-01-07 00:26:57 +00:00
|
|
|
{- git-annex main program
|
|
|
|
-
|
|
|
|
- Copyright 2010 Joey Hess <joey@kitenet.net>
|
|
|
|
-
|
|
|
|
- Licensed under the GNU GPL version 3 or higher.
|
|
|
|
-}
|
|
|
|
|
2012-06-26 13:15:47 +00:00
|
|
|
{-# LANGUAGE CPP #-}
|
|
|
|
|
2011-01-07 00:26:57 +00:00
|
|
|
module GitAnnex where
|
|
|
|
|
|
|
|
import System.Console.GetOpt
|
|
|
|
|
2011-10-05 20:02:51 +00:00
|
|
|
import Common.Annex
|
2011-12-13 19:05:07 +00:00
|
|
|
import qualified Git.Config
|
2012-05-18 22:20:53 +00:00
|
|
|
import qualified Git.CurrentRepo
|
2011-01-07 06:15:10 +00:00
|
|
|
import CmdLine
|
2011-01-07 00:26:57 +00:00
|
|
|
import Command
|
2011-06-24 01:25:39 +00:00
|
|
|
import Types.TrustLevel
|
2011-01-26 04:17:38 +00:00
|
|
|
import qualified Annex
|
2011-06-01 23:10:38 +00:00
|
|
|
import qualified Remote
|
2011-09-18 21:47:49 +00:00
|
|
|
import qualified Limit
|
2012-01-06 14:14:37 +00:00
|
|
|
import qualified Option
|
2011-01-07 00:26:57 +00:00
|
|
|
|
|
|
|
import qualified Command.Add
|
|
|
|
import qualified Command.Unannex
|
|
|
|
import qualified Command.Drop
|
|
|
|
import qualified Command.Move
|
|
|
|
import qualified Command.Copy
|
|
|
|
import qualified Command.Get
|
|
|
|
import qualified Command.FromKey
|
|
|
|
import qualified Command.DropKey
|
2012-08-24 21:23:58 +00:00
|
|
|
import qualified Command.TransferKey
|
2012-02-16 20:36:35 +00:00
|
|
|
import qualified Command.ReKey
|
2011-10-31 19:18:41 +00:00
|
|
|
import qualified Command.Reinject
|
2011-01-07 00:26:57 +00:00
|
|
|
import qualified Command.Fix
|
|
|
|
import qualified Command.Init
|
2011-03-03 21:21:00 +00:00
|
|
|
import qualified Command.Describe
|
2011-03-29 03:22:31 +00:00
|
|
|
import qualified Command.InitRemote
|
2011-01-07 00:26:57 +00:00
|
|
|
import qualified Command.Fsck
|
|
|
|
import qualified Command.Unused
|
|
|
|
import qualified Command.DropUnused
|
2012-05-02 18:59:05 +00:00
|
|
|
import qualified Command.AddUnused
|
2011-01-07 00:26:57 +00:00
|
|
|
import qualified Command.Unlock
|
|
|
|
import qualified Command.Lock
|
|
|
|
import qualified Command.PreCommit
|
|
|
|
import qualified Command.Find
|
2011-03-05 21:23:55 +00:00
|
|
|
import qualified Command.Whereis
|
2012-01-06 19:40:04 +00:00
|
|
|
import qualified Command.Log
|
2011-06-22 22:46:45 +00:00
|
|
|
import qualified Command.Merge
|
2011-05-17 01:18:34 +00:00
|
|
|
import qualified Command.Status
|
2011-01-08 19:54:14 +00:00
|
|
|
import qualified Command.Migrate
|
2011-01-07 00:26:57 +00:00
|
|
|
import qualified Command.Uninit
|
|
|
|
import qualified Command.Trust
|
|
|
|
import qualified Command.Untrust
|
2011-01-26 19:37:16 +00:00
|
|
|
import qualified Command.Semitrust
|
2011-12-02 20:59:55 +00:00
|
|
|
import qualified Command.Dead
|
2012-10-01 19:12:04 +00:00
|
|
|
import qualified Command.Group
|
|
|
|
import qualified Command.Ungroup
|
2012-10-03 21:04:52 +00:00
|
|
|
import qualified Command.Vicfg
|
2011-12-10 00:27:22 +00:00
|
|
|
import qualified Command.Sync
|
2011-07-01 21:15:46 +00:00
|
|
|
import qualified Command.AddUrl
|
2012-05-31 23:47:18 +00:00
|
|
|
import qualified Command.Import
|
2011-02-03 22:55:12 +00:00
|
|
|
import qualified Command.Map
|
2011-03-16 19:48:26 +00:00
|
|
|
import qualified Command.Upgrade
|
2011-03-19 18:33:24 +00:00
|
|
|
import qualified Command.Version
|
2012-06-26 13:15:47 +00:00
|
|
|
#ifdef WITH_ASSISTANT
|
watch subcommand
So far this only handles auto-annexing new files that are created inside
the repository while it's running. To make this really useful,
it needs to at least:
- notice deleted files and stage the deletion
(tricky; there's a race with add..)
- notice renamed files, auto-fix the symlink, and stage the new file location
- periodically auto-commit staged changes
- honor .gitignore, not adding files it excludes
Also nice to have would be:
- Somehow sync remotes, possibly using a push sync like dvcs-autosync
does, so they are immediately updated.
- Somehow get content that is unavilable. This is problimatic with inotify,
since we only get an event once the user has tried (and failed) to read
from the file. Perhaps instead, automatically copy content that is added
out to remotes, with the goal of all repos eventually getting a copy,
if df allows.
- Drop files that have not been used lately, or meet some other criteria
(as long as there's a copy elsewhere).
- Perhaps automatically dropunused files that have been deleted,
although I cannot see a way to do that, since by the time the inotify
deletion event arrives, the file is deleted, and we cannot see what
its symlink pointed to! Alternatievely, perhaps automatically
do an expensive unused/dropunused cleanup process.
Some of this probably needs the currently stateless threads to maintain
a common state.
2012-04-12 21:29:43 +00:00
|
|
|
import qualified Command.Watch
|
2012-06-22 17:04:03 +00:00
|
|
|
import qualified Command.Assistant
|
2012-07-26 03:13:01 +00:00
|
|
|
#ifdef WITH_WEBAPP
|
|
|
|
import qualified Command.WebApp
|
|
|
|
#endif
|
2012-06-26 13:15:47 +00:00
|
|
|
#endif
|
2012-10-13 23:07:56 +00:00
|
|
|
import qualified Command.Help
|
2011-01-07 00:26:57 +00:00
|
|
|
|
|
|
|
cmds :: [Command]
|
|
|
|
cmds = concat
|
2011-10-29 19:19:05 +00:00
|
|
|
[ Command.Add.def
|
|
|
|
, Command.Get.def
|
|
|
|
, Command.Drop.def
|
|
|
|
, Command.Move.def
|
|
|
|
, Command.Copy.def
|
|
|
|
, Command.Unlock.def
|
|
|
|
, Command.Lock.def
|
2011-12-10 00:27:22 +00:00
|
|
|
, Command.Sync.def
|
|
|
|
, Command.AddUrl.def
|
2012-05-31 23:47:18 +00:00
|
|
|
, Command.Import.def
|
2011-10-29 19:19:05 +00:00
|
|
|
, Command.Init.def
|
|
|
|
, Command.Describe.def
|
|
|
|
, Command.InitRemote.def
|
2011-10-31 19:18:41 +00:00
|
|
|
, Command.Reinject.def
|
2011-10-29 19:19:05 +00:00
|
|
|
, Command.Unannex.def
|
|
|
|
, Command.Uninit.def
|
|
|
|
, Command.PreCommit.def
|
|
|
|
, Command.Trust.def
|
|
|
|
, Command.Untrust.def
|
|
|
|
, Command.Semitrust.def
|
2011-12-02 20:59:55 +00:00
|
|
|
, Command.Dead.def
|
2012-10-01 19:12:04 +00:00
|
|
|
, Command.Group.def
|
|
|
|
, Command.Ungroup.def
|
2012-10-03 21:04:52 +00:00
|
|
|
, Command.Vicfg.def
|
2011-10-29 19:19:05 +00:00
|
|
|
, Command.FromKey.def
|
|
|
|
, Command.DropKey.def
|
2012-08-24 21:23:58 +00:00
|
|
|
, Command.TransferKey.def
|
2012-02-16 20:36:35 +00:00
|
|
|
, Command.ReKey.def
|
2011-10-29 19:19:05 +00:00
|
|
|
, Command.Fix.def
|
|
|
|
, Command.Fsck.def
|
|
|
|
, Command.Unused.def
|
|
|
|
, Command.DropUnused.def
|
2012-05-02 18:59:05 +00:00
|
|
|
, Command.AddUnused.def
|
2011-10-29 19:19:05 +00:00
|
|
|
, Command.Find.def
|
|
|
|
, Command.Whereis.def
|
2012-01-06 19:40:04 +00:00
|
|
|
, Command.Log.def
|
2011-10-29 19:19:05 +00:00
|
|
|
, Command.Merge.def
|
|
|
|
, Command.Status.def
|
|
|
|
, Command.Migrate.def
|
|
|
|
, Command.Map.def
|
|
|
|
, Command.Upgrade.def
|
|
|
|
, Command.Version.def
|
2012-06-26 13:15:47 +00:00
|
|
|
#ifdef WITH_ASSISTANT
|
watch subcommand
So far this only handles auto-annexing new files that are created inside
the repository while it's running. To make this really useful,
it needs to at least:
- notice deleted files and stage the deletion
(tricky; there's a race with add..)
- notice renamed files, auto-fix the symlink, and stage the new file location
- periodically auto-commit staged changes
- honor .gitignore, not adding files it excludes
Also nice to have would be:
- Somehow sync remotes, possibly using a push sync like dvcs-autosync
does, so they are immediately updated.
- Somehow get content that is unavilable. This is problimatic with inotify,
since we only get an event once the user has tried (and failed) to read
from the file. Perhaps instead, automatically copy content that is added
out to remotes, with the goal of all repos eventually getting a copy,
if df allows.
- Drop files that have not been used lately, or meet some other criteria
(as long as there's a copy elsewhere).
- Perhaps automatically dropunused files that have been deleted,
although I cannot see a way to do that, since by the time the inotify
deletion event arrives, the file is deleted, and we cannot see what
its symlink pointed to! Alternatievely, perhaps automatically
do an expensive unused/dropunused cleanup process.
Some of this probably needs the currently stateless threads to maintain
a common state.
2012-04-12 21:29:43 +00:00
|
|
|
, Command.Watch.def
|
2012-06-22 17:04:03 +00:00
|
|
|
, Command.Assistant.def
|
2012-07-26 03:13:01 +00:00
|
|
|
#ifdef WITH_WEBAPP
|
|
|
|
, Command.WebApp.def
|
|
|
|
#endif
|
2012-06-26 13:15:47 +00:00
|
|
|
#endif
|
2012-10-13 23:07:56 +00:00
|
|
|
, Command.Help.def
|
2011-01-07 00:26:57 +00:00
|
|
|
]
|
|
|
|
|
|
|
|
options :: [Option]
|
2012-01-06 14:14:37 +00:00
|
|
|
options = Option.common ++
|
more command-specific options
Made --from and --to command-specific options.
Added generic storage for values of command-specific options,
which allows removing some of the special case fields in AnnexState.
(Also added generic storage for command-specific flags, although there are
not yet any.)
Note that this storage uses a Map, so repeatedly looking up the same value
is slightly more expensive than looking up an AnnexState field. But, the
value can be looked up once in the seek stage, transformed as necessary,
and passed in a closure to the start stage, and this avoids that overhead.
Still, I'm hesitant to use this for things like force or fast flags.
It's probably best to reserve it for flags that are only used by a few
commands, or options like --from and --to that it's important only be
allowed to be used with commands that implement them, to avoid user
confusion.
2012-01-06 07:06:25 +00:00
|
|
|
[ Option ['N'] ["numcopies"] (ReqArg setnumcopies paramNumber)
|
2011-06-01 20:49:17 +00:00
|
|
|
"override default number of copies"
|
2011-06-02 06:33:31 +00:00
|
|
|
, Option [] ["trust"] (ReqArg (Remote.forceTrust Trusted) paramRemote)
|
2011-06-01 21:49:37 +00:00
|
|
|
"override trust setting"
|
2011-06-02 06:33:31 +00:00
|
|
|
, Option [] ["semitrust"] (ReqArg (Remote.forceTrust SemiTrusted) paramRemote)
|
2011-07-14 20:44:23 +00:00
|
|
|
"override trust setting back to default"
|
2011-06-02 06:33:31 +00:00
|
|
|
, Option [] ["untrust"] (ReqArg (Remote.forceTrust UnTrusted) paramRemote)
|
2011-06-01 21:49:37 +00:00
|
|
|
"override trust setting to untrusted"
|
2011-07-14 20:44:23 +00:00
|
|
|
, Option ['c'] ["config"] (ReqArg setgitconfig "NAME=VALUE")
|
|
|
|
"override git configuration setting"
|
2011-09-21 03:24:48 +00:00
|
|
|
, Option ['x'] ["exclude"] (ReqArg Limit.addExclude paramGlob)
|
2011-09-18 22:21:42 +00:00
|
|
|
"skip files matching the glob pattern"
|
2011-12-22 17:53:06 +00:00
|
|
|
, Option ['I'] ["include"] (ReqArg Limit.addInclude paramGlob)
|
|
|
|
"don't skip files matching the glob pattern"
|
2011-09-21 03:24:48 +00:00
|
|
|
, Option ['i'] ["in"] (ReqArg Limit.addIn paramRemote)
|
2011-09-19 00:14:18 +00:00
|
|
|
"skip files not present in a remote"
|
2011-09-21 03:24:48 +00:00
|
|
|
, Option ['C'] ["copies"] (ReqArg Limit.addCopies paramNumber)
|
2011-09-19 00:23:08 +00:00
|
|
|
"skip files with fewer copies"
|
2011-11-28 21:37:15 +00:00
|
|
|
, Option ['B'] ["inbackend"] (ReqArg Limit.addInBackend paramName)
|
|
|
|
"skip files not using a key-value backend"
|
2012-10-10 16:59:45 +00:00
|
|
|
, Option [] ["inallgroup"] (ReqArg Limit.addInAllGroup paramGroup)
|
2012-10-08 19:18:58 +00:00
|
|
|
"skip files not present in all remotes in a group"
|
|
|
|
, Option [] ["largerthan"] (ReqArg Limit.addLargerThan paramSize)
|
2012-10-08 17:39:18 +00:00
|
|
|
"skip files larger than a size"
|
2012-10-08 19:18:58 +00:00
|
|
|
, Option [] ["smallerthan"] (ReqArg Limit.addSmallerThan paramSize)
|
2012-10-08 17:39:18 +00:00
|
|
|
"skip files smaller than a size"
|
2012-09-25 20:48:24 +00:00
|
|
|
, Option ['T'] ["time-limit"] (ReqArg Limit.addTimeLimit paramTime)
|
|
|
|
"stop after the specified amount of time"
|
2012-01-06 14:14:37 +00:00
|
|
|
] ++ Option.matcher
|
2011-01-26 04:17:38 +00:00
|
|
|
where
|
2012-09-25 20:48:24 +00:00
|
|
|
setnumcopies v = Annex.changeState $ \s -> s { Annex.forcenumcopies = readish v }
|
2011-07-14 20:44:23 +00:00
|
|
|
setgitconfig :: String -> Annex ()
|
|
|
|
setgitconfig v = do
|
2011-12-13 19:05:07 +00:00
|
|
|
newg <- inRepo $ Git.Config.store v
|
2011-11-08 19:34:10 +00:00
|
|
|
Annex.changeState $ \s -> s { Annex.repo = newg }
|
2011-01-07 00:26:57 +00:00
|
|
|
|
|
|
|
header :: String
|
|
|
|
header = "Usage: git-annex command [option ..]"
|
2011-01-07 06:15:10 +00:00
|
|
|
|
|
|
|
run :: [String] -> IO ()
|
2012-07-02 04:53:00 +00:00
|
|
|
run args = dispatch True args cmds options [] header Git.CurrentRepo.get
|