Mercurial > pub > buggler
comparison translate.pl @ 5:d2efec56373f
working buglist transform and bugs fetching
| author | cin |
|---|---|
| date | Tue, 01 Sep 2015 19:47:30 +0300 |
| parents | d1400de5832b |
| children | 2a5f38eb25a9 |
comparison
equal
deleted
inserted
replaced
| 4:f8f966388b68 | 5:d2efec56373f |
|---|---|
| 1 #!/usr/bin/perl -w | 1 #!/usr/bin/perl -w |
| 2 | |
| 3 use JSON; | |
| 4 use YAML::XS qw(LoadFile Dump); | |
| 5 use URI; | |
| 6 use XML::Writer; | |
| 7 use IPC::Run qw(run); | |
| 2 | 8 |
| 3 our @ClassPath = qw( | 9 our @ClassPath = qw( |
| 4 /usr/share/java/xalan-j2-serializer.jar | 10 /usr/share/java/xalan-j2-serializer.jar |
| 5 /usr/share/java/xalan-j2.jar | 11 /usr/share/java/xalan-j2.jar |
| 6 /usr/share/java/xerces-j2.jar | 12 /usr/share/java/xerces-j2.jar |
| 7 /usr/share/java/xml-commons-resolver.jar | 13 /usr/share/java/xml-commons-resolver.jar |
| 8 . | 14 . |
| 9 ); | 15 ); |
| 10 | 16 |
| 11 xalan( | 17 my $config = LoadFile("config.yaml"); |
| 12 -IN => "bug-list1.xml", | 18 |
| 13 -XSL => "bug-list.xsl", | 19 if ( !( $config->{bugzilla}{url} =~ /\/$/ ) ) { |
| 14 -URIRESOLVER => "org.apache.xml.resolver.tools.CatalogResolver", | 20 $config->{bugzilla}{url} .= "/"; |
| 15 -ENTITYRESOLVER => "org.apache.xml.resolver.tools.CatalogResolver" | 21 } |
| 16 ); | 22 |
| 23 my $bz = BzRest->new( | |
| 24 url => $config->{bugzilla}{url}, | |
| 25 apikey => $config->{bugzilla}{apikey} | |
| 26 ); | |
| 27 | |
| 28 my $bugs = $bz->GetBugs( { ids => [ 283, 284 ] } ); | |
| 29 | |
| 30 my @fields = qw( | |
| 31 id | |
| 32 creation_time | |
| 33 last_change_time | |
| 34 creator | |
| 35 assigned_to | |
| 36 | |
| 37 status | |
| 38 resolution | |
| 39 | |
| 40 priority | |
| 41 severity | |
| 42 url | |
| 43 | |
| 44 blocks | |
| 45 depends_on | |
| 46 cc | |
| 47 | |
| 48 component | |
| 49 product | |
| 50 classification | |
| 51 version | |
| 52 | |
| 53 actual_time | |
| 54 estimated_time | |
| 55 remainig_time | |
| 56 deadline | |
| 57 ); | |
| 58 | |
| 59 my %fieldsMap = ( | |
| 60 id => 'bug_id', | |
| 61 creator => 'reporter', | |
| 62 status => 'bug_status', | |
| 63 severity => 'bug_severity', | |
| 64 blocks => 'blocked', | |
| 65 depends_on => 'dependson', | |
| 66 creation_time => 'creation_ts', | |
| 67 last_change_time => 'delta_ts' | |
| 68 ); | |
| 69 | |
| 70 my $writer = XML::Writer->new( OUTPUT => \*STDOUT, ENCODING => 'utf-8' ); | |
| 71 | |
| 72 $writer->xmlDecl("UTF-8"); | |
| 73 $writer->startTag("bugzilla"); | |
| 74 | |
| 75 foreach my $bug ( @$bugs ) { | |
| 76 $writer->startTag("bug"); | |
| 77 foreach my $field ( @fields ) { | |
| 78 next unless $bug->{$field}; | |
| 79 | |
| 80 my $tagName = $fieldsMap{$field} || $field; | |
| 81 my @values = ref($bug->{$field}) && ref($bug->{$field}) eq 'ARRAY' ? @{$bug->{$field}} : $bug->{$field}; | |
| 82 | |
| 83 foreach my $v (@values) { | |
| 84 $writer->dataElement($tagName, $v); | |
| 85 } | |
| 86 } | |
| 87 $writer->endTag(); | |
| 88 } | |
| 89 | |
| 90 $writer->endTag(); | |
| 91 | |
| 92 | |
| 93 | |
| 94 #xalan( | |
| 95 # -IN => "bug-list2.xml", | |
| 96 # -XSL => "bug-list.xsl", | |
| 97 # -URIRESOLVER => "org.apache.xml.resolver.tools.CatalogResolver", | |
| 98 # -ENTITYRESOLVER => "org.apache.xml.resolver.tools.CatalogResolver", | |
| 99 # -PARAM => (chargeset => "dev") | |
| 100 #); | |
| 17 | 101 |
| 18 sub xalan { | 102 sub xalan { |
| 19 my %params = @_; | 103 my @params = @_; |
| 20 return system 'java', | 104 return system 'java', |
| 21 -cp => join( ':', @ClassPath ), | 105 -cp => join( ':', @ClassPath ), |
| 22 "org.apache.xalan.xslt.Process", %params; | 106 "org.apache.xalan.xslt.Process", @params; |
| 107 } | |
| 108 | |
| 109 package BzRest; | |
| 110 use fields qw(url apikey); | |
| 111 use LWP::UserAgent; | |
| 112 use XMLRPC::Lite; | |
| 113 use YAML::XS qw(Dump); | |
| 114 | |
| 115 use constant { SELF => __PACKAGE__ }; | |
| 116 | |
| 117 sub new { | |
| 118 my $class = shift; | |
| 119 $class = ref $class || $class; | |
| 120 | |
| 121 my $inst = fields::new($class); | |
| 122 $inst->CTOR(@_); | |
| 123 | |
| 124 return $inst; | |
| 125 } | |
| 126 | |
| 127 sub CTOR { | |
| 128 my SELF $this = shift; | |
| 129 my %params = @_; | |
| 130 | |
| 131 $this->{url} = $params{url} or die "An url is required"; | |
| 132 $this->{apikey} = $params{apikey} if $params{apikey}; | |
| 133 } | |
| 134 | |
| 135 sub GetBug { | |
| 136 my SELF $this = shift; | |
| 137 my $id = shift; | |
| 138 my %params = @_; | |
| 139 | |
| 140 $params{api_key} = $this->{apikey}; | |
| 141 | |
| 142 my $bugurl = URI->new_abs( 'rest/bug/' . $id, $this->{url} ); | |
| 143 $bugurl->query_form( \%params ); | |
| 144 | |
| 145 my $agent = LWP::UserAgent->new(); | |
| 146 my $res = $agent->get($bugurl); | |
| 147 | |
| 148 return $this->_AssertResponse( $res, $bugurl ); | |
| 149 } | |
| 150 | |
| 151 sub GetBugs { | |
| 152 my SELF $this = shift; | |
| 153 | |
| 154 return $this->CallXMLRPC( 'Bug.get', shift )->{bugs}; | |
| 155 } | |
| 156 | |
| 157 sub CallXMLRPC { | |
| 158 my SELF $this = shift; | |
| 159 my ( $method, $params ) = @_; | |
| 160 | |
| 161 die "Method must be specified" unless $method; | |
| 162 $params ||= {}; | |
| 163 | |
| 164 $params->{api_key} = $this->{apikey}; | |
| 165 my $url = URI->new_abs( 'xmlrpc.cgi', $this->{url} ); | |
| 166 | |
| 167 my $result = XMLRPC::Lite->proxy($url)->call( $method, $params ); | |
| 168 | |
| 169 die $result->fault if $result->fault; | |
| 170 return $result->result; | |
| 171 } | |
| 172 | |
| 173 sub _AssertResponse { | |
| 174 my SELF $this = shift; | |
| 175 my ( $res, $url ) = @_; | |
| 176 | |
| 177 die "Failed to get any response: " . $url unless $res; | |
| 178 | |
| 179 die "Failed to fetch: " . $url . ": " . $res->code unless $res->is_success; | |
| 180 | |
| 181 my $bug = JSON->new()->utf8()->decode( $res->content ); | |
| 182 | |
| 183 die "Bugzilla failed: " . $bug->{message} if $bug->{error}; | |
| 184 | |
| 185 return $bug->{bugs}; | |
| 23 } | 186 } |
| 24 | 187 |
| 25 __END__ | 188 __END__ |
| 26 | 189 |
| 27 =pod | 190 =pod |
