#!/bin/sh
set -ex
find -mindepth 1 -maxdepth 1 ! -name xnee-mirror ! -name cvs2git -print0 | xargs -0 rm -rf

(echo cvs ; sleep 1 ; echo git ) | repotool initialize xnee

sed -i '/REMOTE_URL.*svn/s/^/#/' Makefile
sed -i '/CVS_HOST.*savannah/s/^ *# *//' Makefile
sed -i '/REMOTE_URL.*cvs/s/^ *# *//' Makefile

make xnee-mirror

# Create the authors file
find xnee-mirror -name '*,v' -print0 |
xargs -0 --max-args 1 \
rlog |
sed -nr 's/^date:.* author: ([^;]+).*/\1/p' |
sort -u |
while read -r uname ; do
	if [ "$uname" = hesa ] ; then
		echo "hesa = Henrik Sandklef <hesa@sandklef.com>"
	elif [ "$uname" = joda ] ; then
		echo "joda = Jon-Erling Dahl <joda@gadgeteer.nu>"
	else
		fname="$(curl -s "https://savannah.gnu.org/users/$uname" | grep -A1 'Real Name:' | tail -n1 | html2text)"
		if [ "$fname" != "" ] ; then
			echo "$uname = $fname <https://savannah.gnu.org/users/$uname>"
		else
			echo "$uname = $uname"
		fi
	fi
done \
>> xnee.map
echo cvs-fast-export = cvs-fast-export >> xnee.map

make xnee-git

cd xnee-git

# Add missing tags here
#git tag --no-sign --annotate --message 'version 0.1.2' ...

# Rename some tags to better names
# This is the best way to rename tags
rename 's{XNEE_}{xnee-}' .git/refs/tags/*
rename 's{RELEASE_}{xnee-}' .git/refs/tags/*
rename 's{REL_}{xnee-}' .git/refs/tags/*
rename 's{_PRE}{-pre}' .git/refs/tags/*
rename 's{_PARSER}{-parser}' .git/refs/tags/*
rename 'y/A-Z/a-z/' .git/refs/tags/*
rename 's{_}{.}g' .git/refs/tags/*

# Rename some branches similarly
for branch in $(git branch | tr -d '*') ; do
	git branch --move $branch $(echo $branch | sed 's/XNEE_/xnee-/i;s/_/./g')
done

# Turn CVS tags that got made into branches back into tags
for tag in $(git branch | grep xnee-[0-9]) ; do
	git tag --no-sign "$tag" "$tag"
	git branch --delete --force "$tag"
done

# Clean up extraneous tags and branch(es)
git tag --delete savannah.32385 xnee
#git branch --delete ...

# Change the commits with bogus commit messages to empty
git filter-repo --force --message-callback '
empty = b"*** empty log message ***\n"
fake = b"Synthetic commit for incomplete tag "
if message == empty:
	return b""
elif message.startswith(fake):
	l = len(fake)
	tag = message[l:]
	message = message[:l]
	tag = tag.replace(b"XNEE_", b"xnee-")
	tag = tag.replace(b"RELEASE_", b"xnee-")
	tag = tag.replace(b"REL_", b"xnee-")
	tag = tag.replace(b"_PRE", b"-pre")
	tag = tag.replace(b"_PARSER", b"-parser")
	tag = tag.lower()
	tag = tag.replace(b"_", b".")
	return message + tag
else:
	return message'

# Clean up after git filter-repo
git for-each-ref --format="%(refname)" refs/replace/ |
xargs --max-args 1 \
git update-ref -d
git reflog expire --expire=now --all
git gc --prune=now
