]> jfr.im git - irc/weechat/weechat.org.git/commitdiff
Auto update stable/next devel and symbolic links when adding a release
authorSébastien Helleu <redacted>
Fri, 9 Jun 2023 19:51:35 +0000 (21:51 +0200)
committerSébastien Helleu <redacted>
Fri, 9 Jun 2023 19:51:35 +0000 (21:51 +0200)
weechat/common/utils.py
weechat/dev/views.py
weechat/doc/views.py
weechat/download/models.py
weechat/download/views.py

index b79d26eb8976e05bd103af97bee8e906241115e0..b390d3a347973e9d93f436de31b7391346c6eaba 100644 (file)
@@ -20,6 +20,6 @@
 """Some useful functions."""
 
 
-def version_to_tuple(version):
-    """Convert version to a tuple of integers."""
-    return tuple(map(int, version.split('.')))
+def version_to_list(version):
+    """Convert version to a list of integers."""
+    return list(map(int, version.split('.')))
index 663ee76843293d080c3dd624b76d07cf2e405b03..7490beaa6b42de587871f06a52e04601f8be46f0 100644 (file)
@@ -26,7 +26,7 @@ from django.utils.translation import gettext, gettext_lazy
 
 from weechat.common.path import files_path_join, media_path_join
 from weechat.common.templatetags.version import version_as_int
-from weechat.common.utils import version_to_tuple
+from weechat.common.utils import version_to_list
 from weechat.dev.models import Task
 from weechat.download.models import Release
 
@@ -110,7 +110,7 @@ def roadmap(request, versions='future'):
     """Page with roadmap for future or all versions."""
     task_list = None
     try:
-        v_stable = version_to_tuple(
+        v_stable = version_to_list(
             Release.objects.get(project__name='weechat',
                                 version='stable').description
         )
@@ -118,14 +118,14 @@ def roadmap(request, versions='future'):
         if versions == 'future':
             # future versions
             tasks = [task for task in all_tasks
-                     if version_to_tuple(task.version.version) > v_stable]
+                     if version_to_list(task.version.version) > v_stable]
         else:
             # already released versions
             tasks = [task for task in all_tasks
-                     if version_to_tuple(task.version.version) <= v_stable]
+                     if version_to_list(task.version.version) <= v_stable]
         task_list = sorted(
             tasks,
-            key=lambda task: version_to_tuple(task.version.version),
+            key=lambda task: version_to_list(task.version.version),
         )
     except ObjectDoesNotExist:
         task_list = None
index 9548fc43bd3604e9f6332348b0fca5f36fc78d92..2c53f952f0c6c88bb78c5e932ecacc3c7782da3a 100644 (file)
@@ -31,7 +31,7 @@ from django.utils.translation import gettext
 
 from weechat.common.models import Project
 from weechat.common.path import files_path_join
-from weechat.common.utils import version_to_tuple
+from weechat.common.utils import version_to_list
 from weechat.doc.models import (
     Language,
     Version,
@@ -278,16 +278,16 @@ def security_wsa(request, project='weechat', wsa=''):
 
 def is_security_affecting_release(security, release):
     """Return True if the Security issue is affecting the Release."""
-    version_tuple = version_to_tuple(release.version)
+    version_list = version_to_list(release.version)
     for version in security.affected.split(','):
         if '-' in version:
             version1, version2 = version.split('-', 1)
-            version1 = version_to_tuple(version1)
-            version2 = version_to_tuple(version2)
-            if version1 <= version_tuple <= version2:
+            version1 = version_to_list(version1)
+            version2 = version_to_list(version2)
+            if version1 <= version_list <= version2:
                 return True
         else:
-            if version_tuple == version_to_tuple(version):
+            if version_list == version_to_list(version):
                 return True
     return False
 
index de2841a37569c58c7a6a4511806572160fbdb931..2cdfa8edeab1e1c3cd86813282d28a5414c6643c 100644 (file)
@@ -33,7 +33,7 @@ from django.db.models.signals import pre_save
 
 from weechat.common.models import Project
 from weechat.common.path import files_path_join
-from weechat.common.utils import version_to_tuple
+from weechat.common.utils import version_to_list
 
 PACKAGES_COMPRESSION_EXT = (
     'gz',
@@ -85,8 +85,8 @@ class Release(models.Model):
                               project__name=self.project.name,
                               version='stable',
                           ).description)
-        stable_version_tuple = version_to_tuple(stable_version)
-        return version_to_tuple(self.version) <= stable_version_tuple
+        stable_version_list = version_to_list(stable_version)
+        return version_to_list(self.version) <= stable_version_list
 
     class Meta:
         ordering = ['-date']
@@ -210,36 +210,20 @@ def handler_package_saved(sender, **kwargs):
         pass
 
 
-def add_release(project, version):
-    """Add a project release with its packages."""
-    print(f'Adding release {version} and packages in project {project}')
-    if Release.objects.filter(project__name=project, version=version).exists():
-        release = Release.objects.get(project__name=project, version=version)
-    else:
-        release = Release(
-            project=Project.objects.get(name=project),
-            version=version,
-        )
-    release.description = ''
-    release.date = date.today()
-    release.security_issues_fixed = 0
-    release.securityfix = ''
-    release.save()
-    for ext in PACKAGES_COMPRESSION_EXT:
-        Package.objects.filter(
-            version__project__name=project,
-            filename=f'{project}-{version}.tar.{ext}'
-        ).delete()
-        package = Package(
-            version=release,
-            type=Type.objects.get(type=f'src1-{ext}'),
-            filename=f'{project}-{version}.tar.{ext}',
-        )
-        package.save()
+def make_symlink(link_name, target):
+    """Create a symbolic link (overwrite link_name if existing)."""
+    print(f'Making symlink: {link_name} -> {target}')
+    tmp_name = f'{link_name}.__tmp__'
+    os.symlink(target, tmp_name)
+    os.rename(tmp_name, link_name)
 
 
 def set_stable_version(project, version):
-    """Set the stable version for a project."""
+    """
+    Set the stable version for a project and update all symbolic links to docs
+    and packages.
+    """
+    # set stable version in database
     print(f'Setting stable release to {version} in project {project}')
     if Release.objects.filter(project__name=project, version='stable').exists():
         release = Release.objects.get(project__name=project, version='stable')
@@ -254,6 +238,29 @@ def set_stable_version(project, version):
     release.securityfix = ''
     release.save()
 
+    # update package symbolic links
+    for ext in PACKAGES_COMPRESSION_EXT:
+        make_symlink(
+            files_path_join('src', f'{project}-stable.tar.{ext}'),
+            f'{project}-{version}.tar.{ext}',
+        )
+        make_symlink(
+            files_path_join('src', f'{project}-stable.tar.{ext}.asc'),
+            f'{project}-{version}.tar.{ext}.asc',
+        )
+
+    # update doc symbolic links
+    doc_symlinks = (
+        ('ChangeLog-stable.html', f'ChangeLog-{version}.html'),
+        ('ReleaseNotes-stable.html', f'ReleaseNotes-{version}.html'),
+        ('stable', version),
+    )
+    for link_name, filename in doc_symlinks:
+        make_symlink(
+            files_path_join('doc', project, link_name),
+            filename,
+        )
+
 
 def set_devel_version(project, version):
     """Set the devel version for a project."""
@@ -269,14 +276,64 @@ def set_devel_version(project, version):
     release.save()
 
 
+def add_release(project, version):
+    """Add a project release with its packages."""
+    print(f'Adding release {version} and packages in project {project}')
+    if Release.objects.filter(project__name=project, version=version).exists():
+        release = Release.objects.get(project__name=project, version=version)
+    else:
+        release = Release(
+            project=Project.objects.get(name=project),
+            version=version,
+        )
+    release.description = ''
+    release.date = date.today()
+    release.security_issues_fixed = 0
+    release.securityfix = ''
+    release.save()
+    for ext in PACKAGES_COMPRESSION_EXT:
+        Package.objects.filter(
+            version__project__name=project,
+            filename=f'{project}-{version}.tar.{ext}'
+        ).delete()
+        package = Package(
+            version=release,
+            type=Type.objects.get(type=f'src1-{ext}'),
+            filename=f'{project}-{version}.tar.{ext}',
+        )
+        package.save()
+
+    # if the version added is higher than current stable (or no current stable):
+    #   1. update stable version
+    #   2. set next devel version if version ends with ".0" (feature, not patch)
+    version_list = version_to_list(version)
+    try:
+        stable_version = (
+            Release.objects.get(project__name=project, version='stable').description
+        )
+    except ObjectDoesNotExist:
+        stable_version = '0'
+    stable_version_list = version_to_list(stable_version)
+    if version_list > stable_version_list:
+        # update stable version
+        set_stable_version(project, version)
+        # set next devel version
+        if version_list[-1] == 0:
+            next_devel = version_list[:]
+            next_devel[-2] += 1
+            next_devel[-1] = 0
+            next_devel_string = '.'.join([str(v) for v in next_devel]) + '-dev'
+            set_devel_version(project, next_devel_string)
+
+
 def release_action(action, project, version):
     """Run a release action."""
-    if action == 'add':
-        add_release(project, version)
-    elif action == 'stable':
+    if action == 'stable':
         set_stable_version(project, version)
     elif action == 'devel':
         set_devel_version(project, version)
+    elif action == 'add':
+        add_release(project, version)
     else:
         print(f'ERROR: unsupported release action: "{action}"')
         sys.exit(1)
index b5967355bbd9fd9104b367a6094dd67c85d8385b..44b9d27359571687a7b462312064b7ce1c0dd261 100644 (file)
@@ -24,7 +24,7 @@ from django.http import HttpResponse
 from django.shortcuts import render, get_object_or_404
 
 from weechat.common.models import Project
-from weechat.common.utils import version_to_tuple
+from weechat.common.utils import version_to_list
 from weechat.download.models import Release, Package
 
 
@@ -65,7 +65,7 @@ def packages(request, project='weechat', version='stable'):
                                      .exclude(version__version='devel'))
             package_list = sorted(
                 package_list_unsorted,
-                key=lambda pkg: (version_to_tuple(pkg.version.version),
+                key=lambda pkg: (version_to_list(pkg.version.version),
                                  -1 * pkg.type.priority),
                 reverse=True,
             )
@@ -86,7 +86,7 @@ def packages(request, project='weechat', version='stable'):
                                      .exclude(version__version=stable_desc))
             package_list = sorted(
                 package_list_unsorted,
-                key=lambda pkg: (version_to_tuple(pkg.version.version),
+                key=lambda pkg: (version_to_list(pkg.version.version),
                                  -1 * pkg.type.priority),
                 reverse=True,
             )