#!/bin/sh -e

#export PATH=$PATH:`dirname $0`

LN_CMD=ln

FORKDIR=~/LP
[ -d /var/ftp/pub/Linux/ALT/LP ] && FORKDIR=/var/ftp/pub/Linux/ALT/LP

REPODIR=
for dir in \
    /var/ftp/pub/Linux/ALT/Sisyphus \
    /ALT/Sisyphus \
    /var/mirror/Sisyphus \
    /mirror/Sisyphus \
; do
    [ -d $dir ] && REPODIR=$dir && break
done


origin_flavour=classic
fork_flavour=classic
addon_flavour=hasher

arches="x86_64 i586"
[ -e .repofork-config ] && . .repofork-config


curdir=`pwd`
PROG=`basename $0`

show_help()
{
	cat <<EOF
$PROG - create a modified copy of a repository

Usage: $PROG [options] addrepo1 ... addrepoN

Options:
  --arch="i586 x86_64"           binary architectures to fork
  --forkdir=/path                path where the forked repository root dir will be
  --repodir=/path                path to the original repository root dir
  --addon-component-name=<name>  addon repository component name (default is $addon_flavour)
  --fork-component-name=<name>   forked repository component name (default is $fork_flavour)
  --origin-component-name=<name> original repository component name (default is $origin_flavour)
  --hardlink                     use hard links (default)
  --symlink                      use symbolic links instead of hard links
    (warning: can result in broken symlinks when original repository is updated)
  -q, --quiet                    try to be more quiet;
  -v, --verbose                  print a message for each action;
  -h, --help                     show this text and exit.

Report bugs to http://bugs.altlinux.ru/

EOF
}

show_usage()
{
	show_help
	exit
}

parse_common_option()
{
	echo "ERROR: unsupported option $1"
	show_usage
}

TEMP=`getopt -n $PROG -o h -l addon-component-name:,arch:,forkdir:,fork-component-name:,hardlink,help,origin-component-name:,repodir:,symlink -- "$@"` ||
	show_usage
eval set -- "$TEMP"

while :; do
	case "$1" in
		--arch) shift; arches="$1";
			;;
		--repodir) shift; REPODIR="$1";
			;;
		--forkdir) shift; FORKDIR="$1";
			;;
		--origin-component-name) shift; origin_flavour="$1";
			;;
		--fork-component-name) shift; fork_flavour="$1";
			;;
		--addon-component-name) shift; addon_flavour="$1";
			;;
		--hardlink) LN_CMD="ln";
			;;
		--symlink) LN_CMD="ln -s";
			;;
		--help|-h) show_help; exit;
			;;
		--) shift; break
			;;
		*) parse_common_option "$1"
			;;
	esac
	shift
done

if ! mkdir -p "$FORKDIR"; then
    echo "ERROR: can't create local fork dir $FORKDIR"
    exit 1
fi
if [ ! -w "$FORKDIR" ]; then
    echo "ERROR: can't write to local fork dir $FORKDIR"
    exit 1
fi
if [ ! -d "$REPODIR" ]; then
    echo "ERROR: can't find repository dir $REPODIR"
    exit 1
fi

[ -z "$1" ] && show_usage

for ARCH in noarch $arches; do
    echo processing $ARCH
    for ADDONDIR in "$@"; do
	! [ -d "$ADDONDIR" ] && [ -d "$FORKDIR/$1" ] && ADDONDIR="$FORKDIR/$1"
	ARCH_INDIR=$ADDONDIR/$ARCH/RPMS.$addon_flavour
	ARCH_OUTDIR=$FORKDIR/$ARCH/RPMS.$fork_flavour
	mkdir -p $ARCH_OUTDIR
	pushd $ARCH_OUTDIR >/dev/null
	ls *.rpm 2>/dev/null | xargs rm -f
	popd >/dev/null
	if [ -d $REPODIR/files/$ARCH/RPMS ]; then
	    ls $REPODIR/files/$ARCH/RPMS | awk '{print "'"$REPODIR/files/$ARCH/RPMS/"'" $1}' | xargs $LN_CMD -t $ARCH_OUTDIR/
	else
	    # beware of ls: too long list of arguments
	    ls $REPODIR/$ARCH/RPMS.$fork_flavour | awk '{print "'"$REPODIR/$ARCH/RPMS.$fork_flavour/"'" $1}' | xargs $LN_CMD -t $ARCH_OUTDIR/
	fi
	# remove rpms by name
	if stat -t $ARCH_INDIR/*.$ARCH.rpm >/dev/null 2>&1; then
	    echo 'remove rpms by name ...'
	    for i in $ARCH_INDIR/*.$ARCH.rpm; do
		repofork-helper-rm-rpm-by-name $ARCH_OUTDIR $i
	    done
	fi

	# remove rpms by srpm name
	if stat -t $ADDONDIR/SRPMS.$addon_flavour/*.src.rpm >/dev/null 2>&1; then
	    echo 'remove rpms by srpm name ...'
	    repofork-helper-rm-rpm-by-srpm-name --flavour $origin_flavour --basedir $REPODIR/$ARCH/base $ARCH_OUTDIR `rpmquery --queryformat '%{NAME}\\n' -p $ADDONDIR/SRPMS.$addon_flavour/*.src.rpm`
	fi

	# remove using force list
	if [ -e $ADDONDIR/$ARCH/remove.ls ]; then
	    echo 'remove rpms by remove.ls list ...'
	    pushd $ARCH_OUTDIR >/dev/null
	    for i in `cat $curdir/$ADDONDIR/$ARCH/remove.ls`; do
		rm -f `basename $i`
	    done
	    popd >/dev/null
	fi

	if stat -t $ARCH_INDIR/*.$ARCH.rpm >/dev/null 2>&1; then
	    ln -f $LN_OPT $ARCH_INDIR/*.$ARCH.rpm $ARCH_OUTDIR/
	fi
    done

    echo 'genbasedir ...'
    #genbasedir --bloat --create --topdir=$FORKDIR $ARCH $fork_flavour
    genbasedir --bloat --create --bz2only \
	--cachedir="$HOME"/.cache \
	--topdir=$FORKDIR $ARCH $fork_flavour
done
