#!/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=
REPOBRANCH=

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 (to find by default)
  --branch p9                    original repository branch name (optional, default is sisyphus)
  --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 b:h -l addon-component-name:,arch:,branch:,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";
			;;
		--branch|-b) shift; REPOBRANCH="$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 [ -z "$REPODIR" ]; then
    REPODIR=`altlinux-find-local-mirror ${REPOBRANCH:+-b $REPOBRANCH}`
    if [ -z "$REPODIR" ]; then
	echo "ERROR: can't find local repository. Use --repodir /path"
	exit 1
    fi
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
    # TODO: use files/list for quick check if names/srpm-names are used in arch
    # we need list-based utils for it, also quick analogs of
    #repofork-helper-rm-rpm-by-name && repofork-helper-rm-rpm-by-srpm-name
    #for ADDONDIR in "$@"; do
    #if [ -d "$ADDONDIR/$ARCH" ]; then
    #is_arch_used_in_addons=yes
    #fi
    #done
    #if [ -z "$is_arch_used_in_addons" ]; then
    #echo $ARCH not used in addons: can be skipped
    #fi
    #TODO: if not arch_used_in_addons and not names/srpm-names used in arch
    # skip fork/genrepo and just use different apt.conf w/o this arch:
    #apt.conf.orig.noarch apt.conf.orig.x86_64, ...
    echo processing $ARCH
    for ADDONDIR in "$@"; do
	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
