]> git.deb.at Git - deb/packages.git/blob - lib/Packages/SrcPage.pm
Replace non working volatile mirror debian.domainmail.org with mirror.csclub.uwaterloo.ca
[deb/packages.git] / lib / Packages / SrcPage.pm
1 package Packages::SrcPage;
2
3 use strict;
4 use warnings;
5
6 use Data::Dumper;
7 use Deb::Versions;
8 use Packages::CGI;
9 use Packages::Page qw( :all );
10
11 our @ISA = qw( Packages::Page );
12
13 #FIXME: change parameters so that we can use the version from Packages::Page
14 sub merge_data {
15     my ($self, $pkg, $suite, $archive, $data) = @_;
16
17     my %data = split /\00/o, $data;
18     $data{package} = $pkg;
19     $data{suite} = $suite;
20     $data{archive} = $archive;
21
22     return $self->merge_package( \%data );
23 }
24
25 our @DEP_FIELDS = qw( build-depends build-depends-indep
26                       build-conflicts build-conflicts-indep);
27 sub merge_package {
28     my ($self, $data) = @_;
29
30     ($data->{package} && $data->{suite} && $data->{archive}) || return;
31     $self->{package} ||= $data->{package};
32     ($self->{package} eq $data->{package}) || return;
33     debug( "merge package $data->{package}/$data->{version} into $self (".($self->{version}||'').")", 2 ) if DEBUG;
34
35     if (!$self->{version}
36         || (version_cmp( $data->{version}, $self->{version} ) > 0)) {
37         debug( "added package is newer, replacing old information" ) if DEBUG;
38
39         $self->{data} = $data;
40
41         my @uploaders;
42         if ($data->{maintainer} ||= '') {
43             push @uploaders, [ split_name_mail( $data->{maintainer} ) ];
44         }
45         if ($data->{uploaders}) {
46             my @up_tmp = split( /\s*,\s*/,
47                                 $data->{uploaders} );
48             foreach my $up (@up_tmp) {
49                 if ($up ne $data->{maintainer}) { # weed out duplicates
50                     push @uploaders, [ split_name_mail( $up ) ];
51                 }
52             }
53         }
54         $self->{uploaders} = \@uploaders;
55
56         if ($data->{files}) {
57             my @files = split /\01/so, $data->{files};
58             $self->{files} = \@files;
59         }
60
61         foreach (@DEP_FIELDS) {
62             $self->normalize_dependencies( $_, $data );
63         }
64
65         $self->{version} = $data->{version};
66     }
67
68     return 1;
69 }
70
71 #FIXME: should be mergable with the Packages::Page version
72 sub normalize_dependencies {
73     my ($self, $dep_field, $data) = @_;
74
75     my ($deps_norm, $deps) = parse_deps( $data->{$dep_field}||'' );
76     $self->{dep_fields}{$dep_field} =
77         [ $deps_norm, $deps ];
78 }
79
80 sub get_src {
81     my ($self, $field) = @_;
82     
83     return $self->{$field} if exists $self->{$field};
84     return $self->{data}{$field};
85 }
86
87 sub get_architectures {
88     die "NOT SUPPORTED";
89 }
90
91 sub get_arch_field {
92     my ($self, $field) = @_;
93
94     return $self->{data}{$field};
95 }
96
97 sub get_versions {
98     my ($self) = @_;
99
100     return [ $self->{version} ];
101 }
102
103 sub get_version_string {
104     my ($self) = @_;
105
106     my $versions = $self->get_versions;
107
108     return ($self->{version}, $versions);
109 }
110
111 sub get_dep_field {
112     my ($self, $dep_field) = @_;
113
114     my @deps;
115     foreach my $dep (@{$self->{dep_fields}{$dep_field}[1]}) {
116         my @or_deps;
117         foreach my $or_dep ( @$dep ) {
118             my $p_name = $or_dep->[0];
119             my $p_version = $or_dep->[1] ? "$or_dep->[1] $or_dep->[2]" : undef;
120             my $arch_neg;
121             my $arch_str = '';
122             if ($or_dep->[3] && @{$or_dep->[3]}) {
123                 # as either all or no archs have to be prepended with
124                 # exlamation marks, use the first and delete the others
125                 if ($or_dep->[3][0] =~ /^!/) {
126                     $arch_neg = 1;
127                     foreach (@{$or_dep->[3]}) {
128                         $_ =~ s/^!//go;
129                     }
130                 }
131                 $arch_str = join(" ",sort(@{$or_dep->[3]}));
132             }
133
134             push @or_deps, [ $p_name, $p_version, $arch_neg, $arch_str ];
135         }
136         push @deps, [ 0, @or_deps ];
137     }
138     return \@deps;
139 }
140
141 1;