aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPascal Rigaux <pixel@mandriva.com>2008-02-25 22:11:29 +0000
committerPascal Rigaux <pixel@mandriva.com>2008-02-25 22:11:29 +0000
commit0ca0076a09724a30337e6e7362ed25baf20d8f95 (patch)
tree4da83321c9a6cf7db6712e2a9298b8cb60977969
parent58a5337c92999d8350964711166e969c98903cc3 (diff)
downloadperl-URPM-0ca0076a09724a30337e6e7362ed25baf20d8f95.tar
perl-URPM-0ca0076a09724a30337e6e7362ed25baf20d8f95.tar.gz
perl-URPM-0ca0076a09724a30337e6e7362ed25baf20d8f95.tar.bz2
perl-URPM-0ca0076a09724a30337e6e7362ed25baf20d8f95.tar.xz
perl-URPM-0ca0076a09724a30337e6e7362ed25baf20d8f95.zip
- add filesize to synthesis, add ->filesize to get it, and add
selected_size_filesize() to compute the sum (backport from HEAD)
-rw-r--r--NEWS3
-rw-r--r--URPM.pm4
-rw-r--r--URPM.xs26
-rw-r--r--URPM/Resolve.pm23
4 files changed, 54 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index 7478649..71c1dae 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,6 @@
+- add filesize to synthesis, add ->filesize to get it, and add
+ selected_size_filesize() to compute the sum
+
Version 2.09.1 - 17 December 2007, by Pascal "Pixel" Rigaux
- suggests:
diff --git a/URPM.pm b/URPM.pm
index 4cbb884..437cdda 100644
--- a/URPM.pm
+++ b/URPM.pm
@@ -625,6 +625,10 @@ The rpm's bare name.
=item $package->rflags()
+=item $package->filesize()
+
+Size of the rpm file (ie the rpm header + cpio body)
+
=item $package->set_flag($name, $value)
=item $package->set_flag_base($value)
diff --git a/URPM.xs b/URPM.xs
index 409b277..e22eb48 100644
--- a/URPM.xs
+++ b/URPM.xs
@@ -49,6 +49,7 @@
struct s_Package {
char *info;
+ int filesize;
char *requires;
char *suggests;
char *obsoletes;
@@ -179,6 +180,11 @@ get_int(Header header, int_32 tag) {
}
static int
+sigsize_to_filesize(int sigsize) {
+ return sigsize + 440; /* 440 is the rpm header size (?) empirical, but works */
+}
+
+static int
print_list_entry(char *buff, int sz, char *name, int_32 flags, char *evr) {
int len = strlen(name);
char *p = buff;
@@ -809,6 +815,8 @@ pack_header(URPM__Package pkg) {
}
pkg->info = memcpy(malloc(p-buff), buff, p-buff);
}
+ if (pkg->filesize == 0)
+ pkg->filesize = sigsize_to_filesize(get_int(pkg->h, RPMTAG_SIGSIZE));
if (pkg->requires == NULL && pkg->suggests == NULL)
has_old_suggests = 0;
pkg->requires = pack_list(pkg->h, RPMTAG_REQUIRENAME, RPMTAG_REQUIREFLAGS, RPMTAG_REQUIREVERSION, is_not_old_suggests);
@@ -1131,6 +1139,8 @@ parse_line(AV *depslist, HV *provides, HV *obsoletes, URPM__Package pkg, char *b
av_push(depslist, sv_pkg);
}
memset(pkg, 0, sizeof(struct s_Package));
+ } else if (!strcmp(tag, "filesize")) {
+ pkg->filesize = atoi(data);
} else if (!strcmp(tag, "requires")) {
free(pkg->requires); pkg->requires = memcpy(malloc(data_len), data, data_len);
} else if (!strcmp(tag, "suggests")) {
@@ -1937,6 +1947,18 @@ Pkg_size(pkg)
OUTPUT:
RETVAL
+int
+Pkg_filesize(pkg)
+ URPM::Package pkg
+ CODE:
+ if (pkg->filesize) {
+ RETVAL = pkg->filesize;
+ } else if (pkg->h) {
+ RETVAL = sigsize_to_filesize(get_int(pkg->h, RPMTAG_SIGSIZE));
+ } else RETVAL = 0;
+ OUTPUT:
+ RETVAL
+
void
Pkg_group(pkg)
URPM::Package pkg
@@ -2454,6 +2476,10 @@ Pkg_build_info(pkg, fileno, provides_files=NULL)
size = snprintf(buff, sizeof(buff), "@summary@%s\n", pkg->summary);
if (size < sizeof(buff)) write_nocheck(fileno, buff, size);
}
+ if (pkg->filesize) {
+ size = snprintf(buff, sizeof(buff), "@filesize@%d\n", pkg->filesize);
+ if (size < sizeof(buff)) write_nocheck(fileno, buff, size);
+ }
size = snprintf(buff, sizeof(buff), "@info@%s\n", pkg->info);
write_nocheck(fileno, buff, size);
} else croak("no info available for package %s",
diff --git a/URPM/Resolve.pm b/URPM/Resolve.pm
index eb9bfef..659ed1c 100644
--- a/URPM/Resolve.pm
+++ b/URPM/Resolve.pm
@@ -1340,11 +1340,30 @@ sub disable_selected_and_unrequested_dependencies {
#- side-effects: none
sub selected_size {
my ($urpm, $state) = @_;
- my $size;
+ my ($size) = _selected_size_filesize($urpm, $state, 0);
+ $size;
+}
+#- side-effects: none
+sub selected_size_filesize {
+ my ($urpm, $state) = @_;
+ _selected_size_filesize($urpm, $state, 1);
+}
+#- side-effects: none
+sub _selected_size_filesize {
+ my ($urpm, $state, $compute_filesize) = @_;
+ my ($size, $filesize, $bad_filesize);
foreach (keys %{$state->{selected} || {}}) {
my $pkg = $urpm->{depslist}[$_];
$size += $pkg->size;
+ $compute_filesize or next;
+
+ if (my $n = $pkg->filesize) {
+ $filesize += $n;
+ } elsif (!$bad_filesize) {
+ $urpm->{debug} and $urpm->{debug}("no filesize for package " . $pkg->fullname);
+ $bad_filesize = 1;
+ }
}
foreach (values %{$state->{rejected} || {}}) {
@@ -1352,7 +1371,7 @@ sub selected_size {
$size -= $_->{size};
}
- $size;
+ $size, $bad_filesize ? 0 : $filesize;
}
#- compute installed flags for all packages in depslist.