merge with crew
authorMatt Mackall <mpm@selenic.com>
Sun, 30 Jun 2013 14:56:04 -0500
changeset 19336 666aa90258e6
parent 19330 867b9957d895 (current diff)
parent 19335 77440de177f7 (diff)
child 19371 648d1974b3f3
merge with crew
--- a/mercurial/changegroup.py	Tue Jun 25 21:02:22 2013 +0400
+++ b/mercurial/changegroup.py	Sun Jun 30 14:56:04 2013 -0500
@@ -354,14 +354,8 @@
         progress(msgbundling, None)
 
         mfs.clear()
-        total = len(changedfiles)
-        # for progress output
-        msgfiles = _('files')
-        for i, fname in enumerate(sorted(changedfiles)):
-            filerevlog = repo.file(fname)
-            if not filerevlog:
-                raise util.Abort(_("empty or missing revlog for %s") % fname)
 
+        def linknodes(filerevlog, fname):
             if fastpathlinkrev:
                 ln, llr = filerevlog.node, filerevlog.linkrev
                 needed = set(cl.rev(x) for x in clnodes)
@@ -371,8 +365,33 @@
                         if linkrev in needed:
                             yield filerevlog.node(r), cl.node(linkrev)
                 fnodes[fname] = dict(genfilenodes())
+            return fnodes.get(fname, {})
 
-            linkrevnodes = fnodes.pop(fname, {})
+        for chunk in self.generatefiles(changedfiles, linknodes, commonrevs,
+                                        source):
+            yield chunk
+
+        yield self.close()
+        progress(msgbundling, None)
+
+        if clnodes:
+            repo.hook('outgoing', node=hex(clnodes[0]), source=source)
+
+    def generatefiles(self, changedfiles, linknodes, commonrevs, source):
+        repo = self._repo
+        progress = self._progress
+        reorder = self._reorder
+        msgbundling = _('bundling')
+
+        total = len(changedfiles)
+        # for progress output
+        msgfiles = _('files')
+        for i, fname in enumerate(sorted(changedfiles)):
+            filerevlog = repo.file(fname)
+            if not filerevlog:
+                raise util.Abort(_("empty or missing revlog for %s") % fname)
+
+            linkrevnodes = linknodes(filerevlog, fname)
             # Lookup for filenodes, we collected the linkrev nodes above in the
             # fastpath case and with lookupmf in the slowpath case.
             def lookupfilelog(x):
@@ -386,11 +405,6 @@
                 for chunk in self.group(filenodes, filerevlog, lookupfilelog,
                                         reorder=reorder):
                     yield chunk
-        yield self.close()
-        progress(msgbundling, None)
-
-        if clnodes:
-            repo.hook('outgoing', node=hex(clnodes[0]), source=source)
 
     def revchunk(self, revlog, rev, prev, linknode):
         node = revlog.node(rev)
--- a/mercurial/commands.py	Tue Jun 25 21:02:22 2013 +0400
+++ b/mercurial/commands.py	Sun Jun 30 14:56:04 2013 -0500
@@ -4356,8 +4356,10 @@
                 pass
         if not filenodes:
             raise util.Abort(_("'%s' not found in manifest!") % file_)
-        fl = repo.file(file_)
-        p = [repo.lookup(fl.linkrev(fl.rev(fn))) for fn in filenodes]
+        p = []
+        for fn in filenodes:
+            fctx = repo.filectx(file_, fileid=fn)
+            p.append(fctx.node())
     else:
         p = [cp.node() for cp in ctx.parents()]
 
--- a/tests/filterpyflakes.py	Tue Jun 25 21:02:22 2013 +0400
+++ b/tests/filterpyflakes.py	Sun Jun 30 14:56:04 2013 -0500
@@ -4,35 +4,48 @@
 
 import sys, re, os
 
-def makekey(message):
-    # "path/file:line: message"
-    match = re.search(r"(line \d+)", message)
-    line = ''
-    if match:
-        line = match.group(0)
-        message = re.sub(r"(line \d+)", '', message)
-    return re.sub(r"([^:]*):([^:]+):([^']*)('[^']*')(.*)$",
-                  r'\3:\5:\4:\1:\2:' + line,
-                  message)
+def makekey(typeandline):
+    """
+    for sorting lines by: msgtype, path/to/file, lineno, message
+
+    typeandline is a sequence of a message type and the entire message line
+    the message line format is path/to/file:line: message
+
+    >>> makekey((3, 'example.py:36: any message'))
+    (3, 'example.py', 36, ' any message')
+    >>> makekey((7, 'path/to/file.py:68: dummy message'))
+    (7, 'path/to/file.py', 68, ' dummy message')
+    >>> makekey((2, 'fn:88: m')) > makekey((2, 'fn:9: m'))
+    True
+    """
+
+    msgtype, line = typeandline
+    fname, line, message = line.split(":", 2)
+    # line as int for ordering 9 before 88
+    return msgtype, fname, int(line), message
+
 
 lines = []
 for line in sys.stdin:
-    # We whitelist tests
+    # We whitelist tests (see more messages in pyflakes.messages)
     pats = [
             r"imported but unused",
             r"local variable '.*' is assigned to but never used",
             r"unable to detect undefined names",
            ]
-    if not re.search('|'.join(pats), line):
-        continue
+    for msgtype, pat in enumerate(pats):
+        if re.search(pat, line):
+            break # pattern matches
+    else:
+        continue # no pattern matched, next line
     fn = line.split(':', 1)[0]
     f = open(os.path.join(os.path.dirname(os.path.dirname(__file__)), fn))
     data = f.read()
     f.close()
     if 'no-check-code' in data:
         continue
-    lines.append(line)
+    lines.append((msgtype, line))
 
-for line in sorted(lines, key = makekey):
+for msgtype, line in sorted(lines, key = makekey):
     sys.stdout.write(line)
 print