1
0
mirror of https://gitlab.com/fdroid/fdroidserver.git synced 2024-10-05 18:50:09 +02:00

Merge branch 'current-version-links' into 'master'

Current version links

This is the automatic generation of "current version" symlinks that @ciarang and I chatted about, and is discussed here: https://f-droid.org/forums/topic/static-urls-to-current-version-of-each-app/

See merge request !29
This commit is contained in:
Ciaran Gultnieks 2014-11-17 09:01:11 +00:00
commit 031b4a74e7
4 changed files with 60 additions and 8 deletions

View File

@ -52,6 +52,15 @@ archive_description = """
The repository of older versions of applications from the main demo repository.
"""
# `fdroid update` will create a link to the current version of a given app.
# This provides a static path to the current APK. To disable the creation of
# this link, uncomment this:
# make_current_version_link = False
# By default, the "current version" link will be based on the "Name" of the
# app from the metadata. You can change it to use a different field from the
# metadata here:
# current_version_name_source = 'id'
# The ID of a GPG key for making detached signatures for apks. Optional.
# gpgkey = '1DBA2E89'

View File

@ -47,6 +47,8 @@ default_config = {
'mvn3': "mvn",
'gradle': 'gradle',
'sync_from_local_copy_dir': False,
'make_current_version_link': True,
'current_version_name_source': 'Name',
'update_stats': False,
'stats_ignore': [],
'stats_server': None,

View File

@ -18,6 +18,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import sys
import glob
import hashlib
import os
import paramiko
@ -120,7 +121,9 @@ def update_awsbucket(repo_section):
def update_serverwebroot(serverwebroot, repo_section):
rsyncargs = ['rsync', '--archive', '--delete']
# use a checksum comparison for accurate comparisons on different
# filesystems, for example, FAT has a low resolution timestamp
rsyncargs = ['rsync', '--archive', '--delete', '--checksum']
if options.verbose:
rsyncargs += ['--verbose']
if options.quiet:
@ -131,18 +134,29 @@ def update_serverwebroot(serverwebroot, repo_section):
rsyncargs += ['-e', 'ssh -i ' + config['identity_file']]
indexxml = os.path.join(repo_section, 'index.xml')
indexjar = os.path.join(repo_section, 'index.jar')
# serverwebroot is guaranteed to have a trailing slash in common.py
# upload the first time without the index so that the repo stays working
# while this update is running. Then once it is complete, rerun the
# command again to upload the index. Always using the same target with
# rsync allows for very strict settings on the receiving server, you can
# literally specify the one rsync command that is allowed to run in
# ~/.ssh/authorized_keys. (serverwebroot is guaranteed to have a trailing
# slash in common.py)
if subprocess.call(rsyncargs +
['--exclude', indexxml, '--exclude', indexjar,
repo_section, serverwebroot]) != 0:
sys.exit(1)
# use stricter checking on the indexes since they provide the signature
rsyncargs += ['--checksum']
sectionpath = serverwebroot + repo_section
if subprocess.call(rsyncargs + [indexxml, sectionpath]) != 0:
sys.exit(1)
if subprocess.call(rsyncargs + [indexjar, sectionpath]) != 0:
if subprocess.call(rsyncargs + [repo_section, serverwebroot]) != 0:
sys.exit(1)
# upload "current version" symlinks if requested
if config['make_current_version_link'] and repo_section == 'repo':
links_to_upload = []
for f in glob.glob('*.apk') \
+ glob.glob('*.apk.asc') + glob.glob('*.apk.sig'):
if os.path.islink(f):
links_to_upload.append(f)
if len(links_to_upload) > 0:
if subprocess.call(rsyncargs + links_to_upload + [serverwebroot]) != 0:
sys.exit(1)
def _local_sync(fromdir, todir):

View File

@ -824,7 +824,15 @@ def make_index(apps, sortedids, apks, repodir, archive, categories):
apklist[i]['apkname'], apklist[i + 1]['apkname']))
sys.exit(1)
current_version_code = 0
current_version_file = None
for apk in apklist:
# find the APK for the "Current Version"
if current_version_code < apk['versioncode']:
current_version_code = apk['versioncode']
if current_version_code < int(app['Current Version Code']):
current_version_file = apk['apkname']
apkel = doc.createElement("package")
apel.appendChild(apkel)
addElement('version', apk['version'], doc, apkel)
@ -857,6 +865,25 @@ def make_index(apps, sortedids, apks, repodir, archive, categories):
if len(apk['features']) > 0:
addElement('features', ','.join(apk['features']), doc, apkel)
if current_version_file is not None \
and config['make_current_version_link'] \
and repodir == 'repo': # only create these
sanitized_name = re.sub('''[ '"&%?+=]''', '',
app[config['current_version_name_source']])
apklinkname = sanitized_name + '.apk'
current_version_path = os.path.join(repodir, current_version_file)
if os.path.exists(apklinkname):
os.remove(apklinkname)
os.symlink(current_version_path, apklinkname)
# also symlink gpg signature, if it exists
for extension in ('.asc', '.sig'):
sigfile_path = current_version_path + extension
if os.path.exists(sigfile_path):
siglinkname = apklinkname + extension
if os.path.exists(siglinkname):
os.remove(siglinkname)
os.symlink(sigfile_path, siglinkname)
of = open(os.path.join(repodir, 'index.xml'), 'wb')
if options.pretty:
output = doc.toprettyxml()