--- a/hgext/phabricator.py Sat Feb 09 23:01:30 2019 +0100
+++ b/hgext/phabricator.py Sat Mar 02 18:48:23 2019 +0000
@@ -60,6 +60,7 @@
parser,
patch,
phases,
+ pycompat,
registrar,
scmutil,
smartset,
@@ -219,12 +220,16 @@
with contextlib.closing(urlopener.open(request)) as rsp:
body = rsp.read()
repo.ui.debug(b'Conduit Response: %s\n' % body)
- parsed = json.loads(body)
- if parsed.get(r'error_code'):
+ parsed = pycompat.rapply(
+ lambda x: encoding.unitolocal(x) if isinstance(x, pycompat.unicode)
+ else x,
+ json.loads(body)
+ )
+ if parsed.get(b'error_code'):
msg = (_(b'Conduit Error (%s): %s')
- % (parsed[r'error_code'], parsed[r'error_info']))
+ % (parsed[b'error_code'], parsed[b'error_info']))
raise error.Abort(msg)
- return parsed[r'result']
+ return parsed[b'result']
@vcrcommand(b'debugcallconduit', [], _(b'METHOD'))
def debugcallconduit(ui, repo, name):
@@ -249,9 +254,9 @@
return None
query = callconduit(repo, b'diffusion.repository.search',
{b'constraints': {b'callsigns': [callsign]}})
- if len(query[r'data']) == 0:
+ if len(query[b'data']) == 0:
return None
- repophid = encoding.strtolocal(query[r'data'][0][r'phid'])
+ repophid = query[b'data'][0][b'phid']
repo.ui.setconfig(b'phabricator', b'repophid', repophid)
return repophid
@@ -305,11 +310,11 @@
drevs = [drev for force, precs, drev in toconfirm.values()]
alldiffs = callconduit(unfi, b'differential.querydiffs',
{b'revisionIDs': drevs})
- getnode = lambda d: bin(encoding.unitolocal(
- getdiffmeta(d).get(r'node', b''))) or None
+ getnode = lambda d: bin(
+ getdiffmeta(d).get(b'node', b'')) or None
for newnode, (force, precset, drev) in toconfirm.items():
diffs = [d for d in alldiffs.values()
- if int(d[r'revisionID']) == drev]
+ if int(d[b'revisionID']) == drev]
# "precursors" as known by Phabricator
phprecset = set(getnode(d) for d in diffs)
@@ -328,7 +333,7 @@
# exists in the repo
oldnode = lastdiff = None
if diffs:
- lastdiff = max(diffs, key=lambda d: int(d[r'id']))
+ lastdiff = max(diffs, key=lambda d: int(d[b'id']))
oldnode = getnode(lastdiff)
if oldnode and oldnode not in nodemap:
oldnode = None
@@ -361,7 +366,7 @@
def writediffproperties(ctx, diff):
"""write metadata to diff so patches could be applied losslessly"""
params = {
- b'diff_id': diff[r'id'],
+ b'diff_id': diff[b'id'],
b'name': b'hg:meta',
b'data': json.dumps({
b'user': ctx.user(),
@@ -373,7 +378,7 @@
callconduit(ctx.repo(), b'differential.setdiffproperty', params)
params = {
- b'diff_id': diff[r'id'],
+ b'diff_id': diff[b'id'],
b'name': b'local:commits',
b'data': json.dumps({
ctx.hex(): {
@@ -408,7 +413,7 @@
transactions = []
if neednewdiff:
diff = creatediff(ctx)
- transactions.append({b'type': b'update', b'value': diff[r'phid']})
+ transactions.append({b'type': b'update', b'value': diff[b'phid']})
else:
# Even if we don't need to upload a new diff because the patch content
# does not change. We might still need to update its metadata so
@@ -433,7 +438,7 @@
desc = ctx.description()
info = callconduit(repo, b'differential.parsecommitmessage',
{b'corpus': desc})
- for k, v in info[r'fields'].items():
+ for k, v in info[b'fields'].items():
if k in [b'title', b'summary', b'testPlan']:
transactions.append({b'type': k, b'value': v})
@@ -455,13 +460,13 @@
result = callconduit(repo, b'user.search', query)
# username not found is not an error of the API. So check if we have missed
# some names here.
- data = result[r'data']
- resolved = set(entry[r'fields'][r'username'].lower() for entry in data)
+ data = result[b'data']
+ resolved = set(entry[b'fields'][b'username'].lower() for entry in data)
unresolved = set(names) - resolved
if unresolved:
raise error.Abort(_(b'unknown username: %s')
% b' '.join(sorted(unresolved)))
- return [entry[r'phid'] for entry in data]
+ return [entry[b'phid'] for entry in data]
@vcrcommand(b'phabsend',
[(b'r', b'rev', [], _(b'revisions to send'), _(b'REV')),
@@ -538,7 +543,7 @@
revision, diff = createdifferentialrevision(
ctx, revid, lastrevid, oldnode, olddiff, actions)
diffmap[ctx.node()] = diff
- newrevid = int(revision[r'object'][r'id'])
+ newrevid = int(revision[b'object'][b'id'])
if revid:
action = b'updated'
else:
@@ -580,9 +585,8 @@
for i, rev in enumerate(revs):
old = unfi[rev]
drevid = drevids[i]
- drev = [d for d in drevs if int(d[r'id']) == drevid][0]
+ drev = [d for d in drevs if int(d[b'id']) == drevid][0]
newdesc = getdescfromdrev(drev)
- newdesc = encoding.unitolocal(newdesc)
# Make sure commit message contain "Differential Revision"
if old.description() != newdesc:
if old.phase() == phases.public:
@@ -613,8 +617,8 @@
# Map from "hg:meta" keys to header understood by "hg import". The order is
# consistent with "hg export" output.
-_metanamemap = util.sortdict([(r'user', b'User'), (r'date', b'Date'),
- (r'node', b'Node ID'), (r'parent', b'Parent ')])
+_metanamemap = util.sortdict([(b'user', b'User'), (b'date', b'Date'),
+ (b'node', b'Node ID'), (b'parent', b'Parent ')])
def _confirmbeforesend(repo, revs, oldmap):
url, token = readurltoken(repo)
@@ -644,7 +648,7 @@
def _getstatusname(drev):
"""get normalized status name from a Differential Revision"""
- return drev[r'statusName'].replace(b' ', b'').lower()
+ return drev[b'statusName'].replace(b' ', b'').lower()
# Small language to specify differential revisions. Support symbols: (), :X,
# +, and -.
@@ -762,8 +766,8 @@
drevs = callconduit(repo, b'differential.query', params)
# Fill prefetched with the result
for drev in drevs:
- prefetched[drev[r'phid']] = drev
- prefetched[int(drev[r'id'])] = drev
+ prefetched[drev[b'phid']] = drev
+ prefetched[int(drev[b'id'])] = drev
if key not in prefetched:
raise error.Abort(_(b'cannot get Differential Revision %r')
% params)
@@ -777,12 +781,12 @@
while queue:
params = queue.pop()
drev = fetch(params)
- if drev[r'id'] in visited:
+ if drev[b'id'] in visited:
continue
- visited.add(drev[r'id'])
- result.append(int(drev[r'id']))
- auxiliary = drev.get(r'auxiliary', {})
- depends = auxiliary.get(r'phabricator:depends-on', [])
+ visited.add(drev[b'id'])
+ result.append(int(drev[b'id']))
+ auxiliary = drev.get(b'auxiliary', {})
+ depends = auxiliary.get(b'phabricator:depends-on', [])
for phid in depends:
queue.append({b'phids': [phid]})
result.reverse()
@@ -802,7 +806,7 @@
for r in ancestordrevs:
tofetch.update(range(max(1, r - batchsize), r + 1))
if drevs:
- fetch({r'ids': list(tofetch)})
+ fetch({b'ids': list(tofetch)})
validids = sorted(set(getstack(list(ancestordrevs))) | set(drevs))
# Walk through the tree, return smartsets
@@ -836,12 +840,12 @@
This is similar to differential.getcommitmessage API. But we only care
about limited fields: title, summary, test plan, and URL.
"""
- title = drev[r'title']
- summary = drev[r'summary'].rstrip()
- testplan = drev[r'testPlan'].rstrip()
+ title = drev[b'title']
+ summary = drev[b'summary'].rstrip()
+ testplan = drev[b'testPlan'].rstrip()
if testplan:
testplan = b'Test Plan:\n%s' % testplan
- uri = b'Differential Revision: %s' % drev[r'uri']
+ uri = b'Differential Revision: %s' % drev[b'uri']
return b'\n\n'.join(filter(None, [title, summary, testplan, uri]))
def getdiffmeta(diff):
@@ -881,17 +885,17 @@
Note: metadata extracted from "local:commits" will lose time zone
information.
"""
- props = diff.get(r'properties') or {}
- meta = props.get(r'hg:meta')
- if not meta and props.get(r'local:commits'):
- commit = sorted(props[r'local:commits'].values())[0]
+ props = diff.get(b'properties') or {}
+ meta = props.get(b'hg:meta')
+ if not meta and props.get(b'local:commits'):
+ commit = sorted(props[b'local:commits'].values())[0]
meta = {
- r'date': r'%d 0' % commit[r'time'],
- r'node': commit[r'rev'],
- r'user': r'%s <%s>' % (commit[r'author'], commit[r'authorEmail']),
+ b'date': b'%d 0' % commit[b'time'],
+ b'node': commit[b'rev'],
+ b'user': b'%s <%s>' % (commit[b'author'], commit[b'authorEmail']),
}
- if len(commit.get(r'parents', ())) >= 1:
- meta[r'parent'] = commit[r'parents'][0]
+ if len(commit.get(b'parents', ())) >= 1:
+ meta[b'parent'] = commit[b'parents'][0]
return meta or {}
def readpatch(repo, drevs, write):
@@ -901,14 +905,14 @@
"differential.query".
"""
# Prefetch hg:meta property for all diffs
- diffids = sorted(set(max(int(v) for v in drev[r'diffs']) for drev in drevs))
+ diffids = sorted(set(max(int(v) for v in drev[b'diffs']) for drev in drevs))
diffs = callconduit(repo, b'differential.querydiffs', {b'ids': diffids})
# Generate patch for each drev
for drev in drevs:
- repo.ui.note(_(b'reading D%s\n') % drev[r'id'])
+ repo.ui.note(_(b'reading D%s\n') % drev[b'id'])
- diffid = max(int(v) for v in drev[r'diffs'])
+ diffid = max(int(v) for v in drev[b'diffs'])
body = callconduit(repo, b'differential.getrawdiff',
{b'diffID': diffid})
desc = getdescfromdrev(drev)
@@ -923,7 +927,7 @@
header += b'# %s %s\n' % (_metanamemap[k], meta[k])
content = b'%s%s\n%s' % (header, desc, body)
- write(encoding.unitolocal(content))
+ write(content)
@vcrcommand(b'phabread',
[(b'', b'stack', False, _(b'read dependencies'))],
@@ -979,7 +983,7 @@
if i + 1 == len(drevs) and opts.get(b'comment'):
actions.append({b'type': b'comment', b'value': opts[b'comment']})
if actions:
- params = {b'objectIdentifier': drev[r'phid'],
+ params = {b'objectIdentifier': drev[b'phid'],
b'transactions': actions}
callconduit(repo, b'differential.revision.edit', params)