~ubuntu-branches/ubuntu/natty/adblock-plus/natty

« back to all changes in this revision

Viewing changes to buildtools/Packager.pm

  • Committer: Bazaar Package Importer
  • Author(s): Benjamin Drung
  • Date: 2010-11-05 18:42:36 UTC
  • mto: (25.1.1 sid)
  • mto: This revision was merged to the branch mainline in revision 27.
  • Revision ID: james.westby@ubuntu.com-20101105184236-h7dnu8mbfjaoya62
Tags: upstream-1.3.1
ImportĀ upstreamĀ versionĀ 1.3.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
use strict;
4
4
use warnings;
5
5
 
 
6
my %apps =
 
7
(
 
8
  conkeror => '{a79fe89b-6662-4ff4-8e88-09950ad4dfde}',
 
9
  emusic => 'dlm@emusic.com',
 
10
  fennec => '{a23983c0-fd0e-11dc-95ff-0800200c9a66}',
 
11
  firefox => '{ec8030f7-c20a-464f-9b0e-13a3a9e97384}',
 
12
  midbrowser => '{aa5ca914-c309-495d-91cf-3141bbb04115}',
 
13
  prism => 'prism@developer.mozilla.org',
 
14
  seamonkey => '{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}',
 
15
  songbird => 'songbird@songbirdnest.com',
 
16
  thunderbird => '{3550f703-e582-4d05-9a08-453d09bdfdc6}',
 
17
  toolkit => 'toolkit@mozilla.org',
 
18
);
 
19
 
6
20
sub new
7
21
{
8
22
  my ($class, $params) = @_;
18
32
  return $self;
19
33
}
20
34
 
21
 
sub readVersion
 
35
sub readMetadata
22
36
{
23
 
  my ($self, $versionFile) = @_;
24
 
 
25
 
  open(local *FILE, $versionFile) or die "Could not open version file $versionFile";
26
 
  $self->{version} = <FILE>;
27
 
  $self->{version} =~ s/[^\w\.]//gs;
 
37
  my ($self, $metadataFile) = @_;
 
38
 
 
39
  my $data = $self->readFile($metadataFile);
 
40
  die "Could not read metadata file $metadataFile" unless defined $data;
 
41
 
 
42
  $self->{settings} = {};
 
43
  my $curSection;
 
44
  my %lists = map {$_ => 1} qw(contributor);
 
45
  foreach my $line (split(/[\r\n]+/, $data))
 
46
  {
 
47
    $line =~ s/#.*//;
 
48
    $line =~ s/^\s+//;
 
49
    $line =~ s/\s+$//;
 
50
    next unless length($line);
 
51
 
 
52
    if ($line =~ /^\[(.*)\]$/)
 
53
    {
 
54
      $curSection = $1;
 
55
    }
 
56
    elsif ($line =~ /(.+)=(.*)/)
 
57
    {
 
58
      if (defined $curSection)
 
59
      {
 
60
        $self->{settings}{$curSection} = {} unless exists $self->{settings}{$curSection};
 
61
        if (exists($lists{$1}))
 
62
        {
 
63
          $self->{settings}{$curSection}{$1} = [] unless exists $self->{settings}{$curSection}{$1};
 
64
          push @{$self->{settings}{$curSection}{$1}}, $2;
 
65
        }
 
66
        else
 
67
        {
 
68
          $self->{settings}{$curSection}{$1} = $2;
 
69
        }
 
70
      }
 
71
      else
 
72
      {
 
73
        warn "Setting outside section in metadata file: $line";
 
74
      }
 
75
    }
 
76
    else
 
77
    {
 
78
      warn "Unrecognized line in metadata file: $line";
 
79
    }
 
80
  }
 
81
 
 
82
  warn "Version not set in metadata file" unless exists($self->{settings}{general}{version});
 
83
  $self->{version} = $self->{settings}{general}{version};
28
84
  if (exists $self->{devbuild})
29
85
  {
30
 
    $self->{version} .= ".0" while ($self->{version} =~ tr/././ < 2);
31
 
    $self->{version} .= $self->{devbuild};
 
86
    unless ($self->{version} =~ /\D$/)
 
87
    {
 
88
      $self->{version} .= ".0" while ($self->{version} =~ tr/././ < 2);
 
89
      $self->{version} .= "+";
 
90
    }
 
91
    $self->{version} .= "." . $self->{devbuild};
32
92
  }
33
 
  close(FILE);
34
 
}
35
 
 
36
 
sub readBasename
37
 
{
38
 
  my ($self, $manifestFile) = @_;
39
 
 
40
 
  my $data = $self->readFile($manifestFile);
41
 
  die "Could not open manifest file $manifestFile" unless defined $data;
42
 
  die "Could not find JAR file name in $manifestFile" unless $data =~ /\bjar:chrome\/(\S+?)\.jar\b/;
43
 
 
44
 
  $self->{baseName} = $1;
45
93
}
46
94
 
47
95
sub readLocales
59
107
 
60
108
sub readLocaleData
61
109
{
62
 
  my ($self, $localesDir, $installManifestFile) = @_;
 
110
  my ($self, $localesDir) = @_;
63
111
 
64
112
  $self->{localeData} = {};
65
113
  $self->{name} = '';
75
123
    $self->{localeData}{$locale} = {id => $locale};
76
124
    while ($data =~ /^\s*(?![!#])(\S+)\s*=\s*(.+)$/mg)
77
125
    {
78
 
      if ($1 eq "name" || $1 eq "description" || $1 eq "translator" || $1 eq "description.short" || $1 eq "description.long")
 
126
      if ($1 eq "name" || $1 eq "description" || $1 eq "homepage" || $1 eq "translator" || $1 eq "description.short" || $1 eq "description.long")
79
127
      {
80
128
        $self->{localeData}{$locale}{$1} = $2;
81
129
      }
87
135
    $self->{name} = $self->{localeData}{"en-US"}{name} if exists($self->{localeData}{"en-US"}{name});
88
136
    $self->{description} = $self->{localeData}{"en-US"}{description} if exists($self->{localeData}{"en-US"}{description});
89
137
  }
90
 
 
91
 
  # HACK: Read author name and homepage from install manifest
92
 
  if (defined($installManifestFile))
93
 
  {
94
 
    my $installRDF = $self->readFile($installManifestFile);
95
 
    $self->{author} = $1 if $installRDF && $installRDF =~ /<em:creator>\s*([^<>]+?)\s*<\/em:creator>/;
96
 
    $self->{homepage} = $1 if $installRDF && $installRDF =~ /<em:homepageURL>\s*([^<>]+?)\s*<\/em:homepageURL>/;
97
 
  }
98
 
 
99
 
  my $info = "";
100
 
  my %translators = ();
101
 
  foreach my $locale (sort {$a->{id} cmp $b->{id}} values %{$self->{localeData}})
102
 
  {
103
 
    next unless (exists($locale->{translator}) && $locale->{translator}) ||
104
 
                (exists($locale->{name}) && $locale->{name} && $locale->{name} ne $self->{name}) ||
105
 
                (exists($locale->{description}) && $locale->{description} && $locale->{description} ne $self->{description});
106
 
 
107
 
    if (exists($locale->{translator}))
108
 
    {
109
 
      foreach my $translator (split(/,/, $locale->{translator}))
110
 
      {
111
 
        $translator =~ s/^\s+//g;
112
 
        $translator =~ s/\s+$//g;
113
 
        $translators{$translator} = 1 if $translator ne "";
114
 
      }
115
 
    }
116
 
    $locale->{name} = $self->{name} unless exists($locale->{name}) && $locale->{name} && $locale->{name} ne $self->{name};
117
 
    $locale->{description} = $self->{description} unless exists($locale->{description}) && $locale->{description} && $locale->{description} ne $self->{description};
118
 
 
119
 
    my $id = $self->encodeXML($locale->{id});
120
 
    my $name = $self->encodeXML($locale->{name});
121
 
    my $description = $self->encodeXML($locale->{description});
122
 
 
123
 
    # Duplicate author and homepage in each locale to work around bug 416350
124
 
    my $author = $self->encodeXML($self->{author});
125
 
    my $homepage = $self->encodeXML($self->{homepage});
126
 
 
127
 
    $info .= <<EOT;
128
 
\t<em:localized>
129
 
\t\t<Description>
130
 
\t\t\t<em:locale>$id</em:locale>
131
 
\t\t\t<em:name>$name</em:name>
132
 
\t\t\t<em:description>$description</em:description>
133
 
\t\t\t<em:creator>$author</em:creator>
134
 
\t\t\t<em:homepageURL>$homepage</em:homepageURL>
135
 
\t\t</Description>
136
 
\t</em:localized>
137
 
EOT
138
 
  }
139
 
 
140
 
  $info .= "\n";
141
 
 
142
 
  foreach my $translator (sort keys %translators)
143
 
  {
144
 
    $translator = $self->encodeXML($translator);
145
 
    $info .= <<EOT;
146
 
\t<em:translator>$translator</em:translator>
147
 
EOT
148
 
  }
149
 
 
150
 
  $self->{localizedInfo} = $info;
151
 
}
152
 
 
153
 
sub readNameFromManifest
154
 
{
155
 
  my ($self, $installManifestFile) = @_;
156
 
 
157
 
  my $installRDF = $self->readFile($installManifestFile);
158
 
  return unless $installRDF;
159
 
 
160
 
  $installRDF =~ s/<em:(requires|targetApplication)>.*?<\/em:\1>//gs;
161
 
 
162
 
  $self->{name} = $1 if $installRDF =~ /<em:name>\s*([^<>]+?)\s*<\/em:name>/;
 
138
  $self->{homepage} = $self->{settings}{homepage}{default};
 
139
  $self->{author} = $self->{settings}{general}{author};
 
140
 
 
141
  # Fix up locale data if missing
 
142
  foreach my $locale (values %{$self->{localeData}})
 
143
  {
 
144
    $locale->{name} = $self->{name} unless exists($locale->{name}) && $locale->{name};
 
145
    $locale->{description} = $self->{description} unless exists($locale->{description}) && $locale->{description};
 
146
 
 
147
    if (exists($self->{settings}{homepage}{$locale->{id}}))
 
148
    {
 
149
      $locale->{homepage} = $self->{settings}{homepage}{$locale->{id}};
 
150
    }
 
151
    elsif ($locale->{id} =~ /^(\w+)/ && exists($self->{settings}{homepage}{$1}))
 
152
    {
 
153
      $locale->{homepage} = $self->{settings}{homepage}{$1};
 
154
    }
 
155
    else
 
156
    {
 
157
      $locale->{homepage} = $self->{settings}{homepage}{default};
 
158
    }
 
159
    warn "Failed to get homepage for $locale->{id}" unless $locale->{homepage};
 
160
  }
163
161
}
164
162
 
165
163
sub rm_rec
211
209
      s/^((?:  )+)/"\t" x (length($1)\/2)/e;
212
210
      s/\{\{VERSION\}\}/$self->{version}/g if $extendedTextMode;
213
211
      s/\{\{BUILD\}\}/$self->{build}/g if $extendedTextMode;
214
 
      s/\{\{NAME\}\}/$self->{name}/g if $extendedTextMode;
215
 
      s/\{\{DESCRIPTION\}\}/$self->{description}/g if $extendedTextMode;
216
 
      s/\{\{LOCALIZED\}\}/$self->{localizedInfo}/g if $extendedTextMode;
217
212
      if ($extendedTextMode && /\{\{LOCALE\}\}/)
218
213
      {
219
214
        my $loc = "";
226
221
        $_ = $loc;
227
222
      }
228
223
 
229
 
      if ($self->{devbuild} && $fromFile =~ /\binstall\.rdf$/ && /^(\s*)<em:version>/)
230
 
      {
231
 
        $_ .= "$1<em:updateURL>https://adblockplus.org/devbuilds/update.rdf</em:updateURL>\n";
232
 
      }
233
 
 
234
224
      $_ = $self->{postprocess_line}->($fromFile, $_) if exists $self->{postprocess_line};
235
225
 
236
226
      $_;
360
350
  unlink $fileName if $invalid;
361
351
}
362
352
 
 
353
sub writeManifest
 
354
{
 
355
  my ($self, $manifestFile) = @_;
 
356
 
 
357
  my $id = $self->encodeXML($self->{settings}{general}{id});
 
358
  my $version = $self->encodeXML($self->{version});
 
359
  my $name = $self->encodeXML($self->{name});
 
360
  my $description = $self->encodeXML($self->{description});
 
361
  my $author = $self->encodeXML($self->{author});
 
362
  my $homepage = $self->encodeXML($self->{homepage});
 
363
 
 
364
  open(local *FILE, '>', $manifestFile) or die "Failed to write manifest file $manifestFile";
 
365
  binmode(FILE);
 
366
  print FILE <<"EOT";
 
367
<?xml version="1.0"?>
 
368
 
 
369
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 
370
\t\txmlns:em="http://www.mozilla.org/2004/em-rdf#">
 
371
 
 
372
\t<Description about="urn:mozilla:install-manifest">
 
373
 
 
374
\t\t<em:id>$id</em:id>
 
375
\t\t<em:version>$version</em:version>
 
376
\t\t<em:name>$name</em:name>
 
377
\t\t<em:description>$description</em:description>
 
378
\t\t<em:creator>$author</em:creator>
 
379
\t\t<em:homepageURL>$homepage</em:homepageURL>
 
380
\t\t<em:type>2</em:type>
 
381
EOT
 
382
 
 
383
  if ($self->{devbuild})
 
384
  {
 
385
    print FILE <<"EOT";
 
386
\t\t<em:updateURL><![CDATA[https://adblockplus.org/devbuilds/update.rdf?baseName=$self->{settings}{general}{basename}&reqVersion=%REQ_VERSION%&id=%ITEM_ID%&version=%ITEM_VERSION%&maxAppVersion=%ITEM_MAXAPPVERSION%&status=%ITEM_STATUS%&appID=%APP_ID%&appVersion=%APP_VERSION%&appOS=%APP_OS%&appABI=%APP_ABI%&locale=%APP_LOCALE%&currentAppVersion=%CURRENT_APP_VERSION%&updateType=%UPDATE_TYPE%]]></em:updateURL>
 
387
EOT
 
388
  }
 
389
 
 
390
  if (exists($self->{settings}{general}{icon}))
 
391
  {
 
392
    my $icon = $self->encodeXML($self->{settings}{general}{icon});
 
393
    print FILE <<"EOT";
 
394
\t\t<em:iconURL>$icon</em:iconURL>
 
395
EOT
 
396
  }
 
397
  if (exists($self->{settings}{general}{about}))
 
398
  {
 
399
    my $about = $self->encodeXML($self->{settings}{general}{about});
 
400
    print FILE <<"EOT";
 
401
\t\t<em:aboutURL>$about</em:aboutURL>
 
402
EOT
 
403
  }
 
404
  if (exists($self->{settings}{general}{options}))
 
405
  {
 
406
    my $options = $self->encodeXML($self->{settings}{general}{options});
 
407
    print FILE <<"EOT";
 
408
\t\t<em:optionsURL>$options</em:optionsURL> 
 
409
EOT
 
410
  }
 
411
 
 
412
  print FILE "\n";
 
413
 
 
414
  if (exists($self->{settings}{general}{contributor}))
 
415
  {
 
416
    foreach my $contributor (map {$self->encodeXML($_)} @{$self->{settings}{general}{contributor}})
 
417
    {
 
418
      print FILE <<"EOT";
 
419
\t\t<em:contributor>$contributor</em:contributor>
 
420
EOT
 
421
    }
 
422
    print FILE "\n";
 
423
  }
 
424
 
 
425
  my %translators = ();
 
426
  foreach my $locale (values %{$self->{localeData}})
 
427
  {
 
428
    if (exists($locale->{translator}))
 
429
    {
 
430
      foreach my $translator (split(/,/, $locale->{translator}))
 
431
      {
 
432
        $translator =~ s/^\s+//g;
 
433
        $translator =~ s/\s+$//g;
 
434
        $translators{$translator} = 1 if $translator ne "";
 
435
      }
 
436
    }
 
437
  }
 
438
  foreach my $translator (sort keys %translators)
 
439
  {
 
440
    $translator = $self->encodeXML($translator);
 
441
    print FILE <<"EOT";
 
442
\t\t<em:translator>$translator</em:translator>
 
443
EOT
 
444
  }
 
445
  print FILE "\n";
 
446
 
 
447
  foreach my $locale (sort {$a->{id} cmp $b->{id}} values %{$self->{localeData}})
 
448
  {
 
449
    my $id = $self->encodeXML($locale->{id});
 
450
    my $name = $self->encodeXML($locale->{name});
 
451
    my $description = $self->encodeXML($locale->{description});
 
452
    my $homepage = $self->encodeXML($locale->{homepage});
 
453
 
 
454
    # Duplicate author in each locale to work around bug 416350
 
455
    my $author = $self->encodeXML($self->{author});
 
456
 
 
457
    print FILE <<"EOT";
 
458
\t\t<em:localized>
 
459
\t\t\t<Description>
 
460
\t\t\t\t<em:locale>$id</em:locale>
 
461
\t\t\t\t<em:name>$name</em:name>
 
462
\t\t\t\t<em:description>$description</em:description>
 
463
\t\t\t\t<em:creator>$author</em:creator>
 
464
\t\t\t\t<em:homepageURL>$homepage</em:homepageURL>
 
465
\t\t\t</Description>
 
466
\t\t</em:localized>
 
467
EOT
 
468
  }
 
469
  print FILE "\n";
 
470
 
 
471
  foreach my $app (sort keys %{$self->{settings}{compat}})
 
472
  {
 
473
    if (!exists($apps{$app}))
 
474
    {
 
475
      warn "Unrecognized application in manifest: $app";
 
476
      next;
 
477
    }
 
478
 
 
479
    my $id = $self->encodeXML($apps{$app});
 
480
    my ($min, $max) = map {$self->encodeXML($_)} split(/\//, $self->{settings}{compat}{$app});
 
481
 
 
482
    print FILE <<"EOT";
 
483
\t\t<em:targetApplication>
 
484
\t\t\t<Description>
 
485
\t\t\t\t<!-- $app -->
 
486
\t\t\t\t<em:id>$id</em:id>
 
487
\t\t\t\t<em:minVersion>$min</em:minVersion>
 
488
\t\t\t\t<em:maxVersion>$max</em:maxVersion>
 
489
\t\t\t</Description>
 
490
\t\t</em:targetApplication>
 
491
EOT
 
492
  }
 
493
 
 
494
  print FILE <<"EOT";
 
495
\t</Description>  
 
496
</RDF>
 
497
EOT
 
498
 
 
499
  close(FILE);
 
500
}
 
501
 
363
502
sub makeJAR
364
503
{
365
504
  my ($self, $jarFile, @files) = @_;
458
597
my $Name = qr/[A-Za-z_:][\w.\-:]*/;
459
598
my $Reference = qr/&$Name;|&#\d+;|&#x[\da-fA-F]+;/;
460
599
my $PEReference = qr/%$Name;/;
461
 
my $EntityValue = qr/"(?:[^%&"]|$PEReference|$Reference)*"|'(?:[^%&']|$PEReference|$Reference)*'/;
 
600
my $EntityValue = qr/"(?:[^%&"]|$PEReference|$Reference)*"|'(?:[^%&']|$PEReference|$Reference)*'/;  #"
462
601
 
463
602
sub fixDTDFile
464
603
{
491
630
 
492
631
  my $changed = 0;
493
632
  $data .= "\n" unless $data =~ /\n$/s;
494
 
  while ($reference =~ /^\s*(?![!#])(\S+)\s*=\s*.+$/mg)
 
633
  while ($reference =~ /^\s*(?![!#])(\S+)\s*=\s*?.*$/mg)
495
634
  {
496
635
    my ($match, $name) = ($&, $1);
497
 
    unless ($data =~ /^\s*(?![!#])($name)\s*=\s*.+$/m)
 
636
    unless ($data =~ /^\s*(?![!#])($name)\s*=\s*?.*$/m)
498
637
    {
499
638
      $data .= "$match\n";
500
639
      $changed = 1;
549
688
    }
550
689
  }
551
690
 
 
691
  $self->writeManifest('tmp/install.rdf');
 
692
  push @files, 'install.rdf';
 
693
 
552
694
  if (-f '.signature')
553
695
  {
554
696
    my $signData = $self->readFile(".signature");