registrar: add support for storing the type of command in func object

This patch adds support for storing the type of command which is going to run in
the func object. For this it does the following:

1) Add three possible values as attributes to the registrar.command class
2) Add a new argument to registrar.command._doregister function
3) Add a new attribute cmdtype to the func object

The type of command will be helpful in deciding what level of access on hidden
commits it can has.

Differential Revision: https://phab.mercurial-scm.org/D736
This commit is contained in:
Pulkit Goyal 2017-09-20 04:47:43 +05:30
parent 5cbb2943df
commit aaa435b086
2 changed files with 28 additions and 2 deletions

View File

@ -35,11 +35,14 @@ from . import (
hook,
profiling,
pycompat,
registrar,
scmutil,
ui as uimod,
util,
)
unrecoverablewrite = registrar.command.unrecoverablewrite
class request(object):
def __init__(self, args, ui=None, repo=None, fin=None, fout=None,
ferr=None, prereposetups=None):
@ -495,7 +498,7 @@ class cmdalias(object):
return aliasargs(self.fn, args)
def __getattr__(self, name):
adefaults = {r'norepo': True,
adefaults = {r'norepo': True, r'cmdtype': unrecoverablewrite,
r'optionalrepo': False, r'inferrepo': False}
if name not in adefaults:
raise AttributeError(name)

View File

@ -7,6 +7,7 @@
from __future__ import absolute_import
from .i18n import _
from . import (
configitems,
error,
@ -131,13 +132,35 @@ class command(_funcregistrarbase):
command line arguments. If True, arguments will be examined for potential
repository locations. See ``findrepo()``. If a repository is found, it
will be used.
There are three constants in the class which tells what type of the command
that is. That information will be helpful at various places. It will be also
be used to decide what level of access the command has on hidden commits.
The constants are:
unrecoverablewrite is for those write commands which can't be recovered like
push.
recoverablewrite is for write commands which can be recovered like commit.
readonly is for commands which are read only.
"""
unrecoverablewrite = "unrecoverable"
recoverablewrite = "recoverable"
readonly = "readonly"
def _doregister(self, func, name, options=(), synopsis=None,
norepo=False, optionalrepo=False, inferrepo=False):
norepo=False, optionalrepo=False, inferrepo=False,
cmdtype=unrecoverablewrite):
possiblecmdtypes = set([self.unrecoverablewrite, self.recoverablewrite,
self.readonly])
if cmdtype not in possiblecmdtypes:
raise error.ProgrammingError(_("unknown cmdtype value '%s' for "
"'%s' command") % (cmdtype, name))
func.norepo = norepo
func.optionalrepo = optionalrepo
func.inferrepo = inferrepo
func.cmdtype = cmdtype
if synopsis:
self._table[name] = func, list(options), synopsis
else: