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