#!/bin/sh

# see the repack.stub for how to use

# Copyright 2009, Ryan Niebur <ryan@debian.org>
# Copyright 2009-2023, gregor herrmann <gregoa@debian.org>
# License: Artistic or GPL-1+

# TODO: provide example watch files and repack.locals
# TODO: test suite. problems fixed that need to be tested:
# * globbing
# * whitespace and then comments in the MANIFEST
# TODO: does / in weird places work? test suite too.
# TODO: I actually broke stuff with the MANIFEST change not thinking..
# TODO: allow for a sepearate (and multiple) MANIFEST files, then
# de-uglify libsyntax-highlight-engine-kate-perl.
# TODO: have each mv and rm check that something actually changed, and
# if not, die

set -e
set -u

. "${DPT__SCRIPTS:-/usr/share/pkg-perl-tools}/lib/dpt-lib.sh"

usage() {
    echo "Usage: dpt repack.sh --upstream-version <version> <downloaded-file>"
    exit 1
}

if [ "$#" != "3" ]; then
    usage
fi
if [ "$1" != "--upstream-version" ]; then
    usage
fi
if [ ! -f "$3" ]; then
    if [ -n "$3" ]; then
        echo "$3 doesn't exist"
    fi
    usage
fi
VER="$2"
FILE="$3"

SUFFIX="+dfsg"

echo
echo "Repackaging $FILE"
echo

DIR=`mktemp -d ./tmpRepackXXXXXX`
DIR=$(readlink -f "$DIR")
trap "/bin/rm -rf \"$DIR\"" QUIT INT EXIT

# Create an extra directory to cope with rootless tarballs
UP_BASE="$DIR/unpack"
mkdir "$UP_BASE"
tar xf "$FILE" -C "$UP_BASE" || unzip "$FILE" -d "$UP_BASE"

if [ `ls -1 "$UP_BASE" | wc -l` -eq 1 ]; then
	# Tarball does contain a root directory
	UP_BASE="$UP_BASE/`ls -1 "$UP_BASE"`"
fi

RM_OPTS="-vrf"

real_rm(){
    /bin/rm "$@"
}

real_mv(){
    /bin/mv "$@"
}

rm(){
    set +f
    MYOLDPWD=$(pwd)
    cd "$UP_BASE"
    if [ "$MANIFEST" = "1" ]; then
        PERM=$(stat --format=%a "MANIFEST")
        chmod u+w "MANIFEST"
    fi
    for i in $@; do
        if [ "$MANIFEST" = "1" ]; then
            PATTERN="^$i"
            if [ -d "$i" ]; then
                if ! { echo "$PATTERN" | grep -q "/$" ; }; then
                    PATTERN="${PATTERN}/"
                fi
            else
                PATTERN="${PATTERN}\s?"
            fi
            grep -Ev "$PATTERN" "MANIFEST" > "$DIR/MANIFEST"
            real_mv "$DIR/MANIFEST" "MANIFEST"
        fi
        real_rm "$RM_OPTS" "$i"
    done
    if [ "$MANIFEST" = "1" ]; then
        chmod $PERM "MANIFEST"
    fi
    cd $MYOLDPWD
    set -f
}

mv(){
    set +f
    OLD=$(pwd)
    cd $UP_BASE
    real_mv "$@"
    cd $OLD
    if [ "$MANIFEST" = "1" ]; then
        echo "MANIFEST cannot be manipulated with mv yet, patches welcome"
        exit 1
    fi
    set -f
}

# bump with incompatible changes
REPACK_VERSION=4

requires_version(){
    if [ $REPACK_VERSION -lt $1 ]; then
        echo "dpt repack.sh is not up to date enough for this package. you need at least version $1, while this script is only version $REPACK_VERSION"
        exit 1
    fi
}

MANIFEST=0
## Remove stuff
set -f
MYORIGPWD=$(pwd)
cd "$UP_BASE"
. "$MYORIGPWD/debian/repack.local"
cd $MYORIGPWD
set +f
## End

REPACK_DIR="$PKG-${VER}${SUFFIX}.orig" # DevRef § 6.7.8.2
DFSG_TAR="$(dirname $FILE)/${PKG}_${VER}${SUFFIX}.orig.tar"

real_mv "$UP_BASE" "$DIR/$REPACK_DIR"

# .gz or .bz2?
FILETYPE=$(file --brief --mime-type --dereference "$FILE")
case "$FILETYPE" in
    application/x-gzip|application/gzip|application/zip)
        C_PROGRAM="gzip"
        C_SUFFIX="gz"
        ;;
    application/x-bzip2|application/bzip2)
        C_PROGRAM="bzip2"
        C_SUFFIX="bz2"
        ;;
    application/x-xz|application/xz)
        C_PROGRAM="xz"
        C_SUFFIX="xz"
        ;;
    *)
        echo "E: Unknown filetye $FILETYPE"
        exit 1
        ;;
esac
    
# Using a pipe hides tar errors!
tar cfC "$DIR/repacked.tar" "$DIR" "$REPACK_DIR"
$C_PROGRAM -9 < "$DIR/repacked.tar" > "$DIR/repacked.tar.$C_SUFFIX"

real_mv "$DIR/repacked.tar.$C_SUFFIX" "$DFSG_TAR.$C_SUFFIX"

echo "*** $DFSG_TAR.$C_SUFFIX ready"

exit 0
POD=<<EOF
=head1 NAME

dpt-repack.sh - repackaging helper (deprecated)

=head1 SYNOPSIS

B<dpt repack.sh> --upstream-version I<version> F<downloaded-file>

=head1 DESCRIPTION

B<dpt repack.sh> helps creating repackaged tarballs, suitable for feeding
into L<dpkg-source(1)>.  This command is deprecated in favor of the
functionality provided by L<uscan(1)> in conjunction with the
B<Files-Excluded> stanza in F<debian/copyright>.

Work is commenced in three stages:

=over

=item

B<dpt repack.sh> unpacks the provided upstream tarball.

=item

F<debian/repack.local> is sourced to remove unsuitable content.

=item

B<dpt repack.sh> packs the sources again, under a suitable file name in the
form C<package_ver.orig.tar.gz> (suffix depending on initial compression).

=back

B<dpt repack.sh> invokes F<debian/repack.local> in an environment where B<rm> and
B<mv> are replaced with functions that reflect the operations in the
F<MANIFEST> file, if present.

=head1 SEE ALSO

L<uscan(1)>, L<mk-origtargz(1)>

=head1 COPYRIGHT & LICENSE

Copyright 2009, Ryan Niebur L<ryan@debian.org>

Copyright 2009-2023, gregor herrmann L<gregoa@debian.org>

This program is free software and can be distributed under the same terms as
Perl.

=cut
EOF
