blob: aef0aafa0bfe3853ca316b36a7ac25239c856f20 (
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
|
#!/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-xml charcreation.xml ea-skills.xml effects.xml emotes.xml hair.xml paths.xml settings.xml skills.xml status-effects.xml units.xml
$1 emotes graphics/emotes/
$1 images graphics/images/
$1 items graphics/items/
$1 minimaps graphics/minimaps/
$1 particles graphics/particles/
$1 skills graphics/skills/
$1 sprites graphics/sprites/
$1 tiles graphics/tiles/
$1 item-xml items.xml
$1 map-xml maps.xml
$1 maps maps/
$1 mob-xml monsters.xml
$1 npc-xml npcs.xml
$1 sfx sfx/
$1 tsx 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
}
# TODO actually use this
function add_music()
{
adler32 $1 | {
read name hash
chmod a+r $name
sed '/<\/updates>/i <update type="music" required="no" file="'$name'" hash="'$hash'" />' -i resources.xml
}
}
function do_initial_zip()
{
zip=$1-$this_update.zip; shift
git ls-files --with-tree=HEAD -- "$@" \
| zip -q $output/$zip -@
add_resource $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_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
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
}
if test "$0" = "$BASH_SOURCE"
then
echo 'Generating updates automatically'
main
elif test "$0" = 'bash'
then
echo 'sourcing detected - you can do manual updates'
else
echo 'How did you get here?'
exit 3
fi
|