projects/aports·blob v3.4.0_rc4 · refs

238 lines · 5.4 KiB

1#!/usr/bin/perl
2
3use strict;
4use warnings;
5use autodie qw(:all);
6use feature qw(:5.14);
7use LWP::UserAgent;
8use LWP::ConnCache;
9use JSON;
10
11our $packager = '';
12my %pkgmap = ();
13my %licenses = ();
14
15my $template = <<'EOF';
16# Contributor: [% contributor %]
17# Maintainer: [% maintainer %]
18pkgname=[% pkgname %]
19_pkgreal=[% pkgreal %]
20pkgver=[% pkgver %]
21pkgrel=0
22pkgdesc=[% pkgdesc %]
23url="http://packages.python.org/pypi/[% pkgreal %]"
24arch="noarch"
25license="PSF"
26pydepends=""
27pymakedepends=""
28depends="python $pydepends"
29makedepends="python-dev $pymakedepends"
30subpackages="$pkgname-doc"
31source="[% source %]"
32builddir="$srcdir/$_pkgreal-$pkgver"
33
34build() {
35 cd "$builddir"
36 python setup.py build
37}
38
39package() {
40 cd "$builddir"
41 python setup.py install \
42 --prefix=/usr \
43 --root="$pkgdir" \
44 --single-version-externally-managed
45}
46EOF
47
48my $ua = LWP::UserAgent->new();
49my $json = JSON->new;
50$ua->env_proxy;
51$ua->conn_cache(LWP::ConnCache->new);
52
53sub read_file {
54 my ($filename) = @_;
55 open my $fh, '<:utf8', $filename;
56 local $/;
57 my $text = <$fh>;
58 return $text;
59}
60
61sub read_assignments_from_file {
62 my ($filename) = @_;
63 my $text = read_file($filename);
64 my %sline = $text =~ /^(\w+)\s*=\s*([^\"\n]*)$/mg;
65 my %mline = $text =~ /^(\w+)\s*=\s*\"([^\"]*)\"$/mg;
66
67 my %temp = (%sline, %mline);
68
69 return \%temp;
70}
71
72sub map_pypi_to_apk {
73 my ($pypi) = @_;
74 return $pkgmap{$pypi} unless !exists($pkgmap{$pypi});
75 return 'py-'.lc($pypi);
76}
77
78sub map_license {
79 my ($license) = @_;
80
81 $license =~ s/ or / /g;
82
83 return $license;
84}
85
86sub get_source {
87 my ($distdata) = @_;
88
89 for my $url (@{$distdata->{urls}}) {
90 return $url->{url} if $url->{python_version} eq 'source'
91 }
92 die "Unable to locate sources for $distdata->{name}.\n";
93}
94
95sub read_apkbuild {
96 return read_assignments_from_file('APKBUILD');
97}
98
99sub write_apkbuild {
100 my ($distdata) = @_;
101
102 my %repl = (
103 packager => $packager,
104 pkgname => map_pypi_to_apk($distdata->{info}{name}),
105 pkgreal => $distdata->{info}{name},
106 pkgver => $distdata->{info}{version},
107 source => get_source($distdata),
108 license => map_license($distdata->{info}{license}),
109 );
110 $template =~ s/\[% (.*?) %\]/$repl{$1}/g;
111
112 open my $fh, '>:utf8', 'APKBUILD';
113 print {$fh} $template;
114 close $fh;
115
116 say "Wrote $repl{pkgname}/APKBUILD";
117
118 return \%repl;
119}
120
121sub prepare_tree {
122 system('abuild checksum unpack prepare');
123}
124
125sub get_data {
126 my ($package) = @_;
127 my $response = $ua->get("http://pypi.python.org/pypi/$package/json");
128 $response->is_success or die $response->status_line;
129 my $distdata = $json->decode($response->decoded_content);
130
131 return $distdata;
132}
133
134sub get_deps {
135 my ($data) = @_;
136
137 chdir "src/$data->{pkgreal}-$data->{pkgver}";
138 my $reqs = `python ./setup.py --requires`;
139
140 my @reqs = split /\n/, $reqs;
141
142 foreach my $i (0 .. $#reqs) {
143 $reqs[$i] =~ s/(\(|\s+).*$//;
144 $reqs[$i] = map_pypi_to_apk($reqs[$i]);
145 }
146
147 chdir '../..';
148
149 my $apk = read_file('APKBUILD');
150
151 $reqs = join ' ', @reqs;
152
153 $apk =~ s/pymakedepends=""/pymakedepends="$reqs"/;
154
155 open my $fh, '>:utf8', 'APKBUILD';
156
157 print $fh $apk;
158
159 say "Requires: $reqs";
160}
161
162my $abuild_conf = read_assignments_from_file('/etc/abuild.conf');
163$packager = $abuild_conf->{PACKAGER} if $abuild_conf->{PACKAGER};
164
165sub usage {
166 say <<'EOF';
167Usage: apkbuild-pypi [create <package> | check | recreate | upgrade | update]
168
169In the repository root:
170 create <package>: Creates an APKBUILD for <package>
171
172In the package root:
173 check : Reports current & latest version of the package
174 recreate : Recreates the APKBUILD
175 upgrade : Upgrades to the latest version of the package
176 update : Updates APKBUILD metadata
177EOF
178}
179
180given ($ARGV[0]) {
181 when ('create') {
182 my $package = $ARGV[1];
183 $package or die usage;
184
185 my $distdata = get_data($package);
186 my $apkname = map_pypi_to_apk($package);
187
188 mkdir $apkname;
189 chdir $apkname;
190
191 my $data = write_apkbuild($distdata);
192 prepare_tree;
193
194 get_deps($data);
195 } when ('recreate') {
196 my $apkbuild = read_apkbuild;
197 my $distdata = get_data($apkbuild->{_pkgreal});
198
199 prepare_tree;
200 get_deps;
201 } when ('upgrade') {
202 my $apkbuild = read_apkbuild;
203 my $distdata = get_data($apkbuild->{_pkgreal});
204
205 my $pkgver = $distdata->{info}{version};
206
207 if ($pkgver ne $apkbuild->{pkgver}) {
208 say "Upgrading PyPI package from $apkbuild->{pkgver} to $pkgver";
209
210 my $text = read_file('APKBUILD');
211
212 $text =~ s/^(pkgver)=.*$/$1=$pkgver/mg or
213 die "Can't find pkgver line in APKBUILD";
214 $text =~ s/^(pkgrel)=.*$/$1=0/mg or
215 die "Can't find pkgrel line in APKBUILD";
216
217 open my $fh, '>:utf8', 'APKBUILD';
218 print $fh $text;
219 close $fh;
220 } else {
221 say "Already up to date with PyPI";
222 }
223 } when ('check') {
224 my $apkbuild = read_apkbuild;
225 my $distdata = get_data($apkbuild->{_pkgreal});
226
227 my $pkgver = $distdata->{info}{version};
228
229 say "$apkbuild->{pkgname}: Latest version: $pkgver Packaged version: $apkbuild->{pkgver}";
230 if ($pkgver ne $apkbuild->{pkgver}) {
231 exit(1);
232 }
233 } when ('update') {
234 prepare_tree;
235 } default {
236 die usage;
237 }
238}