diff --git a/README.dev.md b/README.dev.md index 78b8ba2..98f8bdd 100644 --- a/README.dev.md +++ b/README.dev.md @@ -112,6 +112,7 @@ the settings to your needs: LOGGING['handlers']['file']['filename'] = '/tmp/geany_django.log' LATEST_VERSION_RELEASES_DIRECTORY = '/path/to/geany/releases/directory/or/just/empty' + LATEST_VERSION_PLUGINS_RELEASES_DIRECTORY = '/path/to/plugins/releases/directory/or/just/empty' STATIC_DOCS_GEANY_SOURCE_TARBALL = '/path/to/geany/source/tarball/or/just/empty' IRC_USER_LIST_FILE = '/path/to/irc/data/or/just/empty' diff --git a/docker/local_settings.docker.py b/docker/local_settings.docker.py index cfa6cd9..f5c5021 100644 --- a/docker/local_settings.docker.py +++ b/docker/local_settings.docker.py @@ -55,7 +55,8 @@ STATIC_DOCS_GEANY_DESTINATION_URL = os.path.join(MEDIA_URL, 'i18n') STATIC_DOCS_GEANY_I18N_STATISTICS_FILENAME = 'i18n_statistics.json' -LATEST_VERSION_RELEASES_DIRECTORY = '' +LATEST_VERSION_RELEASES_DIRECTORY = '/nonexistant/geany' +LATEST_VERSION_PLUGINS_RELEASES_DIRECTORY = '/nonexistant/plugins' LOGGING = { 'version': 1, diff --git a/geany/settings.py b/geany/settings.py index 0251a3f..dfc8a38 100644 --- a/geany/settings.py +++ b/geany/settings.py @@ -458,6 +458,7 @@ IRC_USER_LIST_FILE = '/srv/tmp/irc_userlist' LATEST_VERSION_RELEASES_DIRECTORY = '/srv/www/download.geany.org' +LATEST_VERSION_PLUGINS_RELEASES_DIRECTORY = '/srv/www/plugins.geany.org/geany-plugins/' MEZZANINE_SYNC_PAGES_DESTINATION_PATH = os.path.join(PROJECT_ROOT, 'page_content') diff --git a/latest_version/context_processors.py b/latest_version/context_processors.py index 1f60221..1590e2f 100644 --- a/latest_version/context_processors.py +++ b/latest_version/context_processors.py @@ -22,13 +22,27 @@ # ---------------------------------------------------------------------- @cache_function(CACHE_TIMEOUT_1HOUR, ignore_arguments=True) def latest_version(request): - geany_latest_version = LatestVersion.objects.get(id=1) + latest_versions = LatestVersion.objects.all() + latest_versions_by_name = { + latest_version.name: latest_version + for latest_version + in latest_versions} + geany_latest_version = latest_versions_by_name.get('Geany') + geany_plugins_latest_version = latest_versions_by_name.get('Geany-Plugins') + # Geany release_versions_provider = ReleaseVersionsProvider( settings.LATEST_VERSION_RELEASES_DIRECTORY, fallback_version=geany_latest_version.version) release_versions = release_versions_provider.provide() + # Geany-Plugins + geany_plugins_release_versions_provider = ReleaseVersionsProvider( + settings.LATEST_VERSION_PLUGINS_RELEASES_DIRECTORY, + fallback_version=geany_plugins_latest_version.version) + plugins_release_versions = geany_plugins_release_versions_provider.provide() return dict( geany_latest_version=geany_latest_version, - release_versions=release_versions) + geany_plugins_latest_version=geany_plugins_latest_version, + release_versions=release_versions, + plugins_release_versions=plugins_release_versions) diff --git a/latest_version/fixtures/first_plugins_version.json b/latest_version/fixtures/first_plugins_version.json new file mode 100644 index 0000000..cae47a7 --- /dev/null +++ b/latest_version/fixtures/first_plugins_version.json @@ -0,0 +1,12 @@ +[ + { + "model": "latest_version.latestversion", + "pk": 2, + "fields": { + "name": "Geany-Plugins", + "version": "1.36.0", + "github_link": "/commits/1.36.0", + "release_date": "2020-09-28T14:12:00Z" + } + } +] diff --git a/latest_version/migrations/0002_latestversion_name.py b/latest_version/migrations/0002_latestversion_name.py new file mode 100644 index 0000000..7ebf7f2 --- /dev/null +++ b/latest_version/migrations/0002_latestversion_name.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.16 on 2020-09-27 21:36 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('latest_version', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='latestversion', + name='name', + field=models.CharField(default='Geany', max_length=50, unique=True), + preserve_default=False, + ), + ] diff --git a/latest_version/models.py b/latest_version/models.py index d972b95..0fc8cf0 100644 --- a/latest_version/models.py +++ b/latest_version/models.py @@ -17,6 +17,7 @@ class LatestVersion(models.Model): + name = models.CharField(max_length=50, unique=True) version = models.CharField(max_length=50, verbose_name='Latest Geany version') release_date = models.DateTimeField() github_link = models.CharField( @@ -28,16 +29,10 @@ class Meta: verbose_name = 'Latest Version' verbose_name_plural = 'Latest Version' - # ---------------------------------------------------------------------- - def save(self, *args, **kwargs): # pylint: disable=signature-differs - """Save but replace the existing row instead of adding a new one""" - self.id = 1 # pylint: disable=invalid-name,attribute-defined-outside-init - super().save(*args, **kwargs) - # ---------------------------------------------------------------------- def delete(self, using=None, keep_parents=False): """Never delete anything""" # ---------------------------------------------------------------------- def __str__(self): - return 'Geany {}'.format(self.version) + return '{} {}'.format(self.name, self.version) diff --git a/latest_version/releases.py b/latest_version/releases.py index bef0012..a4737b9 100644 --- a/latest_version/releases.py +++ b/latest_version/releases.py @@ -16,6 +16,7 @@ import logging import re +from django.conf import settings from packaging.version import parse as parse_version @@ -25,21 +26,38 @@ RELEASE_TYPE_MACOS = 'macos_version' RELEASE_TYPES = { - RELEASE_TYPE_SOURCE_GZIP: { - 'pattern': re.compile(r'^geany-([0-9\.\-]+).tar.gz$'), - 'fallback_filename': 'geany-{version}.tar.gz' + settings.LATEST_VERSION_RELEASES_DIRECTORY: { + RELEASE_TYPE_SOURCE_GZIP: { + 'pattern': re.compile(r'^geany-([0-9\.\-]+).tar.gz$'), + 'fallback_filename': 'geany-{version}.tar.gz' + }, + RELEASE_TYPE_SOURCE_BZIP2: { + 'pattern': re.compile(r'^geany-([0-9\.\-]+).tar.bz2$'), + 'fallback_filename': 'geany-{version}.tar.bz2' + }, + RELEASE_TYPE_WINDOWS: { + 'pattern': re.compile(r'^geany-([0-9\.\-]+)_setup(-[0-9]+)?.exe$'), + 'fallback_filename': 'geany-{version}_setup.exe' + }, + RELEASE_TYPE_MACOS: { + 'pattern': re.compile(r'^geany-([0-9\.\-]+)_osx(-[0-9]+)?.dmg$'), + 'fallback_filename': 'geany-{version}_osx.dmg' + }, }, - RELEASE_TYPE_SOURCE_BZIP2: { - 'pattern': re.compile(r'^geany-([0-9\.\-]+).tar.bz2$'), - 'fallback_filename': 'geany-{version}.tar.bz2' - }, - RELEASE_TYPE_WINDOWS: { - 'pattern': re.compile(r'^geany-([0-9\.\-]+)_setup(-[0-9]+)?.exe$'), - 'fallback_filename': 'geany-{version}_setup.exe' - }, - RELEASE_TYPE_MACOS: { - 'pattern': re.compile(r'^geany-([0-9\.\-]+)_osx(-[0-9]+)?.dmg$'), - 'fallback_filename': 'geany-{version}_osx.dmg' + + settings.LATEST_VERSION_PLUGINS_RELEASES_DIRECTORY: { + RELEASE_TYPE_SOURCE_GZIP: { + 'pattern': re.compile(r'^geany-plugins-([0-9\.\-]+).tar.gz$'), + 'fallback_filename': 'geany-plugins-{version}.tar.gz' + }, + RELEASE_TYPE_SOURCE_BZIP2: { + 'pattern': re.compile(r'^geany-plugins-([0-9\.\-]+).tar.bz2$'), + 'fallback_filename': 'geany-plugins-{version}.tar.bz2' + }, + RELEASE_TYPE_WINDOWS: { + 'pattern': re.compile(r'^geany-plugins-([0-9\.\-]+)_setup(-[0-9]+)?.exe$'), + 'fallback_filename': 'geany-plugins-{version}_setup.exe' + }, }, } @@ -81,6 +99,9 @@ def _fetch_releases_from_filesystem(self): return path = Path(self._releases_directory) + if not path.exists(): + return + for entry in path.iterdir(): relative_entry = entry.relative_to(self._releases_directory) filename = relative_entry.as_posix() @@ -89,21 +110,19 @@ def _fetch_releases_from_filesystem(self): # ---------------------------------------------------------------------- def _group_releases_by_type(self): self._release_files_by_version = dict() - for release_type in RELEASE_TYPES: + release_types = self._get_release_types() + for release_type in release_types: self._release_files_by_version[release_type] = list() for filename in self._release_files: - if RELEASE_TYPES[RELEASE_TYPE_SOURCE_GZIP]['pattern'].match(filename): - self._release_files_by_version[RELEASE_TYPE_SOURCE_GZIP].append(filename) - - elif RELEASE_TYPES[RELEASE_TYPE_SOURCE_BZIP2]['pattern'].match(filename): - self._release_files_by_version[RELEASE_TYPE_SOURCE_BZIP2].append(filename) + for release_type in release_types: + if release_types[release_type]['pattern'].match(filename): + self._release_files_by_version[release_type].append(filename) + break - elif RELEASE_TYPES[RELEASE_TYPE_WINDOWS]['pattern'].match(filename): - self._release_files_by_version[RELEASE_TYPE_WINDOWS].append(filename) - - elif RELEASE_TYPES[RELEASE_TYPE_MACOS]['pattern'].match(filename): - self._release_files_by_version[RELEASE_TYPE_MACOS].append(filename) + # ---------------------------------------------------------------------- + def _get_release_types(self): + return RELEASE_TYPES.get(self._releases_directory, dict()) # ---------------------------------------------------------------------- def _factor_release_versions(self): @@ -117,12 +136,13 @@ def _factor_release_versions(self): def _determine_latest_version(self, release_type): versions = self._release_files_by_version[release_type] sorted_versions = sorted(versions, key=parse_version) + release_types = self._get_release_types() try: latest_version = sorted_versions.pop() logger.debug( 'Latest version found for "{}": {}'.format(release_type, latest_version)) except IndexError: - fallback_filename = RELEASE_TYPES[release_type]['fallback_filename'] + fallback_filename = release_types[release_type]['fallback_filename'] latest_version = fallback_filename.format(version=self._fallback_version) logger.debug( 'Latest version found for "{}": {} (fallback)'.format( diff --git a/page_content/download/releases.md b/page_content/download/releases.md index 54a00ec..dd23e74 100644 --- a/page_content/download/releases.md +++ b/page_content/download/releases.md @@ -1,5 +1,4 @@ -Releases -========== +## Geany Releases Distribution | File | GPG Signature | GPG Key ----------------- | ------------- | ------------- | ------------- @@ -11,10 +10,19 @@ Mac OSX | [{{ release_versions.macos_version }}](https://download.gean [Release notes for Geany {{ geany_latest_version.version }}][3] -## Plugins +## Geany-Plugins Releases Geany has a few plugins included (Classbuilder, Export, Filebrowser, HTML Characters, Save Actions and Split Window) -but many more plugins are available in the [Geany-Plugins][5] project. +but many more plugins are available in the [Geany-Plugins][5] project: + +Distribution | File | GPG Signature | GPG Key +----------------- | ------------- | ------------- | ------------- +Source (tar.gz) | [{{ plugins_release_versions.source_gzip_version }}](https://plugins.geany.org/geany-plugins/{{ plugins_release_versions.source_gzip_version }}) | [{{ plugins_release_versions.source_gzip_version }}.sig](https://plugins.geany.org/geany-plugins/{{ plugins_release_versions.source_gzip_version }}.sig) ([Instructions][4]) | [frlan-pubkey.txt][6] +Source (tar.bz2) | [{{ plugins_release_versions.source_bzip2_version }}](https://plugins.geany.org/geany-plugins/{{ plugins_release_versions.source_bzip2_version }}) | [{{ plugins_release_versions.source_bzip2_version }}.sig](https://plugins.geany.org/geany-plugins/{{ plugins_release_versions.source_bzip2_version }}.sig) ([Instructions][4]) | [frlan-pubkey.txt][6] +Windows | [{{ plugins_release_versions.windows_version }}](https://plugins.geany.org/geany-plugins/{{ plugins_release_versions.windows_version }}) | [{{ plugins_release_versions.windows_version }}.sig](https://plugins.geany.org/geany-plugins/{{ plugins_release_versions.windows_version }}.sig) ([Instructions][4]) | [frlan-pubkey.txt][6] +Mac OSX | (included in `{{ release_versions.macos_version }}` above) | - | - + +[Release notes for Geany-Plugins {{ geany_plugins_latest_version.version }}][7] For more details, see the [plugin page][5]. @@ -28,9 +36,12 @@ For older versions, please see https://download.geany.org/. - Note: Tarballs before 1.25 used another GPG Key: https://download.geany.org/colombanw-pubkey-pre-1.25.txt - Note: Tarballs before 0.21 used another GPG Key: https://download.geany.org/ntrel-pubkey.txt - Note: Tarballs before 0.20 used another GPG Key: https://download.geany.org/eht16-pubkey_old.txt +- Note: Geany-Plugins downloads use the following GPG Key: https://download.geany.org/frlan-pubkey.txt [1]: https://download.geany.org/colombanw-pubkey.txt [2]: https://download.geany.org/eht16-pubkey.txt [3]: /documentation/releasenotes/ [4]: /support/verify-gpg-signature/ [5]: /support/plugins/ +[6]: https://download.geany.org/frlan-pubkey.txt +[7]: https://raw.githubusercontent.com/geany/geany-plugins/{{ geany_plugins_latest_version.version }}/NEWS