#/bin/sh

base=$(pwd);
project=klibc;
export COMMIT_AUTHOR_NAME="H. Peter Anvin"
export COMMIT_AUTHOR_EMAIL="hpa@zytor.com"
export TZ=UTC

# clean
rm -rf $base/checkout/ || exit 1
mkdir $base/checkout/ || exit 1
rm  -rf $base/patches/ || exit 1
mkdir $base/patches/ || exit 1
rm  -rf $base/git/ || exit 1
mkdir -p $base/git/$project || exit 1
cd $base/git/$project || exit 1
git-init-db || exit 1
mkdir -p .git/refs/tags/

# checkout sources
cd $base/checkout/ || exit 1
cvs co $project || exit 1
cd $base/checkout/$project || exit 1

# export patchset patches
cd $base/checkout/$project || exit 1
cvsps -x -g -p $base/patches/ || exit 1

# extract metadata into individual files
cd $base/patches/ || exit 1

# fix CVS patchset order
mv 204.patch old204.patch
mv 205.patch 204.patch
mv old204.patch 205.patch

count=$(ls -1 *.patch| wc -l)
for i in $(seq 1 $count); do
	$base/split-cvsps-patch.pl $i.patch;
done

# suppress ash-branch
rm 205.patch.tag

commit_patch() {
	. $base/patches/$1.patch.author

	cd $base/git/$project || exit 1
	patch -u --no-backup-if-mismatch -f -p1 --fuzz=0 --input=$base/patches/$1.patch || exit 1
	cat $base/patches/$1.patch.files | xargs git-update-cache --add --remove
	tree=$(git-write-tree) || exit 1

	# create initial commit
	if [ -e .git/HEAD ]; then
		commit=$(git-commit-tree $tree -p HEAD < $base/patches/$1.patch.log) || exit 1
	else
		commit=$(git-commit-tree $tree < $base/patches/$1.patch.log) || exit 1
	fi

	echo Committed: $commit[$i]
	echo $commit > .git/HEAD
}

commit_tag() {
	tag=$(cat $base/patches/$1.patch.tag) || exit 1
	rm -rf $base/git/$project/* || exit 1
	cd $base/checkout/ || exit 1
	cvs export -r$tag -d$base/git/$project $project
	cd $base/git/$project || exit 1
	rm $base/git/$project/.git/index || exit 1
	find * \( -type f -o -type l \) | xargs git-update-cache --add
	tree=$(git-write-tree) || exit 1
	commit=$(git-commit-tree $tree -p HEAD < $base/patches/$1.patch.log) || exit 1
	echo Committed: $commit[$i] $tag
	echo $commit > .git/HEAD
	echo "object $commit" > .git/refs/tags/$tag.tmp
	echo "type commit" >> .git/refs/tags/$tag.tmp
	echo "tag $tag" >> .git/refs/tags/$tag.tmp
	tagid=$(git-mktag < .git/refs/tags/$tag.tmp)
	rm .git/refs/tags/$tag.tmp
	echo $tagid > .git/refs/tags/$tag
}

# commit patches to git repository
for i in $(seq 1 $count); do \
	echo commit $i; \
	if [ $i -eq "688" ]; then
		cat $base/patches/205.patch | patch -p1 -R
	fi
	if [ -e $base/patches/$i.patch.tag ]; then
		echo patch $i is a tag; \
		commit_tag $i;
	elif [ -e $base/patches/$i.patch ]; then
		commit_patch $i;
	fi
done

