1
0
Fork 0
mirror of https://we.phorge.it/source/arcanist.git synced 2024-11-25 08:12:40 +01:00

Allow "hg arc-ls-markers" to run under Python 2 or Python 3

Summary:
Ref T13546. See PHI1805. Currently, the "arc-ls-markers" extension doesn't run under Python 3:

  - some stuff needs "b'...'" to mark it as a byte string;
  - "dict.iteritems()" is gone in Python 3, and "mercurial.pycompat" isn't always available;
  - in Python 3, "json" refuses to print byte strings; and
  - the compiler caching behavior in Python 3 has changed.

Try to get these things working in the same way under Python 2 and Python 3.

Test Plan:
Ran this command (with `python` as Python 2, locally):

```
$ python /usr/local/bin/hg --config 'extensions.arc-hg=/Users/epriestley/dev/core/lib/arcanist/support/hg/arc-hg.py' arc-ls-markers --
```

...and this command:

```
$ python3 /usr/local/bin/hg --config 'extensions.arc-hg=/Users/epriestley/dev/core/lib/arcanist/support/hg/arc-hg.py' arc-ls-markers --
```

..and saw the same output in both cases (previously, `python3 ...` fataled in various ways).

Maniphest Tasks: T13546

Differential Revision: https://secure.phabricator.com/D21392
This commit is contained in:
epriestley 2020-07-06 15:24:30 -07:00
parent 79a6dfd7a9
commit a28e76b7b3
2 changed files with 27 additions and 5 deletions

1
.gitignore vendored
View file

@ -36,3 +36,4 @@
# Python extension compiled files. # Python extension compiled files.
/support/hg/arc-hg.pyc /support/hg/arc-hg.pyc
/support/hg/__pycache__/

View file

@ -1,4 +1,14 @@
from __future__ import absolute_import from __future__ import absolute_import
import sys
is_python_3 = sys.version_info[0] >= 3
if is_python_3:
def arc_items(dict):
return dict.items()
else:
def arc_items(dict):
return dict.iteritems()
import os import os
import json import json
@ -19,8 +29,8 @@ cmdtable = {}
command = registrar.command(cmdtable) command = registrar.command(cmdtable)
@command( @command(
"arc-ls-markers", b'arc-ls-markers',
[('', 'output', '', [(b'', b'output', b'',
_('file to output refs to'), _('FILE')), _('file to output refs to'), _('FILE')),
] + cmdutil.remoteopts, ] + cmdutil.remoteopts,
_('[--output FILENAME] [SOURCE]')) _('[--output FILENAME] [SOURCE]'))
@ -42,6 +52,16 @@ def lsmarkers(ui, repo, source=None, **opts):
else: else:
markers = remotemarkers(ui, repo, source, opts) markers = remotemarkers(ui, repo, source, opts)
for m in markers:
if m['name'] != None:
m['name'] = m['name'].decode('utf-8')
if m['node'] != None:
m['node'] = m['node'].decode('utf-8')
if m['description'] != None:
m['description'] = m['description'].decode('utf-8')
json_opts = { json_opts = {
'indent': 2, 'indent': 2,
'sort_keys': True, 'sort_keys': True,
@ -54,14 +74,15 @@ def lsmarkers(ui, repo, source=None, **opts):
with open(output_file, 'w+') as f: with open(output_file, 'w+') as f:
json.dump(markers, f, **json_opts) json.dump(markers, f, **json_opts)
else: else:
print json.dumps(markers, output_file, **json_opts) json_data = json.dumps(markers, **json_opts)
print(json_data)
return 0 return 0
def localmarkers(ui, repo): def localmarkers(ui, repo):
markers = [] markers = []
active_node = repo['.'].node() active_node = repo[b'.'].node()
all_heads = set(repo.heads()) all_heads = set(repo.heads())
current_name = repo.dirstate.branch() current_name = repo.dirstate.branch()
saw_current = False saw_current = False
@ -117,7 +138,7 @@ def localmarkers(ui, repo):
bookmarks = repo._bookmarks bookmarks = repo._bookmarks
active_bookmark = repo._activebookmark active_bookmark = repo._activebookmark
for bookmark_name, bookmark_node in bookmarks.iteritems(): for bookmark_name, bookmark_node in arc_items(bookmarks):
is_active = (active_bookmark == bookmark_name) is_active = (active_bookmark == bookmark_name)
description = repo[bookmark_node].description() description = repo[bookmark_node].description()