summaryrefslogtreecommitdiffstats
path: root/Bugzilla/Version.pm
diff options
context:
space:
mode:
Diffstat (limited to 'Bugzilla/Version.pm')
-rw-r--r--Bugzilla/Version.pm278
1 files changed, 143 insertions, 135 deletions
diff --git a/Bugzilla/Version.pm b/Bugzilla/Version.pm
index a078cb4fc..d8c77671a 100644
--- a/Bugzilla/Version.pm
+++ b/Bugzilla/Version.pm
@@ -26,121 +26,118 @@ use Scalar::Util qw(blessed);
use constant DEFAULT_VERSION => 'unspecified';
-use constant DB_TABLE => 'versions';
+use constant DB_TABLE => 'versions';
use constant NAME_FIELD => 'value';
+
# This is "id" because it has to be filled in and id is probably the fastest.
# We do a custom sort in new_from_list below.
use constant LIST_ORDER => 'id';
use constant DB_COLUMNS => qw(
- id
- value
- product_id
- isactive
+ id
+ value
+ product_id
+ isactive
);
-use constant REQUIRED_FIELD_MAP => {
- product_id => 'product',
-};
+use constant REQUIRED_FIELD_MAP => {product_id => 'product',};
use constant UPDATE_COLUMNS => qw(
- value
- isactive
+ value
+ isactive
);
use constant VALIDATORS => {
- product => \&_check_product,
- value => \&_check_value,
- isactive => \&Bugzilla::Object::check_boolean,
+ product => \&_check_product,
+ value => \&_check_value,
+ isactive => \&Bugzilla::Object::check_boolean,
};
-use constant VALIDATOR_DEPENDENCIES => {
- value => ['product'],
-};
+use constant VALIDATOR_DEPENDENCIES => {value => ['product'],};
################################
# Methods
################################
sub new {
- my $class = shift;
- my $param = shift;
- my $dbh = Bugzilla->dbh;
-
- my $product;
- if (ref $param) {
- $product = $param->{product};
- my $name = $param->{name};
- if (!defined $product) {
- ThrowCodeError('bad_arg',
- {argument => 'product',
- function => "${class}::new"});
- }
- if (!defined $name) {
- ThrowCodeError('bad_arg',
- {argument => 'name',
- function => "${class}::new"});
- }
-
- my $condition = 'product_id = ? AND value = ?';
- my @values = ($product->id, $name);
- $param = { condition => $condition, values => \@values };
+ my $class = shift;
+ my $param = shift;
+ my $dbh = Bugzilla->dbh;
+
+ my $product;
+ if (ref $param) {
+ $product = $param->{product};
+ my $name = $param->{name};
+ if (!defined $product) {
+ ThrowCodeError('bad_arg', {argument => 'product', function => "${class}::new"});
+ }
+ if (!defined $name) {
+ ThrowCodeError('bad_arg', {argument => 'name', function => "${class}::new"});
}
- unshift @_, $param;
- return $class->SUPER::new(@_);
+ my $condition = 'product_id = ? AND value = ?';
+ my @values = ($product->id, $name);
+ $param = {condition => $condition, values => \@values};
+ }
+
+ unshift @_, $param;
+ return $class->SUPER::new(@_);
}
sub new_from_list {
- my $self = shift;
- my $list = $self->SUPER::new_from_list(@_);
- return [sort { vers_cmp(lc($a->name), lc($b->name)) } @$list];
+ my $self = shift;
+ my $list = $self->SUPER::new_from_list(@_);
+ return [sort { vers_cmp(lc($a->name), lc($b->name)) } @$list];
}
sub run_create_validators {
- my $class = shift;
- my $params = $class->SUPER::run_create_validators(@_);
- my $product = delete $params->{product};
- $params->{product_id} = $product->id;
- return $params;
+ my $class = shift;
+ my $params = $class->SUPER::run_create_validators(@_);
+ my $product = delete $params->{product};
+ $params->{product_id} = $product->id;
+ return $params;
}
sub bug_count {
- my $self = shift;
- my $dbh = Bugzilla->dbh;
+ my $self = shift;
+ my $dbh = Bugzilla->dbh;
- if (!defined $self->{'bug_count'}) {
- $self->{'bug_count'} = $dbh->selectrow_array(qq{
+ if (!defined $self->{'bug_count'}) {
+ $self->{'bug_count'} = $dbh->selectrow_array(
+ qq{
SELECT COUNT(*) FROM bugs
WHERE product_id = ? AND version = ?}, undef,
- ($self->product_id, $self->name)) || 0;
- }
- return $self->{'bug_count'};
+ ($self->product_id, $self->name)
+ ) || 0;
+ }
+ return $self->{'bug_count'};
}
sub update {
- my $self = shift;
- my ($changes, $old_self) = $self->SUPER::update(@_);
-
- if (exists $changes->{value}) {
- my $dbh = Bugzilla->dbh;
- $dbh->do('UPDATE bugs SET version = ?
- WHERE version = ? AND product_id = ?',
- undef, ($self->name, $old_self->name, $self->product_id));
- }
- return $changes;
-}
+ my $self = shift;
+ my ($changes, $old_self) = $self->SUPER::update(@_);
-sub remove_from_db {
- my $self = shift;
+ if (exists $changes->{value}) {
my $dbh = Bugzilla->dbh;
+ $dbh->do(
+ 'UPDATE bugs SET version = ?
+ WHERE version = ? AND product_id = ?', undef,
+ ($self->name, $old_self->name, $self->product_id)
+ );
+ }
+ return $changes;
+}
- # The version cannot be removed if there are bugs
- # associated with it.
- if ($self->bug_count) {
- ThrowUserError("version_has_bugs", { nb => $self->bug_count });
- }
- $self->SUPER::remove_from_db();
+sub remove_from_db {
+ my $self = shift;
+ my $dbh = Bugzilla->dbh;
+
+ # The version cannot be removed if there are bugs
+ # associated with it.
+ if ($self->bug_count) {
+ ThrowUserError("version_has_bugs", {nb => $self->bug_count});
+ }
+ $self->SUPER::remove_from_db();
}
###############################
@@ -148,45 +145,48 @@ sub remove_from_db {
###############################
sub product_id { return $_[0]->{'product_id'}; }
-sub is_active { return $_[0]->{'isactive'}; }
+sub is_active { return $_[0]->{'isactive'}; }
sub product {
- my $self = shift;
+ my $self = shift;
- require Bugzilla::Product;
- $self->{'product'} ||= Bugzilla::Product->new({ id => $self->product_id, cache => 1 });
- return $self->{'product'};
+ require Bugzilla::Product;
+ $self->{'product'}
+ ||= Bugzilla::Product->new({id => $self->product_id, cache => 1});
+ return $self->{'product'};
}
################################
# Validators
################################
-sub set_name { $_[0]->set('value', $_[1]); }
+sub set_name { $_[0]->set('value', $_[1]); }
sub set_is_active { $_[0]->set('isactive', $_[1]); }
sub _check_value {
- my ($invocant, $name, undef, $params) = @_;
- my $product = blessed($invocant) ? $invocant->product : $params->{product};
-
- $name = trim($name);
- $name || ThrowUserError('version_blank_name');
- # Remove unprintable characters
- $name = clean_text($name);
-
- my $version = new Bugzilla::Version({ product => $product, name => $name });
- if ($version && (!ref $invocant || $version->id != $invocant->id)) {
- ThrowUserError('version_already_exists', { name => $version->name,
- product => $product->name });
- }
- return $name;
+ my ($invocant, $name, undef, $params) = @_;
+ my $product = blessed($invocant) ? $invocant->product : $params->{product};
+
+ $name = trim($name);
+ $name || ThrowUserError('version_blank_name');
+
+ # Remove unprintable characters
+ $name = clean_text($name);
+
+ my $version = new Bugzilla::Version({product => $product, name => $name});
+ if ($version && (!ref $invocant || $version->id != $invocant->id)) {
+ ThrowUserError('version_already_exists',
+ {name => $version->name, product => $product->name});
+ }
+ return $name;
}
sub _check_product {
- my ($invocant, $product) = @_;
- $product || ThrowCodeError('param_required',
- { function => "$invocant->create", param => 'product' });
- return Bugzilla->user->check_can_admin_product($product->name);
+ my ($invocant, $product) = @_;
+ $product
+ || ThrowCodeError('param_required',
+ {function => "$invocant->create", param => 'product'});
+ return Bugzilla->user->check_can_admin_product($product->name);
}
###############################
@@ -196,44 +196,52 @@ sub _check_product {
# This is taken straight from Sort::Versions 1.5, which is not included
# with perl by default.
sub vers_cmp {
- my ($a, $b) = @_;
-
- # Remove leading zeroes - Bug 344661
- $a =~ s/^0*(\d.+)/$1/;
- $b =~ s/^0*(\d.+)/$1/;
-
- my @A = ($a =~ /([-.]|\d+|[^-.\d]+)/g);
- my @B = ($b =~ /([-.]|\d+|[^-.\d]+)/g);
-
- my ($A, $B);
- while (@A and @B) {
- $A = shift @A;
- $B = shift @B;
- if ($A eq '-' and $B eq '-') {
- next;
- } elsif ( $A eq '-' ) {
- return -1;
- } elsif ( $B eq '-') {
- return 1;
- } elsif ($A eq '.' and $B eq '.') {
- next;
- } elsif ( $A eq '.' ) {
- return -1;
- } elsif ( $B eq '.' ) {
- return 1;
- } elsif ($A =~ /^\d+$/ and $B =~ /^\d+$/) {
- if ($A =~ /^0/ || $B =~ /^0/) {
- return $A cmp $B if $A cmp $B;
- } else {
- return $A <=> $B if $A <=> $B;
- }
- } else {
- $A = uc $A;
- $B = uc $B;
- return $A cmp $B if $A cmp $B;
- }
+ my ($a, $b) = @_;
+
+ # Remove leading zeroes - Bug 344661
+ $a =~ s/^0*(\d.+)/$1/;
+ $b =~ s/^0*(\d.+)/$1/;
+
+ my @A = ($a =~ /([-.]|\d+|[^-.\d]+)/g);
+ my @B = ($b =~ /([-.]|\d+|[^-.\d]+)/g);
+
+ my ($A, $B);
+ while (@A and @B) {
+ $A = shift @A;
+ $B = shift @B;
+ if ($A eq '-' and $B eq '-') {
+ next;
+ }
+ elsif ($A eq '-') {
+ return -1;
+ }
+ elsif ($B eq '-') {
+ return 1;
+ }
+ elsif ($A eq '.' and $B eq '.') {
+ next;
+ }
+ elsif ($A eq '.') {
+ return -1;
+ }
+ elsif ($B eq '.') {
+ return 1;
+ }
+ elsif ($A =~ /^\d+$/ and $B =~ /^\d+$/) {
+ if ($A =~ /^0/ || $B =~ /^0/) {
+ return $A cmp $B if $A cmp $B;
+ }
+ else {
+ return $A <=> $B if $A <=> $B;
+ }
+ }
+ else {
+ $A = uc $A;
+ $B = uc $B;
+ return $A cmp $B if $A cmp $B;
}
- return @A <=> @B;
+ }
+ return @A <=> @B;
}
1;