summaryrefslogtreecommitdiff
path: root/bin/gitify
blob: 80f85afaf2b94445e0fe0f53304a0c624b22b337 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/usr/bin/env bash

empty() {
	[[ $(stat -c %s "$1") -eq 0 ]]
}

url2murl() {
	local x
	x=$1
	x=${x//'^'/'^5E'}
	x=${x//':'/'^3A'}
	x=${x//'%'/'^25'}
	printf '%s' "$x"
}

murl2url() {
	local x
	x=$1
	x=${x//'^25'/'%'}
	x=${x//'^3A'/':'}
	x=${x//'^5E'/'^'}
	printf '%s' "$x"
}

main() {
	set -euE -o pipefail
	shopt -s nullglob
	shopt -s globstar

	top=$PWD
	mkdir -p "$1"
	cd "$1"
	git init
	echo 'ref: refs/heads/PROGRAMS/CVTUTF' > .git/HEAD
	lastbranch=PROGRAMS/CVTUTF
	git commit --allow-empty -m 'initial commit'

	for snapshot in "$top"/dat/pools/snaps/*; do
		snapname="${snapshot##*/}"
		time="${snapname%%-*}"
		dirpart="${snapname#*-}"
		dirpart="${dirpart//_/\/}"

		branch=$dirpart
		newbranch=true
		git checkout "$lastbranch"
		git checkout -b "$branch" || newbranch=false
		git checkout "$branch"

		rm -f -- * .metadata.txt
		cp -- "$snapshot"/* .

		if [[ "$time" != *99 ]]; then
			listingdir=("$top/dat/content-dir/$time/"**"/Public/$dirpart")
			if [[ ${#listingdir[@]} != 1 ]]; then
				>&2 printf 'Cannot find wayback listing for %s' "$snapname"
				false
			fi
			if ! [[ -f readme.txt ]] && ! empty "$listingdir/readme.txt"; then
			   cp "$listingdir/readme.txt" .
			fi
			cp "$listingdir/metadata.txt" .metadata.txt
		fi

		if $newbranch || [[ -n "$(git status -s .)" ]]; then
			if [[ "$time" = *99 ]]; then
				msg="Synthesized listing: ${time} ${dirpart}"
				time="${time%99}00"
			else
				waurl="http://web.archive.org/web/$(murl2url "${listingdir##*/content-dir/}/")"
				msg="$waurl"
			fi
			gitdate="$(sed -r 's/(....)(..)(..)(..)(..)(..)/\1-\2-\3T\4:\5:\6/' <<<"$time")"
			git add .
			export GIT_AUTHOR_DATE=$gitdate
			export GIT_COMMITTER_DATE=$gitdate
			git commit --allow-empty -m "$msg"
			if [[ "$branch" != *.OLD ]]; then
				lastbranch="$branch"
			fi
		fi
	done
}

main "$@"