8dedf9d0be
Change-Id: I901c023f707a0223af673c217c65434e26e2ab1f Reviewed-on: https://cl.tvl.fyi/c/depot/+/568 Reviewed-by: lukegb <lukegb@tvl.fyi>
63 lines
2 KiB
Python
63 lines
2 KiB
Python
"""Bizarre hacks to make Gerrit better."""
|
|
|
|
import collections
|
|
import re
|
|
import random
|
|
import mercurial
|
|
|
|
_ = mercurial.i18n._
|
|
|
|
cmdtable = {}
|
|
command = mercurial.registrar.command(cmdtable)
|
|
|
|
testedwith = '5.3.1'
|
|
|
|
_changeid_regex = re.compile(b'^Change-Id: (I.*)$', re.M)
|
|
|
|
def random_hash():
|
|
"""Returns a random SHA1-like hex string."""
|
|
return b"%040x" % random.getrandbits(160)
|
|
|
|
def reposetup(ui, repo):
|
|
|
|
class GerritRepo(repo.__class__):
|
|
def commitctx(self, ctx, *args, **kwargs):
|
|
match = _changeid_regex.search(ctx._text)
|
|
if not match:
|
|
ctx._text = ctx._text.rstrip(b'\n')
|
|
ctx._text += b'\n\nChange-Id: I' + random_hash()
|
|
return super().commitctx(ctx, *args, **kwargs)
|
|
|
|
repo.__class__ = GerritRepo
|
|
|
|
|
|
@command(b'gerrit-obsolete', [], _(b'[options]'))
|
|
def gerritobsolete(ui, repo, **opts):
|
|
"""Mark draft commits as obsolete by public commits based on Gerrit Change-Id tag."""
|
|
if repo.obsstore.readonly:
|
|
ui.error(b'obsstore is readonly')
|
|
return
|
|
changesets = collections.defaultdict(set)
|
|
drafts = set()
|
|
for draft in repo.set('draft() - obsolete()'):
|
|
match = _changeid_regex.search(draft.description())
|
|
if not match:
|
|
continue
|
|
changesets[match.groups()[0]].add(draft)
|
|
drafts.add(draft)
|
|
if not drafts:
|
|
return
|
|
publicparent = next(repo.set(
|
|
b'ancestor((public() and bookmark("canon")), %s)' % (
|
|
b', '.join(x.hex() for x in drafts))))
|
|
megare = b're:(?ms)^Change-Id: (%s)$' % (b'|'.join(changesets.keys()),)
|
|
markers = []
|
|
for public in repo.set('(%s..(public() and canon)) and desc(%s)', publicparent, megare):
|
|
match = _changeid_regex.search(public.description())
|
|
if not match:
|
|
continue
|
|
drafts = changesets[match.groups()[0]]
|
|
if not drafts:
|
|
continue
|
|
markers.append((tuple(drafts), (public,)))
|
|
mercurial.obsolete.createmarkers(repo, markers, operation=b'gerrit-obsolete')
|