{"thread":{"id":"40939","subject":"[PATCH 2/2] git-p4: reduce number of server queries for fetches","startedAt":"2015-12-05T11:22:22Z","lastAt":"2015-12-05T11:22:22Z","messageCount":1,"participants":["Sam Hocevar"],"isPatch":true,"patchVersion":1,"patchTotal":2},"messages":[{"id":"274052","messageId":"20151205112222.GA15873@hocevar.net","threadId":"40939","inReplyTo":null,"subject":"[PATCH 2/2] git-p4: reduce number of server queries for fetches","fromName":"Sam Hocevar","fromEmail":"sam@hocevar.net","sentAt":"2015-12-05T11:22:22Z","receivedAt":"2015-12-05T11:22:22Z","isPatch":true,"sender":{"key":"sam@hocevar.net","avatar":"https://avatars.githubusercontent.com/u/245089?v=4"},"body":"When fetching changes from a depot using a full client spec, there\nis no need to perform as many queries as there are top-level paths\nin the client spec.  Instead we query all changes in chronological\norder, also getting rid of the need to sort the results and remove\nduplicates.\n\nSigned-off-by: Sam Hocevar <sam@hocevar.net>\n---\n git-p4.py | 43 ++++++++++++++++++++-----------------------\n 1 file changed, 20 insertions(+), 23 deletions(-)\n\ndiff --git a/git-p4.py b/git-p4.py\nindex 210f100..ea2bbb2 100755\n--- a/git-p4.py\n+++ b/git-p4.py\n@@ -796,39 +796,36 @@ def p4ChangesForPaths(depotPaths, changeRange, requestedBlockSize):\n                 die(\"cannot use --changes-block-size with non-numeric revisions\")\n             block_size = None\n \n-    # Accumulate change numbers in a dictionary to avoid duplicates\n-    changes = {}\n+    changes = []\n \n-    for p in depotPaths:\n-        # Retrieve changes a block at a time, to prevent running\n-        # into a MaxResults/MaxScanRows error from the server.\n+    # Retrieve changes a block at a time, to prevent running\n+    # into a MaxResults/MaxScanRows error from the server.\n \n-        while True:\n-            cmd = ['changes']\n+    while True:\n+        cmd = ['changes']\n \n-            if block_size:\n-                end = min(changeEnd, changeStart + block_size)\n-                revisionRange = \"%d,%d\" % (changeStart, end)\n-            else:\n-                revisionRange = \"%s,%s\" % (changeStart, changeEnd)\n+        if block_size:\n+            end = min(changeEnd, changeStart + block_size)\n+            revisionRange = \"%d,%d\" % (changeStart, end)\n+        else:\n+            revisionRange = \"%s,%s\" % (changeStart, changeEnd)\n \n+        for p in depotPaths:\n             cmd += [\"%s...@%s\" % (p, revisionRange)]\n \n-            for line in p4_read_pipe_lines(cmd):\n-                changeNum = int(line.split(\" \")[1])\n-                changes[changeNum] = True\n+        # Insert changes in chronological order\n+        for line in reversed(p4_read_pipe_lines(cmd)):\n+            changes.append(int(line.split(\" \")[1]))\n \n-            if not block_size:\n-                break\n+        if not block_size:\n+            break\n \n-            if end >= changeEnd:\n-                break\n+        if end >= changeEnd:\n+            break\n \n-            changeStart = end + 1\n+        changeStart = end + 1\n \n-    changelist = changes.keys()\n-    changelist.sort()\n-    return changelist\n+    return changes\n \n def p4PathStartsWith(path, prefix):\n     # This method tries to remedy a potential mixed-case issue:\n-- \n2.6.2\n"}]}