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:
parent
261cbcd3ee
commit
2a73b74603
@ -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:
|
||||
|
@ -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):
|
||||
|
Loading…
Reference in New Issue
Block a user