From 2a73b746034ad237adbfcdedd7ce4285a1382cde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Wed, 2 Mar 2016 11:30:40 +0000 Subject: [PATCH] checkupdates: sort tags by date in one go This greatly speeds up checkupdates when UCM:Tags is used on git repositories, especially on ones with lots of tags. The old method ran a command per tag. The new method runs a single command and doesn't require any sorting. Test runs show that `fdroid checkupdates org.adaway` is down from ~13s to ~10s on my laptop. --- fdroidserver/checkupdates.py | 10 +++++++--- fdroidserver/common.py | 38 +++++++++++++++--------------------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index b617ea9a..71931e3f 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -121,7 +121,11 @@ def check_tags(app, pattern): hver = None hcode = "0" - tags = vcs.gettags() + tags = [] + if repotype == 'git': + tags = vcs.latesttags() + else: + tags = vcs.gettags() if not tags: return (None, "No tags found", None) @@ -133,8 +137,8 @@ def check_tags(app, pattern): return (None, "No matching tags found", None) logging.debug("Matching tags: " + ','.join(tags)) - if len(tags) > 5 and repotype in ('git',): - tags = vcs.latesttags(tags, 5) + if len(tags) > 5 and repotype == 'git': + tags = tags[:5] logging.debug("Latest tags: " + ','.join(tags)) for tag in tags: diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 0b4c2dd0..1b199bb6 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -588,14 +588,8 @@ class vcs: rtags.append(tag) return rtags - def latesttags(self, tags, number): - """Get the most recent tags in a given list. - - :param tags: a list of tags - :param number: the number to return - :returns: A list containing the most recent tags in the provided - list, up to the maximum number given. - """ + # Get a list of all the known tags, sorted from newest to oldest + def latesttags(self): raise VCSException('latesttags not supported for this vcs type') # Get current commit reference (hash, revision, etc) @@ -703,21 +697,21 @@ class vcs_git(vcs): p = FDroidPopen(['git', 'tag'], cwd=self.local, output=False) return p.output.splitlines() - def latesttags(self, tags, number): + tag_format = re.compile(r'.*tag: ([^),]*).*') + + def latesttags(self): self.checkrepo() - tl = [] - for tag in tags: - p = FDroidPopen( - ['git', 'show', '--format=format:%ct', '-s', tag], - cwd=self.local, output=False) - # Timestamp is on the last line. For a normal tag, it's the only - # line, but for annotated tags, the rest of the info precedes it. - ts = int(p.output.splitlines()[-1]) - tl.append((ts, tag)) - latest = [] - for _, t in sorted(tl)[-number:]: - latest.append(t) - return latest + p = FDroidPopen(['git', 'log', '--tags', + '--simplify-by-decoration', '--pretty=format:%d'], + cwd=self.local, output=False) + tags = [] + for line in p.output.splitlines(): + m = self.tag_format.match(line) + if not m: + continue + tag = m.group(1) + tags.append(tag) + return tags class vcs_gitsvn(vcs):