[SCM] Debian Qt/KDE packaging tools branch, master, updated. debian/0.6.8-20-gd750b7b

Modestas Vainius modax at alioth.debian.org
Mon Mar 15 00:11:41 UTC 2010


The following commit has been merged in the master branch:
commit 2da5544573eebf69c424c53c0d423a9377f11f97
Author: Modestas Vainius <modestas at vainius.eu>
Date:   Sun Mar 14 18:17:29 2010 +0200

    Reimplement pkgkde-getbuildlogs in perl.
    
    This fixes a couple of bugs including proper support for -v option and  support
    for multiple -a and -v options.
---
 symbolshelper/Debian/PkgKde.pm    |   55 +++++++
 symbolshelper/pkgkde-getbuildlogs |  302 ++++++++++++++++++++++---------------
 2 files changed, 238 insertions(+), 119 deletions(-)

diff --git a/symbolshelper/Debian/PkgKde.pm b/symbolshelper/Debian/PkgKde.pm
new file mode 100644
index 0000000..3a25e11
--- /dev/null
+++ b/symbolshelper/Debian/PkgKde.pm
@@ -0,0 +1,55 @@
+package Debian::PkgKde;
+
+use base qw(Exporter);
+our @EXPORT = qw(get_program_name
+    printmsg info warning errormsg error syserr usageerr);
+
+{
+    my $progname;
+    sub get_program_name {
+	unless (defined $progname) {
+	    $progname = ($0 =~ m,/([^/]+)$,) ? $1 : $0;
+	}
+	return $progname;
+    }
+}
+
+sub format_message {
+    my $type = shift;
+    my $format = shift;
+
+    my $msg = sprintf($format, @_);
+    return ((defined $type) ?
+	get_program_name() . ": $type: " : "") . "$msg\n";
+}
+
+sub printmsg {
+    print STDERR format_message(undef, @_);
+}
+
+sub info {
+    print STDERR format_message("info", @_);
+}
+
+sub warning {
+    warn format_message("warning", @_);
+}
+
+sub syserr {
+    my $msg = shift;
+    die format_message("error", "$msg: $!", @_);
+}
+
+sub errormsg {
+    print STDERR format_message("error", @_);
+}
+
+sub error {
+    die format_message("error", @_);
+}
+
+sub usageerr {
+    die format_message("usage", @_);
+}
+
+1;
diff --git a/symbolshelper/pkgkde-getbuildlogs b/symbolshelper/pkgkde-getbuildlogs
index 522ec28..cfcbb0f 100755
--- a/symbolshelper/pkgkde-getbuildlogs
+++ b/symbolshelper/pkgkde-getbuildlogs
@@ -1,126 +1,190 @@
-#!/bin/sh
-
-set -e
-
-include_common() {
-    local _dirname
-    _dirname="`dirname "$0"`"
-    if [ -n "$_dirname" ] && [ -f "$_dirname/../datalib/sh_output" ]; then
-        . "$_dirname/../datalib/sh_output"
-    else
-        . /usr/share/pkg-kde-tools/lib/sh_output
-    fi
-}
-
-usage() {
-    echo "$PROGNAME: usage:" "$0" "[ -d destdir ]" "[ -v version ]" "[ package ]" "[ distribution ]" >&2
-}
-
-download_logs() {
-    local destdir pkg distro ver url
-    destdir="$1"
-    pkg="$2"
-    distro="$3"
-    ver="$4"
-    # Download debs
-    url="https://buildd.debian.org/pkg.cgi?pkg=$pkg"
-    if [ -n "$ver" ]; then
-        url="${url}&ver=$ver"
-    elif [ -n "$distro" ]; then
-        url="${url}&dist=$distro"
-    fi
-
-    info "Downloading referenced build logs from $url ..."
-    wget -e robots=off --timestamping --no-directories --directory-prefix="$destdir" \
-         --recursive --level=1 --no-parent --accept 'fetch.cgi*' "$url"
-}
-
-rename_logs() {
-    local destdir pkg
-    local IFS f files old
-    destdir="$1"
-    pkg="$2"
-    files="`ls -1 "$destdir" 2>/dev/null |
-        sed -n "/^fetch\.cgi?.*pkg=${pkg}/ {"'
-            p;
-            s/fetch\.cgi//;
-            s/[?;&][^=]\+=\([^?;&]\+\)/_\1/g;
-            s/^_//;
-            s/$/.build/;
-            p;
-        }'`";
-    IFS='
-'
-
-    if [ -n "$files" ]; then
-        for f in $files; do
-            if [ -n "$old" ]; then
-                info2 "$f"
-                mv "$destdir/$old" "$destdir/$f"
-                old=""
-            else
-                old="$f"
-            fi
-        done
-
-        return 0
-    else
-        return 1
-    fi
-}
-
-include_common
-
-# Process options
-VERSION=""
-DESTDIR=""
-while getopts "d:v:" name; do
-    case "$name" in
-	d)  DESTDIR="$OPTARG" ;;
-	v)  VERSION="$OPTARG" ;;
-	\?)  usage; exit 2 ;;
-    esac
-done
-
-shift `expr $OPTIND - 1`
-
-PACKAGE="$1"
-DISTRO="$2"
-
-if [ -f debian/changelog ]; then
-    _parsechangelog=`dpkg-parsechangelog`
-    if [ -z "$PACKAGE" ]; then
-        PACKAGE=$(echo "$_parsechangelog" | sed -n '/^Source:/ {s/[^:]\+:[[:space:]]*\(.\+\)/\1/; p; q}')
-    fi
-    if [ -n "$PACKAGE" ] && [ -z "$VERSION" ] && [ -z "$DISTRO" ]; then
-        DISTRO=$(echo "$_parsechangelog" | sed -n '/^Distribution:/ {s/[^:]\+:[[:space:]]*\(.\+\)/\1/; p; q}')
-        if [ "$DISTRO" = "UNRELEASED" ]; then
-            # Get distro from the next to current entry
-            _parsechangelog=`dpkg-parsechangelog -c1 -o1`
-            DISTRO=$(echo "$_parsechangelog" | sed -n '/^Distribution:/ {s/[^:]\+:[[:space:]]*\(.\+\)/\1/; p; q}')
-        fi
-    fi
-fi
-
-if [ -z "$PACKAGE" ] || ( [ -z "$VERSION" ] && [ -z "$DISTRO" ] ); then
-    usage
-    exit 2
-fi
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Debian::PkgKde;
+use Getopt::Long;
+use File::Copy qw();
+
+eval "use URI; use URI::QueryParam";
+if ($@) {
+    error "in order to use this utility, you have to install liburi-perl package";
+}
+
+sub usage {
+    usageerr "[ -d destdir ] [ -v version ] [ -a arch ] [ package ] [ distribution ]";
+}
+
+sub construct_url {
+    my ($path, %params) = @_;
+
+    my $url = URI->new($path);
+    foreach my $param (keys %params) {
+	my @value = (ref $params{$param} eq "ARRAY") ?
+	    @{$params{$param}} : ( $params{$param} );
+	$url->query_param_append($param, @value);
+    }
+    return $url->as_string();
+}
+
+sub as_array {
+    my $scalar = shift;
+    my @ret;
+    if (defined $scalar) {
+	if (ref($scalar) eq 'ARRAY') {
+	    @ret = @$scalar;
+	} else {
+	    push @ret, $scalar;
+	}
+    }
+    return @ret;
+}
+
+sub get_command_output {
+    my @lines;
+    open(my $cmd, "-|", @_) or syserr("unable to execute command %s", $_[0]);
+    while (<$cmd>) {
+	chop;
+	push @lines, $_;
+    }
+    close $cmd;
+    return @lines;
+}
+
+sub get_rfc822_field_value {
+    my ($field, $input) = @_;
+    foreach my $line (@$input) {
+	if ($line =~ /^\Q$field\E:\s*(.*)$/) {
+	    return "$1"
+	}
+    }
+}
+
+sub download_logs {
+    my ($destdir, $pkg, %opts) = @_;
+    my $distro = $opts{distro};
+    my $url;
+
+    # Construct URL
+    if (defined $distro) {
+        $url = construct_url('https://buildd.debian.org/pkg.cgi',
+	    pkg => $pkg, dist => $distro, arch => [ as_array($opts{arch}) ]);
+    } elsif (defined $opts{ver}) {
+        $url = construct_url('https://buildd.debian.org/build.cgi',
+	    pkg => $pkg, ver => [ as_array($opts{ver}) ],
+	    arch => [ as_array($opts{arch}) ])
+    } else {
+	error "neither version(s) nor distribution was specified";
+    }
+
+    # Download
+    info "Downloading referenced build logs from $url ...";
+    if (system("wget", "-e", "robots=off", "--timestamping", "--no-directories",
+        "--directory-prefix=$destdir", "--recursive", "--level=1", "--no-parent",
+        "--accept", "fetch.cgi*", $url) != 0)
+    {
+	error "problems downloading (wget'ing) build logs";
+    }
+}
+
+sub rename_logs {
+    my ($destdir, $pkg) = @_;
+    my %rename;
+    if (opendir(my $dir, $destdir)) {
+	while (my $file = readdir($dir)) {
+	    my $newname;
+	    if ($file =~ /^fetch\.cgi\?.*pkg=$pkg/) {
+		$newname = $file;
+		$newname =~ s/fetch\.cgi//;
+		$newname =~ s/[?;&][^=]+=([^?;&]+)/_$1/g;
+		$newname =~ s/^_//;
+		$newname =~ s/$/.build/;
+		$rename{$file} = $newname;
+	    }
+	}
+	closedir($dir);
+    }
+
+    foreach my $file (keys %rename) {
+	my $newname = $rename{$file};
+	File::Copy::move("$destdir/$file", "$destdir/$newname") or
+	    error "unable to rename '%s' to '%s'", $file, $newname;
+    }
+
+    return values %rename;
+}
+
+my $opt_destdir;
+my @opt_versions;
+my @opt_archs;
+
+# Get and verify options
+unless (GetOptions(
+	"destdir|d=s" => \$opt_destdir,
+	"version|v=s" => \@opt_versions,
+	"arch|a=s" => \@opt_archs))
+{
+    usage();
+}
+
+my ($opt_package, $opt_distro) = @ARGV;
+my @dpkg_parsechangelog;
+
+if (!$opt_package && -f "debian/changelog") {
+    @dpkg_parsechangelog = get_command_output("dpkg-parsechangelog");
+    $opt_package = get_rfc822_field_value("Source", \@dpkg_parsechangelog);
+}
+
+if (!$opt_package) {
+    errormsg "source package was not specified and could not be autoguessed";
+    usage();
+}
+
+if ($opt_distro && @opt_versions) {
+    errormsg "version and distribution options are mutually exclusive";
+    usage();
+}
+
+if (!@opt_versions) {
+    if (!$opt_distro && -f "debian/changelog") {
+	@dpkg_parsechangelog = get_command_output("dpkg-parsechangelog") unless @dpkg_parsechangelog;
+	$opt_distro = get_rfc822_field_value("Distribution", \@dpkg_parsechangelog);
+	if ($opt_distro eq "UNRELEASED") {
+	    # Get distro from the next to current entry
+	    $opt_distro = get_rfc822_field_value("Distribution",
+		[ get_command_output("dpkg-parsechangelog", "-c1", "-o1") ]);
+	}
+    }
+    if (!$opt_distro) {
+	errormsg "neither distribution nor version(s) was specified and could not be autoguessed";
+	usage();
+    }
+}
 
 # Determine destination directory to store logs
-destdir="${DESTDIR:-${PACKAGE}_${VERSION:-${DISTRO}}_logs}"
+unless ($opt_destdir) {
+    $opt_destdir = sprintf("%s_%s_logs", $opt_package,
+	($opt_distro) ? $opt_distro : $opt_versions[0]);
+}
 
-info "Selected output directory for logs:" "$destdir/"
-if [ ! -d "$destdir" ]; then
-    mkdir "$destdir"
-fi
+info("Selected output directory for logs: %s/", $opt_destdir);
+unless (-d $opt_destdir) {
+    mkdir $opt_destdir;
+}
+
+download_logs($opt_destdir, $opt_package,
+    distro => $opt_distro, ver => \@opt_versions, arch => \@opt_archs);
 
-download_logs "$destdir" "$PACKAGE" "$DISTRO" "$VERSION"
-rmdir "$destdir" 2>/dev/null || true
+if (my @logs = rename_logs($opt_destdir, $opt_package)) {
+    info "Downloaded build logs (stored to %s):", $opt_destdir;
+    printmsg "  - %s", $_ foreach @logs;
+} else {
+    error "no build logs have been downloaded";
+}
 
-info "Downloaded build logs (stored to $destdir):"
-if ! rename_logs "$destdir" "$PACKAGE"; then
-    error "no build logs has been downloaded"
-fi
+END {
+    rmdir $opt_destdir if $opt_destdir && $opt_destdir ne ".";
+}
 
 exit 0

-- 
Debian Qt/KDE packaging tools



More information about the pkg-kde-commits mailing list