The following commit has been merged in the master branch:
commit 8e9df75625168c0a7631fdbd5f5e27f05cd56b95
Author: Guillem Jover <[email protected]>
Date: Wed Jun 17 03:32:25 2009 +0200
dpkg-name: Rewrite in perl
diff --git a/debian/changelog b/debian/changelog
index 6ca21c8..226a21c 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -4,6 +4,7 @@ dpkg (1.15.3) UNRELEASED; urgency=low
* Unset TAR_OPTIONS when extracting .deb archives. Closes: #530860
* Use default compressor values in dpkg-source from Dpkg::Source::Compressor.
* Fix dpkg-scanpackages to properly detect spurious overrides.
+ * Rewrite dpkg-name in perl.
[ Raphael Hertzog ]
* Unset TAR_OPTIONS when creating/extracting tar archives for source
diff --git a/scripts/Makefile.am b/scripts/Makefile.am
index f0fcdd3..61e33ab 100644
--- a/scripts/Makefile.am
+++ b/scripts/Makefile.am
@@ -34,7 +34,7 @@ EXTRA_DIST = \
dpkg-genchanges.pl \
dpkg-gencontrol.pl \
dpkg-gensymbols.pl \
- dpkg-name.sh \
+ dpkg-name.pl \
dpkg-parsechangelog.pl \
dpkg-scanpackages.pl \
dpkg-scansources.pl \
@@ -129,19 +129,12 @@ do_perl_subst = sed -e
"s:^\#![:space:]*/usr/bin/perl:\#!$(PERL):" \
-e
"s:\$$admindir[[:space:]]*=[[:space:]]*['\"][^'\"]*['\"]:\$$admindir=\"$(admindir)\":"
\
-e
"s:\$$version[[:space:]]*=[[:space:]]*['\"][^'\"]*[\"']:\$$version=\"$(PACKAGE_VERSION)\":"
-do_shell_subst = sed -e "s:version=\"[^\"]*\":version=\"$(PACKAGE_VERSION)\":"
-
%: %.pl Makefile
@test -d `dirname $...@` || $(mkdir_p) `dirname $...@`
$(do_perl_subst) <$< >$@
chmod +x $@
-%: %.sh Makefile
- @test -d `dirname $...@` || $(mkdir_p) `dirname $...@`
- $(do_shell_subst) <$< >$@
- chmod +x $@
-
# Automake has its own install-info rule, gah
all-local: install-info-stamp
diff --git a/scripts/dpkg-name.pl b/scripts/dpkg-name.pl
new file mode 100755
index 0000000..3dbd164
--- /dev/null
+++ b/scripts/dpkg-name.pl
@@ -0,0 +1,256 @@
+#!/usr/bin/perl
+#
+# dpkg-name
+#
+# Copyright © 1995,1996 Erick Branderhorst <[email protected]>.
+# Copyright © 2009 Guillem Jover <[email protected]>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+use warnings;
+use strict;
+
+use File::Basename;
+use File::Path;
+
+use Dpkg;
+use Dpkg::Gettext;
+use Dpkg::ErrorHandling;
+use Dpkg::Cdata;
+use Dpkg::Arch qw(get_host_arch);
+
+textdomain("dpkg-dev");
+
+my %options = (
+ subdir => 0,
+ destdir => "",
+ createdir => 0,
+ overwrite => 0,
+ symlink => 0,
+ architecture => 1,
+);
+
+sub version()
+{
+ printf(_g("Debian %s version %s.\n"), $progname, $version);
+}
+
+sub usage()
+{
+ printf(_g("Usage: %s [<option>...] <file>...\n"), $progname);
+
+ print(_g("
+Options:
+ -a, --no-architecture no architecture part in filename.
+ -o, --overwrite overwrite if file exists.
+ -k, --symlink don't create a new file, but a symlink.
+ -s, --subdir [dir] move file into subdir (use with care).
+ -c, --create-dir create target dir if not there (use with care).
+ -h, --help show this help message.
+ -v, --version show the version.
+
+file.deb changes to <package>_<version>_<architecture>.<package_type>
+according to the 'underscores convention'.
+"));
+}
+
+sub fileexists($)
+{
+ my ($filename) = @_;
+
+ if (-f $filename) {
+ return 1;
+ } else {
+ warning(_g("cannot find '%s'"), $filename);
+ return 0;
+ }
+}
+
+sub filesame($$)
+{
+ my ($a, $b) = @_;
+ my @sta = stat($a);
+ my @stb = stat($b);
+
+ # Same device and inode numbers.
+ return (@sta and @stb and $sta[0] == $stb[0] and $sta[1] == $stb[1]);
+}
+
+sub getfields($)
+{
+ my ($filename) = @_;
+
+ # Read the fields
+ open(CDATA, '-|', "dpkg-deb", "-f", "--", $filename) ||
+ syserr(_g("cannot open %s"), $filename);
+ my $fields = parsecdata(\*CDATA,
+ sprintf(_g("binary control file %s"), $filename));
+ close(CDATA);
+
+ return $fields;
+}
+
+sub getarch($$)
+{
+ my ($filename, $fields) = @_;
+
+ my $arch = $fields->{Architecture};
+ if (!$fields->{Architecture} and !$options{architecture}) {
+ $arch = get_host_arch();
+ warning(g_("assuming architecture '%s' for '%s'"), $arch, $filename);
+ }
+
+ return $arch;
+}
+
+sub getname($$$)
+{
+ my ($filename, $fields, $arch) = @_;
+
+ my $pkg = $fields->{Package};
+ (my $version = $fields->{Version}) =~ s/.*://;
+ my $revision = $fields->{Revision} || $fields->{Package_Revision};
+ if ($revision) {
+ $version .= "-$revision";
+ }
+
+ my $type = $fields->{'Package-Type'} || 'deb';
+
+ my $tname;
+ if ($options{architecture}) {
+ $tname = "$pkg\_$version\_$arch.$type";
+ } else {
+ $tname = "$pkg\_$version.$type";
+ }
+ (my $name = $tname) =~ s/ //g;
+ if ($tname ne $name) { # control fields have spaces
+ warning("bad package control information for '%s'", $filename);
+ }
+ return $name;
+}
+
+sub getdir($$$)
+{
+ my ($filename, $fields, $arch) = @_;
+ my $dir;
+
+ if (!$options{destdir}) {
+ $dir = dirname($filename);
+ if ($options{subdir}) {
+ my $section = $fields->{Section};
+ if (!$section) {
+ $section = "no-section";
+ warning("assuming section '%s' for '%s'", $section, $filename);
+ }
+ if ($section ne "non-free" and $section ne "contrib" and
+ $section ne "no-section") {
+ $dir = "unstable/binary-$arch/$section";
+ } else {
+ $dir = "$section/binary-$arch";
+ }
+ }
+ } else {
+ $dir = $options{destdir};
+ }
+
+ return $dir;
+}
+
+sub move($)
+{
+ my ($filename) = @_;
+
+ if (fileexists($filename)) {
+ my $fields = getfields($filename);
+
+ unless (exists $fields->{Package}) {
+ warning("no Package field found in '%s', skipping it", $filename);
+ return;
+ }
+
+ my $arch = getarch($filename, $fields);
+
+ my $name = getname($filename, $fields, $arch);
+
+ my $dir = getdir($filename, $fields, $arch);
+ if (! -d $dir) {
+ if ($options{createdir}) {
+ if (mkpath($dir)) {
+ info("created directory '%s'", $dir);
+ } else {
+ error("failed creating directory '%s'", $dir);
+ }
+ } else {
+ error("no such dir '%s', try --create-dir (-c) option", $dir);
+ }
+ }
+
+ my $newname = "$dir/$name";
+
+ my @command;
+ if ($options{symlink}) {
+ @command = ("ln", "-s", "--");
+ } else {
+ @command = ("mv", "--");
+ }
+
+ if (filesame($newname, $filename)) {
+ warning("skipping '%s'", $filename);
+ } elsif (-f $newname and !$options{overwrite}) {
+ warning("cannot move '%s' to existing file", $filename);
+ } elsif (system(@command, $filename, $newname) == 0) {
+ info("moved '%s' to '%s'", basename($filename), $newname);
+ } else {
+ error("mkdir can be used to create directory");
+ }
+ }
+}
+
+...@argv || usageerr(_g("need at least a filename"));
+
+while (@ARGV) {
+ $_ = shift(@ARGV);
+ if (m/^-[h?]|--help$/) {
+ usage();
+ exit(0);
+ } elsif (m/^-v|--version$/) {
+ version();
+ exit(0);
+ } elsif (m/^-c|--create-dir$/) {
+ $options{createdir} = 1;
+ } elsif (m/^-s|--subdir$/) {
+ $options{subdir} = 1;
+ if (-d $ARGV[0]) {
+ $options{destdir} = shift(@ARGV);
+ }
+ } elsif (m/^-o|--overwrite$/) {
+ $options{overwite} = 1;
+ } elsif (m/^-k|--symlink$/) {
+ $options{symlink} = 1;
+ } elsif (m/^-a|--no-architecture$/) {
+ $options{architecture} = 0;
+ } elsif (m/^--$/) {
+ foreach (@ARGV) {
+ move($_);
+ }
+ exit 0;
+ } else {
+ move($_);
+ }
+}
+
+0;
+
diff --git a/scripts/dpkg-name.sh b/scripts/dpkg-name.sh
deleted file mode 100755
index e3cddd0..0000000
--- a/scripts/dpkg-name.sh
+++ /dev/null
@@ -1,207 +0,0 @@
-#!/bin/sh
-
-set -e
-
-# Time-stamp: <96/05/03 13:59:41 root>
-prog="$(basename "${0}")"
-version="1.2.3"; # This line modified by Makefile
-purpose="rename Debian packages to full package names"
-
-license () {
-echo "# ${prog} ${version} -- ${purpose}
-# Copyright © 1995,1996 Erick Branderhorst <[email protected]>.
-
-# This is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-
-# This is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the file
-# /usr/share/common-licenses/GPL for more details."
-}
-
-stderr () {
- echo "${prog}: $@" 1>&2;
-}
-
-show_version () {
- echo "${prog} version ${version} -- ${purpose}";
-}
-
-usage () {
- echo "Usage: ${prog} <file>...
-
-${purpose}
-file.deb changes to <package>_<version>_<architecture>.<package_type>
-according to the ``underscores convention''.
-
-Options:
- -a, --no-architecture no architecture part in filename.
- -o, --overwrite overwrite if file exists.
- -k, --symlink don't create a new file, but a symlink.
- -s, --subdir [dir] move file into subdir (Use with care).
- -c, --create-dir create target dir if not there (Use with care).
- -h, --help show this help message.
- -v, --version show the version.
- -l, --license show license."
-}
-
-fileexists () {
- if [ -f "$1" ];
- then
- return 0;
- else
- stderr "can't find \`"$1"'";
- return 1;
- fi
-}
-
-getname () {
- if p=`dpkg-deb -f -- "$1" package`;
- then
- v=`dpkg-deb -f -- "$1" version | sed s,.*:,,`;
- r=`dpkg-deb -f -- "$1" revision`;
- if [ -z "$r" ];
- then
- r=`dpkg-deb -f -- "$1" package_revision`;
- fi
-
- if [ -n "$r" ];
- then
- v=$v-$r;
- fi
-
- a=`dpkg-deb -f -- "$1" architecture`;
- a=`echo $a|sed -e 's/ *//g'`;
- if [ -z "$a" ] && [ -n "$noarchitecture" ]; # arch field empty,
or ignored
- then
- a=`dpkg --print-architecture`;
- stderr "assuming architecture \`"$a"' for \`"$1"'";
- fi
- t=`dpkg-deb -f -- "$1" package-type`
- if [ -z "$t" ];
- then
- t=deb
- fi
- if [ -z "$noarchitecture" ];
- then
- tname=$p\_$v\_$a.$t;
- else
- tname=$p\_$v.$t
- fi
-
- name=`echo $tname|sed -e 's/ //g'`
- if [ "$tname" != "$name" ]; # control fields have spaces
- then
- stderr "bad package control information for \`"$1"'"
- fi
- return 0;
- fi
-}
-
-getdir () {
- if [ -z "$destinationdir" ];
- then
- dir=`dirname "$1"`;
- if [ -n "$subdir" ];
- then
- s=`dpkg-deb -f -- "$1" section`;
- if [ -z "$s" ];
- then
- s="no-section";
- stderr "assuming section \`"no-section"' for
\`"$1"'";
- fi
- if [ "$s" != "non-free" ] && [ "$s" != "contrib" ] && [
"$s" != "no-section" ];
- then
- dir=`echo unstable/binary-$a/$s`;
- else
- dir=`echo $s/binary-$a`;
- fi
- fi
- else
- dir=$destinationdir;
- fi
-}
-
-move () {
- if fileexists "$arg";
- then
- getname "$arg";
- getdir "$arg";
- if [ ! -d "$dir" ];
- then
- if [ -n "$createdir" ];
- then
- if `mkdir -p $dir`;
- then
- stderr "created directory \`$dir'";
- else
- stderr "failed creating directory \`$dir'";
- exit 1;
- fi
- else
- stderr "no such dir \`$dir'";
- stderr "try --create-dir (-c) option";
- exit 1;
- fi
- fi
- newname=`echo $dir/$name`;
- if [ x$symlink = x1 ];
- then
- command="ln -s --"
- else
- command="mv --"
- fi
- if [ $newname -ef "$1" ]; # same device and inode numbers
- then
- stderr "skipping \`"$1"'";
- elif [ -f $newname ] && [ -z "$overwrite" ];
- then
- stderr "can't move \`"$1"' to existing file";
- elif `$command "$1" $newname`;
- then
- echo "moved \``basename "$1"`' to \`$newname'";
- else
- stderr "mkdir can be used to create directory";
- exit 1;
- fi
- fi
-}
-
-if [ $# = 0 ]; then usage; exit 0; fi
-for arg
-do
- if [ -n "$subdirset" ];
- then
- subdirset=0;
- subdir=1;
- if [ -d $arg ];
- then
- destinationdir=$arg;
- continue
- fi
- fi
- case "$arg" in
- --version|-v) show_version; exit 0;;
- --help|-[h?]) usage; exit 0;;
- --licen[cs]e|-l) license; exit 0;;
- --create-dir|-c) createdir=1;;
- --subdir|-s) subdirset=1;;
- --overwrite|-o) overwrite=1 ;;
- --symlink|-k) symlink=1 ;;
- --no-architecture|-a) noarchitecture=1 ;;
- --) shift;
- for arg
- do
- move "$arg";
- done; exit 0;;
- *) move "$arg";;
- esac
-done
-exit 0;
-
-# Local variables:
-# tab-width: 2
-# End:
diff --git a/scripts/po/POTFILES.in b/scripts/po/POTFILES.in
index 4be1a14..ff904ef 100644
--- a/scripts/po/POTFILES.in
+++ b/scripts/po/POTFILES.in
@@ -7,6 +7,7 @@ scripts/dpkg-distaddfile.pl
scripts/dpkg-genchanges.pl
scripts/dpkg-gencontrol.pl
scripts/dpkg-gensymbols.pl
+scripts/dpkg-name.pl
scripts/dpkg-parsechangelog.pl
scripts/dpkg-scanpackages.pl
scripts/dpkg-scansources.pl
--
dpkg's main repository
--
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]