blob: f47f2f38c56614e7848647c7c0058960e37b460e (
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
#!/usr/bin/env bash
url2murl() {
local x
x=$1
x=${x//'^'/'^5E'}
x=${x//':'/'^3A'}
x=${x//'%'/'^25'}
printf '%s' "$x"
}
main() {
set -euE -o pipefail
shopt -s nullglob
echo '# Pass 1'
while read -r snap name date time size; do
dirpart="${name%/*}"
filepart="${name##*/}"
filedir=dat/pools/files/"${date//-/}${time//:/}-${name//\//_}"
snapdir=dat/pools/snaps/"${snap}-${dirpart//\//_}"
mkdir -p -- "$filedir" "$snapdir"
ln -sr "$filedir/$filepart" "$snapdir"
done < "$1"
echo '# Pass 1.5'
# Looking at the data, there are 3 revisions that we DON'T
# have directory listings for. So we need to synthesize
# those.
#
# I created the list of listings to synthesize by not
# synthesizing anything, then looking for files ending in
# ".1". They are created during pass 2 if we have a file with
# no matching listing.
while read -r datetime dirpart newfiles; do
# We need to figure out which files to put in the
# directory listing. We're going to do that by
# mimicking the previous listing with that dirpart.
prevsnap=''
for isnap in dat/pools/snaps/*-"${dirpart//\//_}"; do
isnap=${isnap##*/}
if [[ "${isnap%%-*}" -lt "${datetime}00" ]]; then
prevsnap=$isnap
fi
done
if [[ -z "$prevsnap" ]]; then
>& printf 'Could not find listing of %s before %s\n' "$dirpart" "$datetime"
false
fi
# Ok, now copy that snapshot
snapdir=dat/pools/snaps/"${datetime}99-${dirpart//\//_}"
cp -aT dat/pools/snaps/"$prevsnap" "$snapdir"
# And touch file files we need to change
for filepart in $newfiles; do
name="$dirpart/$filepart"
filedir=dat/pools/files/"${datetime}-${name//\//_}"
mkdir -p -- "$filedir"
rm -- "$snapdir/$filepart"
ln -sr "$filedir/$filepart" "$snapdir"
done
done < <(printf '%s\n' \
'200303310700 PROGRAMS/CVTUTF ConvertUTF.c ConvertUTF.h harness.c' \
'200307291500 ALPHA/CVTUTF-1-1 ExpectedOutput.txt readme.txt' \
'200412210100 PROGRAMS/CVTUTF.OLD CVTUTF7.C CVTUTF7.H' \
)
echo '# Pass 2'
while read -r time url; do
name="${url##*/Public/}"
dirpart="${name%/*}"
filepart="${name##*/}"
if [[ -z "$filepart" ]]; then
continue
fi
pools=(dat/pools/files/*-"${name//\//_}")
pools=("${pools[@]##*/}")
mypool=''
for pool in "${pools[@]}"; do
pooltime="${pool%%-*}"
if [[ "${pooltime}00" -le "$time" ]]; then
mypool=$pool
fi
done
if [[ -z "$mypool" ]]; then
>&2 printf 'Could not find pool for %s %s\n' "$time" "$url"
false
fi
file="dat/content-file/$time/$(url2murl $url)"
declare -i i=0
while true; do
link="dat/pools/files/$mypool/$filepart.$i"
link="${link%.0}"
a="$(readlink -f "$link")" || true
b="$(readlink -f "$file")"
if cmp -s -- "$a" "$b"; then
break
fi
if ln -sr "$b" "$link"; then
break
fi
i+=1
done
done < "$2"
echo '# Pass 3'
while read -r missing; do
if [[ -f "${missing/.OLD}/${missing##*_}" ]]; then
ln -sr "${missing/.OLD}/${missing##*_}" "$missing"
fi
done < <(find dat/pools/files/*-PROGRAMS_CVTUTF.OLD_* -type d -empty)
}
main "$@"
|