# HG changeset patch # User Pulkit Goyal <7895pulkit@gmail.com> # Date 1505863063 -19800 # Wed Sep 20 04:47:43 2017 +0530 # Node ID fe987d0b9e1ea29b98203bc3236cd75c6abb043a # Parent 070ba789f4d023a9108bdf32037e49d93f3b74bc 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 diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py --- a/mercurial/dispatch.py +++ b/mercurial/dispatch.py @@ -35,11 +35,14 @@ 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 @@ 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) diff --git a/mercurial/registrar.py b/mercurial/registrar.py --- a/mercurial/registrar.py +++ b/mercurial/registrar.py @@ -7,6 +7,7 @@ from __future__ import absolute_import +from .i18n import _ from . import ( configitems, error, @@ -131,13 +132,35 @@ 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: