[Differential] [Updated, 66 lines] D76: contrib: add a codemod script to rewrite nested with

quark (Jun Wu) phabricator at mercurial-scm.org
Thu Jul 13 22:01:30 EDT 2017


quark updated this revision to Diff 123.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D76?vs=120&id=123

REVISION DETAIL
  https://phab.mercurial-scm.org/D76

AFFECTED FILES
  contrib/codemod/codemod_nestedwith.py

CHANGE DETAILS

Index: contrib/codemod/codemod_nestedwith.py
===================================================================
--- /dev/null
+++ contrib/codemod/codemod_nestedwith.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+# codemod_nestedwith.py - codemod tool to rewrite nested with
+#
+# Copyright 2017 Facebook, Inc.
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+from __future__ import absolute_import, print_function
+
+import sys
+
+import redbaron
+
+def readpath(path):
+    with open(path) as f:
+        return f.read()
+
+def writepath(path, content):
+    with open(path, 'w') as f:
+        f.write(content)
+
+def nestedwithitems(red):
+    """match nested withs, yield (node, innernode, level)"""
+    visited = set()
+    for node in red.find_all('with'):
+        if node in visited:
+            continue
+        level = 0
+        cur = node
+        while True:
+            if cur.type != 'with':
+                break
+            visited.add(cur)
+            level += 1
+            cur = cur[0]
+        if level > 1:
+            yield (node, level)
+
+def main(argv):
+    if not argv:
+        print('Usage: codemod_nestedwith.py FILES\n')
+
+    for i, path in enumerate(argv):
+        print('(%d/%d) scanning %s' % (i + 1, len(argv), path))
+        changed = False
+        red = redbaron.RedBaron(readpath(path))
+
+        for node, level in nestedwithitems(red):
+            while level > 1:
+                # estimate line length after merging two "with"s
+                new = '%swith %s:' % (node.indentation, node.contexts.dumps())
+                new += ', %s' % node[0].contexts.dumps()
+                # only do the rewrite if the end result is within 80 chars
+                if len(new) > 80:
+                    break
+                node.contexts.append(node[0].contexts)
+                node.value = node[0].value
+                node.value.decrease_indentation(4)
+                level -= 1
+                changed = True
+        if changed:
+            print('updating %s' % path)
+            writepath(path, red.dumps())
+
+if __name__ == "__main__":
+    sys.exit(main(sys.argv[1:]))


EMAIL PREFERENCES
  https://phab.mercurial-scm.org/settings/panel/emailpreferences/

To: quark, #hg-reviewers
Cc: mercurial-devel, indygreg


More information about the Mercurial-devel mailing list