[damned-lies] Improved copy-release management command



commit 66e1274876661f18a724dd93659b481ee697f87e
Author: Claude Paroz <claude 2xlibre net>
Date:   Fri Apr 21 10:20:32 2017 +0200

    Improved copy-release management command

 stats/management/commands/copy-release.py |   32 ++++++++++++++++++----------
 1 files changed, 20 insertions(+), 12 deletions(-)
---
diff --git a/stats/management/commands/copy-release.py b/stats/management/commands/copy-release.py
index 18d05c8..27f56c0 100644
--- a/stats/management/commands/copy-release.py
+++ b/stats/management/commands/copy-release.py
@@ -1,4 +1,6 @@
 from django.core.management.base import BaseCommand, CommandError
+from django.db import transaction
+
 from stats.models import Release, Category, Module
 
 
@@ -15,17 +17,23 @@ class Command(BaseCommand):
         except Release.DoesNotExist:
             raise CommandError("No release named '%s'" % options['release_to_copy'])
 
-        new_rel = Release.objects.create(
-            name=options['new_release'], description=options['new_release'],
-            string_frozen=False, status=rel_to_copy.status
-        )
-
-        for cat in rel_to_copy.category_set.all():
-            if not cat.branch.is_head():
-                mod = Module.objects.get(pk=cat.branch.module.id)
-                branch = mod.get_head_branch()
-            else:
-                branch = cat.branch
-            new_rel.category_set.add(Category(release=new_rel, branch=branch, name=cat.name))
+        with transaction.atomic():
+            new_rel = Release.objects.create(
+                name=options['new_release'], description=options['new_release'],
+                string_frozen=False, status=rel_to_copy.status
+            )
+
+            branch_seen = set()
+            for cat in rel_to_copy.category_set.all():
+                if not cat.branch.is_head():
+                    mod = Module.objects.get(pk=cat.branch.module.id)
+                    branch = mod.get_head_branch()
+                else:
+                    branch = cat.branch
+                if branch in branch_seen:
+                    continue
+                else:
+                    Category.objects.create(release=new_rel, branch=branch, name=cat.name)
+                    branch_seen.add(branch)
 
         return "New release '%s' created" % new_rel.name


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]