Implement --no- for all Boolean options (by an automatic mechanism, not manually). Allow options specified on the command line to override options specified in hooks or _MTN/options, or earlier in the command line.

For example, given the options --foo --no-foo --foo, --foo is used for the command.

One motivation for this is to allow users to set their preferred default options in a hook, and then easily override them as needed. That makes it less significant what mtn sets as the default.

For example (taken from bug 17878, monotone-devel, many commands (approve, disapprove, pull, merge, etc) take an option "--update", that updates the current workspace. If you always want this behavior, you can define the get_default_command_options(cmd) hook in your monotonerc. However, you then have no way to disable that behavior for a particular command; you can't specify --no-update.

There is --no-workspace, but that's not the exact negation of --update; it has other effects (you need to specify the db and branch, for example).

Another example: monotone-devel mtn add is non-recursive by default but allows for --recursive. If you put this in get_default_command_options(cmd), there is no way to override it.