my @common_control_options =
- (($dl > 0 ? (debug => $transcript):()),
- transcript => $transcript,
+ (transcript => $transcript,
requester => $header{from},
request_addr => $controlrequestaddr,
request_msgid => $header{'message-id'},
print {$transcript} "> $_\n";
next if m/^\s*\#/;
$action= '';
- if (m/^stop\s*$/i || m/^quit\s*$/i || m/^--\s*$/ || m/^thank(?:s|\s*you)?\s*$/i || m/^kthxbye\s*$/i) {
+ if (m/^(?:stop|quit|--|thank(?:s|\s*you)?|kthxbye)\.*\s*$/i) {
print {$transcript} "Stopping processing here.\n\n";
last;
} elsif (m/^debug\s+(\d+)$/i && $1 >= 0 && $1 <= 1000) {
$dl= $1+0;
- print {$transcript} "Debug level $dl.\n\n";
+ if ($dl > 0 and not grep /debug/,@common_control_options) {
+ push @common_control_options,(debug => $transcript);
+ }
+ print {$transcript} "Debug level $dl.\n\n";
} elsif (m/^(send|get)\s+\#?(\d{2,})$/i) {
$ref= $2+0;
&sendlynxdoc("bugreport.cgi?bug=$ref","logs for $gBug#$ref");
# to set_found
if (defined($version) && length $version) {
set_found(@common_control_options,
- bug => $ref,
- version => $version,
+ bug => $ref,
+ found => $version,
);
}
};
if ($@) {
$errors++;
- print {$transcript} "Failed to clear fixed versions and reopen on $ref: $@";
+ print {$transcript} "Failed to clear fixed versions and reopen on $ref: ".cleanup_eval_fail($@,$debug)."\n";
}
} elsif (m/^reopen\s+\#?(-?\d+)(?:\s+([\=\!]|(?:\S.*\S)))?$/i) {
$ok++;
$ref= $1;
- $bug_affected{$ref}=1;
+ $ref = $clonebugs{$ref} if exists $clonebugs{$ref};
+ $bug_affected{$ref}=1;
my $new_submitter = $2;
if (defined $new_submitter) {
if ($new_submitter eq '=') {
};
if ($@) {
$errors++;
- print {$transcript} "Failed to reopen $ref: $@";
+ print {$transcript} "Failed to reopen $ref: ".cleanup_eval_fail($@,$debug)."\n";
}
} elsif (m{^(?:(?i)found)\s+\#?(-?\d+)
(?:\s+((?:$config{package_name_re}\/)?
};
if ($@) {
$errors++;
- print {$transcript} "Failed to add found on $ref: $@";
+ print {$transcript} "Failed to add found on $ref: ".cleanup_eval_fail($@,$debug)."\n";
}
}
else {
};
if ($@) {
$errors++;
- print {$transcript} "Failed to clear fixed versions and reopen on $ref: $@";
+ print {$transcript} "Failed to clear fixed versions and reopen on $ref: ".cleanup_eval_fail($@,$debug)."\n";
}
}
}
};
if ($@) {
$errors++;
- print {$transcript} "Failed to remove found on $ref: $@";
+ print {$transcript} "Failed to remove found on $ref: ".cleanup_eval_fail($@,$debug)."\n";
}
}
elsif (m{^(?:(?i)fixed)\s+\#?(-?\d+)
};
if ($@) {
$errors++;
- print {$transcript} "Failed to add fixed on $ref: $@";
+ print {$transcript} "Failed to add fixed on $ref: ".cleanup_eval_fail($@,$debug)."\n";
}
}
elsif (m{^(?:(?i)notfixed)\s+\#?(-?\d+)
};
if ($@) {
$errors++;
- print {$transcript} "Failed to remove fixed on $ref: $@";
+ print {$transcript} "Failed to remove fixed on $ref: ".cleanup_eval_fail($@,$debug)."\n";
}
}
elsif (m/^submitter\s+\#?(-?\d+)\s+(\!|\S.*\S)$/i) {
};
if ($@) {
$errors++;
- print {$transcript} "Failed to set submitter on $ref: $@";
+ print {$transcript} "Failed to set submitter on $ref: ".cleanup_eval_fail($@,$debug)."\n";
}
}
} elsif (m/^forwarded\s+\#?(-?\d+)\s+(\S.*\S)$/i) {
};
if ($@) {
$errors++;
- print {$transcript} "Failed to set the forwarded-to-address of $ref: $@";
+ print {$transcript} "Failed to set the forwarded-to-address of $ref: ".cleanup_eval_fail($@,$debug)."\n";
}
} elsif (m/^notforwarded\s+\#?(-?\d+)$/i) {
$ok++;
};
if ($@) {
$errors++;
- print {$transcript} "Failed to clear the forwarded-to-address of $ref: $@";
+ print {$transcript} "Failed to clear the forwarded-to-address of $ref: ".cleanup_eval_fail($@,$debug)."\n";
}
} elsif (m/^(?:severity|priority)\s+\#?(-?\d+)\s+([-0-9a-z]+)$/i) {
$ok++;
};
if ($@) {
$errors++;
- print {$transcript} "Failed to set severity of $config{bug} $ref to $newseverity: $@";
+ print {$transcript} "Failed to set severity of $config{bug} $ref to $newseverity: ".cleanup_eval_fail($@,$debug)."\n";
}
}
- } elsif (m/^tags?\s+\#?(-?\d+)\s+(([=+-])\s*)?(\S.*)?$/i) {
- ### TODO: [#505189] Consider altering this to accept tag #nnn + foo - bar - baz
+ } elsif (m/^tags?\s+\#?(-?\d+)\s+(\S.*)$/i) {
$ok++;
$ref = $1;
$ref = $clonebugs{$ref} if exists $clonebugs{$ref};
$bug_affected{$ref}=1;
- my $addsubcode = $3;
- my @add_remove_option = ();
- if (defined $addsubcode) {
- if ($addsubcode eq '-') {
- push @add_remove_option,(remove => 1);
- }
- elsif ($addsubcode eq '+') {
- push @add_remove_option,(add => 1);
+ my $tags = $2;
+ my @tags = map {m/^([+=-])(.+)/ ? ($1,$2):($_)} split /[\s,]+/, $tags;
+ # this is an array of hashrefs which contain two elements, the
+ # first of which is the array of tags, the second is the
+ # option to pass to set_tag (we use a hashref here to make it
+ # more obvious what is happening)
+ my @tag_operations;
+ my @badtags;
+ for my $tag (@tags) {
+ if ($tag =~ /^[=+-]$/) {
+ if ($tag eq '=') {
+ @tag_operations = {tags => [],
+ option => [],
+ };
+ }
+ elsif ($tag eq '-') {
+ push @tag_operations,
+ {tags => [],
+ option => [remove => 1],
+ };
+ }
+ elsif ($tag eq '+') {
+ push @tag_operations,
+ {tags => [],
+ option => [add => 1],
+ };
+ }
+ next;
}
- }
- my $tags = $4;
- my @tags = split /[\s,]+/, $tags;
- my @badtags = ();
- foreach my $tag (@tags) {
if (not defined first {$_ eq $tag} @{$config{tags}}) {
push @badtags, $tag;
+ next;
+ }
+ if (not @tag_operations) {
+ @tag_operations = {tags => [],
+ option => [add => 1],
+ };
}
+ push @{$tag_operations[-1]{tags}},$tag;
}
if (@badtags) {
print {$transcript} "Unknown tag/s: ".join(', ', @badtags).".\n".
$errors++;
}
eval {
- set_tags(@common_control_options,
- bug => $ref,
- tags => [@tags],
- warn_on_bad_tags => 0, # don't warn on bad tags,
- # 'cause we do that above
- @add_remove_option,
- );
+ for my $operation (@tag_operations) {
+ set_tag(@common_control_options,
+ bug => $ref,
+ tag => [@{$operation->{tags}}],
+ warn_on_bad_tags => 0, # don't warn on bad tags,
+ # 'cause we do that above
+ @{$operation->{option}},
+ );
+ }
};
if ($@) {
# we intentionally have two errors here if there is a bad
# tag and the above fails for some reason
$errors++;
- print {$transcript} "Failed to alter tags of $config{bug} $ref: $@";
+ print {$transcript} "Failed to alter tags of $config{bug} $ref: ".cleanup_eval_fail($@,$debug)."\n";
}
} elsif (m/^(un)?block\s+\#?(-?\d+)\s+(?:by|with)\s+(\S.*)?$/i) {
$ok++;
$ref= $2;
my $add_remove = defined $1 && $1 eq 'un';
- my @blockers = split /[\s,]+/, $3;
+ my @blockers = map {exists $clonebugs{$_}?$clonebugs{$_}:$_} split /[\s,]+/, $3;
$ref = $clonebugs{$ref} if exists $clonebugs{$ref};
$bug_affected{$ref} = 1;
eval {
};
if ($@) {
$errors++;
- print {$transcript} "Failed to set blocking bugs of $ref: $@";
+ print {$transcript} "Failed to set blocking bugs of $ref: ".cleanup_eval_fail($@,$debug)."\n";
}
} elsif (m/^retitle\s+\#?(-?\d+)\s+(\S.*\S)\s*$/i) {
$ok++;
};
if ($@) {
$errors++;
- print {$transcript} "Failed to set the title of $ref: $@";
+ print {$transcript} "Failed to set the title of $ref: ".cleanup_eval_fail($@,$debug)."\n";
}
} elsif (m/^unmerge\s+\#?(-?\d+)$/i) {
$ok++;
if (scalar(@pkgs) > 0) {
%limit_pkgs = map { ($_, 1) } @pkgs;
$limit{package} = [@pkgs];
- print {$transcript} "Ignoring bugs not assigned to: " .
- join(" ", keys(%limit_pkgs)) . "\n\n";
+ print {$transcript} "Limiting to bugs with field 'package' containing at least one of ".join(', ',map {qq('$_')} @pkgs)."\n";
+ print {$transcript} "Limit currently set to";
+ for my $limit_field (keys %limit) {
+ print {$transcript} " '$limit_field':".join(', ',map {qq('$_')} @{$limit{$limit_field}})."\n";
+ }
+ print {$transcript} "\n";
} else {
- %limit_pkgs = ();
- print {$transcript} "Not ignoring any bugs.\n\n";
+ %limit_pkgs = ();
+ $limit{package} = [];
+ print {$transcript} "Limit cleared.\n\n";
}
} elsif (m/^limit\:?\s+(\S.*\S)\s*$/) {
$ok++;
%limit = ();
print {$transcript} "Limit cleared.\n\n";
}
- elsif (exists $Debbugs::Status::fields{$field} ) {
+ elsif (exists $Debbugs::Status::fields{$field} or $field eq 'source') {
# %limit can actually contain regexes, but because they're
# not evaluated in Safe, DO NOT allow them through without
# fixing this.
$limit{$field} = [@options];
print {$transcript} "Limiting to bugs with field '$field' containing at least one of ".join(', ',map {qq('$_')} @options)."\n";
- print {$transcript} "Limit currently set to ";
+ print {$transcript} "Limit currently set to";
for my $limit_field (keys %limit) {
- print {$transcript} " '$limit_field':".join(', ',map {qq('$_')} @options)."\n";
+ print {$transcript} " '$limit_field':".join(', ',map {qq('$_')} @{$limit{$limit_field}})."\n";
}
print {$transcript} "\n";
}
};
if ($@) {
$errors++;
- print {$transcript} "Failed to mark $ref as affecting package(s): $@";
+ print {$transcript} "Failed to mark $ref as affecting package(s): ".cleanup_eval_fail($@,$debug)."\n";
}
} elsif (m/^summary\s+\#?(-?\d+)\s*(\d+|)\s*$/i) {
};
if ($@) {
$errors++;
- print {$transcript} "Failed to give $ref a summary: $@";
+ print {$transcript} "Failed to give $ref a summary: ".cleanup_eval_fail($@,$debug)."\n";
}
} elsif (m/^owner\s+\#?(-?\d+)\s+((?:\S.*\S)|\!)\s*$/i) {
};
if ($@) {
$errors++;
- print {$transcript} "Failed to mark $ref as having an owner: $@";
+ print {$transcript} "Failed to mark $ref as having an owner: ".cleanup_eval_fail($@,$debug)."\n";
}
} elsif (m/^noowner\s+\#?(-?\d+)\s*$/i) {
$ok++;
};
if ($@) {
$errors++;
- print {$transcript} "Failed to mark $ref as not having an owner: $@";
+ print {$transcript} "Failed to mark $ref as not having an owner: ".cleanup_eval_fail($@,$debug)."\n";
}
} elsif (m/^unarchive\s+#?(\d+)$/i) {
$ok++;