Hello,

Attached, please find the new algorithm for name generation of cloned errata,
written in Perl!

In the long run I guess we should definitely rather rewrite those pages in
Java, instead of maintaining both of the code stacks. Was there a specific
reason for the errata cloning page, why it was not rewritten? Or is it just
remaining by accident?

Thank you,
Johannes

-- 
SUSE LINUX Products GmbH, HRB 16746 (AG Nürnberg)
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer
>From b497b86fdfa6054c60c35a2d78f5eb8a05a445af Mon Sep 17 00:00:00 2001
From: Johannes Renner <jren...@suse.de>
Date: Mon, 23 Apr 2012 14:15:01 +0200
Subject: [PATCH] Fix errata clone name generation in perl code

---
 web/modules/rhn/RHN/DB/ErrataEditor.pm             |   68 ++++++++++++++++----
 .../sniglets/Sniglets/ListView/ErrataList.pm       |    2 +-
 2 files changed, 56 insertions(+), 14 deletions(-)

diff --git a/web/modules/rhn/RHN/DB/ErrataEditor.pm b/web/modules/rhn/RHN/DB/ErrataEditor.pm
index 249ef8d..d175a75 100644
--- a/web/modules/rhn/RHN/DB/ErrataEditor.pm
+++ b/web/modules/rhn/RHN/DB/ErrataEditor.pm
@@ -153,24 +153,47 @@ EOQ
   return ($new_eid);
 }
 
+# This duplicates the algorithm in PublishErrataHelper.java
 sub find_next_advisory {
   my $adv = shift || '';
   my $adv_name = shift || '';
-  my $suffix = '';
-  my $i = 1;
+  my $eid = shift;
 
-  $adv = 'CL' . substr($adv, 2);
-  $adv_name = 'CL' . substr($adv_name, 2);
+  # Set adv equal to adv_name if unset
+  unless ($adv) {
+    $adv = $adv_name;
+  }
 
-  if (advisory_exists($adv) || advisory_name_exists($adv_name)) {
-    $suffix = sprintf("-%u", $i++);
-    $adv = $adv . $suffix;
-    $adv_name = $adv_name . $suffix;
+  if (not erratum_is_clone($eid)) {
+    # For RH errata, replace 'RH' with 'CL-', else prepend
+    if ('RH' eq substr($adv_name, 0, 2)) {
+      $adv = 'CL-' . substr($adv, 2);
+      $adv_name = 'CL-' . substr($adv_name, 2);
+    } else {
+      $adv = 'CL-' . $adv;
+      $adv_name = 'CL-' . $adv_name;
+    }
+  } else {
+    # Erratum is a clone, prepend 'CL-', if there is no prefix yet
+    if ('-' ne substr($adv, 2, 1) || '-' ne substr($adv_name, 2, 1)) {
+      $adv = 'CL-' . $adv;
+      $adv_name = 'CL-' . $adv_name;
+    }
+  }
 
-    while (advisory_exists($adv) || advisory_name_exists($adv_name)) {
-      substr($adv, -1, 1) = $i;
-      substr($adv_name, -1, 1) = $i;
-      $i++;
+  # Find the next valid advisory name that doesn't exist yet
+  while (advisory_exists($adv) || advisory_name_exists($adv_name)) {
+    my $c1 = substr($adv, 1, 1);
+    if ('Z' eq $c1) {
+      # Get the next c0
+      my $c0next = ++substr($adv, 0, 1);
+      $adv = $c0next . 'A' . substr($adv, 2);
+      $adv_name = $c0next . 'A' . substr($adv_name, 2);
+    } else {
+      # Get the next c1
+      my $c1next = ++$c1;
+      $adv = substr($adv, 0, 1) . $c1next . substr($adv, 2);
+      $adv_name = substr($adv_name, 0, 1) . $c1next . substr($adv_name, 2);
     }
   }
 
@@ -200,7 +223,7 @@ sub clone_into_org {
   my $adv = $new->advisory;
   my $adv_name = $new->advisory_name;
 
-  ($adv, $adv_name) = find_next_advisory($adv, $adv_name);
+  ($adv, $adv_name) = find_next_advisory($adv, $adv_name, $old_eid);
 
   $new->advisory($adv);
   $new->advisory_name($adv_name);
@@ -272,6 +295,25 @@ EOQ
   return ($new_eid);
 }
 
+sub erratum_is_clone {
+  my $eid = shift;
+  my $dbh = RHN::DB->connect;
+
+  my $query =<<EOQ;
+SELECT 1
+  FROM dual
+ WHERE EXISTS (SELECT 1 FROM rhnErrataCloned E WHERE E.id = :eid)
+    OR EXISTS (SELECT 1 FROM rhnErrataClonedTmp ET WHERE ET.id = :eid)
+EOQ
+
+  my $sth = $dbh->prepare($query);
+  $sth->execute_h(eid => $eid);
+  my ($exists) = $sth->fetchrow;
+  $sth->finish;
+
+  return ($exists ? 1 : 0);
+}
+
 sub advisory_exists {
   my $adv = shift;
 
diff --git a/web/modules/sniglets/Sniglets/ListView/ErrataList.pm b/web/modules/sniglets/Sniglets/ListView/ErrataList.pm
index 685dce6..b3af014 100644
--- a/web/modules/sniglets/Sniglets/ListView/ErrataList.pm
+++ b/web/modules/sniglets/Sniglets/ListView/ErrataList.pm
@@ -361,7 +361,7 @@ sub potential_for_cloned_channel_provider {
       $row->{OWNED_ERRATA_LIST} = '(none)';
     }
 
-    my ($adv, $adv_name) = RHN::DB::ErrataEditor::find_next_advisory($row->{ADVISORY}, $row->{ADVISORY_NAME});
+    my ($adv, $adv_name) = RHN::DB::ErrataEditor::find_next_advisory($row->{ADVISORY}, $row->{ADVISORY_NAME}, $row->{ID});
 
     push(@options, ( { label => "Clone as ${adv_name}",
 		       value => 'clone_new' },
-- 
1.7.7

_______________________________________________
Spacewalk-devel mailing list
Spacewalk-devel@redhat.com
https://www.redhat.com/mailman/listinfo/spacewalk-devel

Reply via email to