diff options
Diffstat (limited to 'Bugzilla/Version.pm')
-rw-r--r-- | Bugzilla/Version.pm | 278 |
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; |