Index: debian/control
===================================================================
--- debian/control	(revisione 1780)
+++ debian/control	(copia locale)
@@ -69,6 +69,7 @@
     the rest of the package to be present; can sign the pair remotely
     or fetch the pair from a remote machine for signing [gnupg,
     debian-keyring, ssh-client]
+  - debsnap: grab packages from http://snapshot.debian.net [wget]
   - debuild: wrapper to build a package without having to su or worry
     about how to invoke dpkg to build using fakeroot.  Also deals
     with common environment problems, umask etc. [fakeroot,
Index: debian/postinst
===================================================================
--- debian/postinst	(revisione 1780)
+++ debian/postinst	(copia locale)
@@ -616,6 +616,32 @@
 
 EOF
 	fi
+
+	if dpkg --compare-versions "$2" lt 2.10.45
+	then
+		cat >> /etc/devscripts.conf << EOF
+##### debsnap
+#
+# Where to put the directory named <prefix>-<package>/
+# default: source-$package_name if unset
+# DEBSNAP_DESTDIR=
+#
+# Verbosely show messages (yes/no)
+# default: no
+# DEBSNAP_VERBOSE=no
+#
+# The base URL of the archive to download from
+# DEBSNAP_BASE_URL=http://snapshot.debian.net/archive
+#
+# A sed regexp to transform pool/<component>/f/foo into the desired layout
+# default: make the directory from pool/<component>/f/foo to pool/f/foo
+# DEBSNAP_CLEAN_REGEX="s@\([^/]*\)/[^/]*/\(.*\)@\1/\2@"
+#
+# Where the Sources.gz lives, subdirectory of DEBSNAP_BASE_URL/<clean dir>/
+# default: DEBSNAP_BASE_URL/<clean dir>/source/Sources.gz
+# DEBSNAP_SOURCES_GZ_PATH=source/Sources.gz
+
+EOF
     fi
 fi
 
Index: debian/changelog
===================================================================
--- debian/changelog	(revisione 1780)
+++ debian/changelog	(copia locale)
@@ -1,7 +1,13 @@
 devscripts (2.10.45) UNRELEASED; urgency=low
 
+  [ Adam D. Barratt ]
   * NOT RELEASED YET
 
+  [ David Paleino ]
+  * debsnap:
+    + new script from Ron Lee and David Paleino, grabs source packages from
+      snapshot.debian.net, all by default, optionally a single version.
+
  -- Adam D. Barratt <adam@adam-barratt.org.uk>  Mon, 05 Jan 2009 19:23:14 +0000
 
 devscripts (2.10.44) unstable; urgency=low
Index: scripts/debsnap.sh
===================================================================
--- scripts/debsnap.sh	(revisione 0)
+++ scripts/debsnap.sh	(revisione 0)
@@ -0,0 +1,324 @@
+#!/bin/bash
+
+# Copyright © 2009, David Paleino <d.paleino@gmail.com>,
+#                   Ron <ron@debian.org>
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+# Thanks to Ron Lee and Patrick Schoenfeld for helping during
+# the development process! :)
+
+#set -x
+set -e
+
+##
+# Rationale for variables naming:
+# DEBSNAP_FOO : means it directly comes from the config file, which can be edited by the user
+# foo         : means we assigned it, also combining data coming from the user
+##
+
+OPTS=$(getopt -ao d:fvh --long destdir:,force,verbose,version,help -n $0 -- "$@")
+if [ $? -ne 0 ]; then
+	echo "Terminating." >&2
+	exit 1
+fi
+eval set -- "$OPTS"
+
+PROGNAME="$(basename $0)"
+
+version() {
+	echo \
+"This is $PROGNAME, from the Debian devscripts package, version ###VERSION###
+This code is copyright 2009 by David Paleino <d.paleino@gmail.com> and
+Ron <ron@debian.org> -- all rights reserved.
+This program comes with ABSOLUTELY NO WARRANTY.
+You are free to redistribute this code under the terms of the GNU
+General Public License v3 or, at your option, any later version."
+	exit 0
+}
+
+usage() {
+	cat 1>&2 <<EOF
+$PROGNAME [options] <package name> [package version]
+
+  Automatically downloads packages from snapshot.debian.net
+
+  The following options are supported:
+  -h, --help                          Shows this help message
+  --version                           Shows information about version
+  -v, --verbose                       Be verbose
+  -d <destination directory>,
+  --destdir <destination directory>   Directory for retrieved packages
+                                      Default is ./source-<package name>
+  -f, --force                         Force overwriting an existing
+                                      destdir
+
+EOF
+	exit 0
+}
+
+debug() {
+	if [ "$DEBSNAP_VERBOSE" = "yes" ]; then
+		echo "$@"
+	fi
+}
+
+start_download() {
+	quiet="$1"
+	destdir="$2"
+	package="$3"
+	version="$4"
+	directory="$5"
+	suffix="$6"
+
+	dsc="$DEBSNAP_BASE_URL/$directory/${package}_$version.dsc"
+	diff="$DEBSNAP_BASE_URL/$directory/${package}_$version.diff.gz"
+	orig="$DEBSNAP_BASE_URL/$directory/${package}_$upversion.$suffix"
+
+	printf "Downloading %s... " $version
+	[ -n "$quiet" ] || echo
+
+	# I don't really like dget's output with missing files :)
+#	( cd sources / ; \
+#	dget -d --quiet $base_url/$directory/${package}_$version.dsc )
+
+	# the "continue" annidated here mean "go to the next stanza of Sources.gz"
+	if ! wget $quiet -P "$destdir" -nH -nc "$dsc"; then
+		echo "missing .dsc."
+		debug "Url: $dsc"
+		return 1
+	else
+		if ! wget $quiet -P "$destdir" -nH -nc "$orig"; then
+			echo "missing .$suffix."
+			debug "Url: $orig"
+			return 1
+		else
+			if [ "$suffix" = "orig.tar.gz" ]; then
+				if ! wget $quiet -P "$destdir" -nH -nc "$diff"; then
+					echo "missing .diff.gz."
+					debug "Url: $diff"
+					return 1
+				else
+					echo "done."
+				fi
+			else
+				echo "done."
+			fi
+		fi
+	fi
+}
+
+# these are our defaults
+DEFAULT_DEBSNAP_VERBOSE=no
+DEFAULT_DEBSNAP_DESTDIR=
+DEFAULT_DEBSNAP_BASE_URL=http://snapshot.debian.net/archive
+DEFAULT_DEBSNAP_CLEAN_REGEX="s@\([^/]*\)/[^/]*/\(.*\)@\1/\2@"
+DEFAULT_DEBSNAP_SOURCES_GZ_PATH=source/Sources.gz
+VARS="DEBSNAP_VERBOSE DEBSNAP_DESTDIR DEBSNAP_BASE_URL DEBSNAP_CLEAN_REGEX DEBSNAP_SOURCES_GZ_PATH"
+
+# read configuration from devscripts
+eval $(
+	set +e
+	for var in $VARS; do
+		eval "$var=\$DEFAULT_$var"
+	done
+	[ -r "/etc/devscripts.conf" ] && . /etc/devscripts.conf
+	[ -r "~/.devscripts" ] && . ~/.devscripts
+	set | egrep "^(DEBSNAP|DEVSCRIPTS)_"
+)
+
+# sanitize variables
+case "$DEBSNAP_VERBOSE" in
+	yes|no) ;;
+	*) DEBSNAP_VERBOSE=no ;;
+esac
+
+while true; do
+	case "$1" in
+		-v|--verbose)
+			DEBSNAP_VERBOSE=yes
+			shift
+			;;
+		-d|--destdir)
+			DEBSNAP_DESTDIR="$2"
+			shift 2
+			;;
+		-f|--force)
+			force_overwrite=yes
+			shift
+			;;
+		--version)
+			version
+			shift
+			;;
+		-h|--help)
+			usage
+			shift
+			;;
+		--)
+			shift
+			break
+			;;
+		*)
+			echo "Internal error in option parsing." >&2
+			;;
+	esac
+done
+
+package="$1"
+_version="${2//*:/}"    # remove the Epoch
+
+if [ -z "$package" ]; then
+	usage
+fi
+
+if [ "$DEBSNAP_VERBOSE" = "yes" ]; then
+	echo "Using these values:"
+	for var in $VARS; do
+		eval "echo $var=\$$var"
+	done
+	echo "Requested package: $package"
+	if [ -z "$_version" ]; then
+		echo "Requested version: all"
+	else
+		echo "Requested version: $_version"
+	fi
+else
+	quiet="--quiet"
+fi
+
+source_pkg=$(apt-cache showsrc $package | grep -m1 ^Package | cut -f2 -d\ )
+cache_dir=$(apt-cache showsrc $package | grep -m1 ^Directory | cut -f2 -d\ )
+
+# make it pool/f/foo from pool/<section>/f/foo
+clean_dir=$(echo "$cache_dir" | sed -e "$DEBSNAP_CLEAN_REGEX")
+
+[ -n "$DEBSNAP_DESTDIR" ] || DEBSNAP_DESTDIR="source-$source_pkg"
+if [ "$DEBSNAP_DESTDIR" != "." ]; then
+	if [ -d "$DEBSNAP_DESTDIR" ]; then
+		if [ -z "$force_overwrite" ]; then
+			echo "Destination dir $DEBSNAP_DESTDIR already exists."
+			echo "Please (re)move it first, or use --force to overwrite."
+			exit 1
+		fi
+		echo "Removing exiting destination dir $DEBSNAP_DESTDIR as requested."
+		rm -rf "$DEBSNAP_DESTDIR"
+	fi
+	mkdir -p "$DEBSNAP_DESTDIR"
+fi
+
+
+# download the Sources.gz
+tmpdir=$(mktemp -d /tmp/$PROGNAME.XXXX)
+trap "rm -rf \"$tmpdir\"; exit 1" 0 SIGHUP SIGINT SIGTERM
+sources_url="$DEBSNAP_BASE_URL/$clean_dir/$DEBSNAP_SOURCES_GZ_PATH"
+sources_path="$tmpdir/Sources.gz"
+
+echo -n "Downloading Sources.gz... "
+[ -n "$quiet" ] || echo
+
+if ! wget $quiet "$sources_url" -O "$sources_path"; then
+	echo "failed."
+	debug "Url: $sources_url"
+	exit 1
+else
+	echo "done."
+fi
+
+while read field value
+do
+	case $field in
+		Package:)
+			if [ "$value" != "$source_pkg" ]; then
+				echo "Source package names not matching! Exiting."
+				exit 1
+			fi
+			have_package=yes
+			;;
+		Version:)
+			if [ -n "$version" ]; then
+				echo "Version already set. Exiting."
+				exit 1
+			else
+				# remove the Epoch
+				version=${value//*:/}
+				# remove everything after a -
+				upversion=${version%-*}
+				if [ "$upversion" = "$version" ]; then
+					# this is a native package, so the original tarball has 
+					# just "tar.gz" as suffix.
+					suffix="tar.gz"
+				else
+					# this is not a native package, use "orig.tar.gz"
+					suffix="orig.tar.gz"
+				fi
+			fi
+			;;
+		Directory:)
+			if [ -n "$directory" ]; then
+				echo "Directory already set. Exiting."
+				exit 1
+			else
+				directory=$value
+			fi
+			;;
+		"")
+			# the blank line always comes last (unless it comes first)
+			# bail out with errors if directory and version are not set,
+			# (but only if we have seen a Package line already).
+			if [ -z "$have_package" ]; then
+				echo "No Package name before empty Sources.gz line. Skipping stanza."
+			elif [ -z "$version" ] || [ -z "$directory" ]; then
+				echo "Couldn't parse version/directory. Skipping stanza."
+				debug "Version: $version"
+				debug "Directory: $directory"
+#				exit 1
+			else
+				# if the user requested a specific version,
+				# skip the download step until we find it,
+				# then break from the loop and let the outer
+				# call deal with this case for us.
+				if [ -z "$_version" ]; then
+					if ! start_download "$quiet" "$DEBSNAP_DESTDIR" \
+					                    "$package" "$version"      \
+					                    "$directory" "$suffix"; then
+						# Keep trying if some files were missing,
+						# but report that to the caller at exit.
+						missing_package=yes
+					fi
+				elif [ "$_version" = "$version" ]; then
+					break
+				fi
+			fi
+			have_package=
+			version=
+			directory=
+			;;
+	esac
+done < <(zcat "$sources_path")
+
+# We need this if there isn't an empty line following the last (or only) stanza
+# and we also perform the download here if just a single version was requested.
+if [ -n "$version" ] && [ -n "$directory" ]; then
+	if ! start_download "$quiet" "$DEBSNAP_DESTDIR" "$package" \
+	                    "$version" "$directory" "$suffix"; then
+		missing_package=yes
+	fi
+fi
+
+# Disable the trap on exit so we can take back control of the exit code
+trap - 0
+rm -rf "$tmpdir"
+
+[ -z "$missing_package" ] || exit 2

Proprietà modificate su: scripts/debsnap.sh
___________________________________________________________________
Added: svn:executable
   + *
Added: svn:eol-style
   + native

Index: scripts/debsnap.1
===================================================================
--- scripts/debsnap.1	(revisione 0)
+++ scripts/debsnap.1	(revisione 0)
@@ -0,0 +1,144 @@
+.\" for manpage-specific macros, see man(7)
+.TH DEBSNAP 1 "January 8, 2009" "Debian devscripts" "DebSnap User Manual"
+.SH NAME
+debsnap \- retrieve old snapshots of Debian packages
+
+.SH SYNOPSIS
+.B debsnap
+.RI [ options ] " package " [ version ]
+
+.B debsnap
+.RB [ -h " | " \-\-help ] " " [ \-\-version ]
+
+
+.SH DESCRIPTION
+\fBdebsnap\fP is a tool to help with retrieving snapshots of old packages from
+a daily archive repository.
+
+The only publicly available snapshot archive is currently located at
+\fIhttp://snapshot.debian.net\fP
+
+By default, debsnap will download all the available versions for \fIpackage\fP
+that are found in the snapshot archive.  If a \fIversion\fP is specified, only
+that particular version will be downloaded, if available.
+
+
+.SH OPTIONS
+The following options are available:
+
+.TP
+.BI -d " destination\fR,\fP " \-\-destdir " destination"
+Directory to place retrieved packages.
+
+.TP
+.BR \-f ", " \-\-force
+Force overwriting an existing \fIdestination\fP.  By default \fBdebsnap\fP will
+insist the destination directory does not exist yet unless it is explicitly
+specified to be '.' (the current working directory).  This is to avoid files
+being accidentally overwritten by what is fetched from the archive and to
+provide a guarantee for other scripts that only the files fetched will be
+present there upon completion.  Note that this option will remove the
+\fIdestination\fP directory and all of its contents prior to beginning the
+download.
+
+.TP
+.BR \-v ", " \-\-verbose
+Report on the \fBdebsnap\fP configuration being used and progress during the
+download operation.  Please always use this option when reporting bugs.
+
+.TP
+.BR \-h ", " \-\-help
+Show a summary of these options.
+
+.TP
+.B \-\-version
+Show the version of \fBdebsnap\fP.
+
+
+.SH CONFIGURATION OPTIONS
+\fBdebsnap\fP may also be configured through the use of the following options
+in the devscripts configuration files:
+
+.TP
+.B DEBSNAP_VERBOSE
+Same as the command line option \fB\-\-verbose\fP.  Set to "yes" to enable.
+
+.TP
+.B DEBSNAP_DESTDIR
+Set a default path for the destination directory.  If unset
+\fI./source\-<package_name>\fP will be used.  The command line option
+\fB\-\-destdir\fP will override this.
+
+.TP
+.B DEBSNAP_BASE_URL
+The base url for the snapshots archive.  This is the root of a directory tree
+such as \fIpool/<initial>/<package>/\fP under which a \fISources.gz\fP may be
+found, and the root for the location of the packages specified in the
+\fISources.gz\fP file found there.
+
+If unset this defaults to \fIhttp://snapshot.debian.net/archive/\fP
+
+.TP
+.B DEBSNAP_CLEAN_REGEX
+A sed regular expression to transform the directory returned by
+`\fBapt\-cache showsrc\fP \fIpackage\fP \fB| grep ^Directory\fP` to a suitable
+path to be put between \fBDEBSNAP_BASE_URL\fP and \fBDEBSNAP_SOURCES_GZ_PATH\fP.
+
+If unset it will default to s@\e([^/]*\e)/[^/]*/\e(\&.*\e)@\e1/\e2@
+.br
+i.e. it transforms \fIpool/<component>/<initial>/<package>\fP into
+\fIpool/<initial>/<package>\fP
+
+.TP
+.B DEBSNAP_SOURCES_GZ_PATH
+The final path to the \fISources.gz\fP file.  This is appended after the
+\fBDEBSNAP_BASE_URL\fP and the path modified by \fBDEBSNAP_CLEAN_REGEX\fP to
+locate the \fISources.gz\fP file for the package to download.
+
+If unset it will default to \fIsource/Sources.gz\fP
+
+
+.SH EXIT STATUS
+\fBdebsnap\fP will return an exit status of 0 if all operations succeeded,
+1 if a fatal error occurred, and 2 if some packages failed to be downloaded
+but operations otherwise succeeded as expected.  In some cases packages may
+fail to be downloaded because they are no longer available on the snapshot
+mirror, so any caller should expect this may occur in normal use.
+
+
+.SH FILES
+.TP
+.I /etc/devscripts.conf
+Global devscripts configuration options.  Will override hardcoded defaults.
+.TP
+.I ~/.devscripts
+Per\-user configuration options.  Will override any global configuration.
+
+
+.SH SEE ALSO
+.BR devscripts (1),
+.BR devscripts.conf (5),
+.BR git-debimport (1)
+
+
+.SH AUTHORS
+David Paleino <d.paleino@gmail.com>
+.br
+Ron Lee <ron@debian.org>
+
+.SH COPYRIGHT
+Copyright \(co 2009 David Paleino, Ron Lee
+
+Permission is granted to copy, distribute and/or modify this document under
+the terms of the GNU General Public License, Version 3 or (at your option)
+any later version published by the Free Software Foundation.
+
+On Debian systems, the complete text of the GNU General Public License can
+be found in \fI/usr/share/common\-licenses/GPL\fP.
+
+
+.SH BUGS
+.SS Reporting bugs
+The program is part of the devscripts package.  Please report bugs using
+`\fBreportbug devscripts\fP`
+
Index: README
===================================================================
--- README	(revisione 1780)
+++ README	(copia locale)
@@ -119,6 +119,8 @@
   .changes and .dsc files from a remote machine. [gnupg, debian-keyring, 
   ssh-client]
 
+- debsnap: Grabs packages from http://snapshot.debian.net [wget]
+
 - debuild: A wrapper for building a package (i.e., dpkg-buildpackage) to
   avoid problems with insufficient permissions and wrong paths etc.
   Debuild will set up the proper environment for building a package.
Index: conf.default.in
===================================================================
--- conf.default.in	(revisione 1780)
+++ conf.default.in	(copia locale)
@@ -293,6 +293,27 @@
 # GPG keyid to use (-k option)
 # DEBSIGN_KEYID=
 
+##### debsnap
+#
+# Where to put the directory named <prefix>-<package>/
+# default: source-$package_name if unset
+# DEBSNAP_DESTDIR=
+#
+# Verbosely show messages (yes/no)
+# default: no
+# DEBSNAP_VERBOSE=no
+#
+# The base URL of the archive to download from
+# DEBSNAP_BASE_URL=http://snapshot.debian.net/archive
+#
+# A sed regexp to transform pool/<component>/f/foo into the desired layout
+# default: make the directory from pool/<component>/f/foo to pool/f/foo
+# DEBSNAP_CLEAN_REGEX="s@\([^/]*\)/[^/]*/\(.*\)@\1/\2@"
+#
+# Where the Sources.gz lives, subdirectory of DEBSNAP_BASE_URL/<clean dir>/
+# default: DEBSNAP_BASE_URL/<clean dir>/source/Sources.gz
+# DEBSNAP_SOURCES_GZ_PATH=source/Sources.gz
+
 ##### debuild
 # 
 # Do we preserve the whole environment except for PATH?
