123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- #!/usr/bin/perl
- #use strict;
- use Getopt::Long qw(GetOptions);
- use Term::ReadKey;
- use JIRA::REST;
- use Data::Dumper;
- my $editor = $ENV{"EDITOR"} || $ENV{"VISUAL"} || `which emacs` || `which vi`;
- my $default_versions = "1.9 1.8";
- my $default_components = "freeswitch-core";
- my $desc_head = "; Enter the description lines beginning with a ; will be ignored.\n";
- chomp($editor);
- sub getpass {
- ReadMode( "noecho");
- print "Password: ";
- chomp (my $pwd = <STDIN>);
- ReadMode ("original");
- return $pwd;
- }
- sub getfield {
- my $prompt = shift;
- my $default = shift;
- print $prompt . ($default ? "[$default]: " : "");
- chomp (my $data = <STDIN>);
-
- if (!$data) {
- $data = $default;
- }
- return $data;
- }
- sub get_text {
- my $text = shift;
- my $notes = shift;
- my @chars = ("A".."Z", "a".."z");
- my $string;
- $string .= $chars[rand @chars] for 1..8;
-
- if ($text || $notes) {
- open O, ">/tmp/TEXT.$string";
- if ($notes) {
- print O $notes;
- }
- if ($text) {
- print O $text;
- }
- close O;
- }
- system("$editor /tmp/TEXT.$string");
- my $newtext = `cat /tmp/TEXT.$string | grep -v "^\\;"`;
- unlink("/tmp/TEXT.$string");
- return $newtext;
- }
- my %opts;
- my $hashtxt = `git log -1 --oneline 2>/dev/null`;
- my ($hash) = split(" ", $hashtxt);
- GetOptions(
- 'bug=s' => \$opts{bug},
- 'attach' => \$opts{attach},
- 'comment=s' => \$opts{comment},
- 'project=s' => \$opts{project},
- 'summary=s' => \$opts{summary},
- 'desc=s' => \$opts{desc},
- 'components=s' => \$opts{components},
- 'hash=s' => \$opts{hash},
- 'user=s' => \$opts{user},
- 'pass=s' => \$opts{pass},
- 'type=s' => \$opts{type},
- 'versions=s' => \$opts{versions},
- 'noedit' => \$opts{noedit},
- 'terse' => \$opts{terse},
- 'debug' => \$opts{debug},
- ) or die "Usage: $0 -summary <summary> -desc <desc> [-debug] ....\n";
- $opts{project} or $opts{project} = "FS";
- if ($opts{versions}) {
- $opts{versions_array} = [map {{name => $_}} split(" ", $opts{versions})];
- } else {
- $opts{versions_array} = [map {{name => $_}} ($default_versions)];
- $opts{versions} = $default_versions;;
- }
- if ($opts{components}) {
- if ($opts{components} =~ /,/) {
- $opts{components_array} = [map {{name => $_}} split(" ", $opts{components})];
- } else {
- $opts{components_array} = [map {{name => $_}} split(" ", $opts{components})];
- }
- } else {
- $opts{components_array} = [map {{name => $_}} ($default_components)];
- $opts{components} = $default_components;
- }
- if (!$opts{user}) {
- $opts{user} = getfield("User: ");
- }
- if (!$opts{pass} && !$opts{debug}) {
- $opts{pass} = getpass();
- print "\n";
- }
- my $jira;
- my $issue;
- if (!$opts{debug}) {
- $jira = JIRA::REST->new('https://freeswitch.org/jira', $opts{user}, $opts{pass}) or die "login incorrect:";
- $issue = $jira->GET("/issue/FS-7985") or die "login incorrect:";
- }
- if ($opts{bug}) {
- if ($opts{comment}) {
-
- if ($opts{comment} eq "edit") {
- $opts{comment} = get_text();
- }
- my $input = {
- update => {
- comment =>
- [{
- add => {
- body => $opts{comment}
- }
- }
- ]
- }
- };
- $jira->PUT("/issue/" . $opts{bug}, undef, $input);
- print "Comment Posted.\n";
- }
- if ($opts{attach}) {
- $jira->attach_files($opts{bug}, @ARGV);
- printf "%d file%s attached.\n", scalar @ARGV, scalar @ARGV == 1 ? "" : "s";
- }
- if ($opts{versions_array}) {
- $input = {
- update => {
- fixVersions => [
- {set => $opts{versions_array}}
- ]
- }
- };
- $jira->PUT("/issue/" . $opts{bug}, undef, $input);
- }
- exit;
- }
- #print $issue->{key};
- #exit;
- if (!$opts{type}) {
- $opts{type} = "Bug";
- }
- if (!$opts{hash}) {
- $opts{hash} = $hash;
- if (!$opts{hash}) {
- $opts{hash} = "N/A";
- }
- }
- if (!$opts{terse}) {
- $opts{project} = getfield("Project: ", $opts{project});
- $opts{type} = getfield("Type: ", $opts{type});
- $opts{versions} = getfield("Versions: ", $opts{versions});
- $opts{versions_array} = [map {{name => $_}} split(" ", $opts{versions})];
- $opts{summary} = getfield("Summary: ", $opts{summary});
- $opts{components} = getfield("Components: ", $opts{components});
- if ($opts{components} =~ /,/) {
- $opts{components_array} = [map {{name => $_}} split(",", $opts{components})];
- } else {
- $opts{components_array} = [map {{name => $_}} split(" ", $opts{components})];
- }
- $opts{hash} = getfield("GIT Hash: ", $opts{hash});
- if ($opts{noedit}) {
- $opts{desc} = getfield("Description: ", $opts{desc}, $desc_head);
- } else {
- $opts{desc} = get_text($opts{desc}, $desc_head);
- }
- }
- if (!$opts{desc}) {
- if ($opts{noedit}) {
- $opts{desc} = getfield("Description: ", $opts{desc});
- } else {
- $opts{desc} = get_text($opts{desc}, $desc_head);
- }
- if (!$opts{desc}) {
- die "missing desc:";
- }
- }
- if (!$opts{summary}) {
- $opts{summary} = getfield("Summary: ", $opts{summary});
- if (!$opts{summary}) {
- die "Summary is mandatory.";
- }
- }
- my $input = {
- fields => {
- project => { key => $opts{project} },
- issuetype => { name => $opts{type} },
- summary => $opts{summary},
- description => $opts{desc},
- customfield_10024 => $opts{hash},
- customfield_10025 => $opts{hash},
- components => $opts{components_array},
- versions => $opts{versions_array}
- },
- };
- if ($opts{debug}) {
- print Dumper \%opts;
- print Dumper $input;
- } else {
- $issue = $jira->POST('/issue', undef, $input) or die "Issue was not created:";
- print "Issue Posted: " . $issue->{key} . "\n";
- if ($opts{versions_array}) {
- $input = {
- update => {
- fixVersions => [
- {set => $opts{versions_array}}
- ]
- }
- };
- $jira->PUT("/issue/" . $issue->{key}, undef, $input);
- print "Fix versions updated for issue " . $issue->{key} . "\n";
- }
-
- if ($opts{attach}) {
- $jira->attach_files($issue->{key}, @ARGV);
- printf "%d file%s attached.\n", scalar @ARGV, scalar @ARGV == 1 ? "" : "s";
- }
- }
|