blob: 1579221bdbacc3e034e9423e8ce3b60954363e26 (
plain) (
blame)
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
|
#!/bin/bash -e
# This is a tool to automatically generate and ship client updates.
# It is entirely self-contained, storing its own state in the git repo.
# It is called by running 'make updates' in server-data.
# It also supports manually calls for maintenance work.
# TODO: make auto-mode work with music too.
# local branch to keep update info on
# will be created on first run; updated thereafter
branch=update-zips
# must already exist
# must NOT be a relative path
output=~/www/updates
function apply_function()
{
$1 misc *.* COPYING rules/
$1 graphics-emotes graphics/emotes/
$1 graphics-images graphics/images/
$1 graphics-items graphics/items/
$1 graphics-minimaps graphics/minimaps/
$1 graphics-particles graphics/particles/
$1 graphics-skills graphics/skills/
$1 graphics-sprites graphics/sprites/
$1 graphics-tiles graphics/tiles/
$1 items items/
$1 maps maps/
$1 monsters monsters/
$1 npcs npcs/
$1 sfx sfx/
$1 tilesets tilesets/
}
function add_resource()
{
pushd $output >/dev/null
adler32 $1 | tee -a resources2.txt | {
read name hash
chmod a+r $name
sed '/<\/updates>/i <update type="data" file="'$name'" hash="'$hash'" />' -i resources.xml
}
popd >/dev/null
}
function add_music()
{
pushd $output >/dev/null
adler32 $1 | {
read name hash
chmod a+r $name
sed '/<\/updates>/i <update type="music" required="no" file="'$name'" hash="'$hash'" />' -i resources.xml
}
popd >/dev/null
}
function do_initial_zip()
{
zip=$1-$this_update.zip; shift
git ls-files --with-tree=HEAD -- "$@" \
| zip -q $output/$zip -@
add_resource $zip
}
function do_initial_music()
{
zip=music-$this_update.zip
( cd music/ ; git ls-files --with-tree=HEAD ) \
| sed 's:^:music/:' \
| zip -q $output/$zip -@
add_music $zip
}
function git_diff_tree()
{
git diff-tree -r --diff-filter=AM "$@"
}
function do_delta_zip()
{
zip=$1-$last_update..$this_update.zip; shift
if git_diff_tree --quiet $last_update $this_update -- "$@"
then
return
fi
git_diff_tree --name-only $last_update $this_update -- "$@" \
| zip -q $output/$zip -@
add_resource $zip
}
function do_delta_music()
{
zip=music-$last_update..$this_update.zip
if (cd music; git_diff_tree --quiet $last_update $this_update )
then
return
fi
(cd music; git_diff_tree --name-only $last_update $this_update ) \
| sed 's:^:music/:' \
| zip -q $output/$zip -@
add_music $zip
}
function do_initial_zips()
{
apply_function do_initial_zip
}
function do_delta_zips()
{
apply_function do_delta_zip
}
function main()
{
if ! test -d $output
then
echo 'Fatal error: output directory does not exist'
echo "$output"
return 1
fi
if ! test -f $output/resources.xml
then
(
echo '<?xml version="1.0"?>'
echo '<updates>'
echo '</updates>'
) > $output/resources.xml
fi
this_update=$(git rev-parse --short HEAD)
if ! last_update=$(git rev-parse --short $branch 2>/dev/null)
then
echo 'Doing initial updates'
do_initial_zips
elif test "$this_update" = "$last_update"
then
echo 'No commits since last update generation ...'
else
echo 'Doing incremental updates'
do_delta_zips
fi
git branch -f $branch
this_update=$(cd music; git rev-parse --short HEAD)
if ! last_update=$(cd music; git rev-parse --short $branch 2>/dev/null)
then
echo 'Doing initial music updates'
do_initial_music
elif test "$this_update" = "$last_update"
then
echo 'No commits since last music update generation ...'
else
echo 'Doing incremental music updates'
do_delta_music
fi
( cd music; git branch -f $branch )
}
if test "$0" = "$BASH_SOURCE"
then
echo 'Generating updates automatically'
main
else
echo 'sourcing detected - you can do manual updates'
fi
|