From patchwork Tue May 12 00:56:48 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [evolve-ext-V2] inhibit: direct access with and without warning on a per command basis From: Laurent Charignon X-Patchwork-Id: 9017 Message-Id: To: Date: Mon, 11 May 2015 17:56:48 -0700 # HG changeset patch # User Laurent Charignon # Date 1428086461 25200 # Fri Apr 03 11:41:01 2015 -0700 # Node ID ccf7aefd262e60a2f68214e6eef3761c05b0a825 # Parent 5e82d78f5872c9503d7b6691c594a13794a9b4a4 inhibit: direct access with and without warning on a per command basis We introduce a new filtername visibile-directaccess-nowarn to enable direct access with no warning on a per command basis. The motivation behing this change is to display warning when attempting direct access in destructive commands. diff --git a/hgext/inhibit.py b/hgext/inhibit.py --- a/hgext/inhibit.py +++ b/hgext/inhibit.py @@ -37,6 +37,10 @@ cmdtable = {} command = cmdutil.command(cmdtable) +# List of commands where no warning is shown for direct access +directaccessnowarning = ['update', 'export'] +directaccessnowarningevolve = ['prune'] + def reposetup(ui, repo): class obsinhibitedrepo(repo.__class__): @@ -62,7 +66,20 @@ repo.__class__ = obsinhibitedrepo repo._explicitaccess = set() - +def setupdirectaccess(): + """ Add two new filtername that behave like visible to provide direct access + and direct access with warning. Wraps the commands to setup direct access """ + visiblefilter = repoview.computehidden + repoview.filtertable.update({'visible-directaccess-nowarn': visiblefilter}) + for cmd in directaccessnowarning: + extensions.wrapcommand(commands.table, cmd, wrapwithoutwarning) + evolve = extensions.find("evolve") + for cmd in directaccessnowarningevolve: + try: + extensions.wrapcommand(evolve.cmdtable, cmd, wrapwithoutwarning) + except error.UnknownCommand: + # Command not loaded, in that case we don't need to override it + pass def _update(orig, ui, repo, *args, **kwargs): """ When moving to a commit we want to inhibit any obsolete commit affecting @@ -192,6 +209,14 @@ transaction.addpostclose('inhibitposttransaction', inhibitposttransaction) return transaction +def wrapwithoutwarning(orig, *args, **kwargs): + ui, repo, = args[0], args[1] + if repo and repo.filtername == 'visible': + object.__setattr__(repo, 'filtername', + 'visible-directaccess-nowarn') + k = orig(*args, **kwargs) + return k + def extsetup(ui): # lets wrap the computation of the obsolete set # We apply inhibition there @@ -214,6 +239,7 @@ extensions.wrapfunction(obsolete, 'createmarkers', _createmarkers) extensions.wrapfunction(repoview, '_getdynamicblockers', _accessvisible) extensions.wrapfunction(revset, 'posttreebuilthook', _posttreebuilthook) + setupdirectaccess() # wrap update to make sure that no obsolete commit is visible after an # update extensions.wrapcommand(commands.table, 'update', _update) @@ -250,8 +276,10 @@ # We extract the symbols that look like hashes and add them to the # explicitaccess set orig(tree, repo) - if repo is not None and repo.filtername == 'visible': + if repo and repo.filtername and \ + repo.filtername.startswith('visible'): prelength = len(repo._explicitaccess) + accessbefore = set(repo._explicitaccess) repo.symbols = gethashsymbols(tree) cl = repo.unfiltered().changelog for node in repo.symbols: @@ -264,6 +292,13 @@ if rev not in repo.changelog: repo._explicitaccess.add(rev) if prelength != len(repo._explicitaccess): + if repo.filtername != 'visible-directaccess-nowarn': + unhiddencommits = repo._explicitaccess - accessbefore + repo.ui.warn( _("Warning: accessing hidden changesets %s " + "for write operation\n") % + (",".join([str(repo.unfiltered()[l]) + for l in unhiddencommits]))) + repo.invalidatevolatilesets() @command('debugobsinhibit', [], '') diff --git a/tests/test-inhibit.t b/tests/test-inhibit.t --- a/tests/test-inhibit.t +++ b/tests/test-inhibit.t @@ -397,6 +397,9 @@ (use --hidden to access hidden revisions) [255] $ hg rebase -r ad78ff7d621f -r 53a94305e133 -d 2db36d8066ff + Warning: accessing hidden changesets 2db36d8066ff for write operation + Warning: accessing hidden changesets ad78ff7d621f for write operation + Warning: accessing hidden changesets 53a94305e133 for write operation rebasing 10:ad78ff7d621f "add cK" rebasing 11:53a94305e133 "add cL" $ hg log -G