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
119
120
121
122
123
124
125
126
|
set -eu
cache_root=/var/cache/cgit
scan_path=/var/lib/git
remove_suffix=0
test -d "$cache_root" || exit 0
url=$(git config --get hooks.cgiturl || :)
scan_root=$(cd "$scan_path" 2>/dev/null && pwd -P) || scan_root=
if test -z "$url" && test -n "$scan_root"; then
git_dir=$(cd "$(git rev-parse --git-dir)" && pwd -P)
case $git_dir in
"$scan_root"/?*)
url=${git_dir#"$scan_root"/}
url=${url%/.git}
if test "$remove_suffix" = 1; then
url=${url%.git}
url=${url%/}
fi
;;
esac
fi
take() {
len=${rest%%"|"*}
case $len in
"" | *[!0-9]*)
return 1
;;
esac
rest=${rest#*"|"}
test "${#rest}" -ge "$len" || return 1
pattern=
while test "${#pattern}" -lt "$len"; do
pattern="$pattern?"
done
part=${rest%"${rest#$pattern}"}
rest=${rest#$pattern}
}
stale() {
rest=$1
take && take && take || return 0
path=$part
take || return 0
case $path in
"/$url" | "/$url/"*)
return 0
;;
"" | "/")
;;
*)
return 1
;;
esac
case "&$part&" in
*"&url=$url&"* | *"&url=$url/"* | *"&r=$url&"*)
return 0
;;
*"&url=&"* | *"&url=/&"*)
;;
*"&url="* | *"&r="*)
return 1
;;
esac
return 0
}
for slot in "$cache_root"/*; do
case $slot in
*.lock)
continue
;;
esac
test -f "$slot" || continue
case $slot in
*/rc-*)
rm -f "$slot" 2>/dev/null || :
continue
;;
esac
if test -z "$url" ||
dd if="$slot" bs=4096 count=1 2>/dev/null | tr '\0' '\n' |
{ IFS= read -r key || :; stale "$key"; }
then
rm -f "$slot" 2>/dev/null || :
fi
done
exit 0
|