1
0
mirror of https://gitlab.com/fdroid/fdroidserver.git synced 2024-09-17 10:40:12 +02:00

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.
This commit is contained in:
Daniel Martí 2016-03-02 11:30:40 +00:00
parent 261cbcd3ee
commit 2a73b74603
2 changed files with 23 additions and 25 deletions

View File

@ -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:

View File

@ -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):