# HG changeset patch # User Patrick Mezard # Date 2012-07-30 17:26:05 # Node ID 8da6fe276a23dbb71a17ae5590de4f7e65be6136 # Parent 2d6bbf87f7b4333663297f4c91961e14abad8695 debugobsolete: do not traceback on invalid node identifiers diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -2067,17 +2067,31 @@ def debugknown(ui, repopath, *ids, **opt _('[OBSOLETED [REPLACEMENT] [REPL... ]')) def debugobsolete(ui, repo, precursor=None, *successors, **opts): """create arbitrary obsolete marker""" + def parsenodeid(s): + try: + # We do not use revsingle/revrange functions here to accept + # arbitrary node identifiers, possibly not present in the + # local repository. + n = bin(s) + if len(n) != len(nullid): + raise TypeError() + return n + except TypeError: + raise util.Abort('changeset references must be full hexadecimal ' + 'node identifiers') + if precursor is not None: metadata = {} if 'date' in opts: metadata['date'] = opts['date'] metadata['user'] = opts['user'] or ui.username() - succs = tuple(bin(succ) for succ in successors) + succs = tuple(parsenodeid(succ) for succ in successors) l = repo.lock() try: tr = repo.transaction('debugobsolete') try: - repo.obsstore.create(tr, bin(precursor), succs, 0, metadata) + repo.obsstore.create(tr, parsenodeid(precursor), succs, 0, + metadata) tr.close() finally: tr.release() diff --git a/tests/test-obsolete.t b/tests/test-obsolete.t --- a/tests/test-obsolete.t +++ b/tests/test-obsolete.t @@ -31,6 +31,12 @@ Killing a single changeset without replacement $ mkcommit kill_me + $ hg debugobsolete 0 + abort: changeset references must be full hexadecimal node identifiers + [255] + $ hg debugobsolete '00' + abort: changeset references must be full hexadecimal node identifiers + [255] $ hg debugobsolete -d '0 0' `getid kill_me` -u babar $ hg debugobsolete 97b7c2d76b1845ed3eb988cd612611e72406cef0 0 {'date': '0 0', 'user': 'babar'}