Merge lp:~armagetronad-ap/armagetronad/0.2.9-armagetronad-sty+ct+ap into lp:~z-man/armagetronad/0.2.9-armagetronad-sty+ct+ap

Proposed by Armanelgtron
Status: Merged
Merged at revision: 1118
Proposed branch: lp:~armagetronad-ap/armagetronad/0.2.9-armagetronad-sty+ct+ap
Merge into: lp:~z-man/armagetronad/0.2.9-armagetronad-sty+ct+ap
Diff against target: 24818 lines (+13757/-5571)
188 files modified
.bzrignore (+5/-1)
.dockerignore (+5/-0)
.gitignore (+9/-0)
.gitlab-ci.yml (+364/-0)
AUTHORS (+1/-1)
CHANGELOG.md (+807/-0)
CHANGELOG_FROZEN.md (+792/-0)
Dockerfile (+94/-0)
Makefile.am (+6/-3)
Makefile.manual (+3/-5)
NEWS (+78/-19)
batch/checkbugle.py (+21/-19)
batch/git_ff_to_release.sh (+68/-0)
batch/git_merge_safe_sources.sh (+74/-0)
batch/ladder.py (+7/-5)
batch/make/patchnotes.py (+204/-0)
batch/make/sortresources (+3/-1)
batch/make/sortresources.py (+7/-6)
batch/make/uninstall (+1/-1)
batch/make/update_changelog (+13/-0)
batch/make/version (+25/-3)
bootstrap.sh (+1/-1)
config/settings.cfg (+2/-0)
config/settings_dedicated.cfg (+1/-1)
configure.ac (+23/-30)
desktop/armagetronad.desktop.in (+1/-2)
docker/README.md (+103/-0)
docker/build/Makefile.am (+652/-0)
docker/build/build_in_container.sh (+87/-0)
docker/build/context/appdir.sh (+15/-0)
docker/build/context/appimage.sh (+24/-0)
docker/build/context/build.sh (+14/-0)
docker/build/context/portable/AppRun (+38/-0)
docker/build/context/portable/README (+2/-0)
docker/build/context/portable/build (+89/-0)
docker/build/context/portable/fixlinks (+21/-0)
docker/build/context/steam.sh (+32/-0)
docker/build/context/testbuild.sh (+10/-0)
docker/build/context/version.sh.in (+6/-0)
docker/build/context/winbuild.sh (+14/-0)
docker/build/context/wininst.sh (+22/-0)
docker/build/context/winsource.sh (+82/-0)
docker/build/context_to_result.sh (+43/-0)
docker/build/debian_source.sh (+48/-0)
docker/build/fakerelease_proto.sh (+3/-0)
docker/build/make_ci.sh.in (+34/-0)
docker/build/make_deploy.sh (+29/-0)
docker/build/prepare_context.sh (+33/-0)
docker/build/rebrand_debian_core.sh (+24/-0)
docker/build/setup_ci_test.sh.in (+45/-0)
docker/deploy/anonymous_secrets.b64 (+104/-0)
docker/deploy/deploy_download.sh (+140/-0)
docker/deploy/deploy_lp.sh (+40/-0)
docker/deploy/deploy_ppa.sh (+33/-0)
docker/deploy/deploy_scp.sh (+32/-0)
docker/deploy/deploy_steam.sh (+62/-0)
docker/deploy/deploy_zeroinstall.sh (+62/-0)
docker/deploy/lp-project-upload (+247/-0)
docker/deploy/prepare_deploy.sh (+31/-0)
docker/deploy/steamcontentbuilder/README.txt (+1/-0)
docker/deploy/steamcontentbuilder/scripts/app_build_1306180.vdf (+16/-0)
docker/deploy/steamcontentbuilder/scripts/depot_build_1306181.vdf (+31/-0)
docker/deploy/steamcontentbuilder/scripts/depot_build_1306182.vdf (+31/-0)
docker/deploy/targets.sh.in (+233/-0)
docker/deploy/update_zeroinstall.sh (+112/-0)
docker/images/armabuild/Dockerfile.proto (+224/-0)
docker/images/armabuild_32.digest (+1/-0)
docker/images/armabuild_64.digest (+1/-0)
docker/images/armadeb_64.digest (+1/-0)
docker/images/armadeploy_64.digest (+1/-0)
docker/images/armalpine/Dockerfile.proto (+50/-0)
docker/images/armalpine_32.digest (+1/-0)
docker/images/armaroot/Dockerfile.proto (+31/-0)
docker/images/armaroot_64.digest (+1/-0)
docker/images/armasteam_64.digest (+1/-0)
docker/images/armawineblocks.digest (+1/-0)
docker/images/build_all.sh (+20/-0)
docker/images/build_armabuild.sh (+33/-0)
docker/images/build_armabuild_32.sh (+8/-0)
docker/images/build_armabuild_64.sh (+8/-0)
docker/images/build_armadeb_64.sh (+7/-0)
docker/images/build_armadeploy_64.sh (+8/-0)
docker/images/build_armalpine.sh (+21/-0)
docker/images/build_armalpine_32.sh (+8/-0)
docker/images/build_armalpine_64.sh (+11/-0)
docker/images/build_armaroot_64.sh (+18/-0)
docker/images/build_armasteam_64.sh (+10/-0)
docker/images/build_armawineblocks.sh (+37/-0)
docker/images/build_steamcmd.sh (+18/-0)
docker/images/build_steamrt_scout_amd64.sh (+44/-0)
docker/images/clean_all.sh (+20/-0)
docker/images/digest.sh (+12/-0)
docker/images/epoch.sh (+2/-0)
docker/images/rebuild_all_noninteractive.sh (+11/-0)
docker/images/steamcmd.digest (+1/-0)
docker/images/steamcmd/Dockerfile.proto (+14/-0)
docker/images/upload_all.sh (+37/-0)
docker/images/wineblocks/Dockerfile.proto (+18/-0)
docker/images/wineblocks/install.sh (+6/-0)
docker/notes.txt (+62/-0)
docker/scripts/brand.sh (+61/-0)
docker/scripts/build_image.sh (+45/-0)
docker/scripts/download.sh (+13/-0)
docker/scripts/ensure_gits.sh (+39/-0)
docker/scripts/ensure_image.sh (+65/-0)
docker/scripts/fix_gits.sh (+31/-0)
docker/scripts/relevant_branches.sh (+8/-0)
docker/scripts/setup_ci_variables_test.sh (+72/-0)
docker/scripts/tarwrapper.sh (+6/-0)
docker/scripts/test_yaml.sh (+19/-0)
docker/scripts/update_gits.sh (+82/-0)
language/deutsch.txt (+5/-0)
language/english_base.txt (+30/-24)
language/english_base_notranslate.txt (+1/-0)
language/update.py (+14/-6)
src/Makefile.am (+0/-3)
src/doc/HtmlMakefile (+8/-5)
src/doc/html.m4.in (+0/-2)
src/doc/net/sig.m4 (+0/-3)
src/engine/eCamera.cpp (+4/-2)
src/engine/eChat.cpp (+18/-18)
src/engine/eChat.h (+22/-22)
src/engine/eGrid.cpp (+4/-2)
src/engine/eNetGameObject.cpp (+6/-32)
src/engine/eNetGameObject.h (+0/-1)
src/engine/ePlayer.cpp (+141/-90)
src/engine/ePlayer.h (+10/-1)
src/engine/eSound.cpp (+5/-1)
src/engine/eTeam.cpp (+164/-162)
src/engine/eTeam.h (+6/-11)
src/engine/eVoter.cpp (+8/-23)
src/network/l3_demo.cpp (+7/-0)
src/network/nAuthentication.cpp (+180/-180)
src/network/nNetObject.cpp (+11/-12)
src/network/nNetObject.h (+36/-14)
src/network/nNetwork.cpp (+35/-11)
src/network/nNetwork.h (+21/-21)
src/network/nServerInfo.cpp (+4/-7)
src/network/nServerInfo.h (+1/-1)
src/network/nSocket.cpp (+43/-41)
src/network/nSpamProtection.cpp (+21/-23)
src/network/nSpamProtection.h (+3/-3)
src/render/rConsole.cpp (+7/-9)
src/render/rConsoleCout.cpp (+144/-143)
src/render/rConsoleGraph.cpp (+1/-1)
src/render/rFont.cpp (+1/-1)
src/render/rScreen.cpp (+12/-11)
src/render/rScreen.h (+1/-0)
src/render/rSysdep.cpp (+3/-3)
src/render/rTexture.cpp (+5/-0)
src/thirdparty/binreloc/prefix.c (+1/-1)
src/tools/tConfiguration.cpp (+1/-1)
src/tools/tDirectories.cpp (+3/-0)
src/tools/tError.cpp (+5/-0)
src/tools/tError.h (+4/-0)
src/tools/tHeap.cpp (+1/-1)
src/tools/tLinkedList.cpp (+7/-3)
src/tools/tLocale.cpp (+13/-18)
src/tools/tLocale.h (+1/-1)
src/tools/tMemManager.cpp (+35/-43)
src/tools/tMemManager.h (+5/-1)
src/tools/tSafePTR.h (+9/-6)
src/tools/tString.cpp (+740/-662)
src/tools/tString.h (+5/-0)
src/tron/gAIBase.cpp (+2/-2)
src/tron/gAIBase.h (+5/-0)
src/tron/gArmagetron.cpp (+13/-13)
src/tron/gCycle.cpp (+38/-19)
src/tron/gCycle.h (+1/-1)
src/tron/gCycleMovement.cpp (+77/-77)
src/tron/gFloor.cpp (+27/-20)
src/tron/gFriends.cpp (+11/-11)
src/tron/gFriends.h (+1/-1)
src/tron/gGame.cpp (+31/-21)
src/tron/gGame.h (+5/-4)
src/tron/gHud.cpp (+627/-627)
src/tron/gMenus.cpp (+5/-0)
src/tron/gParser.cpp (+475/-475)
src/tron/gServerBrowser.cpp (+16/-4)
src/tron/gZone.cpp (+2702/-2565)
src/ui/uInput.cpp (+2/-1)
src/ui/uMenu.cpp (+9/-6)
src/win32/config_common.h (+3/-0)
textures/font-src.svg (+99/-0)
textures/font.svg (+418/-0)
textures/font_extra-src.svg (+238/-0)
textures/font_extra.svg (+614/-0)
textures/font_s.svg (+78/-0)
To merge this branch: bzr merge lp:~armagetronad-ap/armagetronad/0.2.9-armagetronad-sty+ct+ap
Reviewer Review Type Date Requested Status
Manuel Moos Pending
Review via email: mp+385709@code.launchpad.net
To post a comment you must log in.
1108. By Armanelgtron

Have LADDERLOG_ENABLED enabled by default for servers but disabled for clients (where it's generally less useful anyway).

1109. By Armanelgtron

Check CanRespawn for zone spawn action.

1110. By Armanelgtron

Merge from 0.2.8.

1111. By Armanelgtron

Disallow scoreboard from being toggled while chatting instead of just closing it when entering chat.

1112. By Armanelgtron

Aspect ratio correction for text.

1113. By Armanelgtron

Don't include colors when shrinking center messages.

1114. By Armanelgtron

Add VERIFY_COLOR_STRICT and escape noncompliant color codes on the server so clients don't have to support it.

1115. By Armanelgtron

A couple patches, mainly color related:
Less strict color filtering for
 - names so they can't wind up visibly illegally long.
 - logs/console output
 - center message shrinking
Complete the implementation of CONSOLE_LOG_COLOR_DECORATE_TIMESTAMP

1116. By Armanelgtron

More aspect ratio correction: for text in server browser and fullscreen messages.

1117. By Armanelgtron

"Hack" to fade zones in before round begins

1118. By Armanelgtron

Converted 0.4's font to textures. Using that instead.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file '.bzrignore'
2--- .bzrignore 2019-07-26 01:01:51 +0000
3+++ .bzrignore 2020-07-03 06:03:19 +0000
4@@ -17,12 +17,14 @@
5 ChangeLog
6 EclipseBuild
7 ./INSTALL
8+./compile
9 Makefile.in
10 ./aclocal.m4
11 ./autom4te.cache
12 ./config.h.in
13 ./config.sub
14 ./configure
15+./compile
16 ./depcomp
17 ./install-sh
18 ./missing
19@@ -34,6 +36,7 @@
20 ./config.h
21 ./config.log
22 ./config.status
23+./config.guess
24 ./extrapaths
25 ./stamp-h1
26 ./universal_variable*
27@@ -64,4 +67,5 @@
28 a.out.dSYM
29 src/armagetronad_main_master
30 src/doc/COPYING.txt
31-rubbish
32\ No newline at end of file
33+rubbish
34+./version.h
35
36=== added file '.dockerignore'
37--- .dockerignore 1970-01-01 00:00:00 +0000
38+++ .dockerignore 2020-07-03 06:03:19 +0000
39@@ -0,0 +1,5 @@
40+Dockerfile
41+dockerbuild
42+.dockerignore
43+.gitlab-ci.yml
44+builds
45
46=== modified file '.gitignore'
47--- .gitignore 2019-07-26 01:01:51 +0000
48+++ .gitignore 2020-07-03 06:03:19 +0000
49@@ -3,10 +3,16 @@
50 Armagetron Advanced.app
51 desktop/os-x/Info.plist
52 .gdbinit
53+.cache
54+.lock.*
55+docker/images/context
56+docker/deploy/*.gpg
57+docker/deploy/ssh
58 batch/rcd_config
59 batch/rcd_server
60 batch/rcd_startstop
61 batch/serverstarter
62+*.digest.local
63 ./armagetronad-dedicated
64 COPYING
65 ChangeLog
66@@ -19,6 +25,7 @@
67 /config.h.in
68 /config.sub
69 /configure
70+/builds
71 /depcomp
72 /install-sh
73 /ylwrap
74@@ -31,6 +38,7 @@
75 /config.h
76 /config.log
77 /config.status
78+/config.guess
79 /extrapaths
80 /stamp-h1
81 /universal_variable*
82@@ -42,6 +50,7 @@
83 config/rc.config
84 desktop/armagetronad-armagetronad.desktop
85 language/languages.txt
86+language/*.bak
87 resource/included/
88 resource/automatic/
89 .deps
90
91=== added file '.gitlab-ci.yml'
92--- .gitlab-ci.yml 1970-01-01 00:00:00 +0000
93+++ .gitlab-ci.yml 2020-07-03 06:03:19 +0000
94@@ -0,0 +1,364 @@
95+image: registry.gitlab.com/armagetronad/armagetronad/armaroot_64@sha256:182493edea0ad5b31f8dfe0c27b414cc2a3d710a051b6f2359a21da791ca8a68
96+
97+variables:
98+ # https://docs.gitlab.com/ee/ci/docker/using_docker_build.html
99+ #DOCKER_TLS_CERTDIR: "/certs"
100+ #DOCKER_HOST: ""
101+
102+services:
103+ # required for shared runners, does not hurt for our runner (just some diagnostic complaints)
104+ - name: docker:19.03.0-dind
105+ alias: docker
106+variables:
107+ DOCKER_DRIVER: overlay2
108+ DOCKER_TLS_CERTDIR: ""
109+
110+stages:
111+ - minimal_build
112+ - build_prepare
113+ - build_base
114+ - build_main
115+ - build_collect
116+ - test
117+ - stage
118+ - deploy
119+
120+default:
121+ # common before script: bootstrap, configure, make dist, prepare docker builds
122+ before_script:
123+ - if ! test -d gitlab_build; then
124+ - docker help > /dev/null
125+ - touch timestamp.tag
126+ - test "x${ARMAGETRONAD_FAKERELEASE}" == "x" && export ARMAGETRONAD_FAKERELEASE=false
127+ - test -r configure || ./bootstrap.sh
128+ - ls docker/build -al
129+ - cat version.m4
130+ - mkdir -p gitlab_build
131+ - cd gitlab_build
132+ - . ../docker/scripts/brand.sh .
133+ - ../configure --prefix=/usr/local --disable-glout --disable-sysinstall --disable-desktop progname="${PROGRAM_NAME}" progtitle="${PROGRAM_TITLE}"
134+ - test "x${ARMAGETRONAD_FAKERELEASE}" == "xtrue" && cp ../docker/build/fakerelease_proto.sh docker/build/fakerelease.sh
135+ - cd docker/build
136+ - make CI_prepare -j`nproc`
137+ - cd ../../../
138+ - else
139+ - find . -newer timestamp.tag ! -path "./gitlab_build" -exec touch -r timestamp.tag \{\} \;
140+ - ./docker/scripts/fix_gits.sh || exit $?
141+ - fi
142+
143+ # cache git checkouts of repositories we depend on
144+ cache:
145+ paths:
146+ - docker/scripts/.cache
147+
148+
149+# very basic build
150+build_prepare:
151+ stage: build_prepare
152+ rules:
153+ - if: $CI_MERGE_REQUEST_ID
154+ when: on_success
155+ - when: on_success
156+ script: [""]
157+ artifacts:
158+ untracked: true
159+ expire_in: 1 day
160+
161+
162+build_server_32_raw:
163+ stage: build_base
164+ rules:
165+ - if: $CI_MERGE_REQUEST_ID
166+ when: on_success
167+ - when: on_success
168+ script:
169+ - gitlab_build/docker/build/make_ci.sh -k result.build_server_32
170+ after_script:
171+ - rm -rf gitlab_build/docker/build/context*.dir
172+ artifacts:
173+ untracked: true
174+ expire_in: 1 day
175+
176+build_server_steam_raw:
177+ stage: build_base
178+ rules:
179+ - if: $CI_MERGE_REQUEST_ID
180+ when: on_success
181+ - when: on_success
182+ script:
183+ - gitlab_build/docker/build/make_ci.sh -k result.build_server_steam
184+ artifacts:
185+ untracked: true
186+ expire_in: 1 day
187+
188+ # It seems like GitLab CI, all else being equal, schedules jobs in the order
189+# listed here. So list the ones that take longest first.
190+# Windows builds are worst because they have an additional layer of emulation,
191+# are not parallelized and are client and server build in one.
192+build_windows:
193+ needs:
194+ - build_server_32_raw
195+ dependencies:
196+ - build_server_32_raw
197+ stage: build_main
198+ rules:
199+ - if: $CI_MERGE_REQUEST_ID
200+ when: on_success
201+ - when: on_success
202+ script:
203+ - gitlab_build/docker/build/make_ci.sh CI_windows
204+ artifacts:
205+ paths:
206+ - gitlab_build/docker/build/
207+ expire_in: 1 day
208+
209+build_windows_steam:
210+ needs:
211+ - build_server_steam_raw
212+ dependencies:
213+ - build_server_steam_raw
214+ stage: build_main
215+ rules:
216+ - if: $CI_MERGE_REQUEST_ID
217+ when: on_success
218+ - when: on_success
219+ script:
220+ - gitlab_build/docker/build/make_ci.sh CI_windows_steam
221+ artifacts:
222+ paths:
223+ - gitlab_build/docker/build/
224+ expire_in: 1 day
225+
226+# debtest is faster, but also not paralellized
227+build_debtest:
228+ dependencies:
229+ - build_prepare
230+ stage: build_main
231+ rules:
232+ - if: $CI_MERGE_REQUEST_ID
233+ when: on_success
234+ - when: on_success
235+ script:
236+ - gitlab_build/docker/build/make_ci.sh CI_debtest
237+ artifacts:
238+ paths:
239+ - gitlab_build/docker/build/
240+ expire_in: 1 day
241+
242+# steam builds server and client in one go (the server is already pre-built), they are packed together
243+build_linux_steam:
244+ dependencies:
245+ - build_server_steam_raw
246+ stage: build_main
247+ rules:
248+ - if: $CI_MERGE_REQUEST_ID
249+ when: on_success
250+ - when: on_success
251+ script:
252+ - gitlab_build/docker/build/make_ci.sh CI_linux_steam
253+ artifacts:
254+ paths:
255+ - gitlab_build/docker/build/
256+ expire_in: 1 day
257+
258+build_client_64:
259+ dependencies:
260+ - build_prepare
261+ stage: build_main
262+ rules:
263+ - if: $CI_MERGE_REQUEST_ID
264+ when: on_success
265+ - when: on_success
266+ script:
267+ - gitlab_build/docker/build/make_ci.sh CI_linux_client_64
268+ artifacts:
269+ paths:
270+ - gitlab_build/docker/build/
271+ expire_in: 1 day
272+
273+build_client_32:
274+ dependencies:
275+ - build_prepare
276+ stage: build_main
277+ rules:
278+ - if: $CI_MERGE_REQUEST_ID
279+ when: on_success
280+ - when: on_success
281+ script:
282+ - gitlab_build/docker/build/make_ci.sh CI_linux_client_32
283+ artifacts:
284+ paths:
285+ - gitlab_build/docker/build/
286+ expire_in: 1 day
287+
288+build_server_64:
289+ dependencies:
290+ - build_prepare
291+ stage: build_main
292+ rules:
293+ - if: $CI_MERGE_REQUEST_ID
294+ when: on_success
295+ - when: on_success
296+ script:
297+ - gitlab_build/docker/build/make_ci.sh CI_linux_server_64
298+ artifacts:
299+ paths:
300+ - gitlab_build/docker/build/
301+ expire_in: 1 day
302+
303+# this one is special, it can rely on previous build work
304+build_server_32:
305+ dependencies:
306+ - build_server_32_raw
307+ stage: build_main
308+ rules:
309+ - if: $CI_MERGE_REQUEST_ID
310+ when: on_success
311+ - when: on_success
312+ script:
313+ - gitlab_build/docker/build/make_ci.sh CI_linux_server_32
314+ artifacts:
315+ paths:
316+ - gitlab_build/docker/build/
317+ expire_in: 1 day
318+
319+build_collect:
320+ stage: build_collect
321+ rules:
322+ - if: $CI_MERGE_REQUEST_ID
323+ when: on_success
324+ - when: on_success
325+ script:
326+ - gitlab_build/docker/build/make_ci.sh debtest.tag CI || exit $?
327+ - rm -rf src
328+ artifacts:
329+ untracked: true
330+ expire_in: 1 week
331+
332+# deploy to staged environment
333+deploy-staged:
334+ dependencies:
335+ - build_prepare
336+ - build_collect
337+ stage: stage
338+ tags:
339+ - armagetronad_deploy
340+ rules:
341+ - if: $CI_MERGE_REQUEST_ID
342+ when: never
343+ - if: $CI_COMMIT_REF_PROTECTED == "true"
344+ when: on_success
345+ - when: never
346+ before_script:
347+ - ./docker/scripts/fix_gits.sh || exit $?
348+ - ./docker/deploy/prepare_deploy.sh || exit $?
349+
350+ script:
351+ # mark
352+ - echo ${CI_PIPELINE_IID} > /messageboard/current_pipeline_${CI_COMMIT_REF_NAME}
353+ # now enter the docker build directory and just invoke make there
354+ - cd gitlab_build/docker/build
355+ - make staged_deploy -O -j$(nproc) -k
356+
357+
358+# do the actual release; manually for final releases, delayed to avoid spam for everyone else
359+delay-release:
360+ dependencies: []
361+ stage: stage
362+ rules:
363+ - if: $CI_MERGE_REQUEST_ID
364+ when: never
365+ - if: '$CI_COMMIT_REF_PROTECTED == "false"'
366+ when: never
367+ - if: '$CI_COMMIT_REF_PROTECTED == "true" && $CI_COMMIT_REF_NAME !~ /^release/'
368+ when: delayed
369+ start_in: '6 hours'
370+ - when: on_success
371+ before_script: [""]
372+ script: [""]
373+
374+# do the actual release; manually for final releases, delayed to avoid spam for everyone else
375+deploy-release:
376+ dependencies:
377+ - build_prepare
378+ - build_collect
379+ stage: deploy
380+ tags:
381+ - armagetronad_deploy
382+ rules:
383+ - if: $CI_MERGE_REQUEST_ID
384+ when: never
385+ - if: '$CI_COMMIT_REF_PROTECTED == "true" && $CI_COMMIT_REF_NAME =~ /^release/'
386+ when: manual
387+ - if: '$CI_COMMIT_REF_PROTECTED == "true" && $CI_COMMIT_REF_NAME !~ /^release/'
388+ when: on_success
389+ - when: never
390+ before_script:
391+ - ./docker/scripts/fix_gits.sh || exit $?
392+ - ./docker/deploy/prepare_deploy.sh || exit $?
393+ script:
394+ - tagfile=/messageboard/current_pipeline_${CI_COMMIT_REF_NAME}
395+ - if ! echo ${CI_COMMIT_REF_NAME} | grep -q ^release && test -r ${tagfile} && ! test ${CI_PIPELINE_IID} == `cat ${tagfile}`; then
396+ - echo "A newer build is already in the pipeline, abort."
397+ - exit 0
398+ - fi
399+
400+ # now enter the docker build directory and just invoke make there
401+ - cd gitlab_build/docker/build
402+ - make unstaged_deploy -O -j$(nproc) -k
403+
404+
405+
406+
407+# pack up the downloadable build files in one handy artifact
408+pack:
409+ stage: stage
410+ needs:
411+ - build_collect
412+ dependencies:
413+ - build_collect
414+ script: [""]
415+ before_script:
416+ # test that everything has been prepared correctly
417+ - if ! test -d gitlab_build; then
418+ - echo "No build yet!"
419+ - exit 1
420+ - fi
421+ - find . -newer timestamp.tag ! -path "./gitlab_build" -exec touch -r timestamp.tag \{\} \;
422+ - if ! make -C gitlab_build/docker/build -q CI_pack.tag; then
423+ - make -d -C gitlab_build/docker/build -q CI_pack.tag || exit $?
424+ - exit 1
425+ - fi
426+ - ./docker/scripts/fix_gits.sh || exit $?
427+ artifacts:
428+ expire_in: 1 week
429+ paths:
430+ - gitlab_build/docker/build/upload
431+
432+
433+
434+
435+testbuild:
436+ stage: test
437+ rules:
438+ - when: never
439+ script:
440+ - docker build -t armagetronad_server .
441+
442+
443+
444+
445+# for local testing
446+complete_build:
447+ stage: build_main
448+ rules:
449+ - when: never
450+ script:
451+ - cd gitlab_build/docker/build
452+ - make -O -j$(nproc) CI_base
453+ - make -O -j$(nproc) CI
454+
455+ artifacts:
456+ expire_in: 1 day
457+ paths:
458+ - gitlab_build/docker/build/upload
459
460=== modified file 'AUTHORS'
461--- AUTHORS 2012-05-21 04:31:14 +0000
462+++ AUTHORS 2020-07-03 06:03:19 +0000
463@@ -37,7 +37,7 @@
464 Oscilloscope : Most default instant chats
465 Belenus : OpenBSD support sniplets
466 hoop : Zone rendering settings
467-fman23 : Console Commands
468+fman23 : Console commands
469 LOVER$BOY : Console Commands
470
471 Translators who aren't already cited above:
472
473=== added file 'CHANGELOG.md'
474--- CHANGELOG.md 1970-01-01 00:00:00 +0000
475+++ CHANGELOG.md 2020-07-03 06:03:19 +0000
476@@ -0,0 +1,807 @@
477+
478+#### Changes since 0.2.8.3.5:
479+
480+##### Fixed Bugs
481+
482+ * Debian builds: Documentation html files have empty last change ([#9](https://gitlab.com/armagetronad/armagetronad/-/issues/9))
483+ * Ubuntu PPA release candidate builds would overwrite previous stable releases ([#15](https://gitlab.com/armagetronad/armagetronad/-/issues/15))
484+
485+##### New Features
486+
487+ * Adapt ChangeLog and fingerprint generation to git ([#11](https://gitlab.com/armagetronad/armagetronad/-/issues/11))
488+ * Integrated build system ([#14](https://gitlab.com/armagetronad/armagetronad/-/issues/14))
489+
490+
491+##### Changes on the 0.2.9 branch
492+
493+ * Added detection and reaction code for timing assist bots
494+ * /shuffle now works before you actually join a team
495+ * Implemented /shout command and associated settings
496+ * Fixed suspension and silenced status not being re-applied after a player
497+ disconnects and rejoins a server.
498+ * Tweaks to enemy influence system.
499+ * Ingame menu and console now are drawn on top of a semi-transparent,
500+ darkened area for increased readability.
501+ * New first start menu with clearer language selection and initial setup.
502+ * Tutorial match against one AI at slower speed.
503+ * Tutorial tooltips for the most important keybindings.
504+ * ADD_MASTER_SERVER command to announce a server to a new master server.
505+ Simplifies the process to list your server on a subculture.
506+ * Team launch positions logged to ladderlog with POSITIONS event. Disabled by
507+ default.
508+ * New command-line option "--input" added to poll for input from a file
509+ instead of stdin.
510+ * Added WHITELIST_ENEMIES_[IP/USERNAME] to allow players to be enemies, even
511+ if they come from the same IP address and ALLOW_ENEMIES_SAME_IP is
512+ disabled (which is its default setting).
513+ * GAME_END, NEW_MATCH, and NEW_ROUND ladderlog events include date and time.
514+ * Added ENCODING ladderlog event, which specifies the encoding for data in
515+ ladderlog.txt.
516+ * "--input" now can be used more than once to read from multiple files or pipes.
517+ * new team management ladderlog messages:
518+ TEAM_CREATED <team name>
519+ TEAM_DESTROYED <team name>
520+ TEAM_RENAMED <old team name> <new team name>
521+ TEAM_PLAYER_ADDED <team name> <player>
522+ TEAM_PLAYER_REMOVED <team name> <player>
523+ * Manage external scripts on Unix dedicated servers. New commands:
524+ SPAWN_SCRIPT, RESPAWN_SCRIPT, FORCE_RESPAWN_SCRIPT, KILL_SCRIPT,
525+ LIST_SCRIPTS, SCRIPT_ENV.
526+ * New setting ACCESS_LEVEL_ANNOUNCE_LOGIN that determines if a player's
527+ login/logout message can be announced.
528+ * Authentication is now enabled by default.
529+
530+#### Changes since 0.2.8.3.4:
531+
532+ * Security fix: Check that the remote is allowed to create an object
533+ before creating it, not decide whether it gets to keep it after
534+ it already has been created and potential damage has been done.
535+ No arbitrary code could be executed, but a client could effectively
536+ shut down a server by sending crucial objects, such as the main game
537+ timer or the game itself.
538+ * Compilation fixes for current systems.
539+
540+#### Changes since 0.2.8.3.3:
541+
542+ * Eliminated undefined behavior that was fine in gcc 5, but now
543+ (rightfully!) turned into crashes in gcc 6.
544+ * Eliminated compilation disambiguity that was just causing a mild
545+ performance degradation in gcc 5 and is now a compilation failure in
546+ gcc 6.
547+
548+#### Changes since 0.2.8.3.2:
549+
550+ * security fix: do not read ahead of the beginning of network buffer.
551+ * security fix: don't attribute network errors from processing random
552+ packets to the connection to the server
553+ * security fix: while at it, don't process random packets unless they
554+ may be important
555+ * fix for potential crash with friend list filtering
556+ * intel driver compatibility
557+ * fix for rare crash with sound lock
558+ * fix for camera turning for bizarre axis configurations
559+
560+#### Changes since 0.2.8.3.1:
561+
562+ * security fix: old style action commands from clients no loger cause hangs and crashes
563+ * security fix: oversized packets are ignored properly
564+ * security fix: never read one byte outside of the received buffer
565+ * security fix: only include .cfg files from the var subfolder
566+ * compiler compatibility: adapted to gcc 4.60
567+ * smaller spelling fixes
568+ * FOV calculations now correct for widescreen and horizontal splitscreen
569+ * Additional checks against illegal values passed to renderer
570+
571+#### Changes since 0.2.8.3:
572+
573+ * fixed temporary sound disappearance when alt-tabbing away and back
574+ * default subcultures are now distributed
575+ * enable 32 bit color depth at desktop resolution
576+ * no more display lists for SiS cards
577+ * spelling mistakes and missing German translations
578+
579+#### Changes since 0.2.8.3_rc4:
580+
581+ * New setting: KEEP_PLAYER_SLOT allows the server to kick (preferably) spectators
582+ if it gets full so there is always one slot open for players
583+ * New setting: ACCESS_LEVEL_AUTOKICK_IMMUNITY sets the access level required
584+ to be immune from such kicks (and idle autokicks, too)
585+ * Intercepted chat commands are now written to ladderlog.txt. Format:
586+ COMMAND /command-intercepted player [command arguments]
587+ * Increased default speed of server pinging
588+ * Reordered game menus a bit
589+ * fast finish works again
590+
591+#### Changes since 0.2.8.3_rc3:
592+
593+ * Pinging previously popular servers earlier for quicker server
594+ browsing
595+ * Improved master server random polling, the second polled master now
596+ also is random, and all masters are polled if need be
597+ * Custom camera snaps to cycle direction once when activated if the turn speed
598+ is zero.
599+ * RESERVE_SCREEN_NAME now works regardless of the ALLOW_IMPOSTOR setting.
600+ * USER_LEVEL now escapes the given authenticated name so you don't have to
601+ guess the escaping rules. Ex: USER_LEVEL "name with spaces@forums" 2
602+ changes user level for name\_with\_spaces@forums
603+
604+#### Changes since 0.2.8.3_rc2:
605+
606+ * Fixed crash with server polling
607+ * ROUND_WINNER and MATCH_WINNER ladderlog events now include the players of
608+ the team.
609+ * Camera switches to user preferred camera when you die in incam mode
610+ * Better support for custom language files
611+ * Players can no longer spam chat with /shuffle messages. Added new setting
612+ SHUFFLE_SPAM_MESSAGES_PER_ROUND, a per round, per player limit on the number
613+ of shuffle messages displayed.
614+
615+#### Changes since 0.2.8.3_rc1:
616+
617+ * Fixed dark color filters, such as FILTER_DARK_COLOR_STRINGS, to not filter
618+ the reset color.
619+ * ASE moviepack models no longer have a vertex count limit
620+ * Fixed endless recursion crash between rounds
621+
622+#### Changes since 0.2.8.3_beta3:
623+
624+ * Chat prefix spam protection. Guards against prefix spam, such as when a
625+ user always changes their chat message color, or prefixes all messages
626+ with a clan tag. Toggle with the PREFIX_SPAM_ENABLE setting.
627+ * Fixed VOTING_MATURITY to use the time when the player entered as its
628+ reference time.
629+ * Fixed single player highscore list not containing everyone.
630+ * Fixed generation of duplicate names in highscore lists.
631+ * Fixed camera crash when the grid is empty.
632+
633+#### Changes since 0.2.8.3_beta2:
634+ * Fixed 'invincibility' bug. It really was cycles freezing in time.
635+ * Fixed sporadic sound related crash at round end.
636+ * setting rename: SILENCE_ALL -> SILENCE_DEFAULT.
637+ * Sound no longer gets muted after you switch the sound settings.
638+ * Fixed object collision detection that would sometimes pick a wrong
639+ wall to collide with, most likely the reason behind wrongly accredited
640+ kills.
641+ * Fixed inability to switch viewport assignment in four player mode.
642+ * Better handling of lag clusterbombs.
643+ * Server disconnects now also take immediate effect even when you're
644+ in a menu or chatting.
645+
646+#### Changes since 0.2.8.3_beta1:
647+ * Made ready for Armatrators
648+ * Authentication routines now use utf8 as forward- compatibility with
649+ trunk. Previously, non-ASCII usernames simply didn't work at all.
650+ * Better lag slide protection: clients no longer get confused when
651+ the server sends their cycle back in time, and the server no longer
652+ does that for old clients.
653+ * Fixed rare wallpassing bug; it required what whould usually be an
654+ instakill and infinte wall length.
655+
656+#### Changes since 0.2.8.2:
657+
658+New settings and commands:
659+
660+ * MIN_PLAY_TIME_*: minimal play time required before you are allowed to
661+ play on this server.
662+ * SPAM_AUTOKICK_COUNT: minimal number of spam warning messages you get in a
663+ row before you get kicked.
664+ * FORTRESS_COLLAPSE_SPEED: tune the collapse speed of fortress zones.
665+ * VOTE_KICK_REASON: default reason given on kick votes.
666+ * "/vote" chat interface to votes; "/vote kick <player>" issues a kick vote.
667+ * new vote type "/vote suspend <player>" suspends a player for
668+ VOTING_SUSPEND_ROUNDS rounds.
669+ * new vote type "/vote include <file>", includes configuration file
670+ vote/<file>.
671+ * new vote type "/vote command <command>" executes console command
672+ <command>. (Both that and /vote include are by default only available
673+ to moderators).
674+ * VOTING_HARM_TIME: time between all harmful votes against a player
675+ * VOTING_KICK_MINHARM: auto-transform the first few menu issued kick
676+ votes to suspensions
677+ * (UN)SUSPEND kicks a player to spectator mode with a timeout. Intended to
678+ let new players watch before they play.
679+ * VOTES_CANCEL cancels all running polls.
680+ * VOTING_SUSPEND [<minutes>] disallows voting during a specified amount of time.
681+ * ZONE_ALPHA_TOGGLE to override the systemwide alpha blendings setting and
682+ have zones rendered in wireframe mode even when alpha blending is on.
683+ * ZONE_ALPHA(_SERVER) to control intensity of zone rendering.
684+ * SCORE_HOLE for awarding sacrifice.
685+ * SCORE_SURVIVE for player survival and FORTRESS_HELD_SCORE for not losing
686+ each fortress zone.
687+ * KICK_TO and MOVE_TO: redirect a client to a different server
688+ * DEFAULT_KICK(_TO)_MESSAGE: default reason given to players for a kick
689+ * DEFAULT_KICK_TO_SERVER/PORT: default redirection target for KICK/MOVE_TO.
690+ * RENAME renames a player.
691+ * If all clients support it, PING_CHARITY_MIN/MAX can be used to constrain ping charity.
692+ * VOTE_KICK_TO_SERVER/PORT: redirection target for vote kicks.
693+ * SILENCE and VOICE allow to control chat of annoying players.
694+ * SILENCE_ALL can be used on the server to inhibit all cross-team communication unless specifically voiced.
695+ * ENABLE_CHAT can be set to 0 to disable all chat. If it is set on the server it only disables public chat and logged in players can still speak.
696+ * LAG_*: controls game level lag compensation.
697+ * FILTER_NAME_MIDDLE: collapses multiple whitespaces to one in player names.
698+ * FORTRESS_CONQEST_TIMEOUT: if an enemy contact with a zone happens longer ago than
699+ this value, it is discarded from zone memory.
700+ * TOPOLOGY_POLICE_PARALLEL, extra topology police flag to control the checks
701+ for walls getting copied into the grid in exactly the same place.
702+ * CAMERA_GLANCE_*: separate settings for the glancing camera, work like CAMERA_CUSTOM_*.
703+ Likewise, CAMERA_SERVER_GLANCE_* can replace CAMERA_SERVER_CUSTOM_* when glancing.
704+ CAMERA_*CUSTOM_GLANCE* are server side settings that can control whether server or
705+ clientside settings are used in various situations, see settings.cfg for details.
706+ * CYCLE_BOOST_? and CYCLE_BOOSTFACTOR_? for boosts when breaking away from walls,
707+ see settings.cfg or config.html for details
708+ * CYCLE_ACCEL_TUNNEL, works like CYCLE_ACCEL_SLINGSHOT, but is active when
709+ none of the two walls you're in between is your own.
710+ * CYCLE_WIDTH for making it impossible to squeeze through tight tunnels,
711+ see settings.cfg for details
712+ * VOTING_MATURITY controls how long you have to wait after login before
713+ you can issue kick votes.
714+ * CYCLE_DELAY_DOUBLEBIND_BONUS is an extra factor applied to CYCLE_DELAY
715+ for turns in the same direction. Can be used to limit the advantage
716+ doublebinders get while not punishing players who press both left and
717+ right at the same time.
718+ * LAG_O_METER_(TRESHOLD|BLEND|USE_OLD): Configure the minimal size of the
719+ Lag-O-Meter, its color and whether to scrap it all and stick with the old
720+ one.
721+ * ALLOW_TEAM_CHANGE: if set to 0 players won't be able to join a team, create
722+ a new team or change to another team.
723+ * ALLOW_TEAM_CHANGE_PLAYER/DISALLOW_TEAM_CHANGE_PLAYER: allow/disallow specific
724+ players to switch teams
725+ * INTERCEPT_COMMANDS is a space-delimited list of chat commands that shall be
726+ intercepted by an external script. Example value: /login /admin /teamleave
727+ /teamshuffle /shuffle /team
728+ * INTERCEPT_UNKNOWN_COMMANDS is a boolean specifying if an external script
729+ wishes to handle unrecognized chat commands. This would allow hooking
730+ arbitrary things like /foobarz or /mode ctf
731+ * CONSOLE_LADDER_LOG boolean places the ladderlog on stdout prefixed with
732+ "[L] "
733+ * PLAYER_MESSAGE <user ID or name> <Message>: Like /msg, but from the
734+ console
735+ * All ladderlog outputs can be enabled or disabled separately by using
736+ LADDERLOG_WRITE_*. LADDERLOG_WRITE_ALL enables or disables all ladderlog
737+ output alltogether.
738+ * CHAT_LOG controls whether to write a machine-readable chatlog to
739+ var/chatlog.txt
740+ * CONSOLE_DECORATE_TIMESTAMP write a timestamp for every console message?
741+ * LADDERLOG_DECORATE_TIMESTAMP prefix every ladderlog message with a timestamp?
742+ * SLAP <player> [points] sends a message to everyone and subtracts a number
743+ of points (default: 1) from <player>'s score. Negative points are
744+ supported.
745+ * AUTO_TEAM_SPEC_SPAM to disable the spectator join/leave messages you get
746+ when AUTO_TEAM is enabled
747+
748+If --enable-armathentication was activated:
749+
750+ * /lock, /unlock, /invite and /uninvite team management chat for players of
751+ access level ACCESS_LEVEL_TEAM or better.
752+ * /teams chat command that rougly prints team layout.
753+ * ACCESS_LEVEL_IPS to let admins see IPs of players in the list.
754+ * ACCESS_LEVEL_SPY_MSG/TEAM to let admins spy on team/private messages.
755+ * CASACL to temporarily raise the access level
756+ * ACCESS_LEVEL to modify the required access level to change settings
757+ * AUTHORITY_WHITELIST and AUTHORITY_BLACKLIST to filter authorities you want on your server.
758+ * GLOBAL_ID_ENABLED to toggle remote accounts
759+ * LOCAL_USER, LOCAL_TEAM for local login accounts
760+ * MD5_PREFIX/MD5_SUFFIX for additional password scrambling
761+ * USER_LEVEL to grant users various access levels
762+ * RESERVE_SCREEN_NAME to reserve a screen name to a certain player
763+ * USER_ALIAS to bend authentication names around
764+ * (UN)BAN_USER to ban really stupid users based on their global user ID,
765+ BAN_USER_LIST to show a list.
766+ * ACCESS_LEVEL_OP/ADMIN/CHAT/PLAY/PLAY_SLIDING to control who can do which things
767+ * /login chat command then uses the more secure hashed base logins
768+ * new chat commands /op and /deop to change other players' access rights
769+
770+Featurelets:
771+
772+ * Added Polish language file
773+ * clientside play time tracking and server controlled minimal required experience
774+ to be allowed to play.
775+ * color codes in chat increase the spam level logarithmically.
776+ * /team messages get a reduced spam level; reduction factor is given by
777+ (team size)/(number of total players).
778+ * /team messages can be used by spectators to chat with other spectators only.
779+ * Performance optimizations. Using OpenGL display lists to cache geometry.
780+ * Removed ztrick, antialiasing and perspective correction settings. They all had only one right
781+ setting and caused us some interesting bug reports.
782+ * Added PLAYER_RANDOM_COLOR for lazy people who just want to have a
783+ color that differs from everyone else on the server.
784+ * Configuration files get reloaded on SIGHUP
785+ * all admin commands now also accept partial name matches, like /msg, and check for case sensitive
786+ matches in the screen name first, then the user name, then case insensitive matches in the two.
787+ * --enable-krawallserver has been actually implemented now, and it enables secure logins
788+ to accounts local to the server and not-so-secure logins managed by authentication servers.
789+ * A subculture list for server groups that are not managed by our main master servers
790+ * A friends list and filter for the server browser that shows you only servers with
791+ your friends on them.
792+ * The client now can handle network traffic while it is waiting for the graphics
793+ card to swap buffers.
794+ * The dedicated server no longer uses a fixed delay, but a select() call (that
795+ returns when network data arrives) to idle. When data arrives, it does
796+ the minimum amount of work before it sends out the responses, resulting in
797+ lower latency. It is now safe to decrease DEDICATED_FPS to 20 or 10, latency
798+ is no longer influenced by that setting.
799+ * Game level lag compensation. When a command arrives from a client that is delayed,
800+ it is backdated to the time it was issued, provided enough "lag credit" is left.
801+ The client is informed of the delay so it can compensate in the future, which it does
802+ by forging the game timer.
803+ * Nonnormalized axes and axes with odd turning directions are now properly supported
804+ * The camera has a memory which player you like to watch. Every time you manually switch
805+ the camera and your favorite player is not dead, the favorite is set to the currently
806+ watched player. The next time the camera doesn't know what to watch, your favorite
807+ will be selected.
808+ * Players leaving to spectator mode with <0.2.8.2 clients are handled like
809+ spectators of 0.2.8.2 clients: they stay visible to the others.
810+ * Kick statistics are now persistent across server runs.
811+ * MESSAGE_OF_DAY is now displayed fullscreen if both server and client support it
812+ * Manual fullscreen messages can be triggered with
813+ FULLSCREEN_MESSAGE <timeout> <message content>
814+ * Axes Indicators by meriton, can be enabled using the AXES_INDICATORS
815+ setting.
816+ * New "About" menu item in the main menu displays the version of
817+ Armagetron Advanced, the paths it uses, links to the main site, wiki
818+ and forums and the names of the project admins.
819+ * New entries in ladderlog.txt:
820+ - GAME_TIME <time> (only if enabled via the LADDERLOG_GAME_TIME_INTERVAL
821+ setting): The time that has passed since the last start of a round
822+ - BASEZONE_CONQUERED <team> <x> <y>: A fortress zone belonging to <team>
823+ at the coordinates (<x>, <y>) has been conquered
824+ - BASEZONE_CONQUERER <player>: at the time of the last BASEZONE_CONQUERED
825+ message, <player> has been in the conquered zone
826+ - ONLINE_PLAYER <player> [<ping [<team>]]: At the beginning of the round,
827+ <player> had <ping> and was on <team>. This line is not printed for bots
828+ - NUM_HUMANS <n>: There are <n> players that are not AIs and are part of a
829+ team.
830+ - ROUND_SCORE has the player's team name appended.
831+ - ROUND_SCORE_TEAM: score a team accumulated during the last round.
832+ - WAIT_FOR_EXTENAL_SCRIPT: printed if the setting of the same name is
833+ enabled. In this case the server will delay the start of the next round
834+ until WAIT_FOR_EXTENAL_SCRIPT_TIMEOUT is reached or the setting is
835+ disabled.
836+ * Wrapped console lines are indented by an amount of spaces that can be
837+ specified using the setting CONSOLE_INDENT.
838+ * /help command that supports multiple help topics. Use
839+ HELP_INTRODUCTORY_BLURB and ADD_HELP_TOPIC to control its contents
840+ * /rtfm command that allows moderators to send help messages to newbies
841+ * /players now shows the players' color and allows searching
842+ * TEAM_ELIMINATION_MODE sets the way ArmagetronAd removes teams when there's too much teams.
843+
844+Bugfixes:
845+
846+ * Added compensation for drifting timers (observed often with
847+ overclocked mainboards)
848+ * Text input fields now let the text wrap correctly and make use of the space allocated
849+ for them in a not-completely-dumb way. And *sigh* depending on the text field, color
850+ codes are either ignored (for the usernames) or both displayed in text and rendered.
851+ * "KICK 2pack" no longer kicks user 2 instead of player 2pack.
852+ * Fixed various trail end related extrapolation/simulation inaccuracies that looked
853+ like lag.
854+ * When extrapolating, the game's sensors never detected own or teammates' walls,
855+ it mistook them for enemy walls.
856+ * The acceleration and boost system always used settings for enemy walls instead of
857+ settings for team players' walls. That means that old clients connecting to a
858+ 0.2.8.3+ server that has CYCLE_ACCEL_ENEMY and CYCLE_ACCEL_TEAM set to different
859+ values experience syncing problems. The default behavior therefore is to lock 0.2.8.2
860+ and earlier out of your server if you set one of them away from the default.
861+ If you want to set both accelerations away from the default, but to the same value,
862+ there won't be a compatibility problem; in that case, set CYCLE_ACCEL_ENEMY_OVERRIDE
863+ and CYCLE_ACCEL_TEAM_OVERRIDE to 0 and old clients will be allowed in. However, you
864+ should manually lock out players with 0.2.7 clients, for example by modifying
865+ CYCLE_ACCEL_RIM a tiny bit.
866+ * "Team Red" bug. If the server allows maximally two teams, no team ever
867+ gets to be Team Red.
868+ * Phasing made even more difficult; nice side effect of the fix is
869+ reduced network bandwidth usage.
870+ * Speed gauge resets between rounds.
871+ * More accurate Lag-O-Meter by meriton.
872+ * Zones were sometimes invisible.
873+
874+Internals:
875+
876+ * A complete netsync cycle is now sn_Receive(); nNetObject::SyncAll(); sn_SendPlanned();.
877+ * Ping charity is now completely server controlled.
878+
879+#### Changes since 0.2.8.1:
880+ * Timestamps and teamscores added to scorelog.txt
881+ * Dedicated server now works on FreeBSD and OpenBSD
882+ * User running the dedicated server is called "armagetronad" again, the
883+ longer "armagetronad-dedicated" caused problems with BSD
884+ * Test versions refuse to connect to servers more than one version ahead
885+ * Prepared client for respawns
886+ * Team spawn formation is now configurable
887+ * Added reasons to bans
888+ * Added spectator autokicking
889+ * Added history to chat and console (wrtlprnft). Press "Cursor up" to
890+ edit and repeat previous chats and console commands.
891+ * You only enter a game once your client is synced
892+ * /msg now prefers exact matches over partial matches
893+ * Cycles now have better memory for pending turns (wrtlprnft)
894+ * Added player join/leave/rename messages to ladderlog.txt with IPs
895+ * Ping variance influence on packet loss tolerance code is now clamped
896+ by the regular, configurable, packet loss tolerance: effect of variance
897+ can be no bigger than the effect of ping.
898+ * Spectators are now regular players and can chat
899+ * The /msg command now converts the entered pattern into the internal
900+ name so if you write "/msg öäü" and there is a user named "öäü" with
901+ an internal nick of "oau" it will still get matched
902+ * Team changes are now only executed when allowed, the need for the
903+ temporary/permanent team imbalance setting distinction has gone away
904+ * Added brake toggle button
905+ Bugfixes:
906+ * Client sometimes crashed when leaving a server with AIs on over the menu
907+ * The server starting scripts were chowning /var/run and /var/log to armagetronad
908+ * Short names could crash the server
909+ * Direct cycle collisions sometimes lead to both passing trough each other
910+ * Init scripts now installed correctly with --enable-initscripts
911+ * Hopeless pending team change wishes are deleted
912+ * Large timesteps are now broken down into smaller ones on the game level
913+ * Pretend keys are released before entering chat
914+ * Two cycle steering events were sent if you doublebound the brake
915+ * Large speed boosts out of game rule bounds were possible during network
916+ glitches
917+ * Debug recording reliability increased, function call with undefined return
918+ value eliminated
919+ * Recording and scorekeeping no longer conflict
920+ * Input during a recording now has an end marker, making quick keypresses
921+ after leaving a menu not break it
922+ * CYCLE_RUBBER_DELAY was overridden sometimes by packet loss tolerance
923+ * ALLOW_CONTROL_DURING_CHAT now ignores modifier keys like shift and
924+ has been reactivated
925+ * The camera sometimes got stuck in free mode for the first round you watch
926+ * Crashfix in hole blowing code when no cycle was set
927+ * After a "perfect" 180, you're more often on the right side of your own wall
928+ That code caused some havoc at first, so it has been reworked
929+ * The smart cam did not like fluctuating framerates
930+ * Improved debug recording reliability: multiple master server visits
931+ and too quick keypresses were causing trouble.
932+ * Canonical DESTDIR support and added ROOTDIR support for testing
933+ * Login floods are detected and ignored
934+ * Player name updates sanitized
935+ * Disabled complicated feasibility tests for team menu entries,
936+ they did not have the full information and were often wrong
937+ * Team score only added to player score if no teamplay is possible
938+
939+#### Changes since 0.2.8.0:
940+ * INCLUDE console command now gives a file not found error
941+ * ALL user given paths are validated for security problems in a special function
942+ * Fallback to default map on map load failure works again (broken sine 0.2.8.0_rc4)
943+
944+#### Changes since 0.2.8.0_rc4:
945+Bugfixes:
946+
947+ * SECURITY FIX: via a MAP_FILE path with included .., it was possible
948+ to write files anywhere, provided they did not exist previously.
949+ Clients with this vulnerability are locked out of the server now.
950+ * ALLOW_CONTROL_DURING_CHAT has been disabled for now.
951+ * Another connection termination bug.
952+
953+#### Changes since 0.2.8.0_rc3:
954+ * Added spectator mode toggle key.
955+ * Thresholds when a white background bar is rendered behind texts is
956+ now configurable in the expert section of settings.cfg.
957+ * Ingame menu trigger key is configurable now, only ESC stays hardcoded.
958+ * The map parser checks whether the map is stored at the right location.
959+ * Map validation errors are now visible on the client.
960+ * Made magic numbers used by the smart camera configurable for user tweaking.
961+ This is undocumented and unsupported.
962+ * The server browser now shows a B beside the score to mark bookmarked servers.
963+ Bugfixes:
964+ * -Os compile option is filtered out if GCC 3.3 is used, it makes the build go bad.
965+ * Extremely low values of CYCLE_DELAY were not honored, an arbitrary delay of .005s
966+ was added to it.
967+ * On entering a server, the camera would sometimes be stuck in free mode.
968+
969+#### Changes since 0.2.8.0_rc2:
970+ * Almost final artwork
971+ * Moviepacks can now also contain texture replacements for the default cycle model
972+ * Added number of teammates alive to HUD
973+ Bugfixes:
974+ * Dual textured floor rendering is now disabled without alpha blending as it
975+ did not work anyway.
976+ * Lag-O-Meter now has the correct size (the old, buggy one can be restored by
977+ setting LAG_O_METER_SCALE to .5).
978+ * The network system made some IDs randomly unusable, causing zombie
979+ cycles, invisible walls and disconnections.
980+ * The AI Team from a previous local game session was sometimes still visible
981+ on the score table in the following network game on a remote server.
982+ * The server did not start a new match when temporarily, only spectators were online.
983+ * Player walls were rendered twice.
984+ * The server wrote console center messages to stderr.
985+ * UNBAN_IP did not work at all.
986+ * The code that should kill a cycle in performance/DOS protection
987+ circumstances just crashed.
988+
989+#### Changes since 0.2.8.0_rc1:
990+ * Bugfixes:
991+ - Dedicated server for Windows works again.
992+ - Cycle turns are now executed more accurately on the server.
993+ - Timer stuttering at end of round (was non-critical, but ugly).
994+ - Custom camera did not turn when the internal camera was
995+ configured not to turn.
996+ - Idle player kick code crashed when it kicked a client with
997+ many players.
998+ - The code that removes inactive players after a while removed
999+ the AI players.
1000+ * Reverted smart camera movement to pre-beta4 behavior,
1001+ the new code made some players seasick :)
1002+ * Ingame admin interface gives more useful information to the invoker
1003+ * Small font rendering improvements
1004+ * Zone conquest message, if it is not the one that ends the round,
1005+ now states the name of the zone owning team.
1006+
1007+#### Changes since 0.2.8_beta4.2:
1008+ * Fixed bugs:
1009+ - Random client disconnection
1010+ - Another vote-not-appearing-on-client bug
1011+ - Invisible wall segments right after turn
1012+ - Arena initialization before all settings are transmitted from the server
1013+ - The server was using more rubber than the client sometimes
1014+ - Crash with moviepack and some maps
1015+ - Object sync messages not accepted by client in second network session
1016+ * Improved kill/suicide/team kill distinction (ENEMY_* settings)
1017+ * Chatbots and idle players can be removed from the game and kicked
1018+ (CHATTER/IDLE_REMOVE_TIME,IDLE_KICK_TIME)
1019+ * Players/team leaders can pause the game before a rond starts (PLAYER_CHAT_WAIT*)
1020+ * Color codes can be filtered from player names (FILTER_COLOR_NAMES)
1021+ * New machine readable log file: ladderlog.txt
1022+ * Configurable and better core dump/team kill/suicide distinction algorithm
1023+ * Unknown settings are recognized now in configuration files
1024+ * All global key bindings (Grab mouse, pause and texture reload were left)
1025+ are now configurable
1026+ * Player listing length limit adjusted so two teams/16 players fits on screen
1027+ * Less verbose upgrade warning messages
1028+ * Imposters can get a non-conflicting name (ALLOW_IMPOST[EO]RS)
1029+
1030+#### Changes since 0.2.8_beta4:
1031+ * Fixed bugs:
1032+ - Windows version had a memory overwrite error causing crashes and weird behavior.
1033+ - The game quit when the chat key and a key bound to an instant chat were pressed to quickly.
1034+ - Votes expired too early on the client.
1035+ - Performance: a lot of unused temporary walls were hanging around each round.
1036+ - Cycles sometimes warped to odd locations.
1037+ * Tweaked smart camera to not stay in front of the cycle so much.
1038+ - Tweaked smart camera custom glancing.
1039+ Report back whether you like or hate it!
1040+ * Made custom camera even more configurable, changed default settings.
1041+ (old ones are still in settings.cfg)
1042+ * Forced glancing end on cycle turn now looks better.
1043+ * FOV settings now deal better with wide screens/splitscreen mode.
1044+ * Increased ping measurements again by adding the fluctuations. The raw
1045+ average ping caused the game logic to be too picky.
1046+
1047+#### Changes since 0.2.8_beta3:
1048+ * Famous fixed bugs:
1049+ - Random huge felt lag or blank screen (it was actually a problem with the timer) is gone.
1050+ - Bogus "possible phase bug" message.
1051+ - Seemingly random walls popping out of nothing, only to disappear a second later.
1052+ - Random camera focus changes while you were still alive.
1053+ - Every 100th console line got deleted.
1054+ * Reduced pings! Actually, just the measurement is improved, the actual latency
1055+ stays the same. I hope nobody notices that. Good thing nobody reads NEWS files :)
1056+ * New text editing convenience: Home and end keys work, and CTRL+left/right/del/backspace
1057+ work on whole words. Thanks, Nemo!
1058+ * New instant chat functions: There are now 25 instant chat strings. If an instant
1059+ chat string ends in a \, it will not be sent immediately, it's opened to be edited by you.
1060+ Pressing an instant chat key while already chatting will insert the string, provided the
1061+ key does not produce a regular character.
1062+ * If enabled by the server administrator: control your cycle while you chat.
1063+ * Turning speed of custom and internal camera can be adjusted with CAMERA_CUSTOM_TURN_SPEED
1064+ and CAMERA_IN_TURN_SPEED.
1065+ * The custom camera zooms out from a closeup at round start. Useful to see your position
1066+ in your team. Configurable with CAMERA_CUSTOM_ZOOM.
1067+ * Master server redundancy enabled. Thanks to Lucifer for hosting the backup master!
1068+
1069+#### Changes since 0.2.8_beta2:
1070+ * More bugfixes: most annoying was the crash/infinite loop a server got in when
1071+ the master server was unreachable
1072+ * Added zones to map specification
1073+ * Reworked top level map format (sorry to the map makers for the inconvenience)
1074+ * Windows: added start menu entries that open the system and user data directories
1075+ * Bandwidth limitation now works. That means if you lowered the bandwidth
1076+ limits in the network setup, they were not respected. You probably should
1077+ readjust them.
1078+
1079+#### Changes since 0.2.8_beta1:
1080+ * bugfixes, of course
1081+ * added recording and playback startmenu entries for Windows
1082+ * abuse prevention: added IP banning, player number per IP and client limit,
1083+ doublebinding can be crippled on server command
1084+
1085+#### Changes since 0.2.7.1:
1086+ * Server side cycle synchronization issues fixed:
1087+ - destination removal fixed
1088+ - lag sliding caused by different interpretation of grinding turn commands on client and server fixed
1089+ - niceness for older clients: sync interval decreased, no sync in front of wall to prevent local tunneling
1090+ * Client side cycle synchronization issues fixed:
1091+ - smooth corrections now only affect the appearance, the correct values are used internally
1092+ - sync messages are no longer ignored,
1093+ - new extrapolating sync method implemented,
1094+ - ghosting fixed,
1095+ - wall ends sticking out fixed ( for enemy cycles ),
1096+ - the sophisticated distance based sync code implemented years ago is now actually used, oh dear.
1097+ * Performance improvements:
1098+ - netobject synchronization does no longer traverse all netobjects
1099+ - disabled gameobject-gameobject interaction
1100+ * added support for nonorthogonal driving directions
1101+ * added support for debug recording and playback
1102+ * switched to using automake
1103+
1104+#### Changes since 0.2.7.0:
1105+ * Fixed security issues: fake message ID crash, fake peer ID crash ( both
1106+ maybe could be used to execute arbitrary code ), fake logout exploit, fake
1107+ connections DOS attack
1108+ * The feared "left grid" error message has been replaced by recovery code
1109+ * Fixed transfer of infinite floats over the network
1110+ * Fixed network timer inaccuracies on long running servers
1111+ * Fixed rip bug ( for those who like it: search and you will find )
1112+ * Fixed wall bending ( there is still some wall bending left, but it will be
1113+ too small to notice )
1114+ * Fixed tunneling bugs ( you were able to move from one side of a wall to the other )
1115+ * Fixed bounce bug ( a small zigzag towards a wall sometimes put you further
1116+ away from it, leaving a hole )
1117+ * Fixed massive reference counting overflow crash caused by repeated close grinding/180ing
1118+ * Made rubber code customizable and frame rate independent ( new CYCLE_RUBBER_
1119+ variables in settings.cfg )
1120+ * For debugging and scripting: dedicated server console messages can be
1121+ decorated with client ID and IP
1122+ * Topology police: facility to catch tunneling issues after they happened. off
1123+ by default
1124+ * Cycle network code is more robust
1125+ * Update frequency of cycle position now configurable and more frequent for
1126+ client's own cycle that the rest by default
1127+ * Corrected rc.d scripts to start the server as a system service
1128+ * Voting more configurable: voters can be made public, spectators can't vote
1129+ any more by default
1130+ * Moviepack floor color fixed
1131+ * Hostname lookup failure fixed
1132+ * "PLAYER_1 nick" console command problems fixed
1133+ * Windows libraries moved out of the main source tree
1134+ * Source code now compatible with 64 bit and gcc 3.4
1135+ * Colored explosions!
1136+ * HUD enhancements: customization, works in splitscreen mode
1137+ * Directory scanning code added ( not yet visible, will be used for
1138+ moviepack/cycle selection )
1139+ * Moviepack sky texture support
1140+ * Master server can now run on windows, too
1141+ * Explosion sound now actually works
1142+
1143+#### Changes since 0.2.6.0:
1144+ * added HUD
1145+ * Winzone may now be a deathzone
1146+
1147+#### Changes since 0.2.5.2:
1148+ * Split custom camera into server defined and client defined custom camera
1149+ * Fixed monster chat message exploit
1150+ * Added local player silencing
1151+ * Added Kick voting
1152+ * Added player names on cycles ( implemented by Christian Reitwiessner )
1153+ * Harsher ( and configurable ) spam protection
1154+ * Fixed strangely bent walls
1155+
1156+#### Changes since 0.2.5.1:
1157+ * Fixed fullscreen toggle while chatting
1158+ * Disabled trilinear filtering for ATI cards by default ( to avoid lockups )
1159+ * Worked around flawy S3 texture storage
1160+ * Fixed crash when trying to change teams in spectator mode
1161+
1162+#### Changes since 0.2.5:
1163+ * Another go at the "11th Round Bug"
1164+ * Player list is now sorted after displayed score ( before: some invisible combination of team score and own score )
1165+ * Fixed brakes when connecting to a 0.2.4 or earlier server
1166+ * Updated FAQ with server setting hints
1167+ * Unified Windows and Unix network code
1168+ * Fixed texture hardware mode
1169+ * Less connection losses
1170+ * Fixed network ID related crash
1171+ * Added player names to information you get from a server
1172+ * Added window-fullscreen toggle key and separate setting of screen resolution/window size
1173+
1174+#### Changes since 0.2.4:
1175+ * Fixed online observer mode switching
1176+ * Fixed command line options
1177+ * Fixed player quit message
1178+ * Fixed AI join message
1179+ * Fixed double registration of some network objects ( had no known visible symptom )
1180+ * Added security checks to see if Armagetron is run correctly
1181+ * Fixed big brother ( reporting of OS, graphic card and version to the master server )
1182+ * Disabled memory manager by default
1183+ * Fixed single player exit game crash
1184+ * Fixed zero length sting receive crash
1185+ * Completed network version control
1186+ * Added timestamps to logfiles ( code fragments by k_at_work )
1187+ * Added reason to login deny/kick messages
1188+ * Fixed 11th round bug ( additional round started after match end )
1189+ * Added --doc command line switch to print offline version of online help
1190+ * Fixed sign of rise/drop highscore messages
1191+ * New console commands: quit/exit ( dedicated server only ), kick <player name>, center_message <message> and console_message <message>
1192+ * New setting item: MAX_CLIENTS
1193+ * Improved server browser, less skipping around
1194+ * Added instant win zone
1195+ * Cycle brake is now of limited duration
1196+
1197+#### Changes since 0.2.3:
1198+ * Fixed score display ( really! )
1199+ * Fixed freestyle mode round counting
1200+ * Fixed server freezer
1201+ * Fixed explosion sync
1202+ * Fixed AI crashes when player leaves in mid-battle
1203+ * Fixed configure script: now really uses sdl-config
1204+ * Speeded up deletion of unreachable servers
1205+ * Fixed endless recursion bug ( "11th player bug" )
1206+ * Moved team start positions further apart
1207+ * Player name is now taken from $USER on first start and player color is randomized
1208+
1209+#### Changes since 0.2.2:
1210+ * Fixed highscores and ladder
1211+ * Delayed score deletion after match end
1212+ * Fixed autoexec.cfg loading
1213+ * More automatic rebuilding
1214+ * Fixed dedicated server idle quitting
1215+ * Fixed auto AI
1216+ * Fixed instant chat
1217+ * Fixed score display for many players or long player names
1218+ * Fixed very rare client crash
1219+ * Fixed not so rare release only crash
1220+ * Fixed balance-related typos
1221+ * Tweaked smart camera so that it works well when braking
1222+ * Fixed finish mode game setting
1223+
1224+#### Changes since 0.2.1:
1225+ * Fixed another connection-loss bug
1226+ * Fixed observer freeze
1227+ * Observers now don't just get kicked when nobody else is online
1228+ * Fixed software renderer detection
1229+ * Updated FAQ
1230+ * Fixed config file loading on some architectures
1231+ * Improved team coloring
1232+ * Fixed stuck brake bug
1233+
1234+#### Changes since 0.2.0:
1235+ * Fixed crash when watching a quitting player
1236+
1237+#### Changes since 0.2.pre4:
1238+ * Fixed crashes
1239+ * Fixed windows network connection problems
1240+ * Fixed clour related problems
1241+ * Added marker for own cycle to avoid confusion in team mode
1242+ * Changed directory placement: configuration resides in /etc/armagetron,
1243+ user configuration in ~/.armagetron/var
1244+ * Data files added to ~/.armagetron/textures ( or /models or /sounds )
1245+ are now loaded in favor of original data, allowing user specific mods
1246+
1247+#### Changes since 0.2.pre3:
1248+ * Fixed some more rare crashes and lockups
1249+ * Fixed team handling: all team change operations now get only active
1250+ on next round address
1251+ * Fixed moviesounds
1252+ * Fixed server-master server communications
1253+ * new installation method: make update ( keeps user configuration )
1254+
1255+#### Changes since 0.2.pre2:
1256+ * Fixed some rare crashes and lockups
1257+ * Improved cycle handling over network
1258+ * It is now allowed to fight with an arbitrary large team against the AI
1259+ regardless of the balancing settings
1260+ * improved rendering precision: z-fighting artefact are now uncommon,
1261+ and at the same time early clipping on the near clipping plane
1262+
1263+#### Changes since 0.2.pre:
1264+ * got rid of "zombie" players
1265+ * corrected team messages
1266+ * fixed chatting
1267+ * fixed 32 bit rendering
1268+
1269+#### Changes since 0.1.4.9:
1270+ * it is now possible for players to form teams
1271+ * explosion now can blow holes in player walls
1272+ * delay added to wall disappearance after death
1273+ * finite wall length supported for snake-style gameplay
1274+ * arena size and game speed configurable in the menu
1275+ * the AI has been greatly improved
1276+ * there is an Internet master server active
1277+ * support for localization has been added, currently featuring
1278+ English and German
1279+ * AI players now have names
1280+ * the moviepack title screen is displayed
1281+ * Linux version: easier system-wide installation with RPM packages
1282+ or "make install"
1283+
1284
1285=== added file 'CHANGELOG_FROZEN.md'
1286--- CHANGELOG_FROZEN.md 1970-01-01 00:00:00 +0000
1287+++ CHANGELOG_FROZEN.md 2020-07-03 06:03:19 +0000
1288@@ -0,0 +1,792 @@
1289+##### Changes on the 0.2.9 branch
1290+
1291+ * Added detection and reaction code for timing assist bots
1292+ * /shuffle now works before you actually join a team
1293+ * Implemented /shout command and associated settings
1294+ * Fixed suspension and silenced status not being re-applied after a player
1295+ disconnects and rejoins a server.
1296+ * Tweaks to enemy influence system.
1297+ * Ingame menu and console now are drawn on top of a semi-transparent,
1298+ darkened area for increased readability.
1299+ * New first start menu with clearer language selection and initial setup.
1300+ * Tutorial match against one AI at slower speed.
1301+ * Tutorial tooltips for the most important keybindings.
1302+ * ADD_MASTER_SERVER command to announce a server to a new master server.
1303+ Simplifies the process to list your server on a subculture.
1304+ * Team launch positions logged to ladderlog with POSITIONS event. Disabled by
1305+ default.
1306+ * New command-line option "--input" added to poll for input from a file
1307+ instead of stdin.
1308+ * Added WHITELIST_ENEMIES_[IP/USERNAME] to allow players to be enemies, even
1309+ if they come from the same IP address and ALLOW_ENEMIES_SAME_IP is
1310+ disabled (which is its default setting).
1311+ * GAME_END, NEW_MATCH, and NEW_ROUND ladderlog events include date and time.
1312+ * Added ENCODING ladderlog event, which specifies the encoding for data in
1313+ ladderlog.txt.
1314+ * "--input" now can be used more than once to read from multiple files or pipes.
1315+ * new team management ladderlog messages:
1316+ TEAM_CREATED <team name>
1317+ TEAM_DESTROYED <team name>
1318+ TEAM_RENAMED <old team name> <new team name>
1319+ TEAM_PLAYER_ADDED <team name> <player>
1320+ TEAM_PLAYER_REMOVED <team name> <player>
1321+ * Manage external scripts on Unix dedicated servers. New commands:
1322+ SPAWN_SCRIPT, RESPAWN_SCRIPT, FORCE_RESPAWN_SCRIPT, KILL_SCRIPT,
1323+ LIST_SCRIPTS, SCRIPT_ENV.
1324+ * New setting ACCESS_LEVEL_ANNOUNCE_LOGIN that determines if a player's
1325+ login/logout message can be announced.
1326+ * Authentication is now enabled by default.
1327+
1328+#### Changes since 0.2.8.3.4:
1329+
1330+ * Security fix: Check that the remote is allowed to create an object
1331+ before creating it, not decide whether it gets to keep it after
1332+ it already has been created and potential damage has been done.
1333+ No arbitrary code could be executed, but a client could effectively
1334+ shut down a server by sending crucial objects, such as the main game
1335+ timer or the game itself.
1336+ * Compilation fixes for current systems.
1337+
1338+#### Changes since 0.2.8.3.3:
1339+
1340+ * Eliminated undefined behavior that was fine in gcc 5, but now
1341+ (rightfully!) turned into crashes in gcc 6.
1342+ * Eliminated compilation disambiguity that was just causing a mild
1343+ performance degradation in gcc 5 and is now a compilation failure in
1344+ gcc 6.
1345+
1346+#### Changes since 0.2.8.3.2:
1347+
1348+ * security fix: do not read ahead of the beginning of network buffer.
1349+ * security fix: don't attribute network errors from processing random
1350+ packets to the connection to the server
1351+ * security fix: while at it, don't process random packets unless they
1352+ may be important
1353+ * fix for potential crash with friend list filtering
1354+ * intel driver compatibility
1355+ * fix for rare crash with sound lock
1356+ * fix for camera turning for bizarre axis configurations
1357+
1358+#### Changes since 0.2.8.3.1:
1359+
1360+ * security fix: old style action commands from clients no loger cause hangs and crashes
1361+ * security fix: oversized packets are ignored properly
1362+ * security fix: never read one byte outside of the received buffer
1363+ * security fix: only include .cfg files from the var subfolder
1364+ * compiler compatibility: adapted to gcc 4.60
1365+ * smaller spelling fixes
1366+ * FOV calculations now correct for widescreen and horizontal splitscreen
1367+ * Additional checks against illegal values passed to renderer
1368+
1369+#### Changes since 0.2.8.3:
1370+
1371+ * fixed temporary sound disappearance when alt-tabbing away and back
1372+ * default subcultures are now distributed
1373+ * enable 32 bit color depth at desktop resolution
1374+ * no more display lists for SiS cards
1375+ * spelling mistakes and missing German translations
1376+
1377+#### Changes since 0.2.8.3_rc4:
1378+
1379+ * New setting: KEEP_PLAYER_SLOT allows the server to kick (preferably) spectators
1380+ if it gets full so there is always one slot open for players
1381+ * New setting: ACCESS_LEVEL_AUTOKICK_IMMUNITY sets the access level required
1382+ to be immune from such kicks (and idle autokicks, too)
1383+ * Intercepted chat commands are now written to ladderlog.txt. Format:
1384+ COMMAND /command-intercepted player [command arguments]
1385+ * Increased default speed of server pinging
1386+ * Reordered game menus a bit
1387+ * fast finish works again
1388+
1389+#### Changes since 0.2.8.3_rc3:
1390+
1391+ * Pinging previously popular servers earlier for quicker server
1392+ browsing
1393+ * Improved master server random polling, the second polled master now
1394+ also is random, and all masters are polled if need be
1395+ * Custom camera snaps to cycle direction once when activated if the turn speed
1396+ is zero.
1397+ * RESERVE_SCREEN_NAME now works regardless of the ALLOW_IMPOSTOR setting.
1398+ * USER_LEVEL now escapes the given authenticated name so you don't have to
1399+ guess the escaping rules. Ex: USER_LEVEL "name with spaces@forums" 2
1400+ changes user level for name\_with\_spaces@forums
1401+
1402+#### Changes since 0.2.8.3_rc2:
1403+
1404+ * Fixed crash with server polling
1405+ * ROUND_WINNER and MATCH_WINNER ladderlog events now include the players of
1406+ the team.
1407+ * Camera switches to user preferred camera when you die in incam mode
1408+ * Better support for custom language files
1409+ * Players can no longer spam chat with /shuffle messages. Added new setting
1410+ SHUFFLE_SPAM_MESSAGES_PER_ROUND, a per round, per player limit on the number
1411+ of shuffle messages displayed.
1412+
1413+#### Changes since 0.2.8.3_rc1:
1414+
1415+ * Fixed dark color filters, such as FILTER_DARK_COLOR_STRINGS, to not filter
1416+ the reset color.
1417+ * ASE moviepack models no longer have a vertex count limit
1418+ * Fixed endless recursion crash between rounds
1419+
1420+#### Changes since 0.2.8.3_beta3:
1421+
1422+ * Chat prefix spam protection. Guards against prefix spam, such as when a
1423+ user always changes their chat message color, or prefixes all messages
1424+ with a clan tag. Toggle with the PREFIX_SPAM_ENABLE setting.
1425+ * Fixed VOTING_MATURITY to use the time when the player entered as its
1426+ reference time.
1427+ * Fixed single player highscore list not containing everyone.
1428+ * Fixed generation of duplicate names in highscore lists.
1429+ * Fixed camera crash when the grid is empty.
1430+
1431+#### Changes since 0.2.8.3_beta2:
1432+ * Fixed 'invincibility' bug. It really was cycles freezing in time.
1433+ * Fixed sporadic sound related crash at round end.
1434+ * setting rename: SILENCE_ALL -> SILENCE_DEFAULT.
1435+ * Sound no longer gets muted after you switch the sound settings.
1436+ * Fixed object collision detection that would sometimes pick a wrong
1437+ wall to collide with, most likely the reason behind wrongly accredited
1438+ kills.
1439+ * Fixed inability to switch viewport assignment in four player mode.
1440+ * Better handling of lag clusterbombs.
1441+ * Server disconnects now also take immediate effect even when you're
1442+ in a menu or chatting.
1443+
1444+#### Changes since 0.2.8.3_beta1:
1445+ * Made ready for Armatrators
1446+ * Authentication routines now use utf8 as forward- compatibility with
1447+ trunk. Previously, non-ASCII usernames simply didn't work at all.
1448+ * Better lag slide protection: clients no longer get confused when
1449+ the server sends their cycle back in time, and the server no longer
1450+ does that for old clients.
1451+ * Fixed rare wallpassing bug; it required what whould usually be an
1452+ instakill and infinte wall length.
1453+
1454+#### Changes since 0.2.8.2:
1455+
1456+New settings and commands:
1457+
1458+ * MIN_PLAY_TIME_*: minimal play time required before you are allowed to
1459+ play on this server.
1460+ * SPAM_AUTOKICK_COUNT: minimal number of spam warning messages you get in a
1461+ row before you get kicked.
1462+ * FORTRESS_COLLAPSE_SPEED: tune the collapse speed of fortress zones.
1463+ * VOTE_KICK_REASON: default reason given on kick votes.
1464+ * "/vote" chat interface to votes; "/vote kick <player>" issues a kick vote.
1465+ * new vote type "/vote suspend <player>" suspends a player for
1466+ VOTING_SUSPEND_ROUNDS rounds.
1467+ * new vote type "/vote include <file>", includes configuration file
1468+ vote/<file>.
1469+ * new vote type "/vote command <command>" executes console command
1470+ <command>. (Both that and /vote include are by default only available
1471+ to moderators).
1472+ * VOTING_HARM_TIME: time between all harmful votes against a player
1473+ * VOTING_KICK_MINHARM: auto-transform the first few menu issued kick
1474+ votes to suspensions
1475+ * (UN)SUSPEND kicks a player to spectator mode with a timeout. Intended to
1476+ let new players watch before they play.
1477+ * VOTES_CANCEL cancels all running polls.
1478+ * VOTING_SUSPEND [<minutes>] disallows voting during a specified amount of time.
1479+ * ZONE_ALPHA_TOGGLE to override the systemwide alpha blendings setting and
1480+ have zones rendered in wireframe mode even when alpha blending is on.
1481+ * ZONE_ALPHA(_SERVER) to control intensity of zone rendering.
1482+ * SCORE_HOLE for awarding sacrifice.
1483+ * SCORE_SURVIVE for player survival and FORTRESS_HELD_SCORE for not losing
1484+ each fortress zone.
1485+ * KICK_TO and MOVE_TO: redirect a client to a different server
1486+ * DEFAULT_KICK(_TO)_MESSAGE: default reason given to players for a kick
1487+ * DEFAULT_KICK_TO_SERVER/PORT: default redirection target for KICK/MOVE_TO.
1488+ * RENAME renames a player.
1489+ * If all clients support it, PING_CHARITY_MIN/MAX can be used to constrain ping charity.
1490+ * VOTE_KICK_TO_SERVER/PORT: redirection target for vote kicks.
1491+ * SILENCE and VOICE allow to control chat of annoying players.
1492+ * SILENCE_ALL can be used on the server to inhibit all cross-team communication unless specifically voiced.
1493+ * ENABLE_CHAT can be set to 0 to disable all chat. If it is set on the server it only disables public chat and logged in players can still speak.
1494+ * LAG_*: controls game level lag compensation.
1495+ * FILTER_NAME_MIDDLE: collapses multiple whitespaces to one in player names.
1496+ * FORTRESS_CONQEST_TIMEOUT: if an enemy contact with a zone happens longer ago than
1497+ this value, it is discarded from zone memory.
1498+ * TOPOLOGY_POLICE_PARALLEL, extra topology police flag to control the checks
1499+ for walls getting copied into the grid in exactly the same place.
1500+ * CAMERA_GLANCE_*: separate settings for the glancing camera, work like CAMERA_CUSTOM_*.
1501+ Likewise, CAMERA_SERVER_GLANCE_* can replace CAMERA_SERVER_CUSTOM_* when glancing.
1502+ CAMERA_*CUSTOM_GLANCE* are server side settings that can control whether server or
1503+ clientside settings are used in various situations, see settings.cfg for details.
1504+ * CYCLE_BOOST_? and CYCLE_BOOSTFACTOR_? for boosts when breaking away from walls,
1505+ see settings.cfg or config.html for details
1506+ * CYCLE_ACCEL_TUNNEL, works like CYCLE_ACCEL_SLINGSHOT, but is active when
1507+ none of the two walls you're in between is your own.
1508+ * CYCLE_WIDTH for making it impossible to squeeze through tight tunnels,
1509+ see settings.cfg for details
1510+ * VOTING_MATURITY controls how long you have to wait after login before
1511+ you can issue kick votes.
1512+ * CYCLE_DELAY_DOUBLEBIND_BONUS is an extra factor applied to CYCLE_DELAY
1513+ for turns in the same direction. Can be used to limit the advantage
1514+ doublebinders get while not punishing players who press both left and
1515+ right at the same time.
1516+ * LAG_O_METER_(TRESHOLD|BLEND|USE_OLD): Configure the minimal size of the
1517+ Lag-O-Meter, its color and whether to scrap it all and stick with the old
1518+ one.
1519+ * ALLOW_TEAM_CHANGE: if set to 0 players won't be able to join a team, create
1520+ a new team or change to another team.
1521+ * ALLOW_TEAM_CHANGE_PLAYER/DISALLOW_TEAM_CHANGE_PLAYER: allow/disallow specific
1522+ players to switch teams
1523+ * INTERCEPT_COMMANDS is a space-delimited list of chat commands that shall be
1524+ intercepted by an external script. Example value: /login /admin /teamleave
1525+ /teamshuffle /shuffle /team
1526+ * INTERCEPT_UNKNOWN_COMMANDS is a boolean specifying if an external script
1527+ wishes to handle unrecognized chat commands. This would allow hooking
1528+ arbitrary things like /foobarz or /mode ctf
1529+ * CONSOLE_LADDER_LOG boolean places the ladderlog on stdout prefixed with
1530+ "[L] "
1531+ * PLAYER_MESSAGE <user ID or name> <Message>: Like /msg, but from the
1532+ console
1533+ * All ladderlog outputs can be enabled or disabled separately by using
1534+ LADDERLOG_WRITE_*. LADDERLOG_WRITE_ALL enables or disables all ladderlog
1535+ output alltogether.
1536+ * CHAT_LOG controls whether to write a machine-readable chatlog to
1537+ var/chatlog.txt
1538+ * CONSOLE_DECORATE_TIMESTAMP write a timestamp for every console message?
1539+ * LADDERLOG_DECORATE_TIMESTAMP prefix every ladderlog message with a timestamp?
1540+ * SLAP <player> [points] sends a message to everyone and subtracts a number
1541+ of points (default: 1) from <player>'s score. Negative points are
1542+ supported.
1543+ * AUTO_TEAM_SPEC_SPAM to disable the spectator join/leave messages you get
1544+ when AUTO_TEAM is enabled
1545+
1546+If --enable-armathentication was activated:
1547+
1548+ * /lock, /unlock, /invite and /uninvite team management chat for players of
1549+ access level ACCESS_LEVEL_TEAM or better.
1550+ * /teams chat command that rougly prints team layout.
1551+ * ACCESS_LEVEL_IPS to let admins see IPs of players in the list.
1552+ * ACCESS_LEVEL_SPY_MSG/TEAM to let admins spy on team/private messages.
1553+ * CASACL to temporarily raise the access level
1554+ * ACCESS_LEVEL to modify the required access level to change settings
1555+ * AUTHORITY_WHITELIST and AUTHORITY_BLACKLIST to filter authorities you want on your server.
1556+ * GLOBAL_ID_ENABLED to toggle remote accounts
1557+ * LOCAL_USER, LOCAL_TEAM for local login accounts
1558+ * MD5_PREFIX/MD5_SUFFIX for additional password scrambling
1559+ * USER_LEVEL to grant users various access levels
1560+ * RESERVE_SCREEN_NAME to reserve a screen name to a certain player
1561+ * USER_ALIAS to bend authentication names around
1562+ * (UN)BAN_USER to ban really stupid users based on their global user ID,
1563+ BAN_USER_LIST to show a list.
1564+ * ACCESS_LEVEL_OP/ADMIN/CHAT/PLAY/PLAY_SLIDING to control who can do which things
1565+ * /login chat command then uses the more secure hashed base logins
1566+ * new chat commands /op and /deop to change other players' access rights
1567+
1568+Featurelets:
1569+
1570+ * Added Polish language file
1571+ * clientside play time tracking and server controlled minimal required experience
1572+ to be allowed to play.
1573+ * color codes in chat increase the spam level logarithmically.
1574+ * /team messages get a reduced spam level; reduction factor is given by
1575+ (team size)/(number of total players).
1576+ * /team messages can be used by spectators to chat with other spectators only.
1577+ * Performance optimizations. Using OpenGL display lists to cache geometry.
1578+ * Removed ztrick, antialiasing and perspective correction settings. They all had only one right
1579+ setting and caused us some interesting bug reports.
1580+ * Added PLAYER_RANDOM_COLOR for lazy people who just want to have a
1581+ color that differs from everyone else on the server.
1582+ * Configuration files get reloaded on SIGHUP
1583+ * all admin commands now also accept partial name matches, like /msg, and check for case sensitive
1584+ matches in the screen name first, then the user name, then case insensitive matches in the two.
1585+ * --enable-krawallserver has been actually implemented now, and it enables secure logins
1586+ to accounts local to the server and not-so-secure logins managed by authentication servers.
1587+ * A subculture list for server groups that are not managed by our main master servers
1588+ * A friends list and filter for the server browser that shows you only servers with
1589+ your friends on them.
1590+ * The client now can handle network traffic while it is waiting for the graphics
1591+ card to swap buffers.
1592+ * The dedicated server no longer uses a fixed delay, but a select() call (that
1593+ returns when network data arrives) to idle. When data arrives, it does
1594+ the minimum amount of work before it sends out the responses, resulting in
1595+ lower latency. It is now safe to decrease DEDICATED_FPS to 20 or 10, latency
1596+ is no longer influenced by that setting.
1597+ * Game level lag compensation. When a command arrives from a client that is delayed,
1598+ it is backdated to the time it was issued, provided enough "lag credit" is left.
1599+ The client is informed of the delay so it can compensate in the future, which it does
1600+ by forging the game timer.
1601+ * Nonnormalized axes and axes with odd turning directions are now properly supported
1602+ * The camera has a memory which player you like to watch. Every time you manually switch
1603+ the camera and your favorite player is not dead, the favorite is set to the currently
1604+ watched player. The next time the camera doesn't know what to watch, your favorite
1605+ will be selected.
1606+ * Players leaving to spectator mode with <0.2.8.2 clients are handled like
1607+ spectators of 0.2.8.2 clients: they stay visible to the others.
1608+ * Kick statistics are now persistent across server runs.
1609+ * MESSAGE_OF_DAY is now displayed fullscreen if both server and client support it
1610+ * Manual fullscreen messages can be triggered with
1611+ FULLSCREEN_MESSAGE <timeout> <message content>
1612+ * Axes Indicators by meriton, can be enabled using the AXES_INDICATORS
1613+ setting.
1614+ * New "About" menu item in the main menu displays the version of
1615+ Armagetron Advanced, the paths it uses, links to the main site, wiki
1616+ and forums and the names of the project admins.
1617+ * New entries in ladderlog.txt:
1618+ - GAME_TIME <time> (only if enabled via the LADDERLOG_GAME_TIME_INTERVAL
1619+ setting): The time that has passed since the last start of a round
1620+ - BASEZONE_CONQUERED <team> <x> <y>: A fortress zone belonging to <team>
1621+ at the coordinates (<x>, <y>) has been conquered
1622+ - BASEZONE_CONQUERER <player>: at the time of the last BASEZONE_CONQUERED
1623+ message, <player> has been in the conquered zone
1624+ - ONLINE_PLAYER <player> [<ping [<team>]]: At the beginning of the round,
1625+ <player> had <ping> and was on <team>. This line is not printed for bots
1626+ - NUM_HUMANS <n>: There are <n> players that are not AIs and are part of a
1627+ team.
1628+ - ROUND_SCORE has the player's team name appended.
1629+ - ROUND_SCORE_TEAM: score a team accumulated during the last round.
1630+ - WAIT_FOR_EXTENAL_SCRIPT: printed if the setting of the same name is
1631+ enabled. In this case the server will delay the start of the next round
1632+ until WAIT_FOR_EXTENAL_SCRIPT_TIMEOUT is reached or the setting is
1633+ disabled.
1634+ * Wrapped console lines are indented by an amount of spaces that can be
1635+ specified using the setting CONSOLE_INDENT.
1636+ * /help command that supports multiple help topics. Use
1637+ HELP_INTRODUCTORY_BLURB and ADD_HELP_TOPIC to control its contents
1638+ * /rtfm command that allows moderators to send help messages to newbies
1639+ * /players now shows the players' color and allows searching
1640+ * TEAM_ELIMINATION_MODE sets the way ArmagetronAd removes teams when there's too much teams.
1641+
1642+Bugfixes:
1643+
1644+ * Added compensation for drifting timers (observed often with
1645+ overclocked mainboards)
1646+ * Text input fields now let the text wrap correctly and make use of the space allocated
1647+ for them in a not-completely-dumb way. And *sigh* depending on the text field, color
1648+ codes are either ignored (for the usernames) or both displayed in text and rendered.
1649+ * "KICK 2pack" no longer kicks user 2 instead of player 2pack.
1650+ * Fixed various trail end related extrapolation/simulation inaccuracies that looked
1651+ like lag.
1652+ * When extrapolating, the game's sensors never detected own or teammates' walls,
1653+ it mistook them for enemy walls.
1654+ * The acceleration and boost system always used settings for enemy walls instead of
1655+ settings for team players' walls. That means that old clients connecting to a
1656+ 0.2.8.3+ server that has CYCLE_ACCEL_ENEMY and CYCLE_ACCEL_TEAM set to different
1657+ values experience syncing problems. The default behavior therefore is to lock 0.2.8.2
1658+ and earlier out of your server if you set one of them away from the default.
1659+ If you want to set both accelerations away from the default, but to the same value,
1660+ there won't be a compatibility problem; in that case, set CYCLE_ACCEL_ENEMY_OVERRIDE
1661+ and CYCLE_ACCEL_TEAM_OVERRIDE to 0 and old clients will be allowed in. However, you
1662+ should manually lock out players with 0.2.7 clients, for example by modifying
1663+ CYCLE_ACCEL_RIM a tiny bit.
1664+ * "Team Red" bug. If the server allows maximally two teams, no team ever
1665+ gets to be Team Red.
1666+ * Phasing made even more difficult; nice side effect of the fix is
1667+ reduced network bandwidth usage.
1668+ * Speed gauge resets between rounds.
1669+ * More accurate Lag-O-Meter by meriton.
1670+ * Zones were sometimes invisible.
1671+
1672+Internals:
1673+
1674+ * A complete netsync cycle is now sn_Receive(); nNetObject::SyncAll(); sn_SendPlanned();.
1675+ * Ping charity is now completely server controlled.
1676+
1677+#### Changes since 0.2.8.1:
1678+ * Timestamps and teamscores added to scorelog.txt
1679+ * Dedicated server now works on FreeBSD and OpenBSD
1680+ * User running the dedicated server is called "armagetronad" again, the
1681+ longer "armagetronad-dedicated" caused problems with BSD
1682+ * Test versions refuse to connect to servers more than one version ahead
1683+ * Prepared client for respawns
1684+ * Team spawn formation is now configurable
1685+ * Added reasons to bans
1686+ * Added spectator autokicking
1687+ * Added history to chat and console (wrtlprnft). Press "Cursor up" to
1688+ edit and repeat previous chats and console commands.
1689+ * You only enter a game once your client is synced
1690+ * /msg now prefers exact matches over partial matches
1691+ * Cycles now have better memory for pending turns (wrtlprnft)
1692+ * Added player join/leave/rename messages to ladderlog.txt with IPs
1693+ * Ping variance influence on packet loss tolerance code is now clamped
1694+ by the regular, configurable, packet loss tolerance: effect of variance
1695+ can be no bigger than the effect of ping.
1696+ * Spectators are now regular players and can chat
1697+ * The /msg command now converts the entered pattern into the internal
1698+ name so if you write "/msg öäü" and there is a user named "öäü" with
1699+ an internal nick of "oau" it will still get matched
1700+ * Team changes are now only executed when allowed, the need for the
1701+ temporary/permanent team imbalance setting distinction has gone away
1702+ * Added brake toggle button
1703+ Bugfixes:
1704+ * Client sometimes crashed when leaving a server with AIs on over the menu
1705+ * The server starting scripts were chowning /var/run and /var/log to armagetronad
1706+ * Short names could crash the server
1707+ * Direct cycle collisions sometimes lead to both passing trough each other
1708+ * Init scripts now installed correctly with --enable-initscripts
1709+ * Hopeless pending team change wishes are deleted
1710+ * Large timesteps are now broken down into smaller ones on the game level
1711+ * Pretend keys are released before entering chat
1712+ * Two cycle steering events were sent if you doublebound the brake
1713+ * Large speed boosts out of game rule bounds were possible during network
1714+ glitches
1715+ * Debug recording reliability increased, function call with undefined return
1716+ value eliminated
1717+ * Recording and scorekeeping no longer conflict
1718+ * Input during a recording now has an end marker, making quick keypresses
1719+ after leaving a menu not break it
1720+ * CYCLE_RUBBER_DELAY was overridden sometimes by packet loss tolerance
1721+ * ALLOW_CONTROL_DURING_CHAT now ignores modifier keys like shift and
1722+ has been reactivated
1723+ * The camera sometimes got stuck in free mode for the first round you watch
1724+ * Crashfix in hole blowing code when no cycle was set
1725+ * After a "perfect" 180, you're more often on the right side of your own wall
1726+ That code caused some havoc at first, so it has been reworked
1727+ * The smart cam did not like fluctuating framerates
1728+ * Improved debug recording reliability: multiple master server visits
1729+ and too quick keypresses were causing trouble.
1730+ * Canonical DESTDIR support and added ROOTDIR support for testing
1731+ * Login floods are detected and ignored
1732+ * Player name updates sanitized
1733+ * Disabled complicated feasibility tests for team menu entries,
1734+ they did not have the full information and were often wrong
1735+ * Team score only added to player score if no teamplay is possible
1736+
1737+#### Changes since 0.2.8.0:
1738+ * INCLUDE console command now gives a file not found error
1739+ * ALL user given paths are validated for security problems in a special function
1740+ * Fallback to default map on map load failure works again (broken sine 0.2.8.0_rc4)
1741+
1742+#### Changes since 0.2.8.0_rc4:
1743+Bugfixes:
1744+
1745+ * SECURITY FIX: via a MAP_FILE path with included .., it was possible
1746+ to write files anywhere, provided they did not exist previously.
1747+ Clients with this vulnerability are locked out of the server now.
1748+ * ALLOW_CONTROL_DURING_CHAT has been disabled for now.
1749+ * Another connection termination bug.
1750+
1751+#### Changes since 0.2.8.0_rc3:
1752+ * Added spectator mode toggle key.
1753+ * Thresholds when a white background bar is rendered behind texts is
1754+ now configurable in the expert section of settings.cfg.
1755+ * Ingame menu trigger key is configurable now, only ESC stays hardcoded.
1756+ * The map parser checks whether the map is stored at the right location.
1757+ * Map validation errors are now visible on the client.
1758+ * Made magic numbers used by the smart camera configurable for user tweaking.
1759+ This is undocumented and unsupported.
1760+ * The server browser now shows a B beside the score to mark bookmarked servers.
1761+ Bugfixes:
1762+ * -Os compile option is filtered out if GCC 3.3 is used, it makes the build go bad.
1763+ * Extremely low values of CYCLE_DELAY were not honored, an arbitrary delay of .005s
1764+ was added to it.
1765+ * On entering a server, the camera would sometimes be stuck in free mode.
1766+
1767+#### Changes since 0.2.8.0_rc2:
1768+ * Almost final artwork
1769+ * Moviepacks can now also contain texture replacements for the default cycle model
1770+ * Added number of teammates alive to HUD
1771+ Bugfixes:
1772+ * Dual textured floor rendering is now disabled without alpha blending as it
1773+ did not work anyway.
1774+ * Lag-O-Meter now has the correct size (the old, buggy one can be restored by
1775+ setting LAG_O_METER_SCALE to .5).
1776+ * The network system made some IDs randomly unusable, causing zombie
1777+ cycles, invisible walls and disconnections.
1778+ * The AI Team from a previous local game session was sometimes still visible
1779+ on the score table in the following network game on a remote server.
1780+ * The server did not start a new match when temporarily, only spectators were online.
1781+ * Player walls were rendered twice.
1782+ * The server wrote console center messages to stderr.
1783+ * UNBAN_IP did not work at all.
1784+ * The code that should kill a cycle in performance/DOS protection
1785+ circumstances just crashed.
1786+
1787+#### Changes since 0.2.8.0_rc1:
1788+ * Bugfixes:
1789+ - Dedicated server for Windows works again.
1790+ - Cycle turns are now executed more accurately on the server.
1791+ - Timer stuttering at end of round (was non-critical, but ugly).
1792+ - Custom camera did not turn when the internal camera was
1793+ configured not to turn.
1794+ - Idle player kick code crashed when it kicked a client with
1795+ many players.
1796+ - The code that removes inactive players after a while removed
1797+ the AI players.
1798+ * Reverted smart camera movement to pre-beta4 behavior,
1799+ the new code made some players seasick :)
1800+ * Ingame admin interface gives more useful information to the invoker
1801+ * Small font rendering improvements
1802+ * Zone conquest message, if it is not the one that ends the round,
1803+ now states the name of the zone owning team.
1804+
1805+#### Changes since 0.2.8_beta4.2:
1806+ * Fixed bugs:
1807+ - Random client disconnection
1808+ - Another vote-not-appearing-on-client bug
1809+ - Invisible wall segments right after turn
1810+ - Arena initialization before all settings are transmitted from the server
1811+ - The server was using more rubber than the client sometimes
1812+ - Crash with moviepack and some maps
1813+ - Object sync messages not accepted by client in second network session
1814+ * Improved kill/suicide/team kill distinction (ENEMY_* settings)
1815+ * Chatbots and idle players can be removed from the game and kicked
1816+ (CHATTER/IDLE_REMOVE_TIME,IDLE_KICK_TIME)
1817+ * Players/team leaders can pause the game before a rond starts (PLAYER_CHAT_WAIT*)
1818+ * Color codes can be filtered from player names (FILTER_COLOR_NAMES)
1819+ * New machine readable log file: ladderlog.txt
1820+ * Configurable and better core dump/team kill/suicide distinction algorithm
1821+ * Unknown settings are recognized now in configuration files
1822+ * All global key bindings (Grab mouse, pause and texture reload were left)
1823+ are now configurable
1824+ * Player listing length limit adjusted so two teams/16 players fits on screen
1825+ * Less verbose upgrade warning messages
1826+ * Imposters can get a non-conflicting name (ALLOW_IMPOST[EO]RS)
1827+
1828+#### Changes since 0.2.8_beta4:
1829+ * Fixed bugs:
1830+ - Windows version had a memory overwrite error causing crashes and weird behavior.
1831+ - The game quit when the chat key and a key bound to an instant chat were pressed to quickly.
1832+ - Votes expired too early on the client.
1833+ - Performance: a lot of unused temporary walls were hanging around each round.
1834+ - Cycles sometimes warped to odd locations.
1835+ * Tweaked smart camera to not stay in front of the cycle so much.
1836+ - Tweaked smart camera custom glancing.
1837+ Report back whether you like or hate it!
1838+ * Made custom camera even more configurable, changed default settings.
1839+ (old ones are still in settings.cfg)
1840+ * Forced glancing end on cycle turn now looks better.
1841+ * FOV settings now deal better with wide screens/splitscreen mode.
1842+ * Increased ping measurements again by adding the fluctuations. The raw
1843+ average ping caused the game logic to be too picky.
1844+
1845+#### Changes since 0.2.8_beta3:
1846+ * Famous fixed bugs:
1847+ - Random huge felt lag or blank screen (it was actually a problem with the timer) is gone.
1848+ - Bogus "possible phase bug" message.
1849+ - Seemingly random walls popping out of nothing, only to disappear a second later.
1850+ - Random camera focus changes while you were still alive.
1851+ - Every 100th console line got deleted.
1852+ * Reduced pings! Actually, just the measurement is improved, the actual latency
1853+ stays the same. I hope nobody notices that. Good thing nobody reads NEWS files :)
1854+ * New text editing convenience: Home and end keys work, and CTRL+left/right/del/backspace
1855+ work on whole words. Thanks, Nemo!
1856+ * New instant chat functions: There are now 25 instant chat strings. If an instant
1857+ chat string ends in a \, it will not be sent immediately, it's opened to be edited by you.
1858+ Pressing an instant chat key while already chatting will insert the string, provided the
1859+ key does not produce a regular character.
1860+ * If enabled by the server administrator: control your cycle while you chat.
1861+ * Turning speed of custom and internal camera can be adjusted with CAMERA_CUSTOM_TURN_SPEED
1862+ and CAMERA_IN_TURN_SPEED.
1863+ * The custom camera zooms out from a closeup at round start. Useful to see your position
1864+ in your team. Configurable with CAMERA_CUSTOM_ZOOM.
1865+ * Master server redundancy enabled. Thanks to Lucifer for hosting the backup master!
1866+
1867+#### Changes since 0.2.8_beta2:
1868+ * More bugfixes: most annoying was the crash/infinite loop a server got in when
1869+ the master server was unreachable
1870+ * Added zones to map specification
1871+ * Reworked top level map format (sorry to the map makers for the inconvenience)
1872+ * Windows: added start menu entries that open the system and user data directories
1873+ * Bandwidth limitation now works. That means if you lowered the bandwidth
1874+ limits in the network setup, they were not respected. You probably should
1875+ readjust them.
1876+
1877+#### Changes since 0.2.8_beta1:
1878+ * bugfixes, of course
1879+ * added recording and playback startmenu entries for Windows
1880+ * abuse prevention: added IP banning, player number per IP and client limit,
1881+ doublebinding can be crippled on server command
1882+
1883+#### Changes since 0.2.7.1:
1884+ * Server side cycle synchronization issues fixed:
1885+ - destination removal fixed
1886+ - lag sliding caused by different interpretation of grinding turn commands on client and server fixed
1887+ - niceness for older clients: sync interval decreased, no sync in front of wall to prevent local tunneling
1888+ * Client side cycle synchronization issues fixed:
1889+ - smooth corrections now only affect the appearance, the correct values are used internally
1890+ - sync messages are no longer ignored,
1891+ - new extrapolating sync method implemented,
1892+ - ghosting fixed,
1893+ - wall ends sticking out fixed ( for enemy cycles ),
1894+ - the sophisticated distance based sync code implemented years ago is now actually used, oh dear.
1895+ * Performance improvements:
1896+ - netobject synchronization does no longer traverse all netobjects
1897+ - disabled gameobject-gameobject interaction
1898+ * added support for nonorthogonal driving directions
1899+ * added support for debug recording and playback
1900+ * switched to using automake
1901+
1902+#### Changes since 0.2.7.0:
1903+ * Fixed security issues: fake message ID crash, fake peer ID crash ( both
1904+ maybe could be used to execute arbitrary code ), fake logout exploit, fake
1905+ connections DOS attack
1906+ * The feared "left grid" error message has been replaced by recovery code
1907+ * Fixed transfer of infinite floats over the network
1908+ * Fixed network timer inaccuracies on long running servers
1909+ * Fixed rip bug ( for those who like it: search and you will find )
1910+ * Fixed wall bending ( there is still some wall bending left, but it will be
1911+ too small to notice )
1912+ * Fixed tunneling bugs ( you were able to move from one side of a wall to the other )
1913+ * Fixed bounce bug ( a small zigzag towards a wall sometimes put you further
1914+ away from it, leaving a hole )
1915+ * Fixed massive reference counting overflow crash caused by repeated close grinding/180ing
1916+ * Made rubber code customizable and frame rate independent ( new CYCLE_RUBBER_
1917+ variables in settings.cfg )
1918+ * For debugging and scripting: dedicated server console messages can be
1919+ decorated with client ID and IP
1920+ * Topology police: facility to catch tunneling issues after they happened. off
1921+ by default
1922+ * Cycle network code is more robust
1923+ * Update frequency of cycle position now configurable and more frequent for
1924+ client's own cycle that the rest by default
1925+ * Corrected rc.d scripts to start the server as a system service
1926+ * Voting more configurable: voters can be made public, spectators can't vote
1927+ any more by default
1928+ * Moviepack floor color fixed
1929+ * Hostname lookup failure fixed
1930+ * "PLAYER_1 nick" console command problems fixed
1931+ * Windows libraries moved out of the main source tree
1932+ * Source code now compatible with 64 bit and gcc 3.4
1933+ * Colored explosions!
1934+ * HUD enhancements: customization, works in splitscreen mode
1935+ * Directory scanning code added ( not yet visible, will be used for
1936+ moviepack/cycle selection )
1937+ * Moviepack sky texture support
1938+ * Master server can now run on windows, too
1939+ * Explosion sound now actually works
1940+
1941+#### Changes since 0.2.6.0:
1942+ * added HUD
1943+ * Winzone may now be a deathzone
1944+
1945+#### Changes since 0.2.5.2:
1946+ * Split custom camera into server defined and client defined custom camera
1947+ * Fixed monster chat message exploit
1948+ * Added local player silencing
1949+ * Added Kick voting
1950+ * Added player names on cycles ( implemented by Christian Reitwiessner )
1951+ * Harsher ( and configurable ) spam protection
1952+ * Fixed strangely bent walls
1953+
1954+#### Changes since 0.2.5.1:
1955+ * Fixed fullscreen toggle while chatting
1956+ * Disabled trilinear filtering for ATI cards by default ( to avoid lockups )
1957+ * Worked around flawy S3 texture storage
1958+ * Fixed crash when trying to change teams in spectator mode
1959+
1960+#### Changes since 0.2.5:
1961+ * Another go at the "11th Round Bug"
1962+ * Player list is now sorted after displayed score ( before: some invisible combination of team score and own score )
1963+ * Fixed brakes when connecting to a 0.2.4 or earlier server
1964+ * Updated FAQ with server setting hints
1965+ * Unified Windows and Unix network code
1966+ * Fixed texture hardware mode
1967+ * Less connection losses
1968+ * Fixed network ID related crash
1969+ * Added player names to information you get from a server
1970+ * Added window-fullscreen toggle key and separate setting of screen resolution/window size
1971+
1972+#### Changes since 0.2.4:
1973+ * Fixed online observer mode switching
1974+ * Fixed command line options
1975+ * Fixed player quit message
1976+ * Fixed AI join message
1977+ * Fixed double registration of some network objects ( had no known visible symptom )
1978+ * Added security checks to see if Armagetron is run correctly
1979+ * Fixed big brother ( reporting of OS, graphic card and version to the master server )
1980+ * Disabled memory manager by default
1981+ * Fixed single player exit game crash
1982+ * Fixed zero length sting receive crash
1983+ * Completed network version control
1984+ * Added timestamps to logfiles ( code fragments by k_at_work )
1985+ * Added reason to login deny/kick messages
1986+ * Fixed 11th round bug ( additional round started after match end )
1987+ * Added --doc command line switch to print offline version of online help
1988+ * Fixed sign of rise/drop highscore messages
1989+ * New console commands: quit/exit ( dedicated server only ), kick <player name>, center_message <message> and console_message <message>
1990+ * New setting item: MAX_CLIENTS
1991+ * Improved server browser, less skipping around
1992+ * Added instant win zone
1993+ * Cycle brake is now of limited duration
1994+
1995+#### Changes since 0.2.3:
1996+ * Fixed score display ( really! )
1997+ * Fixed freestyle mode round counting
1998+ * Fixed server freezer
1999+ * Fixed explosion sync
2000+ * Fixed AI crashes when player leaves in mid-battle
2001+ * Fixed configure script: now really uses sdl-config
2002+ * Speeded up deletion of unreachable servers
2003+ * Fixed endless recursion bug ( "11th player bug" )
2004+ * Moved team start positions further apart
2005+ * Player name is now taken from $USER on first start and player color is randomized
2006+
2007+#### Changes since 0.2.2:
2008+ * Fixed highscores and ladder
2009+ * Delayed score deletion after match end
2010+ * Fixed autoexec.cfg loading
2011+ * More automatic rebuilding
2012+ * Fixed dedicated server idle quitting
2013+ * Fixed auto AI
2014+ * Fixed instant chat
2015+ * Fixed score display for many players or long player names
2016+ * Fixed very rare client crash
2017+ * Fixed not so rare release only crash
2018+ * Fixed balance-related typos
2019+ * Tweaked smart camera so that it works well when braking
2020+ * Fixed finish mode game setting
2021+
2022+#### Changes since 0.2.1:
2023+ * Fixed another connection-loss bug
2024+ * Fixed observer freeze
2025+ * Observers now don't just get kicked when nobody else is online
2026+ * Fixed software renderer detection
2027+ * Updated FAQ
2028+ * Fixed config file loading on some architectures
2029+ * Improved team coloring
2030+ * Fixed stuck brake bug
2031+
2032+#### Changes since 0.2.0:
2033+ * Fixed crash when watching a quitting player
2034+
2035+#### Changes since 0.2.pre4:
2036+ * Fixed crashes
2037+ * Fixed windows network connection problems
2038+ * Fixed clour related problems
2039+ * Added marker for own cycle to avoid confusion in team mode
2040+ * Changed directory placement: configuration resides in /etc/armagetron,
2041+ user configuration in ~/.armagetron/var
2042+ * Data files added to ~/.armagetron/textures ( or /models or /sounds )
2043+ are now loaded in favor of original data, allowing user specific mods
2044+
2045+#### Changes since 0.2.pre3:
2046+ * Fixed some more rare crashes and lockups
2047+ * Fixed team handling: all team change operations now get only active
2048+ on next round address
2049+ * Fixed moviesounds
2050+ * Fixed server-master server communications
2051+ * new installation method: make update ( keeps user configuration )
2052+
2053+#### Changes since 0.2.pre2:
2054+ * Fixed some rare crashes and lockups
2055+ * Improved cycle handling over network
2056+ * It is now allowed to fight with an arbitrary large team against the AI
2057+ regardless of the balancing settings
2058+ * improved rendering precision: z-fighting artefact are now uncommon,
2059+ and at the same time early clipping on the near clipping plane
2060+
2061+#### Changes since 0.2.pre:
2062+ * got rid of "zombie" players
2063+ * corrected team messages
2064+ * fixed chatting
2065+ * fixed 32 bit rendering
2066+
2067+#### Changes since 0.1.4.9:
2068+ * it is now possible for players to form teams
2069+ * explosion now can blow holes in player walls
2070+ * delay added to wall disappearance after death
2071+ * finite wall length supported for snake-style gameplay
2072+ * arena size and game speed configurable in the menu
2073+ * the AI has been greatly improved
2074+ * there is an Internet master server active
2075+ * support for localization has been added, currently featuring
2076+ English and German
2077+ * AI players now have names
2078+ * the moviepack title screen is displayed
2079+ * Linux version: easier system-wide installation with RPM packages
2080+ or "make install"
2081
2082=== added file 'Dockerfile'
2083--- Dockerfile 1970-01-01 00:00:00 +0000
2084+++ Dockerfile 2020-07-03 06:03:19 +0000
2085@@ -0,0 +1,94 @@
2086+ARG BASE_BUILD_SMALL=registry.gitlab.com/armagetronad/armagetronad/armalpine_32:028_0
2087+ARG BASE_BUILD_FULL=registry.gitlab.com/armagetronad/armagetronad/armabuild_64:028_0
2088+ARG BASE_LINUX=i386/alpine:3.7
2089+ARG PROGRAM_NAME=armagetronad-unk
2090+ARG PROGRAM_TITLE="Armagetron UNK"
2091+ARG FAKERELEASE=false
2092+ARG BRANCH=master-fix-unknown-bug
2093+
2094+########################################
2095+
2096+# bootstrap source
2097+FROM ${BASE_BUILD_FULL} AS bootstrap
2098+MAINTAINER Manuel Moos <z-man@users.sf.net>
2099+
2100+ENV SOURCE_DIR /home/docker/armagetronad
2101+ENV BUILD_DIR /home/docker/build
2102+
2103+COPY --chown=docker . ${SOURCE_DIR}
2104+RUN chmod 755 ${SOURCE_DIR}
2105+WORKDIR ${SOURCE_DIR}
2106+# these files are in .dockerignore, but if they're in git, restore them.
2107+RUN test -d .git && git checkout .dockerignore .gitlab-ci.yml Dockerfile
2108+RUN git status
2109+#RUN ./batch/make/version .
2110+#RUN false
2111+RUN test -r configure || ./bootstrap.sh
2112+RUN cat version.m4
2113+#RUN false
2114+
2115+########################################
2116+
2117+# build tarball
2118+FROM bootstrap AS configured
2119+
2120+#ARG PROGRAM_NAME
2121+#ARG PROGRAM_TITLE
2122+ARG FAKERELEASE
2123+ARG BRANCH
2124+
2125+RUN mkdir -p ${BUILD_DIR} && chmod 755 ${BUILD_DIR}
2126+WORKDIR ${BUILD_DIR}
2127+RUN . ../armagetronad/docker/scripts/brand.sh . && ARMAGETRONAD_FAKERELEASE=${FAKERELEASE} ../armagetronad/configure --prefix=/usr/local --disable-glout --disable-sysinstall --disable-desktop progname="${PROGRAM_NAME}" progtitle="${PROGRAM_TITLE}"
2128+RUN make -j$(nproc) dist && make -C docker/build tag.gits
2129+RUN if [ ${FAKERELEASE} = true ]; then cp ../armagetronad/docker/build/fakerelease_proto.sh docker/build/fakerelease.sh; fi
2130+
2131+########################################
2132+
2133+# build server
2134+FROM bootstrap AS build_server
2135+
2136+ARG PROGRAM_NAME
2137+ARG PROGRAM_TITLE
2138+
2139+RUN bash ./configure --prefix=/usr/local --disable-glout --disable-sysinstall --disable-desktop progname="${PROGRAM_NAME}" progtitle="${PROGRAM_TITLE}"
2140+RUN make -j$(nproc)
2141+RUN DESTDIR=/home/docker/destdir make install
2142+
2143+########################################
2144+
2145+# build client
2146+FROM bootstrap AS build_client
2147+
2148+ARG PROGRAM_NAME
2149+ARG PROGRAM_TITLE
2150+
2151+RUN bash ./configure --prefix=/usr/local --disable-sysinstall --disable-desktop progname="${PROGRAM_NAME}" progtitle="${PROGRAM_TITLE}"
2152+RUN make -j$(nproc)
2153+RUN DESTDIR=/home/docker/destdir make install
2154+
2155+########################################
2156+
2157+FROM ${BASE_LINUX} AS run_server_base
2158+MAINTAINER Manuel Moos <z-man@users.sf.net>
2159+
2160+# runtime dependencies
2161+RUN apk add \
2162+boost-thread \
2163+libxml2 \
2164+protobuf \
2165+python \
2166+shadow \
2167+--no-cache
2168+
2169+########################################
2170+
2171+FROM run_server_base AS run_server
2172+MAINTAINER Manuel Moos <z-man@users.sf.net>
2173+
2174+ARG PROGRAM_NAME
2175+
2176+WORKDIR /
2177+COPY --chown=root --from=build_server /home/docker/destdir/ /
2178+RUN sh /usr/local/share/games/${PROGRAM_NAME}-dedicated/scripts/sysinstall install /usr/local
2179+
2180
2181=== modified file 'Makefile.am'
2182--- Makefile.am 2019-07-26 01:01:51 +0000
2183+++ Makefile.am 2020-07-03 06:03:19 +0000
2184@@ -19,7 +19,7 @@
2185
2186 # resource is included as a subdir for the purpose of keeping this makefile short and delegating
2187 # resource management to a more appropriate place anyway
2188-SUBDIRS = src resource batch config desktop
2189+SUBDIRS = src resource batch config desktop docker/build
2190
2191 # special tasks to do if we're building the master server
2192 if BUILDMASTER
2193@@ -80,8 +80,11 @@
2194 # clear SVN
2195 find $(distdir) -depth -name .svn -exec rm -rf \{\} \;
2196
2197-# strip comments from translated files
2198- cd $(distdir)/language; python2 ./update.py --dist
2199+# clear git and bzr
2200+ rm -rf .git .bzr
2201+
2202+# strip comments from translated files
2203+ cd $(distdir)/language; `which python3 python python2 2> /dev/null | head -n 1` ./update.py --dist
2204 # restore timestamps
2205 cd $(distdir)/language; for f in *.txt; do test -r $$f.bak && touch -r $$f.bak $$f; done
2206 rm -f $(distdir)/language/*.bak
2207
2208=== modified file 'Makefile.manual'
2209--- Makefile.manual 2011-11-30 19:48:10 +0000
2210+++ Makefile.manual 2020-07-03 06:03:19 +0000
2211@@ -146,9 +146,7 @@
2212
2213 # make snapshot of SVN state, tracking relevant changes in .changetag
2214 fingerprint: .changetag
2215-# easy, just do svn info, that contains all the information needed. If that fails, try other scms.
2216- svn info ${top_srcdir} > $@ || svk info ${top_srcdir} > $@ || { bzr testament ${top_srcdir}; bzr info ${top_srcdir}; } > $@ || echo "unknown" > $@
2217- svn info `dirname ${top_srcdir}` >> @$ || svn info `dirname ${top_srcdir}` >> $@ || echo "unknown" >> $@
2218+ git -C ${top_srcdir} show HEAD -s > $@ || svn info ${top_srcdir} > $@ || svk info ${top_srcdir} > $@ || { bzr testament ${top_srcdir}; bzr info ${top_srcdir}; } > $@ || echo "unknown" > $@
2219 diff $@ .changetag > /dev/null 2>&1 || cp $@ .changetag
2220
2221 ########################
2222@@ -162,8 +160,8 @@
2223 # Keep the changelog up to date as well (triggered by make dist only)
2224 $(srcdir)/ChangeLog: .changetag
2225 touch $@
2226- @echo -e "\nGenerating ChangeLog from SVN/BZR, please be patient...\n"
2227- cd ${srcdir}; svn log 2>&1 > ChangeLog || bzr log --gnu-changelog 2>&1 > ChangeLog || echo "No official releasse: no changelog" > ChangeLog
2228+ @echo -e "\nGenerating ChangeLog from GIT/BZR, please be patient...\n"
2229+ cd ${srcdir}; git log 2>&1 > ChangeLog || bzr log --gnu-changelog 2>&1 > ChangeLog || echo "No official releasse: no changelog" > ChangeLog
2230 test -r $@ || touch $@
2231
2232 # extra target to make before a real distribution is built
2233
2234=== modified file 'NEWS'
2235--- NEWS 2014-01-13 03:59:54 +0000
2236+++ NEWS 2020-07-03 06:03:19 +0000
2237@@ -1,4 +1,19 @@
2238-Changes since 0.2.8.3.x:
2239+
2240+Changes since 0.2.8.3.5:
2241+
2242+ Fixed Bugs
2243+
2244+- Debian builds: Documentation html files have empty last change (#9)
2245+- Ubuntu PPA release candidate builds would overwrite previous stable releases (#15)
2246+
2247+ New Features
2248+
2249+- Adapt ChangeLog and fingerprint generation to git (#11)
2250+- Integrated build system (#14)
2251+
2252+
2253+ Changes on the 0.2.9 branch
2254+
2255 - Added detection and reaction code for timing assist bots
2256 - /shuffle now works before you actually join a team
2257 - Implemented /shout command and associated settings
2258@@ -36,7 +51,38 @@
2259 login/logout message can be announced.
2260 - Authentication is now enabled by default.
2261
2262+Changes since 0.2.8.3.4:
2263+
2264+- Security fix: Check that the remote is allowed to create an object
2265+ before creating it, not decide whether it gets to keep it after
2266+ it already has been created and potential damage has been done.
2267+ No arbitrary code could be executed, but a client could effectively
2268+ shut down a server by sending crucial objects, such as the main game
2269+ timer or the game itself.
2270+- Compilation fixes for current systems.
2271+
2272+Changes since 0.2.8.3.3:
2273+
2274+- Eliminated undefined behavior that was fine in gcc 5, but now
2275+ (rightfully!) turned into crashes in gcc 6.
2276+- Eliminated compilation disambiguity that was just causing a mild
2277+ performance degradation in gcc 5 and is now a compilation failure in
2278+ gcc 6.
2279+
2280+Changes since 0.2.8.3.2:
2281+
2282+- security fix: do not read ahead of the beginning of network buffer.
2283+- security fix: don't attribute network errors from processing random
2284+ packets to the connection to the server
2285+- security fix: while at it, don't process random packets unless they
2286+ may be important
2287+- fix for potential crash with friend list filtering
2288+- intel driver compatibility
2289+- fix for rare crash with sound lock
2290+- fix for camera turning for bizarre axis configurations
2291+
2292 Changes since 0.2.8.3.1:
2293+
2294 - security fix: old style action commands from clients no loger cause hangs and crashes
2295 - security fix: oversized packets are ignored properly
2296 - security fix: never read one byte outside of the received buffer
2297@@ -47,6 +93,7 @@
2298 - Additional checks against illegal values passed to renderer
2299
2300 Changes since 0.2.8.3:
2301+
2302 - fixed temporary sound disappearance when alt-tabbing away and back
2303 - default subcultures are now distributed
2304 - enable 32 bit color depth at desktop resolution
2305@@ -54,8 +101,9 @@
2306 - spelling mistakes and missing German translations
2307
2308 Changes since 0.2.8.3_rc4:
2309+
2310 - New setting: KEEP_PLAYER_SLOT allows the server to kick (preferably) spectators
2311- if it gets full so there is always one slot open for players
2312+ if it gets full so there is always one slot open for players
2313 - New setting: ACCESS_LEVEL_AUTOKICK_IMMUNITY sets the access level required
2314 to be immune from such kicks (and idle autokicks, too)
2315 - Intercepted chat commands are now written to ladderlog.txt. Format:
2316@@ -65,6 +113,7 @@
2317 - fast finish works again
2318
2319 Changes since 0.2.8.3_rc3:
2320+
2321 - Pinging previously popular servers earlier for quicker server
2322 browsing
2323 - Improved master server random polling, the second polled master now
2324@@ -77,6 +126,7 @@
2325 changes user level for name\_with\_spaces@forums
2326
2327 Changes since 0.2.8.3_rc2:
2328+
2329 - Fixed crash with server polling
2330 - ROUND_WINNER and MATCH_WINNER ladderlog events now include the players of
2331 the team.
2332@@ -87,12 +137,14 @@
2333 of shuffle messages displayed.
2334
2335 Changes since 0.2.8.3_rc1:
2336+
2337 - Fixed dark color filters, such as FILTER_DARK_COLOR_STRINGS, to not filter
2338 the reset color.
2339 - ASE moviepack models no longer have a vertex count limit
2340 - Fixed endless recursion crash between rounds
2341
2342 Changes since 0.2.8.3_beta3:
2343+
2344 - Chat prefix spam protection. Guards against prefix spam, such as when a
2345 user always changes their chat message color, or prefixes all messages
2346 with a clan tag. Toggle with the PREFIX_SPAM_ENABLE setting.
2347@@ -127,7 +179,8 @@
2348
2349 Changes since 0.2.8.2:
2350
2351- New settings and commands:
2352+New settings and commands:
2353+
2354 - MIN_PLAY_TIME_*: minimal play time required before you are allowed to
2355 play on this server.
2356 - SPAM_AUTOKICK_COUNT: minimal number of spam warning messages you get in a
2357@@ -217,6 +270,7 @@
2358 when AUTO_TEAM is enabled
2359
2360 If --enable-armathentication was activated:
2361+
2362 - /lock, /unlock, /invite and /uninvite team management chat for players of
2363 access level ACCESS_LEVEL_TEAM or better.
2364 - /teams chat command that rougly prints team layout.
2365@@ -237,7 +291,8 @@
2366 - /login chat command then uses the more secure hashed base logins
2367 - new chat commands /op and /deop to change other players' access rights
2368
2369- Featurelets:
2370+Featurelets:
2371+
2372 - Added Polish language file
2373 - clientside play time tracking and server controlled minimal required experience
2374 to be allowed to play.
2375@@ -286,19 +341,19 @@
2376 Armagetron Advanced, the paths it uses, links to the main site, wiki
2377 and forums and the names of the project admins.
2378 - New entries in ladderlog.txt:
2379- - GAME_TIME <time> (only if enabled via the LADDERLOG_GAME_TIME_INTERVAL
2380+ GAME_TIME <time> (only if enabled via the LADDERLOG_GAME_TIME_INTERVAL
2381 setting): The time that has passed since the last start of a round
2382- - BASEZONE_CONQUERED <team> <x> <y>: A fortress zone belonging to <team>
2383+ BASEZONE_CONQUERED <team> <x> <y>: A fortress zone belonging to <team>
2384 at the coordinates (<x>, <y>) has been conquered
2385- - BASEZONE_CONQUERER <player>: at the time of the last BASEZONE_CONQUERED
2386+ BASEZONE_CONQUERER <player>: at the time of the last BASEZONE_CONQUERED
2387 message, <player> has been in the conquered zone
2388- - ONLINE_PLAYER <player> [<ping [<team>]]: At the beginning of the round,
2389+ ONLINE_PLAYER <player> [<ping [<team>]]: At the beginning of the round,
2390 <player> had <ping> and was on <team>. This line is not printed for bots
2391- - NUM_HUMANS <n>: There are <n> players that are not AIs and are part of a
2392+ NUM_HUMANS <n>: There are <n> players that are not AIs and are part of a
2393 team.
2394- - ROUND_SCORE has the player's team name appended.
2395- - ROUND_SCORE_TEAM: score a team accumulated during the last round.
2396- - WAIT_FOR_EXTENAL_SCRIPT: printed if the setting of the same name is
2397+ ROUND_SCORE has the player's team name appended.
2398+ ROUND_SCORE_TEAM: score a team accumulated during the last round.
2399+ WAIT_FOR_EXTENAL_SCRIPT: printed if the setting of the same name is
2400 enabled. In this case the server will delay the start of the next round
2401 until WAIT_FOR_EXTENAL_SCRIPT_TIMEOUT is reached or the setting is
2402 disabled.
2403@@ -310,7 +365,8 @@
2404 - /players now shows the players' color and allows searching
2405 - TEAM_ELIMINATION_MODE sets the way ArmagetronAd removes teams when there's too much teams.
2406
2407- Bugfixes:
2408+Bugfixes:
2409+
2410 - Added compensation for drifting timers (observed often with
2411 overclocked mainboards)
2412 - Text input fields now let the text wrap correctly and make use of the space allocated
2413@@ -339,7 +395,8 @@
2414 - More accurate Lag-O-Meter by meriton.
2415 - Zones were sometimes invisible.
2416
2417- Internals:
2418+Internals:
2419+
2420 - A complete netsync cycle is now sn_Receive(); nNetObject::SyncAll(); sn_SendPlanned();.
2421 - Ping charity is now completely server controlled.
2422
2423@@ -410,6 +467,7 @@
2424
2425 Changes since 0.2.8.0_rc4:
2426 Bugfixes:
2427+
2428 - SECURITY FIX: via a MAP_FILE path with included .., it was possible
2429 to write files anywhere, provided they did not exist previously.
2430 Clients with this vulnerability are locked out of the server now.
2431@@ -458,11 +516,11 @@
2432 Cycle turns are now executed more accurately on the server.
2433 Timer stuttering at end of round (was non-critical, but ugly).
2434 Custom camera did not turn when the internal camera was
2435- configured not to turn.
2436+ configured not to turn.
2437 Idle player kick code crashed when it kicked a client with
2438- many players.
2439+ many players.
2440 The code that removes inactive players after a while removed
2441- the AI players.
2442+ the AI players.
2443 - Reverted smart camera movement to pre-beta4 behavior,
2444 the new code made some players seasick :)
2445 - Ingame admin interface gives more useful information to the invoker
2446@@ -502,7 +560,7 @@
2447 Cycles sometimes warped to odd locations.
2448 - Tweaked smart camera to not stay in front of the cycle so much.
2449 Tweaked smart camera custom glancing.
2450- Report back whether you like or hate it!
2451+ Report back whether you like or hate it!
2452 - Made custom camera even more configurable, changed default settings.
2453 (old ones are still in settings.cfg)
2454 - Forced glancing end on cycle turn now looks better.
2455@@ -601,7 +659,7 @@
2456 - Colored explosions!
2457 - HUD enhancements: customization, works in splitscreen mode
2458 - Directory scanning code added ( not yet visible, will be used for
2459- moviepack/cycle selection )
2460+ moviepack/cycle selection )
2461 - Moviepack sky texture support
2462 - Master server can now run on windows, too
2463 - Explosion sound now actually works
2464@@ -746,3 +804,4 @@
2465 - the moviepack title screen is displayed
2466 - Linux version: easier system-wide installation with RPM packages
2467 or "make install"
2468+
2469
2470=== modified file 'batch/checkbugle.py'
2471--- batch/checkbugle.py 2008-12-11 08:15:17 +0000
2472+++ batch/checkbugle.py 2020-07-03 06:03:19 +0000
2473@@ -2,6 +2,8 @@
2474
2475 # checks bugle trace log for OpenGL problems
2476
2477+from __future__ import print_function
2478+
2479 import sys
2480
2481 count = 0
2482@@ -38,7 +40,7 @@
2483 lineNo=lineNo+1
2484
2485 if False and function.find( 'List' ) >= 0 and function.find( 'Call' ) < 0:
2486- print "%d (%s) (%s) (%s) (%s)" % (count, line[:-1], function, args, result)
2487+ print("%d (%s) (%s) (%s) (%s)" % (count, line[:-1], function, args, result))
2488
2489 count = count + 1
2490 if count > 100:
2491@@ -46,12 +48,12 @@
2492
2493 if function == 'glBegin':
2494 if inBlock:
2495- print "Error: Still in block.", lineNo
2496+ print("Error: Still in block.", lineNo)
2497 exit(-1)
2498 inBlock = True
2499 elif function == 'glEnd':
2500 if not inBlock:
2501- print "Error: Not in block.", lineNo
2502+ print("Error: Not in block.", lineNo)
2503 exit(-1)
2504 inBlock = False
2505 else:
2506@@ -64,15 +66,15 @@
2507 if function == 'glGenLists':
2508 legalLists[result] = True
2509 if inList:
2510- print "Error: Still in list generation.", lineNo
2511+ print("Error: Still in list generation.", lineNo)
2512 exit(-1)
2513
2514 if function == 'glEndList':
2515 if not inList:
2516- print "Error: Not in list generation.", lineNo
2517+ print("Error: Not in list generation.", lineNo)
2518 exit(-1)
2519 if inBlockAtListStart != inBlock:
2520- print "Error: glBegin/glEnd mismatch in list.", lineNo
2521+ print("Error: glBegin/glEnd mismatch in list.", lineNo)
2522 exit(-1)
2523 inList=False
2524
2525@@ -81,50 +83,50 @@
2526 list=args[0:args.find(',')]
2527 currentList=list
2528 if inList:
2529- print "Error: Still in list generation.", lineNo
2530+ print("Error: Still in list generation.", lineNo)
2531 exit(-1)
2532 if not legalLists[list]:
2533- print "Error: list %s used, but not generated." % [list], lineNo
2534+ print("Error: list %s used, but not generated." % [list], lineNo)
2535 exit(-1)
2536 setLists[list]=True
2537 inList=True
2538 elif inList:
2539 if not function in usedInList:
2540 usedInList[function]=lineNo
2541- #print lineNo, function
2542+ #print(lineNo, function)
2543
2544 if function == 'glCallList':
2545 list=args
2546 if not legalLists[list]:
2547- print "Error: list %s used, but not generated." % [list], lineNo
2548+ print("Error: list %s used, but not generated." % [list], lineNo)
2549 exit(-1)
2550 if inList and currentList == list:
2551- print "Error: list %s used, but it's just getting generated." % [list], lineNo
2552+ print("Error: list %s used, but it's just getting generated." % [list], lineNo)
2553 exit(-1)
2554 if not setLists[list]:
2555- print "Error: list %s used, but not set." % [list], lineNo
2556+ print("Error: list %s used, but not set." % [list], lineNo)
2557 exit(-1)
2558
2559 if function == 'glDeleteLists':
2560 list=args[0:args.find(',')]
2561 if not legalLists[list]:
2562- print "Error: list %s used, but not generated." % [list], lineNo
2563+ print("Error: list %s used, but not generated." % [list], lineNo)
2564 exit(-1)
2565 legalLists[list]=False
2566 setLists[list]=False
2567
2568-print "Used in display lists:"
2569+print("Used in display lists:")
2570 for f in usedInList:
2571- print f, usedInList[f]
2572+ print(f, usedInList[f])
2573
2574 print
2575-print "Used in glBegin/End:"
2576+print("Used in glBegin/End:")
2577 for f in usedInBlock:
2578- print f, usedInBlock[f]
2579+ print(f, usedInBlock[f])
2580
2581 print
2582-print "Used outside glBegin/End:"
2583+print("Used outside glBegin/End:")
2584 for f in usedOutBlock:
2585- print f, usedOutBlock[f]
2586+ print(f, usedOutBlock[f])
2587
2588
2589
2590=== added file 'batch/git_ff_to_release.sh'
2591--- batch/git_ff_to_release.sh 1970-01-01 00:00:00 +0000
2592+++ batch/git_ff_to_release.sh 2020-07-03 06:03:19 +0000
2593@@ -0,0 +1,68 @@
2594+#!/bin/sh
2595+
2596+# Depending on which branch this is invoked on, fast forward from next a little less stable branch
2597+# master -> beta, beta -> release
2598+
2599+#set -x
2600+
2601+sd=$1
2602+test -z "${sd}" && sd=`dirname $0`
2603+
2604+git update-index --refresh
2605+if ! git diff-index --quiet HEAD --; then
2606+ echo ""
2607+ echo "Local modifications detected, abort. Commit first."
2608+ exit 1
2609+fi
2610+
2611+HASH=`git -C ${sd} rev-parse HEAD`
2612+BRANCH=`git -C ${sd} rev-parse --abbrev-ref HEAD`
2613+# BRANCH=beta_0.2.9
2614+SUFFIX=`echo ${BRANCH} | sed -e s/^release// -e s/^beta// -e s/^legacy//`
2615+
2616+MERGE_FROM=""
2617+
2618+case ${BRANCH} in
2619+ release*)
2620+ MERGE_FROM=beta${SUFFIX}
2621+ ;;
2622+ beta)
2623+ MERGE_FROM=master
2624+ ;;
2625+ beta*)
2626+ if test "${SUFFIX}" = "_0.2.9"; then
2627+ SUFFIX=_0.2.8
2628+ fi
2629+ MERGE_FROM=legacy${SUFFIX}
2630+ ;;
2631+ *)
2632+ echo "Unknown branch, don't know what to do."
2633+ exit 0
2634+ ;;
2635+esac
2636+
2637+git -C ${sd} fetch origin || exit $?
2638+
2639+# merge the listed branches from origin and, if present, locally
2640+TOTAL_MERGE=""
2641+for s in ${MERGE_FROM}; do
2642+ TOTAL_MERGE="${TOTAL_MERGE} origin/$s"
2643+ if git -C ${sd} branch -l | grep -q " $s\$"; then
2644+ TOTAL_MERGE="${TOTAL_MERGE} ${s}"
2645+ fi
2646+done
2647+
2648+git -C ${sd} merge --ff-only ${TOTAL_MERGE} || exit $?
2649+
2650+NEW_HASH=`git -C ${sd} rev-parse HEAD`
2651+test ${NEW_HASH} = ${HASH} && exit 0
2652+
2653+echo
2654+echo '****************************'
2655+echo 'New revisions in this merge:'
2656+echo '****************************'
2657+git log ${HASH}..
2658+
2659+echo
2660+echo In case you change your mind and 'git reset --hard', the pre-merge git revision is:
2661+echo ${HASH}
2662\ No newline at end of file
2663
2664=== added file 'batch/git_merge_safe_sources.sh'
2665--- batch/git_merge_safe_sources.sh 1970-01-01 00:00:00 +0000
2666+++ batch/git_merge_safe_sources.sh 2020-07-03 06:03:19 +0000
2667@@ -0,0 +1,74 @@
2668+#!/bin/sh
2669+
2670+# Depending on which branch this is invoked on, merge all other branches that can be deemed safe
2671+
2672+#set -x
2673+
2674+sd=$1
2675+test -z "${sd}" && sd=`dirname $0`
2676+
2677+git -C ${sd} update-index --refresh
2678+if ! git -C ${sd} diff-index --quiet HEAD --; then
2679+ echo ""
2680+ echo "Local modifications detected, abort. Commit first."
2681+ exit 1
2682+fi
2683+
2684+HASH=`git -C ${sd} rev-parse HEAD`
2685+BRANCH=`git -C ${sd} rev-parse --abbrev-ref HEAD`
2686+#BRANCH=beta_0.2.9
2687+SUFFIX=`echo ${BRANCH} | sed -e s/^release// -e s/^beta// -e s/^legacy//`
2688+
2689+MERGE_FROM=""
2690+
2691+case ${BRANCH} in
2692+ release*)
2693+ echo "Release branch, nothing safe to merge."
2694+ exit 0
2695+ ;;
2696+ beta*)
2697+ MERGE_FROM=release${SUFFIX}
2698+ ;;
2699+ legacy*)
2700+ if test "${SUFFIX}" = "_0.2.8"; then
2701+ SUFFIX=_0.2.9
2702+ MERGE_FROM=legacy_0.2.8.3
2703+ fi
2704+ MERGE_FROM="${MERGE_FROM} release${SUFFIX} beta${SUFFIX}"
2705+ ;;
2706+ master)
2707+ MERGE_FROM="legacy_0.2.8 legacy_0.2.8.3"
2708+ #MERGE_FROM="release beta legacy_0.2.8 legacy_0.2.8.3"
2709+ ;;
2710+ *)
2711+ echo "Unknown branch, don't know what to do."
2712+ exit 0
2713+ ;;
2714+esac
2715+
2716+git -C ${sd} fetch origin || exit $?
2717+
2718+# merge the listed branches from origin and, if present, locally
2719+TOTAL_MERGE=""
2720+for s in ${MERGE_FROM}; do
2721+ TOTAL_MERGE="${TOTAL_MERGE} origin/$s"
2722+ if git -C ${sd} branch -l | grep -q " $s\$"; then
2723+ TOTAL_MERGE="${TOTAL_MERGE} ${s}"
2724+ fi
2725+done
2726+
2727+git -C ${sd} pull --ff-only origin || exit $?
2728+git -C ${sd} merge ${TOTAL_MERGE} || exit $?
2729+
2730+NEW_HASH=`git -C ${sd} rev-parse HEAD`
2731+test ${NEW_HASH} = ${HASH} && exit 0
2732+
2733+echo
2734+echo '****************************'
2735+echo 'New revisions in this merge:'
2736+echo '****************************'
2737+git log ${HASH}..
2738+
2739+echo
2740+echo In case you change your mind and 'git reset --hard', the pre-merge git revision is:
2741+echo ${HASH}
2742\ No newline at end of file
2743
2744=== modified file 'batch/ladder.py'
2745--- batch/ladder.py 2006-05-29 01:55:42 +0000
2746+++ batch/ladder.py 2020-07-03 06:03:19 +0000
2747@@ -1,6 +1,8 @@
2748 #!/usr/bin/python
2749 # purpose: process ladderlog.txt and generate a usefull ladder league from it
2750
2751+from __future__ import print_function
2752+
2753 import math
2754
2755
2756@@ -150,12 +152,12 @@
2757 if diagonal < minDiagonal: minDiagonal = diagonal
2758 averageDiagonal += diagonal/len(players)
2759
2760- print averageDiagonal
2761+ print(averageDiagonal)
2762
2763 maxDeviation = 1
2764 if minDiagonal < 0:
2765 maxDeviation = -1/minDiagonal
2766- print maxDeviation
2767+ print(maxDeviation)
2768
2769 # initialize score vector
2770 score = {}
2771@@ -197,7 +199,7 @@
2772 error += abs(deltascore[i])
2773
2774 if iter == 100:
2775- print error
2776+ print(error)
2777 iter = 0
2778 iter += 1
2779
2780@@ -230,9 +232,9 @@
2781
2782 scoreDataBase = PairScoreDictionary()
2783 scoreDataBase.ReadLog( open( "ladderlog.txt" ) )
2784-#print "read"
2785+#print("read")
2786 ladder = scoreDataBase.GenerateLadder()
2787
2788 for entry in ladder:
2789- print entry[1], entry[0]
2790+ print(entry[1], entry[0])
2791
2792
2793=== added file 'batch/make/patchnotes.py'
2794--- batch/make/patchnotes.py 1970-01-01 00:00:00 +0000
2795+++ batch/make/patchnotes.py 2020-07-03 06:03:19 +0000
2796@@ -0,0 +1,204 @@
2797+#!/usr/bin/python3
2798+#wd=`dirname $0`
2799+
2800+# generates patch notes from git log references to gitlab issues
2801+# parameters: <path to git repository> <path to frozen changelog> <gitlab team> <gitlab project>
2802+
2803+
2804+# issue query URI sample
2805+# https://gitlab.com/api/v4/projects/9837210/issues?scope=all&state=closed&iids[]=11&iids[]=9
2806+
2807+# Looks for commit lines of the form
2808+# Implements https://gitlab.com/armagetronad/armagetronad/-/issues/11
2809+# or
2810+# Fixes #11
2811+# looks up the referenced issues in the GitLab API, generates a ChangeLog/Patch Note line for each
2812+
2813+import sys, argparse
2814+import subprocess
2815+from packaging import version
2816+from string import Template
2817+import urllib.request
2818+import json
2819+
2820+# checks whether s represents an iteger
2821+def RepresentsInt(s):
2822+ try:
2823+ int(s)
2824+ return True
2825+ except ValueError:
2826+ return False
2827+
2828+# retrieve tags from git repository
2829+def GetTags(repo, tag_lower_limit):
2830+ alltags_raw=subprocess.run(["git", "-C", repo, "tag", "-l", "--merged"], stdout=subprocess.PIPE)
2831+ alltags=alltags_raw.stdout.decode('utf-8').split('\n')
2832+ return list(filter(lambda x: len(x) > 0 and version.parse(x) >= version.parse(tag_lower_limit), alltags))
2833+
2834+ # sort tags in chronological order (assuming they're all on the same branch)
2835+ revisions={}
2836+ for tag in tags:
2837+ # count number of revisions since tag
2838+ revisions_since_tag_raw=subprocess.run(["git", "-C", repo, "rev-list", "--count", tag + ".."], stdout=subprocess.PIPE)
2839+ revisions[tag]=int(revisions_since_tag_raw.stdout.decode('utf-8'))
2840+
2841+ print(revisions)
2842+ tags.sort(key=lambda x: revisions[x], reverse=True)
2843+ return tags
2844+
2845+# return (tag, list of issues fixed after tag as integers)
2846+def FixedAfterTag(repo, team, project, tags):
2847+ # for each tag, collect which issues have been resolved (Fix.. Close.. Solve.. Implement...)
2848+ # or mentioned otherwise
2849+ uri_start=Template('https://gitlab.com/${team}/${project}/-/issues/').substitute(team=team, project=project)
2850+ # The build system is on Python 3.5, so we're stuck with this mechanism
2851+ # print(uri_start)
2852+
2853+ last_fixed_in={}
2854+ last_mentioned_in={}
2855+ issues=set([])
2856+
2857+ for tag in tags:
2858+ log_raw=subprocess.run(["git", "-C", repo, "log", tag + ".."], stdout=subprocess.PIPE)
2859+ log=log_raw.stdout.decode('utf-8').split('\n')
2860+
2861+ for logline in log:
2862+ mentions=False
2863+ fixes=False
2864+ ref=None
2865+ if logline[0:4] == ' ':
2866+ for word in logline.split():
2867+ if word.startswith(uri_start):
2868+ ref = word[len(uri_start):]
2869+ elif word.startswith('#'):
2870+ ref = word[1:]
2871+ if not ref is None and RepresentsInt(ref):
2872+ ref=int(ref)
2873+ mentions = True
2874+ trimmed=logline.strip().upper()
2875+ if trimmed.startswith('FIX') or trimmed.startswith('IMPLEMENT') or trimmed.startswith('CLOSE') or trimmed.startswith('SOLVE'):
2876+ fixes = True
2877+ if fixes:
2878+ last_fixed_in[ref] = tag
2879+ if mentions:
2880+ last_mentioned_in[ref] = tag
2881+ issues.add(ref)
2882+
2883+ #print(issues)
2884+ #print(last_fixed_in)
2885+ #print(last_mentioned_in)
2886+
2887+ fixed_after_tag={}
2888+ for issue in issues:
2889+ fixed_in = None
2890+ if issue in last_fixed_in:
2891+ fixed_in = last_fixed_in[issue]
2892+ if fixed_in == None and issue in last_mentioned_in:
2893+ fixed_in = last_mentioned_in[issue]
2894+ if fixed_in != None:
2895+ #print(issue, fixed_in)
2896+ fixed_after_tag.setdefault(fixed_in, []).append(issue)
2897+
2898+ #print(fixed_after_tag)
2899+ return fixed_after_tag
2900+
2901+# retrieves metadata for an issue from gitlab, composes markup patch note line
2902+def GetMarkupLine(team, project, issue):
2903+ uri=Template('https://gitlab.com/api/v4/projects/${team}%2F${project}/issues?scope=all&state=closed&iids[]=${issue}').substitute(team=team, project=project, issue=issue)
2904+ #print(uri)
2905+ with urllib.request.urlopen(uri) as content:
2906+ data = json.loads(content.read().decode())
2907+ #print(data)
2908+ if len(data) == 0:
2909+ return "", None
2910+ title = data[0]['title']
2911+ weblink = data[0]['web_url']
2912+ labels = data[0]['labels']
2913+ line = None
2914+ if data[0]['state'] == 'closed':
2915+ line = Template(' * ${title} ([#${issue}](${weblink}))').substitute(title=title.strip(), issue=issue, weblink=weblink)
2916+ #print(line, labels)
2917+ if 'Type::Bug' in labels:
2918+ return 'Fixed Bugs', line
2919+ elif 'Type::Feature' in labels:
2920+ return 'New Features', line
2921+ elif 'Type::Removed' in labels:
2922+ return 'Removed', line
2923+ elif 'Type::Breaking' in labels:
2924+ return 'Breaking Changes', line
2925+ else:
2926+ return 'Other Changes', line
2927+
2928+# parse given frozen changelog, look for last 'changes since' note, extract tag name
2929+def GetLastFrozenTag(frozen):
2930+ file = open(frozen, 'r')
2931+ begin = '#### Changes since '
2932+ for line in file:
2933+ if line.startswith(begin):
2934+ version=line[len(begin):]
2935+ version = version.strip(':\n ')
2936+ if len(version) > 2:
2937+ if version[0] != 'v':
2938+ version = 'v' + version
2939+ return version
2940+
2941+parser = argparse.ArgumentParser(description='Generates ChangeLog/Patch Notes')
2942+parser.add_argument('repository', help='Path to the local git repository')
2943+parser.add_argument('frozen_changelog', help='Path to a previous, now immutable changelog')
2944+parser.add_argument('gitlab_team', help='Team name on gitlab')
2945+parser.add_argument('gitlab_project', help='Project name on gitlab')
2946+parser.add_argument('-p', help='Just print patch notes', action='store_true')
2947+
2948+args = parser.parse_args()
2949+
2950+if len(sys.argv) < 5:
2951+ print("Not enough arguments")
2952+ exit(1)
2953+
2954+patchnotes = args.p
2955+repo = args.repository
2956+frozen = args.frozen_changelog
2957+team = args.gitlab_team
2958+project = args.gitlab_project
2959+
2960+# adapt for other branches
2961+tag_lower_limit=GetLastFrozenTag(frozen)
2962+# print(tag_lower_limit)
2963+
2964+# get all tags relevant to the current branch
2965+tags=GetTags(repo, tag_lower_limit)
2966+#print("tags =", tags)
2967+
2968+fixed_after_tag=FixedAfterTag(repo, team, project, tags)
2969+#print(fixed_after_tag)
2970+
2971+for tag in fixed_after_tag:
2972+ # print(tag)
2973+ fixed = fixed_after_tag[tag]
2974+ # luckily, the category names are alphabetically in the order we want them in :)
2975+ categories={}
2976+ #categories={'Fixed Bugs' : [], 'New Features' : [], 'Other Changes': []}
2977+ for issue in fixed:
2978+ category, line=GetMarkupLine(team, project, issue)
2979+ if not line is None:
2980+ categories.setdefault(category, []).append(line)
2981+
2982+ if len(categories) > 0:
2983+ printtag=tag
2984+ if tag[0] == 'v':
2985+ printtag = tag[1:]
2986+ print()
2987+ print("#### Changes since", printtag + ":")
2988+ print()
2989+ for category in categories:
2990+ print("#####", category)
2991+ print()
2992+ for line in categories[category]:
2993+ print(line)
2994+ print()
2995+ if patchnotes:
2996+ exit(0)
2997+ print()
2998+
2999+file = open(frozen, 'r')
3000+print(file.read())
3001
3002=== modified file 'batch/make/sortresources'
3003--- batch/make/sortresources 2007-11-04 03:21:24 +0000
3004+++ batch/make/sortresources 2020-07-03 06:03:19 +0000
3005@@ -27,7 +27,9 @@
3006 find ${destination}/ -name "*~" -exec rm -rf \{\} \;
3007
3008 # rename them properly
3009-python ${sortresources} -v ${destination} || exit 1
3010+PYTHON=`which python3 python python2 2> /dev/null | head -n 1`
3011+echo python is ${PYTHON}
3012+${PYTHON} ${sortresources} -v ${destination} || exit 1
3013
3014 # silently remove empty directories
3015 find ${destination} -type d -depth -exec rmdir \{\} \; > /dev/null 2>&1
3016
3017=== modified file 'batch/make/sortresources.py'
3018--- batch/make/sortresources.py 2012-07-21 19:16:26 +0000
3019+++ batch/make/sortresources.py 2020-07-03 06:03:19 +0000
3020@@ -8,9 +8,10 @@
3021 # sortresources.py <path_to_seach_and_sort>
3022 # use sortresources.py -h to get command line option help
3023
3024+from __future__ import print_function
3025+
3026 from xml import sax
3027 from xml.sax import handler
3028-import string
3029 import os.path
3030 import os
3031 import sys
3032@@ -161,7 +162,7 @@
3033 return False
3034
3035 if doPrint:
3036- print("renaming " + oldFile + " -> " + newFile)
3037+ print("renaming", oldFile, "->", newFile)
3038
3039 # move file oldFile to newFile, setting apache rewrite rules to keep the file
3040 # fetchable from its old position
3041@@ -183,8 +184,8 @@
3042 # open .htaccess file in the old directory for reading
3043 accessFile = open(htaccessPath)
3044 for line in accessFile:
3045- splitLineLower = string.split(line.lower())
3046- splitLine = string.split(line)
3047+ splitLineLower = str.split(line.lower())
3048+ splitLine = str.split(line)
3049 if splitLineLower[0] == "rewriteengine":
3050 # rewriting is already mentioned; we don't have to enable it laster.
3051 needEngine = False
3052@@ -195,7 +196,7 @@
3053 # nothing to do
3054 return
3055 else:
3056- print("Warning: There already is a different RewriteRule for " + oldFile + " in place.")
3057+ print("Warning: There already is a different RewriteRule for", oldFile, "in place.")
3058 except: pass
3059
3060 # open .htaccess file for appended writing
3061@@ -273,7 +274,7 @@
3062 if arg[1] == "v":
3063 doPrint = True
3064 continue
3065- print("\nUnknown option: " + arg)
3066+ print("\nUnknown option:", arg)
3067 Options(-1)
3068 else:
3069 Options(-1)
3070
3071=== modified file 'batch/make/uninstall'
3072--- batch/make/uninstall 2011-07-19 12:09:41 +0000
3073+++ batch/make/uninstall 2020-07-03 06:03:19 +0000
3074@@ -69,7 +69,7 @@
3075
3076 # compose uninstall script from file and directory list
3077 cat ${UNINSTALL}.files >> ${UNINSTALL}
3078-sort ${UNINSTALL}.dir --reverse --unique >> ${UNINSTALL}
3079+sort ${UNINSTALL}.dir -ru >> ${UNINSTALL}
3080
3081 rm -rf ${DEST}
3082
3083
3084=== added file 'batch/make/update_changelog'
3085--- batch/make/update_changelog 1970-01-01 00:00:00 +0000
3086+++ batch/make/update_changelog 2020-07-03 06:03:19 +0000
3087@@ -0,0 +1,13 @@
3088+#!/bin/sh
3089+# Updates CHANGELOG.md from CHANGELOG_FROZEN.md, git history and launchpad issues
3090+# usage: update_changelog
3091+
3092+set -x
3093+
3094+md=`dirname $0`
3095+top_srcdir=${md}/../../
3096+
3097+${md}/patchnotes.py ${top_srcdir} ${top_srcdir}/CHANGELOG_FROZEN.md armagetronad armagetronad > ${top_srcdir}/CHANGELOG.md
3098+
3099+sed < ${top_srcdir}/CHANGELOG.md > ${top_srcdir}/NEWS -e "s/^ \* /- /" -e "s/^ - / /" -e "s/^ / /" -e "s/^##### */ /" -e "s/^#### *//" -e "s/^##* *//" -e 's,(\[\(.*\)\](\(.*\))),(\1),'
3100+
3101
3102=== modified file 'batch/make/version'
3103--- batch/make/version 2019-03-04 00:53:47 +0000
3104+++ batch/make/version 2020-07-03 06:03:19 +0000
3105@@ -2,10 +2,16 @@
3106 # determines the version of the sources
3107 # usage: version <source directory>
3108
3109-#set -x
3110+# set -x
3111
3112 srcdir="$1"
3113
3114+# if we're building via CI from a protected tag, that is our version
3115+if test "${CI_COMMIT_REF_PROTECTED}" = "true" && ! test -z "${CI_COMMIT_TAG}"; then
3116+ echo "${CI_COMMIT_TAG}" | sed -e s/^v//
3117+ exit 0
3118+fi
3119+
3120 # set version parts to defaults for CVS snapshot
3121 major_version=`cat ${srcdir}/major_version`
3122 minor_version_proto=`cat ${srcdir}/minor_version`
3123@@ -97,7 +103,10 @@
3124 fi
3125 fi
3126
3127-if test -d "${srcdir}/.git"; then
3128+# try to get a good guess about which branch we're on
3129+GIT_BRANCH="alpha"
3130+
3131+if test -e "${srcdir}/.git"; then
3132 # check for a tag
3133 cd $srcdir
3134 # todo: once we have make tags, consider just git describe --tags as version ID.
3135@@ -106,7 +115,8 @@
3136 minor_version=""
3137 DATE=""
3138 else
3139- if git diff-index --quiet HEAD --; then
3140+ git update-index --refresh > /dev/null
3141+ if git diff-index --quiet HEAD --; then
3142 # local checkout clean, just use revno
3143 DATE=_z`git rev-list HEAD --count`
3144 else
3145@@ -114,11 +124,23 @@
3146 DATE=_z`git rev-list HEAD --count`_$DATE
3147 fi
3148 fi
3149+
3150+ GIT_BRANCH=`git -C ${srcdir} rev-parse --abbrev-ref HEAD`
3151 fi
3152+test -z "${CI_COMMIT_BRANCH}" || GIT_BRANCH=${CI_COMMIT_BRANCH}
3153
3154 if test -z "$minor_version"
3155 then
3156 test -z "$DATE" || minor_version=`echo ${minor_version_proto} | sed -e "s,DATE,$DATE," -e "s,YYYYMMDD,$DATE,"`
3157 fi
3158
3159+if test "${CI_COMMIT_REF_PROTECTED}" = "true"; then
3160+ # determine alpha/beta/rc status based on branch
3161+ if echo ${GIT_BRANCH} | grep -q "^beta"; then
3162+ minor_version=`echo ${minor_version} | sed -e s,alpha,beta,`
3163+ elif echo ${GIT_BRANCH} | grep -q "^release"; then
3164+ minor_version=`echo ${minor_version} | sed -e s,alpha,rc,`
3165+ fi
3166+fi
3167+
3168 echo $major_version$minor_version
3169
3170=== modified file 'bootstrap.sh'
3171--- bootstrap.sh 2019-07-26 01:01:51 +0000
3172+++ bootstrap.sh 2020-07-03 06:03:19 +0000
3173@@ -10,7 +10,7 @@
3174 rm -f version
3175 fi
3176 echo "Copying license..."
3177-cp COPYING.txt COPYING
3178+test -r COPYING || cp COPYING.txt COPYING || exit $?
3179 echo "Running aclocal..."
3180 aclocal || { rm aclocal.m4; exit 1; }
3181 echo "Running autoheader..."
3182
3183=== removed file 'config.guess'
3184=== modified file 'config/settings.cfg'
3185--- config/settings.cfg 2016-03-19 07:05:52 +0000
3186+++ config/settings.cfg 2020-07-03 06:03:19 +0000
3187@@ -434,6 +434,8 @@
3188 FILTER_NAME_ENDS 1 # Filter whitespace from beginning and end of player names.
3189 FILTER_NAME_MIDDLE 1 # Filter excess whitespace and other junk from the middle of player names.
3190 FILTER_COLOR_SERVER_NAMES 0 # Filter color codes from server names in the server browser. Only affects the client.
3191+VERIFY_COLOR_STRICT 1 # Verify color codes before interpreting them. Capital letters and anything not 0-9, a-f is not considered a color code then. If set to 0 (the in code default), out of range ascii characters are accepted and interpreted as 0.
3192+
3193
3194 SILENCE_DEFAULT 0 # silence new players by default?
3195 ENABLE_CHAT 1 # allow public messages?
3196
3197=== modified file 'config/settings_dedicated.cfg'
3198--- config/settings_dedicated.cfg 2014-03-30 06:31:13 +0000
3199+++ config/settings_dedicated.cfg 2020-07-03 06:03:19 +0000
3200@@ -235,7 +235,7 @@
3201 PING_FLOOD_TIME_100 100.0 # Minimum time for 100 ping packets to arrive.
3202 PING_FLOOD_GLOBAL .1 # The same times, multiplied by this value, count for all pings from all machines. Negative values disable global flood protection.
3203 CONNECTION_FLOOD_SENSITIVITY .01 # The times PING_FLOOD_TIME_X, multiplied by this value, count for all incoming messages from clients not connected already. A flood here activates turtle mode. Negative values disable global flood protection.
3204-CONNECTION_LIMIT 100 # Maximum number of packets from unknown peers to handle at one
3205+CONNECTION_LIMIT 5 # Maximum number of packets from unknown peers to handle at one
3206 ANTI_SPOOF 0 # If set to 1, checks connecting clients for spoofed IPs are done. Only clients passing a connectivity test are allowed in. This is done in turtle mode automatically, but may be useful to have on at all times.
3207
3208
3209
3210=== modified file 'configure.ac'
3211--- configure.ac 2019-08-21 22:59:09 +0000
3212+++ configure.ac 2020-07-03 06:03:19 +0000
3213@@ -1,4 +1,4 @@
3214-dnl I would like to do this to generate the version number...
3215+/dnl I would like to do this to generate the version number...
3216 dnl AC_DEFUN([AUTOMATIC_VERSION],syscmd([sh batch/make/version .]))
3217
3218 dnl but have to do this with version generated in bootstrap.sh instead for some reason
3219@@ -29,7 +29,7 @@
3220 dnl AC_CANONICAL_HOST
3221
3222 AC_PROG_RANLIB
3223-AM_INIT_AUTOMAKE([subdir-objects])
3224+AM_INIT_AUTOMAKE([subdir-objects tar-ustar])
3225
3226 dnl detect which link commant to use
3227 AC_PROG_LN_S
3228@@ -38,14 +38,14 @@
3229 AC_CHECK_PROG(HAVE_M4,m4,true,false)
3230 AM_CONDITIONAL(HAVE_M4, test $HAVE_M4 = true)
3231
3232-dnl check whether date accepts -r to refer to a file
3233-AM_CONDITIONAL(DATE_R, date +"%Y" -r $0 > /dev/null 2>&1)
3234+dnl dirty trick to allow verbatim output to Makefile.in -> Makefile
3235+dnl source: http://gnu-automake.7480.n7.nabble.com/ifdef-endif-issue-td2662.html
3236+AC_SUBST([protect], [""])
3237
3238 dnl export version
3239 version=$VERSION
3240 AC_SUBST(version)
3241
3242-AC_ARG_VAR(XML2_CONFIG,[Configuration script of libxml2 to use, defaults to xml2-config])
3243 AC_ARG_VAR(CXXFLAGS,Flags passed to the C++ compiler)
3244 AC_ARG_VAR(DEBUGLEVEL,[Debug level for developers, normal users can safely ignore it. Accepted values go from 0 to 5. See README-DEVELOPER for details.])
3245 AC_ARG_VAR(CODELEVEL,[Code checking strictness level for developers, normal users can safely ignore it. Accepted values go from 0 to 4. See README-DEVELOPER for details.])
3246@@ -61,6 +61,8 @@
3247 dnl a modern autoconf is required to process this
3248 AC_PREREQ(2.50)
3249
3250+PKG_PROG_PKG_CONFIG
3251+
3252 build_regular=true
3253
3254 have_lzma=false
3255@@ -131,7 +133,7 @@
3256
3257 # flag to set when mockup versions of the executables should be built to save
3258 # compile time when testing the release process
3259-AM_CONDITIONAL(BUILDFAKERELEASE, test "$ARMAGETRONAD_FAKERELEASE" != "")
3260+AM_CONDITIONAL(BUILDFAKERELEASE, test "$ARMAGETRONAD_FAKERELEASE" != "" && test "$ARMAGETRONAD_FAKERELEASE" != "false" && test "$ARMAGETRONAD_FAKERELEASE" != "no")
3261
3262 # set replacement variables for dedicated server
3263 progtitle_serverorclient=" Client"
3264@@ -330,12 +332,18 @@
3265 dnl ])
3266 dnl])
3267
3268-
3269 if test $CODELEVEL -ge 1; then
3270 CXXFLAGS="$CXXFLAGS -Wall"
3271
3272 dnl careful, only supported on GCC 4.2 and later
3273 AX_CXXFLAGS_GCC_OPTION(-Wno-strict-overflow)
3274+
3275+ dnl this one is from GCC 7 (change to 1 or 2 in the future,
3276+ dnl leave at default and use [[fallthrough]] (std C++ 17)
3277+ AX_CXXFLAGS_GCC_OPTION(-Wimplicit-fallthrough=1)
3278+
3279+
3280+
3281 fi
3282
3283 dnl test $CODELEVEL -ge 2 && CXXFLAGS="$CXXFLAGS -Wshadow -Wpointer-arith -Wfloat-equal -W -Wcast-qual -Wcast-align -Wconversion -Wunreachable-code --pedantic -Winline"
3284@@ -572,29 +580,10 @@
3285 dnl *************************************************
3286
3287 if test x$armamain = xtrue; then
3288-
3289-test -z "$XML2_CONFIG" && XML2_CONFIG=xml2-config
3290-
3291-if ! $XML2_CONFIG --libs > /dev/null; then
3292- AC_MSG_ERROR([Fatal error: the libxml2 configuration script $XML2_CONFIG does not work/exist.])
3293-fi
3294-
3295-# if test x$armamain = xtrue; then
3296-AC_CHECK_LIB(xml2,xmlParseMemory,
3297-CPPFLAGS="$CPPFLAGS `$XML2_CONFIG --cflags`"
3298-LIBS="`$XML2_CONFIG --libs` $LIBS"
3299-AC_DEFINE(HAVE_LIBXML2, 1, [Define if you have the xml2 library (-lxml2).]),
3300-AC_MSG_ERROR([You need the library xml2 to compile ${progtitle}. Read the file doc/install_linux.html.])
3301-,`$XML2_CONFIG --libs`)
3302-
3303-AC_CHECK_FUNC(xmlParserInputBufferCreateFilenameDefault,
3304-,
3305-AC_MSG_ERROR([
3306- Your xml2 library is obsolete!
3307- Please upgrade to 2.6.11 or later
3308-])
3309-)
3310-# fi
3311+ PKG_CHECK_MODULES([XML2], [libxml-2.0 >= 2.6.11])
3312+ CPPFLAGS="$CPPFLAGS $XML2_CFLAGS"
3313+ LIBS="$LIBS $XML2_LIBS"
3314+ AC_DEFINE(HAVE_LIBXML2, 1, [Define if you have the libxml2 library])
3315
3316 dnl *************************************************
3317 dnl Armathentication Threading
3318@@ -994,6 +983,10 @@
3319 resource/Makefile
3320 config/Makefile
3321 desktop/Makefile
3322+docker/build/Makefile
3323+docker/build/setup_ci_test.sh
3324+docker/build/context/version.sh
3325+docker/deploy/targets.sh
3326 desktop/armagetronad.desktop
3327 )
3328
3329
3330=== modified file 'desktop/armagetronad.desktop.in'
3331--- desktop/armagetronad.desktop.in 2015-04-01 11:44:48 +0000
3332+++ desktop/armagetronad.desktop.in 2020-07-03 06:03:19 +0000
3333@@ -1,12 +1,11 @@
3334 [Desktop Entry]
3335 Type=Application
3336 Name=@progtitle@@progtitle_server@
3337-Exec=@progname@
3338+Exec=@progname@ %f
3339 Comment=3d light cycle game
3340 Comment[de]=dreidimensionales Lichtradspiel
3341 Icon=@progname@
3342 Terminal=@build_dedicated@
3343-Path=@prefix@/bin
3344 Categories=Game;ActionGame;
3345 StartupNotify=@build_dedicated@
3346 MimeType=application/x-armagetronad;
3347
3348=== added directory 'docker'
3349=== added file 'docker/README.md'
3350--- docker/README.md 1970-01-01 00:00:00 +0000
3351+++ docker/README.md 2020-07-03 06:03:19 +0000
3352@@ -0,0 +1,103 @@
3353+# Docker Based Build System
3354+
3355+## You Need to Have Installed
3356+ * Everything needed for a dedicated server build, plus python packaging
3357+ * [docker in rootless mode](https://docs.docker.com/engine/security/rootless/)
3358+ * Optional: [docker in reglar mode](https://docs.docker.com/engine/install/ubuntu/) for steam SDK creation
3359+ * Optional: [x11docker](https://github.com/mviereck/x11docker) for Windows build system creation
3360+
3361+Ubuntu is recommended, as rootless docker supports the overlay2 driver there;
3362+pretty much everyone else only gets the vfs driver that always copies the whole
3363+image contents.
3364+
3365+For Ubuntu, to be on the safe side:
3366+
3367+ sudo apt install git wine-stable automake \
3368+ bison g++ make libboost-dev libboost-thread-dev \
3369+ libprotobuf-dev libzthread-dev python recode curl uidmap python3-packaging
3370+
3371+Then follow the instructions from the rootless docker and x11docker above.
3372+
3373+If you are not using Ubuntu on your main machine, you can run Rootless Docker inside
3374+an Ubuntu virtual machine and export the socket for use on your main machine. The safest way to run such a machine is with one NAT network connection that you enable
3375+a port forwarding [rule for SSH](https://bobcares.com/blog/virtualbox-ssh-nat/) for.
3376+Once that is set up, assuming your UID is 1000 on the host and 1001 on the host and you went with the example 2522 source port, connect to the guest with
3377+
3378+ ssh -p 2522 guest -L /run/user/1001/docker.sock:/run/user/1000/docker.sock
3379+
3380+as suggested [here](https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface) and keep that running. Inform your local docker client about the socket with
3381+
3382+ export DOCKER_HOST=unix:///run/user/1000/docker.sock
3383+
3384+and off you go. Only your host user can access that socket and can only control a Docker daemon on a virtual machine running as a non-root user.
3385+
3386+To secure the VM some more, you may want to restrict its access to your LAN. You can use [ufw](https://linuxize.com/post/how-to-setup-a-firewall-with-ufw-on-ubuntu-20-04/) for that. Assuming 192.160.0.1 is your router's IP on the LAN, execute on the VM:
3387+
3388+ sudo ufw allow ssh # default is to block everything, so before we enable ufw, we better make sure ssh will keep working
3389+ sudo ufw enable
3390+ sudo ufw allow out to 192.168.0.1 # this allows traffic to your router and therefore the internet
3391+ sudo ufw deny out to 10.0.0.0/8 # these block all private subnets; LANs usually use these IPs. If yours does not, adapt.
3392+ sudo ufw deny out to 172.16.0.0/12
3393+ sudo ufw deny out to 192.168.0.0/16
3394+ sudo ufw deny in from 10.0.0.0/8
3395+ sudo ufw deny in from 172.16.0.0/12
3396+ sudo ufw deny in from 192.168.0.0/16
3397+
3398+The 'deny in' rules are redundant because the VM is behind a NAT anyway, but you never know. Maybe you switch it to 'bridged' one day.
3399+
3400+## Contents
3401+
3402+ * scripts/ contains helper scripts
3403+ * images/ contains everything else needed to build images from scratch
3404+ * build/ contains the actual build stuff
3405+ * deploy/ contains information about deployments; pre-filled with target definition; each requires certain secrets
3406+
3407+## How to Build
3408+
3409+Assuming the source is in armagetronad, do
3410+
3411+ cd armagetronad
3412+ ./bootstrap.sh
3413+ mkdir ../build
3414+ cd ../build
3415+ ../armagetronad/configure --disable-glout
3416+ cd docker/build
3417+ make <target>
3418+
3419+target can be
3420+
3421+ * *free*: Build everything relevant for free open source systems
3422+ * *closed*: Build steam and windows binaries
3423+ * *full*: Build all
3424+ * *clean*: Remove build results
3425+
3426+## Developer Notes
3427+To update to another branch, you may have to adapt related branch names in scripts/relevant_branches.sh.
3428+
3429+To make builds use up to date versions of additional git repositories, call scripts/update_gits.sh.
3430+
3431+All scripts can be invoked from any work directory as long as you invoke them with a relative or absoulte path, they find their relevant data directories and other scripts automatically.
3432+
3433+## GitLab CI
3434+
3435+The root .gitlab-ci.yml uses the files in this directory to do the builds. The building should work fine in any gitlab runner configured to use docker, especially the shared runners.
3436+
3437+For deployment, however, an own runner needs to be set up. A stadard setup will do fine, but then run as root. To run a rootless gitlab runner, you must do the following. Install gitlab runner normally, but disable the default service with
3438+
3439+ systemctl disable gitlab-runner
3440+
3441+As a regular user, register a runner with
3442+
3443+ gitlab-runner register
3444+
3445+the data to fill in is described on the GitLab CI configuration of the project. Then, normally, gitlab-runner uses docker-in-docker to run additional containers. That does not work rootless. Instead, you can just make the docker control socket available to gitlab's container by editing the volumes line in `~/.gitlab-runer/config.toml` to
3446+
3447+ volumes = ["/var/run/user/UID/docker.sock:/var/run/docker.sock", "/cache", "/home/USERNAME/secrets:/secrets:ro"]
3448+
3449+replacing UID with your user ID and USERNAME with your username. If you want to use the runner for deployment, the secrets folder then has to contain the credentials required to do so. Read deploy/targets.sh for details.
3450+
3451+Then, run the runner with
3452+
3453+ gitlab-runner run
3454+
3455+ Security and consistency implication: You then only have one docker instance. Jobs running on your runner can therefore modify the same docker images, for example apply tags. Therefore, all our CI scripts reference used images by their digest and use randomized names for containers so they don't get into one another's way.
3456\ No newline at end of file
3457
3458=== added directory 'docker/build'
3459=== added file 'docker/build/Makefile.am'
3460--- docker/build/Makefile.am 1970-01-01 00:00:00 +0000
3461+++ docker/build/Makefile.am 2020-07-03 06:03:19 +0000
3462@@ -0,0 +1,652 @@
3463+.PHONY: tarball clean distclean source free closed full all
3464+
3465+# We want everything deleted if something bad happens
3466+.DELETE_ON_ERROR:
3467+
3468+default:
3469+ echo "Nothing generic to do."
3470+
3471+# individual targets for split jobs
3472+CI_prepare: gits_artifacts.tag source make_ci.sh rootcontext.64
3473+CI_linux_server_32: appimage_server_32.tag apptar_server_32.tag
3474+CI_linux_client_32: appimage_client_32.tag apptar_client_32.tag
3475+CI_linux_server_64: appimage_server_64.tag apptar_server_64.tag
3476+CI_linux_client_64: appimage_client_64.tag apptar_client_64.tag
3477+CI_windows: winzip.tag windows.tag
3478+CI_debtest: debtest.tag
3479+CI_linux_steam: steamdirs/steam_linux
3480+CI_windows_steam: steamdirs/steam_windows
3481+
3482+# full open source builds
3483+free.tag: appimage.tag apptar.tag sourcetar.tag
3484+ touch $@
3485+free: free.tag
3486+
3487+# builds for non-open source systems/environments
3488+closed_regular.tag: windows.tag winzip.tag
3489+ touch $@
3490+closed_regular: closed.tag
3491+closed_steam.tag: steam_windows.tag steam_linux.tag
3492+ touch $@
3493+closed_steam: closed_steam.tag
3494+closed.tag: closed_steam.tag closed_regular.tag
3495+ touch $@
3496+closed: closed.tag
3497+
3498+# closed comes first because windows builds take the longest and are not internally parallelized
3499+full.tag: result.winsource_32 result.winsource_steam closed.tag free.tag
3500+ touch $@
3501+full: full.tag
3502+
3503+# what to build from GitLab CI, divided into stages
3504+CI_base.tag: gits.tag source.tag result.build_server_32 result.build_client_64 context.64
3505+ touch $@
3506+
3507+# minimal expected build to be packable
3508+CI_pack.tag: gits_artifacts.tag source.tag CI_base.tag free.tag upload/PATCHNOTES.md upload/CHANGELOG.md
3509+ touch $@
3510+
3511+# all windows builds
3512+CI_windows.tag: CI_base.tag steam_windows.tag closed_regular.tag
3513+ touch $@
3514+
3515+# all free linux builds (so, no steam)
3516+CI_free.tag: CI_base.tag free.tag
3517+ touch $@
3518+
3519+# (OBSOLETE) targets for CI merge tests, a bit leaner than a full build
3520+CI_merge.tag: windows.tag debtest.tag
3521+ touch $@
3522+CI_merge: CI_merge.tag
3523+CI_merge_nodeb.tag: windows.tag CI_base.tag
3524+ touch $@
3525+CI_merge_nodeb: CI_merge_nodeb.tag
3526+
3527+# all builds
3528+#CI.tag: CI_pack.tag apptar_server_64.tag
3529+CI.tag: CI_windows.tag CI_free.tag full.tag CI_pack.tag
3530+ touch $@
3531+
3532+CI_base: CI_base.tag
3533+CI: CI.tag
3534+
3535+all: default
3536+
3537+dockertest.tag:
3538+ cp ${srcdir}/fakerelease_proto.sh .
3539+ @echo "Testing whether 'docker' works..."
3540+ docker help > /dev/null
3541+ echo > $@
3542+
3543+tarwrapper.sh: ${top_srcdir}/docker/scripts/tarwrapper.sh
3544+ ln -s $< $@
3545+
3546+#***************************************************************
3547+
3548+# variables
3549+
3550+# package metadata
3551+PACKAGE_VERSION:=$(shell grep "^PACKAGE_VERSION=" context/version.sh | sed -e "s,.*=,,")
3552+PACKAGE_NAME:=$(shell grep "^PACKAGE_NAME=" context/version.sh | sed -e "s,.*=,,")
3553+PACKAGE_TITLE:=$(shell grep "^PACKAGE_TITLE=" context/version.sh | sed -e "s,.*=,,")
3554+PACKAGE_NAME_SUFFIX:=$(shell echo $(PACKAGE_NAME) | sed -e "s,.*-,-,")
3555+PACKAGE_TITLE_SUFFIX:=$(shell echo $(PACKAGE_TITLE) | sed -e "s,.* , ,")
3556+STEAM_PACKAGE_NAME=retrocycles
3557+STEAM_PACKAGE_TITLE=Retrocycles
3558+
3559+# configurations for lean builds not supposed to be installed
3560+CONFIGURE_ARGUMENTS:=--disable-uninstall --disable-restoreold --enable-etc --enable-automakedefaults --disable-useradd --disable-sysinstall --disable-initscripts
3561+CONFIGURE_ARGUMENTS_SERVER:=--disable-glout --enable-armathentication
3562+
3563+# other directories
3564+SCRIPTDIR:=${srcdir}/../scripts
3565+GITS:=$(SCRIPTDIR)/.cache/gits
3566+
3567+# dump CI data and variables determined from it
3568+CI_INFO: ${srcdir}/../scripts/brand.sh
3569+ . ${srcdir}/../scripts/brand.sh @top_srcdir@ && \
3570+ echo SERIES=$${SERIES} > $@ && \
3571+ echo PROGRAM_NAME=$${PROGRAM_NAME} >> $@ && \
3572+ echo PROGRAM_TITLE=$${PROGRAM_TITLE} >> $@ && \
3573+ echo CI_COMMIT_REF_PROTECTED=$${CI_COMMIT_REF_PROTECTED} >> $@ && \
3574+ echo CI_COMMIT_SHA=$${CI_COMMIT_SHA} >> $@ && \
3575+ echo CI_COMMIT_REF_NAME=$${CI_COMMIT_REF_NAME} >> $@
3576+
3577+.PRECIOUS: CI_INFO
3578+
3579+#***************************************************************
3580+
3581+upload/.tag:
3582+ mkdir -p upload
3583+ echo > $@
3584+proto.tag:
3585+ mkdir -p proto
3586+ echo > $@
3587+
3588+make_ci.sh: ${srcdir}/make_ci.sh.in
3589+ cp $< $@
3590+
3591+context/version.sh: ${srcdir}/context/version.sh.in
3592+ cd ../../; ./config.status docker/build/context/version.sh
3593+
3594+../deploy/targets.sh: ${srcdir}/../deploy/targets.sh.in
3595+ cd ../../; ./config.status docker/deploy/targets.sh
3596+
3597+#***************************************************************
3598+
3599+# create source tarball
3600+TARBALL:=../../armagetronad-@version@.tar.gz
3601+$(TARBALL):
3602+ $(MAKE) -C ../../ dist GZIP_ENV=""
3603+tarball: $(TARBALL)
3604+
3605+# unpack source tarball
3606+source.tag: $(TARBALL) dockertest.tag
3607+ rm -rf source armagetronad-@version@
3608+ tar -xzf $(TARBALL)
3609+ mv armagetronad-@version@ source
3610+ echo > $@
3611+source: source.tag
3612+
3613+# rebranded tarball for upload
3614+upload/$(PACKAGE_NAME)-@version@.tbz: $(TARBALL) upload/.tag tarwrapper.sh
3615+ rm -rf $@ repack
3616+ mkdir -p repack_1 repack_2
3617+ cd repack_1; tar -xzf ../$(TARBALL)
3618+ mv repack_1/armagetronad-@version@ repack_2/$(PACKAGE_NAME)-@version@
3619+ cd repack_2; ../tarwrapper.sh -cjf repacked.tbz $(PACKAGE_NAME)-@version@
3620+ mv repack_2/repacked.tbz $@
3621+ rm -rf repack_1 repack_2
3622+
3623+sourcetar.tag: upload/$(PACKAGE_NAME)-@version@.tbz
3624+ touch $@
3625+
3626+# foreign gits (in the cache)
3627+gits.tag: $(SCRIPTDIR)/fix_gits.sh
3628+ $(SCRIPTDIR)/fix_gits.sh
3629+ echo > $@
3630+
3631+# bits of gits we need in artifacts
3632+gits_artifacts.tag: gits.tag
3633+ rm -rf gits
3634+ mkdir -p gits
3635+ cp -a ${GITS}/ubuntu/debian gits/
3636+ mkdir -p gits/steam
3637+ cp -a ${GITS}/steam-art/good/title.png gits/steam
3638+ echo > $@
3639+
3640+upload/PATCHNOTES.md: sourcetar.tag upload/.tag
3641+ ${top_srcdir}/batch/make/patchnotes.py ${top_srcdir} ${top_srcdir}/CHANGELOG_FROZEN.md armagetronad armagetronad -p > $@
3642+
3643+upload/CHANGELOG.md: sourcetar.tag upload/.tag
3644+ ${top_srcdir}/batch/make/patchnotes.py ${top_srcdir} ${top_srcdir}/CHANGELOG_FROZEN.md armagetronad armagetronad > $@
3645+
3646+#***************************************************************
3647+
3648+# generic context with source
3649+# technically everything here depends on the Makefile, but enforcing rebuilds on all
3650+# Makefile edits is too annoying during develop/test cycles.
3651+rootcontext.64: source.tag ${srcdir}/*.sh ${srcdir}/context/build.sh #Makefile
3652+ ${srcdir}/prepare_context.sh $@.dir source ${srcdir}/context/build.sh
3653+ echo "armabuild_64" > $@.dir/image
3654+ echo > $@
3655+
3656+context.64: rootcontext.64
3657+ ${srcdir}/prepare_context.sh $@.dir $<.dir/'*'
3658+ echo > $@
3659+
3660+#***************************************************************
3661+
3662+# switch container to use to 32 bit
3663+context.32: context.64
3664+ ${srcdir}/prepare_context.sh $@.dir $<.dir/'*'
3665+ rm $@.dir/image
3666+ echo "armabuild_32" > $@.dir/image
3667+ echo > $@
3668+
3669+# switch container to use to steam SDK, rebrand
3670+context.steam: context.64 gits_artifacts.tag
3671+ ${srcdir}/prepare_context.sh $@.dir $<.dir/'*'
3672+ rm $@.dir/image
3673+ echo "armasteam_64" > $@.dir/image
3674+# rebrand
3675+ sed -i $@.dir/version.sh -e s/PACKAGE_NAME=armagetronad/PACKAGE_NAME=$(STEAM_PACKAGE_TITLE)/ -e s/PACKAGE_TITLE=\"Armagetron\ Advanced/PACKAGE_TITLE=\"$(STEAM_PACKAGE_TITLE)/ -e s/PACKAGE_TITLE=\"Armagetron/PACKAGE_TITLE=\"$(STEAM_PACKAGE_TITLE)/
3676+# no remotely adult stuff
3677+ sed -i $@.dir/source/src/engine/ePlayer.cpp -e "s/pr0n/cat videos/"
3678+# install alternative title, adapt sources
3679+ cp gits/steam/title.png $@.dir/source/textures/
3680+ sed -i $@.dir/source/src/tron/gLogo.cpp $@.dir/source/Makefile.* -e "s,textures/title.jpg,textures/title.png,"
3681+ cd $@.dir/source; automake
3682+# done
3683+ echo > $@
3684+
3685+# add debian/ubuntu build info for release %. Requires GPG key from ~/.gnupg
3686+context.debsrc_%: rootcontext.64 ${srcdir}/rebrand_debian_core.sh ${srcdir}/debian_source.sh gits_artifacts.tag $(TARBALL)
3687+ ${srcdir}/prepare_context.sh $@.dir $<.dir/'*' $(TARBALL) ${srcdir}/rebrand_debian_core.sh ${srcdir}/debian_source.sh ./gits/debian
3688+ if test -r ../deploy/secrets/sec.gpg; then cp -lrf ../deploy/secrets/*.gpg $@.dir/; fi
3689+ echo "armadeb_64" > $@.dir/image
3690+ echo > $@
3691+result.debsrc_%: context.debsrc_%
3692+ +$(srcdir)/context_to_result.sh $@.dir ./debian_source.sh $*
3693+ echo > $@
3694+
3695+# test build a debian package (with a really old ubuntu codename)
3696+context.debsrc_test: context.debsrc_dapper
3697+ ${srcdir}/prepare_context.sh $@.dir $<.dir/'*'
3698+# extract fake secrets
3699+ base64 -d < ${srcdir}/../deploy/anonymous_secrets.b64 | tar -xjf - --one-top-level=$@.dir
3700+ mv $@.dir/secrets/* $@.dir
3701+ rmdir $@.dir/secrets/
3702+ echo > $@
3703+context.debtest: result.debsrc_test
3704+ ${srcdir}/prepare_context.sh $@.dir $<.dir/'*'
3705+ echo "cd source && debuild -i -us -uc -b && rm -rf *" > $@.dir/build_deb.sh
3706+ chmod +x $@.dir/build_deb.sh
3707+ echo > $@
3708+
3709+result.debtest: context.debtest
3710+ +$(srcdir)/context_to_result.sh $@.dir bash ./build_deb.sh
3711+ echo > $@
3712+
3713+debtest.tag: result.debtest
3714+ echo > $@
3715+
3716+# switch container to use alpine
3717+context.test: rootcontext.64
3718+ ${srcdir}/prepare_context.sh $@.dir $<.dir/'*'
3719+ rm $@.dir/image
3720+ echo "armalpine_32" > $@.dir/image
3721+ echo > $@
3722+
3723+#***************************************************************
3724+
3725+context.build_server_%: context.%
3726+ ${srcdir}/prepare_context.sh $@.dir $<.dir/'*'
3727+ echo "server" > $@.dir/serverclient
3728+ echo > $@
3729+
3730+context.build_client_%: context.%
3731+ ${srcdir}/prepare_context.sh $@.dir $<.dir/'*'
3732+ echo "client" > $@.dir/serverclient
3733+ echo > $@
3734+
3735+.PRECIOUS: context.build_server_32 context.build_client_32 context.build_server_64 context.build_client_64
3736+
3737+#***************************************************************
3738+
3739+# server build for further processing
3740+result.build_server_%: context.build_server_%
3741+ +$(srcdir)/context_to_result.sh $@.dir ./build.sh $(CONFIGURE_ARGUMENTS) $(CONFIGURE_ARGUMENTS_SERVER)
3742+ echo > $@
3743+
3744+# client build for further processing
3745+result.build_client_%: context.build_client_%
3746+ +$(srcdir)/context_to_result.sh $@.dir ./build.sh $(CONFIGURE_ARGUMENTS)
3747+ echo > $@
3748+
3749+.PRECIOUS: result.build_server_32 result.build_client_32 result.build_server_64 result.build_client_64
3750+
3751+#***************************************************************
3752+
3753+# portable application directories
3754+context.appdir_%: result.build_% ${srcdir}/context/portable/* ${srcdir}/context/appdir.sh ${srcdir}/context/steam.sh
3755+ ${srcdir}/prepare_context.sh $@.dir $<.dir/* ${srcdir}/context/portable ${srcdir}/context/appdir.sh ${srcdir}/context/steam.sh
3756+ echo > $@
3757+
3758+result.appdir_%: context.appdir_%
3759+ +$(srcdir)/context_to_result.sh $@.dir ./appdir.sh
3760+ echo > $@
3761+
3762+# use different script for steam builds, rearranging some things
3763+result.appdir_%_steam: context.appdir_%_steam
3764+ +$(srcdir)/context_to_result.sh $@.dir ./steam.sh
3765+ echo > $@
3766+
3767+# tarball of appdir
3768+APPTAR_SERVER_32=$(PACKAGE_NAME)-server_32-$(PACKAGE_VERSION).tbz
3769+APPTAR_SERVER_64=$(PACKAGE_NAME)-server_64-$(PACKAGE_VERSION).tbz
3770+APPTAR_CLIENT_32=$(PACKAGE_NAME)-client_32-$(PACKAGE_VERSION).tbz
3771+APPTAR_CLIENT_64=$(PACKAGE_NAME)-client_64-$(PACKAGE_VERSION).tbz
3772+apptar_server_32.tag: upload/$(APPTAR_SERVER_32)
3773+ echo > $@
3774+apptar_server_64.tag: upload/$(APPTAR_SERVER_64)
3775+ echo > $@
3776+apptar_client_32.tag: upload/$(APPTAR_CLIENT_32)
3777+ echo > $@
3778+apptar_client_64.tag: upload/$(APPTAR_CLIENT_64)
3779+ echo > $@
3780+
3781+upload/$(APPTAR_SERVER_32): result.appdir_server_32 upload/.tag tarwrapper.sh
3782+ cd $<.dir/appdir; ../../tarwrapper.sh -cjf ../../$@ .
3783+upload/$(APPTAR_CLIENT_32): result.appdir_client_32 upload/.tag tarwrapper.sh
3784+ cd $<.dir/appdir; ../../tarwrapper.sh -cjf ../../$@ .
3785+upload/$(APPTAR_SERVER_64): result.appdir_server_64 upload/.tag tarwrapper.sh
3786+ cd $<.dir/appdir; ../../tarwrapper.sh -cjf ../../$@ .
3787+upload/$(APPTAR_CLIENT_64): result.appdir_client_64 upload/.tag tarwrapper.sh
3788+ cd $<.dir/appdir; ../../tarwrapper.sh -cjf ../../$@ .
3789+
3790+apptar.tag: apptar_server_32.tag apptar_client_32.tag apptar_server_64.tag apptar_client_64.tag upload/$(APPTAR_SERVER_32) upload/$(APPTAR_SERVER_64) upload/$(APPTAR_CLIENT_32) upload/$(APPTAR_CLIENT_64)
3791+ echo > $@
3792+apptar: apptar.tag
3793+
3794+.PHONY: appdir apptar
3795+
3796+.PRECIOUS: context.apptar_server_32 context.apptar_client_32 context.apptar_server_64 context.apptar_client_64
3797+
3798+.PRECIOUS: context.appdir_server_32 context.appdir_client_32 context.appdir_server_64 context.appdir_client_64
3799+
3800+#***************************************************************
3801+
3802+# AppImages
3803+context.appimage_%: result.appdir_% ${srcdir}/context/appimage.sh
3804+ ${srcdir}/prepare_context.sh $@.dir $<.dir/appdir $<.dir/image $<.dir/version.sh ${srcdir}/context/appimage.sh
3805+ echo > $@
3806+
3807+result.appimage_%: context.appimage_%
3808+ +$(srcdir)/context_to_result.sh $@.dir "./appimage.sh AppImage"
3809+ echo > $@
3810+
3811+APPIMAGE_BASENAME:=$(shell echo $(PACKAGE_TITLE) | sed -e "s, ,,g")
3812+APPIMAGE_CLIENT_64:=$(APPIMAGE_BASENAME)-$(PACKAGE_VERSION)
3813+APPIMAGE_SERVER_64:=$(APPIMAGE_BASENAME)Dedicated-$(PACKAGE_VERSION)
3814+APPIMAGE_CLIENT_32:=$(APPIMAGE_BASENAME)-32bit-$(PACKAGE_VERSION)
3815+APPIMAGE_SERVER_32:=$(APPIMAGE_BASENAME)Dedicated-32bit-$(PACKAGE_VERSION)
3816+
3817+upload/$(APPIMAGE_CLIENT_64): result.appimage_client_64 upload/.tag
3818+ cp $<.dir/AppImage $@
3819+upload/$(APPIMAGE_SERVER_64): result.appimage_server_64 upload/.tag
3820+ cp $<.dir/AppImage $@
3821+upload/$(APPIMAGE_CLIENT_32): result.appimage_client_32 upload/.tag
3822+ cp $<.dir/AppImage $@
3823+upload/$(APPIMAGE_SERVER_32): result.appimage_server_32 upload/.tag
3824+ cp $<.dir/AppImage $@
3825+
3826+appimage_client_64.tag: upload/$(APPIMAGE_CLIENT_64)
3827+ echo > $@
3828+appimage_server_64.tag: upload/$(APPIMAGE_SERVER_64)
3829+ echo > $@
3830+appimage_client_32.tag: upload/$(APPIMAGE_CLIENT_32)
3831+ echo > $@
3832+appimage_server_32.tag: upload/$(APPIMAGE_SERVER_32)
3833+ echo > $@
3834+
3835+appimage.tag: appimage_client_64.tag appimage_server_64.tag appimage_client_32.tag appimage_server_32.tag
3836+ echo > $@
3837+
3838+.PRECIOUS: context.appimage_server_32 context.appimage_client_32 context.appimage_server_64 context.appimage_client_64
3839+
3840+#***************************************************************
3841+
3842+# windows source
3843+context.winsource_%: result.build_server_% ${srcdir}/context/winsource.sh gits.tag
3844+ ${srcdir}/prepare_context.sh $@.dir $<.dir/* ${srcdir}/context/winsource.sh $(GITS)/codeblocks
3845+ echo > $@
3846+result.winsource_%: context.winsource_%
3847+ +$(srcdir)/context_to_result.sh $@.dir ./winsource.sh
3848+ echo > $@
3849+
3850+# windows build
3851+context.winbuild_%: result.winsource_% ${srcdir}/context/winbuild.sh gits.tag
3852+ ${srcdir}/prepare_context.sh $@.dir $<.dir/* ${srcdir}/context/winbuild.sh $(GITS)/winlibs
3853+ rm $@.dir/image
3854+ echo "armawineblocks" > $@.dir/image
3855+ echo > $@
3856+result.winbuild_%: context.winbuild_%
3857+ +$(srcdir)/context_to_result.sh $@.dir ./winbuild.sh
3858+ echo > $@
3859+
3860+# windows installers
3861+context.wininst_%: result.winbuild_% ${srcdir}/context/wininst.sh
3862+ ${srcdir}/prepare_context.sh $@.dir $<.dir/* ${srcdir}/context/wininst.sh
3863+ rm $@.dir/image
3864+ echo "armawineblocks" > $@.dir/image
3865+ echo > $@
3866+result.wininst_%: context.wininst_%
3867+ +$(srcdir)/context_to_result.sh $@.dir ./wininst.sh
3868+ echo > $@
3869+
3870+# windows source zip
3871+WINZIP_SOURCE_NAME:=$(PACKAGE_NAME)-source-$(PACKAGE_VERSION)
3872+WINZIP_SOURCE_DIR:=proto/$(WINZIP_SOURCE_NAME)
3873+WINZIP_SOURCE:=upload/$(WINZIP_SOURCE_NAME).zip
3874+$(WINZIP_SOURCE_DIR): result.winsource_32 proto.tag Makefile
3875+ rm -rf $@.dir
3876+ cp -al $<.dir/winsource $@.dir
3877+ echo > $@
3878+$(WINZIP_SOURCE): $(WINZIP_SOURCE_DIR) upload/.tag
3879+ cd $(WINZIP_SOURCE_DIR).dir; zip -9 -r ../../$(WINZIP_SOURCE) *
3880+winzip_source.tag: $(WINZIP_SOURCE)
3881+ echo > $@
3882+
3883+# windows client zip
3884+WINZIP_CLIENT_NAME:=$(PACKAGE_NAME)-client-$(PACKAGE_VERSION)
3885+WINZIP_CLIENT_DIR:=proto/$(WINZIP_CLIENT_NAME)
3886+WINZIP_CLIENT:=upload/$(WINZIP_CLIENT_NAME).win32.zip
3887+$(WINZIP_CLIENT_DIR): result.winbuild_32 proto.tag Makefile
3888+ rm -rf $@.dir
3889+ cp -al $<.dir/dist $@.dir
3890+ rm $@.dir/$(PACKAGE_NAME)_dedicated.exe $@.dir/*.nsi $@.dir/banner* $@.dir/INSTALL.txt
3891+ echo > $@
3892+$(WINZIP_CLIENT): $(WINZIP_CLIENT_DIR) upload/.tag
3893+ cd $(WINZIP_CLIENT_DIR).dir; zip -9 -r ../../$(WINZIP_CLIENT) *
3894+winzip_client.tag: $(WINZIP_CLIENT)
3895+ echo > $@
3896+
3897+# windows server zip
3898+WINZIP_SERVER_NAME:=$(PACKAGE_NAME)-server-$(PACKAGE_VERSION)
3899+WINZIP_SERVER_DIR:=proto/$(WINZIP_SERVER_NAME)
3900+WINZIP_SERVER:=upload/$(WINZIP_SERVER_NAME).win32.zip
3901+$(WINZIP_SERVER_DIR): result.winbuild_32 proto.tag Makefile
3902+ rm -rf $@.dir
3903+ cp -al $<.dir/dist $@.dir
3904+ rm -r $@.dir/$(PACKAGE_NAME).exe $@.dir/*.nsi $@.dir/banner* \
3905+ $@.dir/INSTALL.txt $@.dir/models $@.dir/sound $@.dir/textures \
3906+ $@.dir/SDL* $@.dir/libpng* $@.dir/jpeg*
3907+ echo > $@
3908+$(WINZIP_SERVER): $(WINZIP_SERVER_DIR) upload/.tag
3909+ cd $(WINZIP_SERVER_DIR).dir; zip -9 -r ../../$(WINZIP_SERVER) *
3910+winzip_server.tag: $(WINZIP_SERVER)
3911+ echo > $@
3912+
3913+winzip.tag: winzip_server.tag winzip_client.tag winzip_source.tag
3914+ echo > $@
3915+
3916+
3917+# copy installers into upload
3918+WININST_CLIENT_NAME:=$(PACKAGE_NAME)-$(PACKAGE_VERSION).gcc.win32.exe
3919+WININST_SERVER_NAME:=$(PACKAGE_NAME)-dedicated-$(PACKAGE_VERSION).gcc.win32.exe
3920+WININST_CLIENT=upload/$(WININST_CLIENT_NAME)
3921+WININST_SERVER=upload/$(WININST_SERVER_NAME)
3922+$(WININST_CLIENT): result.wininst_32 upload/.tag
3923+ rm -f $@
3924+ cp $<.dir/$(WININST_CLIENT_NAME) $@
3925+$(WININST_SERVER): result.wininst_32 upload/.tag
3926+ rm -f $@
3927+ cp $<.dir/$(WININST_SERVER_NAME) $@
3928+windows.tag: $(WININST_CLIENT) $(WININST_SERVER)
3929+ echo > $@
3930+
3931+# prerequisites for zeroinstall
3932+zeroinstall.tag: winzip.tag apptar.tag
3933+ touch $@
3934+zeroinstall: zeroinstall.tag
3935+
3936+.PHONY: windows winzip_client winzip_server zeroinstall
3937+
3938+.PRECIOUS: context.wininst_32 context.winbuild_32 context.winsource_32
3939+
3940+#***************************************************************
3941+
3942+steamdirs/.tag:
3943+ mkdir -p steamdirs
3944+ echo > $@
3945+
3946+# steam packaging
3947+steamdirs/steam_linux: result.appdir_server_steam result.appdir_client_steam steamdirs/.tag
3948+ rm -rf $@.dir
3949+ cp -al $<.dir/appdir $@.dir
3950+ cp -al result.appdir_client_steam.dir/appdir/* $@.dir/
3951+ echo > $@
3952+
3953+steamdirs/steam_windows: result.winbuild_steam steamdirs/.tag
3954+ rm -rf $@.dir
3955+ cp -al $<.dir/dist $@.dir
3956+ mv $@.dir/*dedicated.exe $@.dir/DEDICATED.hex
3957+ mv $@.dir/*.exe $@.dir/CLIENT.hex
3958+ mv $@.dir/CLIENT.hex $@.dir/$(STEAM_PACKAGE_TITLE).exe
3959+ mv $@.dir/DEDICATED.hex $@.dir/$(STEAM_PACKAGE_TITLE)_Dedicated.exe
3960+ rm -rf $@.dir/*.nsi
3961+ rm -rf $@.dir/*.url
3962+ rm -rf $@.dir/banner*
3963+ echo > $@
3964+
3965+steam_linux.tag: steamdirs/steam_linux result.appdir_client_steam result.appdir_server_steam
3966+ echo > $@
3967+steam_windows.tag: steamdirs/steam_windows result.winbuild_steam
3968+ echo > $@
3969+
3970+steam.tag: steam_windows.tag steam_linux.tag
3971+ echo > $@
3972+.PHONY: steam steam_windows steam_linux
3973+
3974+.PRECIOUS: context.build_client_steam result.build_client_steam context.appdir_client_steam result.build_server_steam context.build_server_steam context.appdir_server_steam context.winbuild_steam context.winsource_steam
3975+
3976+#***************************************************************
3977+
3978+# for testing, we want minimal builds before any deployment
3979+# in production, the CI solution is responsible for having built
3980+# everything not explicitly required here
3981+deploy_base.tag: CI_pack.tag debtest.tag ../deploy/targets.sh
3982+ echo > $@
3983+deploy_base: deploy_base.tag
3984+
3985+context.deploy_base_%: rootcontext.64 deploy_base.tag ${srcdir}/../deploy/deploy_%.sh ../deploy/* CI_INFO
3986+ ${srcdir}/prepare_context.sh $@.dir $<.dir/'*' upload ../deploy/'*' ${srcdir}/../deploy/deploy_$*.sh CI_INFO
3987+ echo > $@
3988+context.deploy_%: context.deploy_base_%
3989+ ${srcdir}/prepare_context.sh $@.dir $<.dir/'*'
3990+ echo > $@
3991+result.deploy_%: context.deploy_%
3992+ +$(srcdir)/context_to_result.sh $@.dir ./deploy_$*.sh
3993+ echo > $@
3994+
3995+# special case steam: run in steamcmd image
3996+context.deploy_steam: context.deploy_base_steam ${srcdir}/../deploy/steamcontentbuilder/*/* steamdirs/*
3997+ ${srcdir}/prepare_context.sh $@.dir $<.dir/'*' ${srcdir}/../deploy/steamcontentbuilder
3998+ sed -i $@.dir/steamcontentbuilder/scripts/app_build_1306180.vdf -e "s/BUILD_DESCRIPTION/$(STEAM_PACKAGE_TITLE)$(PACKAGE_TITLE_SUFFIX) $(PACKAGE_VERSION)/"
3999+ mkdir -p $@.dir/steamcontentbuilder/content $@.dir/steamcontentbuilder/output
4000+ cp -al steamdirs/steam_windows.dir $@.dir/steamcontentbuilder/content/steam_windows
4001+ cp -al steamdirs/steam_linux.dir $@.dir/steamcontentbuilder/content/steam_linux
4002+ rm -rf $@.dir/upload
4003+ rm -f $@.dir/image
4004+ echo "steamcmd" > $@.dir/image
4005+ echo > $@
4006+
4007+context.deploy_ppa_%: result.debsrc_% ${srcdir}/../deploy/deploy_ppa.sh ../deploy/targets.sh CI_INFO
4008+ ${srcdir}/prepare_context.sh $@.dir $<.dir/'*' ${srcdir}/../deploy/deploy_ppa.sh ../deploy/targets.sh ../deploy/secrets/*.gpg CI_INFO
4009+ echo > $@
4010+result.deploy_ppa_%: context.deploy_ppa_%
4011+ +$(srcdir)/context_to_result.sh $@.dir ./deploy_ppa.sh $*
4012+ echo > $@
4013+
4014+# deploy for launchpad needs armadeb image
4015+context.deploy_lp: context.deploy_base_lp ${srcdir}/../deploy/lp-project-upload
4016+ ${srcdir}/prepare_context.sh $@.dir $<.dir/'*' ${srcdir}/../deploy/lp-project-upload
4017+ rm -f $@.dir/image
4018+ echo "armadeb_64" > $@.dir/image
4019+ echo > $@
4020+
4021+context.update_zi: context.deploy_base_zeroinstall ${srcdir}/../deploy/*_zeroinstall.sh
4022+ ${srcdir}/prepare_context.sh $@.dir $<.dir/'*' ${srcdir}/../deploy/*_zeroinstall.sh
4023+ rm -f $@.dir/image
4024+ echo "armadeploy_64" > $@.dir/image
4025+ echo > $@
4026+result.update_zi: context.update_zi
4027+ +$(srcdir)/context_to_result.sh $@.dir ./update_zeroinstall.sh
4028+ echo > $@
4029+context.deploy_zi: context.deploy_base_zeroinstall result.update_zi ${srcdir}/../deploy/*_zeroinstall.sh result.deploy_lp result.deploy_scp
4030+ ${srcdir}/prepare_context.sh $@.dir $<.dir/'*' result.update_zi.dir/zeroinstall ${srcdir}/../deploy/*_zeroinstall.sh
4031+ rm -f $@.dir/image
4032+ echo "armadeploy_64" > $@.dir/image
4033+ echo > $@
4034+result.deploy_zi: context.deploy_zi
4035+ +$(srcdir)/context_to_result.sh $@.dir ./deploy_zeroinstall.sh
4036+ echo > $@
4037+
4038+# deploy to download site (additional dependency here only, standard rules apply)
4039+result.deploy_download: result.deploy_scp result.deploy_lp
4040+
4041+# individual deploy targets
4042+deploy_lp: result.deploy_lp
4043+deploy_scp: result.deploy_scp
4044+deploy_steam: result.deploy_steam
4045+deploy_zi: result.deploy_zi
4046+deploy_download: result.deploy_download
4047+
4048+deploy_ppa: \
4049+deploy_ppa_focal \
4050+deploy_ppa_eoan \
4051+deploy_ppa_bionic \
4052+deploy_ppa_xenial \
4053+deploy_ppa_trusty
4054+
4055+deploy_ppa_%: result.deploy_ppa_%
4056+ @echo Deployed $*
4057+
4058+deploy: deploy_lp deploy_scp deploy_ppa deploy_zi deploy_steam deploy_download
4059+#deploy: deploy_scp
4060+#deploy: deploy_zi
4061+#deploy: deploy_ppa
4062+
4063+unstaged_%:
4064+# disable staging, deploy for real
4065+ sed -i ../deploy/targets.sh -e "s/STAGING=true/STAGING=false/"
4066+ STAGING=false MAKE=$(MAKE) ${srcdir}/make_deploy.sh $*
4067+
4068+staged_%:
4069+# enforce staging
4070+ sed -i ../deploy/targets.sh -e "s/STAGING=false/STAGING=true/"
4071+ MAKE=$(MAKE) ${srcdir}/make_deploy.sh $*
4072+
4073+.PHONY: deploy deploy_ppa deploy_scp deploy_steam deploy_base deploy_download
4074+
4075+.PRECIOUS: context.debsrc_dapper \
4076+context.debsrc_bionic result.debsrc_bionic context.deploy_ppa_bionic result.deploy_ppa_bionic \
4077+context.debsrc_trusty result.debsrc_trusty context.deploy_ppa_trusty result.deploy_ppa_trusty \
4078+context.debsrc_xenial result.debsrc_xenial context.deploy_ppa_xenial result.deploy_ppa_xenial \
4079+context.debsrc_eoan result.debsrc_eoan context.deploy_ppa_eoan result.deploy_ppa_eoan \
4080+context.debsrc_focal result.debsrc_focal context.deploy_ppa_focal result.deploy_ppa_focal \
4081+context.deploy_base_scp context.deploy_scp \
4082+context.deploy_base_download result.deploy_download context.deploy_download
4083+
4084+#***************************************************************
4085+
4086+# base64 encode secrets so they can be passed in via a protected configuration variable
4087+../deploy/secrets.b64: ../deploy/secrets/* ../deploy/secrets/*/*
4088+ cd ../deploy; tar --exclude-backups -cjf - secrets | base64 > secrets.b64
4089+
4090+secrets: ../deploy/secrets.b64
4091+
4092+.PHONY: secrets
4093+
4094+#***************************************************************
4095+
4096+# test client build on lean alpine linux
4097+test: result.build_client_test result.build_server_test
4098+
4099+#***************************************************************
4100+
4101+intermediateclean:
4102+ rm -rf context.*
4103+
4104+# keep the artifacts clean of junk not needed in the next phase
4105+artifactclean:
4106+ rm -rf *.dir source proto/*.dir
4107+
4108+clean: intermediateclean
4109+ rm -rf upload source gits result.* *.tag proto
4110+ if git -C ${srcdir} rev-parse --abbrev-ref HEAD > /dev/null; then rm -f CI_INFO; fi
4111+distclean: clean
4112+ rm -rf $(TARBALL) CI_INFO
4113+ cd ${top_srcdir} && ./bootstrap.sh
4114+ cat ${top_srcdir}/version.m4
4115
4116=== added file 'docker/build/build_in_container.sh'
4117--- docker/build/build_in_container.sh 1970-01-01 00:00:00 +0000
4118+++ docker/build/build_in_container.sh 2020-07-03 06:03:19 +0000
4119@@ -0,0 +1,87 @@
4120+#!/bin/bash
4121+
4122+# Usage: build_in_container.sh <base_image> <result> <command>
4123+# Takes <base_image> as base, copies current directory into a build directory,
4124+# runs <commmand>, copies resulting build directory to ./<result>/
4125+
4126+base=$1
4127+shift
4128+result=$1
4129+shift
4130+
4131+if test -d ${result}; then
4132+ echo ${result} already exists.
4133+ exit 1
4134+fi
4135+
4136+set -x
4137+
4138+# make sure base image exists
4139+wd=`dirname $0`
4140+${wd}/../scripts/ensure_image.sh "${base}" -d
4141+. ${wd}/../images/digest.sh "${base}" || exit $?
4142+
4143+dockeruser=`docker inspect --format '{{.Config.User}}' ${REGISTRY}${base}${REFERENCE}` || exit $?
4144+home=/home/${dockeruser}
4145+if test -z "$dockeruser";then
4146+ dockeruser=root
4147+ home=/root
4148+fi
4149+
4150+# create dockerfile with prepared input files
4151+tmp=`mktemp`
4152+container_name=image_${PPID}_`basename ${tmp} | tr '[:upper:]' '[:lower:]'`
4153+function build(){
4154+docker build --no-cache -t ${container_name} -f - . <<EOF
4155+FROM ${REGISTRY}${base}${REFERENCE}
4156+RUN mkdir -p ${home}/BUILDDIR
4157+COPY --chown=${dockeruser} ./ ${home}/BUILDDIR
4158+WORKDIR ${home}/BUILDDIR
4159+EOF
4160+}
4161+
4162+build || exit $?
4163+
4164+# run command and extract output from container
4165+function run_and_extract(){
4166+ EXITCODE=0
4167+ cidfile=${result}.CID
4168+ rm -f ${cidfile}
4169+ docker run --cidfile ${cidfile} ${container_name} $@ || EXITCODE=$?
4170+ container_id=`cat ${cidfile}`
4171+ rm -f ${cidfile}
4172+ docker cp ${container_id}:${home}/BUILDDIR ${result} || EXITCODE=$?
4173+ docker rm -f ${container_id} || true
4174+ docker rmi -f ${container_name} || true
4175+ return ${EXITCODE}
4176+}
4177+
4178+if ! run_and_extract "$@"; then
4179+ # on failure, remove output
4180+ rm -rf ${tmp}
4181+ rm -rf ${result}.error
4182+ mv ${result} ${result}.error
4183+ exit 1
4184+fi
4185+
4186+rm -rf ${tmp}
4187+
4188+exit 0
4189+
4190+# save disk space by deduplicating source and destination
4191+set +x
4192+function link_identical_files(){
4193+ while read file; do
4194+ if test -r "${result}/${file}"; then
4195+ if diff "${file}" "${result}/${file}" > /dev/null; then
4196+ echo cp -lf "${file}" ...
4197+ cp -lf "${file}" "${result}/${file}"
4198+ else
4199+ echo NOT "${file}", differs
4200+ fi
4201+ fi
4202+ done
4203+}
4204+find . -type f | link_identical_files || exit $?
4205+set -x
4206+
4207
4208=== added directory 'docker/build/context'
4209=== added file 'docker/build/context/appdir.sh'
4210--- docker/build/context/appdir.sh 1970-01-01 00:00:00 +0000
4211+++ docker/build/context/appdir.sh 2020-07-03 06:03:19 +0000
4212@@ -0,0 +1,15 @@
4213+#!/bin/bash
4214+
4215+# build a portable application dir
4216+test -x fakerelease.sh && . fakerelease.sh
4217+. version.sh || exit 1
4218+
4219+set -x
4220+
4221+SUFFIX=
4222+cat serverclient | grep "server" > /dev/null && SUFFIX=-dedicated
4223+make -C build install DESTDIR=`pwd`/appdir || exit
4224+APPDIR=appdir PACKAGE=${PACKAGE_NAME}${SUFFIX} portable/build || exit
4225+
4226+# comment out to inspect result for debug purposes
4227+rm -rf build source
4228
4229=== added file 'docker/build/context/appimage.sh'
4230--- docker/build/context/appimage.sh 1970-01-01 00:00:00 +0000
4231+++ docker/build/context/appimage.sh 2020-07-03 06:03:19 +0000
4232@@ -0,0 +1,24 @@
4233+#!/bin/bash
4234+
4235+# pack portable application dir into AppImage
4236+set -x
4237+
4238+. ./version.sh
4239+
4240+# determine arch suffix
4241+ARCH=x86_64
4242+if test `getconf LONG_BIT` -eq 32; then
4243+ ARCH=i686
4244+fi
4245+
4246+# copy icon
4247+cp -l appdir/usr/local/share/games/${PACKAGE_NAME}*/desktop/icons/large/${PACKAGE_NAME}*.png appdir/
4248+
4249+# pack it up. The appimagetool package is available here:
4250+# https://github.com/AppImage/AppImageKit/releases
4251+
4252+rm -f $1
4253+ARCH=${ARCH} appimagetool-${ARCH}.AppImage --appimage-extract-and-run appdir $1
4254+
4255+# comment out to inspect result for debug purposes
4256+rm -rf appdir
4257
4258=== added file 'docker/build/context/build.sh'
4259--- docker/build/context/build.sh 1970-01-01 00:00:00 +0000
4260+++ docker/build/context/build.sh 2020-07-03 06:03:19 +0000
4261@@ -0,0 +1,14 @@
4262+#!/bin/bash
4263+
4264+# do a build from source to build
4265+test -x fakerelease.sh && . fakerelease.sh
4266+. version.sh || exit $?
4267+
4268+set -x
4269+
4270+mkdir -p build
4271+pushd build
4272+progname="${PACKAGE_NAME}" progtitle="${PACKAGE_TITLE}" ../source/configure --prefix=/usr/local $@ || exit $?
4273+nice -n 19 make -j `nproc` || exit $?
4274+popd
4275+
4276
4277=== added directory 'docker/build/context/portable'
4278=== added file 'docker/build/context/portable/AppRun'
4279--- docker/build/context/portable/AppRun 1970-01-01 00:00:00 +0000
4280+++ docker/build/context/portable/AppRun 2020-07-03 06:03:19 +0000
4281@@ -0,0 +1,38 @@
4282+#!/bin/bash
4283+
4284+#set -x
4285+
4286+root=$(dirname "${0}")
4287+EXEC=$(grep -h -m 1 -r Exec= ${root}/*.desktop | cut -d "=" -f 2 | cut -d % -f 1 | cut -d " " -f 1 | head -n 1)
4288+# append library path so system libraries are found first (if we put our libs into /usr/lib),
4289+# same for executables.
4290+
4291+# true portable app: create a .armagetronad directory in the current directory and
4292+# it'll be used to store your data.
4293+extraarg=
4294+test -d .${EXEC} && extraarg="--userdatadir .${EXEC} --vardir .${EXEC}/var --userconfigdir .${EXEC}/config"
4295+
4296+# for debugging: if LD_DEBUG_APP=true, use the included libraries first.
4297+# you can then use strace to check no non-standard external libraries are needed.
4298+
4299+extralibs=
4300+if test "x${LD_DEBUG_APP}" = xtrue; then
4301+ echo "Library debug mode: ignore system libraries."
4302+else
4303+ CACHE=~/.${EXEC}/.syslibs
4304+ mkdir -p ~/.${EXEC}
4305+ if test ! -e ${CACHE} || test ${0} -nt ${CACHE}; then
4306+ # find all directories in ld's cache
4307+ for lib in $({ /sbin/ldconfig -p || ldconfig -p; } | tail -n +2 | sed -e "s,.* =>,," -e "s,/[^/]*$,," | sort -u); do
4308+ extralib=${extralib}:${lib}
4309+ done
4310+ echo ${extralib} > ${CACHE}
4311+ fi
4312+ extralib=$(cat ${CACHE})
4313+fi
4314+
4315+LD_LIBRARY_PATH="${root}/usr/local/lib${extralib}:${LD_LIBRARY_PATH}:${root}/usr/lib"
4316+PATH="${root}/usr/local/bin:${PATH}${root}/usr/bin"
4317+export LD_LIBRARY_PATH
4318+export PATH
4319+exec $EXEC ${extraarg} $@
4320
4321=== added file 'docker/build/context/portable/README'
4322--- docker/build/context/portable/README 1970-01-01 00:00:00 +0000
4323+++ docker/build/context/portable/README 2020-07-03 06:03:19 +0000
4324@@ -0,0 +1,2 @@
4325+Contains files for portable builds (AppImage/Steam)
4326+
4327
4328=== added file 'docker/build/context/portable/build'
4329--- docker/build/context/portable/build 1970-01-01 00:00:00 +0000
4330+++ docker/build/context/portable/build 2020-07-03 06:03:19 +0000
4331@@ -0,0 +1,89 @@
4332+#!/bin/bash
4333+# builds portable client
4334+
4335+# set -x
4336+
4337+# add AppRun and desktop file
4338+cp portable/AppRun ${APPDIR}/
4339+find ${APPDIR} -type f -name "*.desktop" -exec mv \{\} ${APPDIR}/ \;
4340+find ${APPDIR} -type l -name "*.desktop" -exec rm \{\} \;
4341+
4342+# hack Icon
4343+for f in $(find ${APPDIR} -type d -name "desktop"); do
4344+ cp $f/icons/small/*.png ${APPDIR}/${PACKAGE}.png
4345+done
4346+
4347+# correct absolute symlinks
4348+APPDIR=${APPDIR} $(dirname $0)/fixlinks
4349+
4350+lastpath=/usr/lib/*linux-gnu
4351+otherpath=${lastpath}
4352+
4353+function copylib()
4354+{
4355+ baselib=$1
4356+ path=$(dirname ${baselib})
4357+ baselib=$(basename ${baselib})
4358+ echo "Found in ${path}."
4359+ if test "$lastpath" != "$path"; then
4360+ otherpath=$lastpath
4361+ fi
4362+ lastpath=$path
4363+ while test -n "${baselib}"; do
4364+ # copy libary
4365+ echo Copying ${baselib}...
4366+ cp -a "${path}/${baselib}" ${APPDIR}/usr/lib/
4367+ # resolve links
4368+ baselib=$(ls -l ${path}/${baselib} | grep -- "->" | sed -e "s,.*-> ,,")
4369+ done
4370+}
4371+
4372+# include libraries
4373+mkdir -p ${APPDIR}/usr/lib/
4374+mkdir -p ${APPDIR}/usr/local/lib/
4375+for library in \
4376+libxml2 \
4377+libZThread \
4378+libSDL-1 \
4379+libboost_thread \
4380+libSDL_image libpng \
4381+libSDL_mixer \
4382+libGLEW \
4383+libfreetype \
4384+libftgl \
4385+libprotobuf \
4386+; do
4387+ echo "Checking for library ${library}...."
4388+ baselib=$(ldd ${APPDIR}/usr/local/bin/${PACKAGE} | grep "${library}" | sed -e "s,.*=> ,," -e "s, (.*,,")
4389+ if test -z "${baselib}"; then
4390+ echo "Not linked."
4391+ else
4392+ copylib ${baselib}
4393+ fi
4394+done
4395+
4396+if ! echo ${PACKAGE} | grep dedicated; then
4397+# libraries we know are dynamically loaded later, so they don't appear in ldd's output
4398+for library in \
4399+libjpeg.so.8 \
4400+; do
4401+ echo "Installing library ${library} anyway, we know it's needed."
4402+ if test -r ${lastpath}/${library}; then
4403+ copylib ${lastpath}/${library}
4404+ else
4405+ copylib ${otherpath}/${library}
4406+ fi
4407+done
4408+fi
4409+
4410+# more libraries for 0.4, later
4411+#libogg.so \
4412+#libogg.so.0 \
4413+#libvorbis.so \
4414+#libvorbis.so.0 \
4415+#libvorbisfile.so \
4416+#libvorbisfile.so.3 \
4417+#libmikmod.so \
4418+#libmikmod.so.2 \
4419+
4420+echo $lastpath
4421
4422=== added file 'docker/build/context/portable/fixlinks'
4423--- docker/build/context/portable/fixlinks 1970-01-01 00:00:00 +0000
4424+++ docker/build/context/portable/fixlinks 2020-07-03 06:03:19 +0000
4425@@ -0,0 +1,21 @@
4426+#!/bin/bash
4427+# fixes absolute symbolic links
4428+
4429+set -x
4430+
4431+# correct absolute symlinks
4432+pushd ${APPDIR}
4433+function processlinks()
4434+{
4435+ while read SOURCE; do
4436+ TARGET=$(ls -l "${SOURCE}" | sed -e "s,.*-> *,,")
4437+ RELATIVEUP=$(dirname ${SOURCE} | sed -e 's,^./,,' -e 's,[^/]*,..,g')
4438+ if echo ${TARGET} | grep '^/' > /dev/null; then
4439+ NEWTARGET=${RELATIVEUP}${TARGET}
4440+ ln -sf ${NEWTARGET} ${SOURCE}
4441+ fi
4442+ done
4443+}
4444+
4445+find . -type l | processlinks
4446+popd
4447
4448=== added file 'docker/build/context/steam.sh'
4449--- docker/build/context/steam.sh 1970-01-01 00:00:00 +0000
4450+++ docker/build/context/steam.sh 2020-07-03 06:03:19 +0000
4451@@ -0,0 +1,32 @@
4452+#!/bin/bash
4453+
4454+# build a portable application dir for the steam runtime
4455+test -x fakerelease.sh && . fakerelease.sh
4456+. version.sh || exit 1
4457+
4458+set -x
4459+
4460+STEAM_PACKAGE_NAME=`echo ${PACKAGE_NAME} | sed -e s/-.*//` || exit $?
4461+STEAM_PACKAGE_TITLE=`echo ${PACKAGE_TITLE} | sed -e s/-.*// -e "s/ .*//"` || exit $?
4462+
4463+# delegate
4464+./appdir.sh $@ || exit $?
4465+
4466+# move stuff around
4467+sed -i appdir/armagetronad.desktop -e s/armagetronad/${STEAM_PACKAGE_NAME}/g || exit $?
4468+if test `cat serverclient` = client; then
4469+ sed -i appdir/AppRun -e s/EXEC=.*\$/EXEC=${PACKAGE_NAME}/g || exit $?
4470+ mv appdir/AppRun appdir/${STEAM_PACKAGE_TITLE} || exit $?
4471+ mv appdir/armagetronad.desktop appdir/${STEAM_PACKAGE_NAME}.desktop || exit $?
4472+else
4473+ sed -i appdir/AppRun -e s/EXEC=.*\$/EXEC=${PACKAGE_NAME}-dedicated/g || exit $?
4474+ mv appdir/AppRun appdir/${STEAM_PACKAGE_TITLE}_Dedicated || exit $?
4475+ mv appdir/armagetronad.desktop appdir/${STEAM_PACKAGE_NAME}-dedicated.desktop || exit $?
4476+fi
4477+
4478+# all in the steam runtime
4479+rm -f appdir/usr/lib/libSDL*
4480+rm -f appdir/usr/lib/libjpeg*
4481+rm -f appdir/usr/lib/libxml2*
4482+rm -f appdir/usr/lib/libpng*
4483+rm -f appdir/usr/lib/libfreetype*
4484
4485=== added file 'docker/build/context/testbuild.sh'
4486--- docker/build/context/testbuild.sh 1970-01-01 00:00:00 +0000
4487+++ docker/build/context/testbuild.sh 2020-07-03 06:03:19 +0000
4488@@ -0,0 +1,10 @@
4489+#!/bin/bash
4490+
4491+# do a simple test server build
4492+test -x fakerelease.sh && . fakerelease.sh
4493+
4494+mkdir build
4495+cd build
4496+../source/configure "$*"
4497+make
4498+
4499
4500=== added file 'docker/build/context/version.sh.in'
4501--- docker/build/context/version.sh.in 1970-01-01 00:00:00 +0000
4502+++ docker/build/context/version.sh.in 2020-07-03 06:03:19 +0000
4503@@ -0,0 +1,6 @@
4504+PACKAGE_VERSION=@version@
4505+PACKAGE_NAME=@prognamebase@
4506+PACKAGE_TITLE="@progtitle@"
4507+
4508+# depends on whether the current build is configured as client or server, maybe don't use?
4509+# PACKAGE_NAME_FULL=@progname@
4510
4511=== added file 'docker/build/context/winbuild.sh'
4512--- docker/build/context/winbuild.sh 1970-01-01 00:00:00 +0000
4513+++ docker/build/context/winbuild.sh 2020-07-03 06:03:19 +0000
4514@@ -0,0 +1,14 @@
4515+#!/bin/sh
4516+# makes windows build from source
4517+
4518+set -x
4519+
4520+Xvfb :99 -screen 1 640x480x8 -nolisten tcp &
4521+DISPLAY=:99
4522+sleep 1
4523+cd winsource
4524+./fromunix.sh || exit $?
4525+cd ..
4526+
4527+# comment out for debugging
4528+rm -rf winsource winlibs debug
4529
4530=== added file 'docker/build/context/wininst.sh'
4531--- docker/build/context/wininst.sh 1970-01-01 00:00:00 +0000
4532+++ docker/build/context/wininst.sh 2020-07-03 06:03:19 +0000
4533@@ -0,0 +1,22 @@
4534+#!/bin/sh
4535+# builds windows installer
4536+
4537+set -x
4538+
4539+if test -r ~/.wine/drive_c/Program\ Files\ \(x86\)/NSIS/makensis.exe; then
4540+ NSIS="C:\Program Files (x86)\NSIS\makensis.exe"
4541+else
4542+ NSIS="C:\Program Files\NSIS\makensis.exe"
4543+fi
4544+
4545+Xvfb :99 -screen 1 640x480x8 -nolisten tcp &
4546+DISPLAY=:99
4547+sleep 1
4548+cd dist
4549+wine "$NSIS" gcc.armagetronad.nsi || exit $?
4550+wine "$NSIS" gcc.armagetronad_dedicated.nsi || exit $?
4551+mv *.gcc.win32.exe ../ || exit $?
4552+cd ..
4553+
4554+# comment out for debugging
4555+rm -rf dist
4556
4557=== added file 'docker/build/context/winsource.sh'
4558--- docker/build/context/winsource.sh 1970-01-01 00:00:00 +0000
4559+++ docker/build/context/winsource.sh 2020-07-03 06:03:19 +0000
4560@@ -0,0 +1,82 @@
4561+#!/bin/sh
4562+# packs windows sources
4563+
4564+set -x
4565+
4566+. ./version.sh
4567+
4568+WINDIR=winsource
4569+SRCDIR=source
4570+BUILDDIR=build
4571+DOCDIR=build/src/doc
4572+CODEBLOCKS=codeblocks
4573+
4574+# prepare windows sources
4575+rm -rf $WINDIR
4576+cp -a $SRCDIR $WINDIR || exit 1
4577+rm -rf $WINDIR/src/doc
4578+rm -rf $WINDIR/doc
4579+cp -r $DOCDIR $WINDIR/doc || exit 1
4580+cp -r $BUILDDIR/language/languages.txt $WINDIR/language || exit 1
4581+cp -r $BUILDDIR/config/aiplayers.cfg $WINDIR/config || exit 1
4582+
4583+# rename text files
4584+for f in $WINDIR/INSTALL $WINDIR/COPYING $WINDIR/AUTHORS $WINDIR/NEWS $WINDIR/ChangeLog `find $WINDIR -name "*README*"`; do
4585+ mv $f $f.txt || exit 1
4586+done
4587+
4588+# copy Code::Blocks build files
4589+if test -n "${CODEBLOCKS}" && test -d ${CODEBLOCKS}; then
4590+ cp -r ${CODEBLOCKS}/* ${WINDIR}/ || exit 1
4591+
4592+ # adapt relative paths to source
4593+ for f in `ls ${CODEBLOCKS} -1 | egrep ".*\.cbp$|.*.\.bat$"`; do
4594+ echo $f
4595+ sed < ${CODEBLOCKS}/$f > ${WINDIR}/$f -e "s,=\.\.\\\\armagetronad,=.,g" -e "s,\.\./armagetronad[^_],,g" -e "s,\.\.\\\\armagetronad[^_],,g" -e "s,armagetronad,${PACKAGE_NAME},g"
4596+ done
4597+fi
4598+
4599+# transcribe nsi scripts
4600+for source in ${CODEBLOCKS}/*.nsi; do
4601+ f=`basename ${source}`
4602+ #echo Adapting installer script $f...
4603+ sed < ${source} > ${WINDIR}/$f \
4604+ -e "s,define PRODUCT_VERSION.*$,define PRODUCT_VERSION \"${PACKAGE_VERSION}\"," \
4605+ -e "s,define PRODUCT_BASENAME.*$,define PRODUCT_BASENAME \"${PACKAGE_TITLE}\"," \
4606+ -e "s,armagetronad,${PACKAGE_NAME},g" || exit 1
4607+
4608+ for suffix in gcc; do
4609+ sed < ${source} > ${WINDIR}/${suffix}.$f \
4610+ -e "s,define PRODUCT_VERSION.*$,define PRODUCT_VERSION \"${PACKAGE_VERSION}.${suffix}\"," \
4611+ -e "s,define PRODUCT_BASENAME.*$,define PRODUCT_BASENAME \"${PACKAGE_TITLE}\"," \
4612+ -e "s,armagetronad,${PACKAGE_NAME},g" || exit 1
4613+
4614+ # generate special makedist script that copies only the wanted installer generators
4615+ MAKEDIST=${WINDIR}/makedist_${suffix}.bat
4616+ echo "call makedist.bat" > ${MAKEDIST}
4617+ echo "xcopy dist\\${suffix}.*.nsi . /Y" >> ${MAKEDIST}
4618+ echo "del dist\\*.nsi" >> ${MAKEDIST}
4619+ echo "xcopy ${suffix}.*.nsi dist /Y" >> ${MAKEDIST}
4620+ echo "del ${suffix}*.nsi" >> ${MAKEDIST}
4621+ echo "pause" >> ${MAKEDIST}
4622+ done
4623+done
4624+
4625+# transcode to windows CR/LF line mode
4626+for suffix in bat nsi nsi.m4 cfg txt dsp dsw h cpp dtd xml; do
4627+ find $WINDIR -name "*.$suffix" -exec recode latin1..latin1/CR-LF \{\} \;
4628+done
4629+
4630+rm -rf $WINDIR/config.* $WINDIR/configure* $WINDIR/*.m4 $WINDIR/*.kde*
4631+rm -rf $WINDIR/bootstrap.sh $WINDIR/batch $WINDIR/missing $WINDIR/install-sh $WINDIR/textures/KGN*
4632+find $WINDIR -name "*.in" -exec rm \{\} \;
4633+find $WINDIR -name "*.am" -exec rm \{\} \;
4634+find $WINDIR -name "Makefile*" -exec rm \{\} \;
4635+find $WINDIR -name "*.ghost" -exec rm \{\} \;
4636+find $WINDIR -depth -name "CVS" -exec rm -rf \{\} \;
4637+find $WINDIR -depth -name "*~" -exec rm -rf \{\} \;
4638+
4639+chmod +x winsource/fromunix.sh || exit 1
4640+
4641+# comment out for debugging
4642+rm -rf ${CODEBLOCKS} ${SRCDIR} ${BUILDDIR}
4643
4644=== added file 'docker/build/context_to_result.sh'
4645--- docker/build/context_to_result.sh 1970-01-01 00:00:00 +0000
4646+++ docker/build/context_to_result.sh 2020-07-03 06:03:19 +0000
4647@@ -0,0 +1,43 @@
4648+#!/bin/bash
4649+
4650+# runs a context through dockerbuild
4651+# usage: context_to_result.sh <image> <name> <command>
4652+# takes input: context.<name>
4653+# produces output: result.<name>
4654+# name can also carry a context. or result. prefix, it will be removed
4655+
4656+#echo -e "\e]2;Build $1\a"
4657+
4658+set -x
4659+
4660+wd="`dirname $0`"
4661+bic="`readlink -f ${wd}/build_in_container.sh`"
4662+
4663+name="$1"
4664+shift
4665+
4666+if echo ${name} | grep "^context\." > /dev/null; then
4667+ name=`echo ${name} | sed -e s,context\.,,`
4668+fi
4669+if echo ${name} | grep "^result\." > /dev/null; then
4670+ name=`echo ${name} | sed -e s,result\.,,`
4671+fi
4672+
4673+rm -rf result.${name}
4674+cd context.${name} || exit $?
4675+image=`cat image` || exit $?
4676+
4677+#sleep 1
4678+
4679+find . -name "*~" -exec rm \{\} \;
4680+
4681+set +x
4682+echo -e "\n\n********************************************************************"
4683+echo -e "Build ${name}"
4684+echo -e "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv\n\n"
4685+
4686+${bic} "${image}" ../result.${name} "$@" || exit $?
4687+
4688+echo -e "\n\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
4689+echo -e "Done building ${name}"
4690+echo -e "********************************************************************"
4691
4692=== added file 'docker/build/debian_source.sh'
4693--- docker/build/debian_source.sh 1970-01-01 00:00:00 +0000
4694+++ docker/build/debian_source.sh 2020-07-03 06:03:19 +0000
4695@@ -0,0 +1,48 @@
4696+#!/bin/bash
4697+
4698+# prepares debian sources
4699+# parameters: <series> (unstable/karmic/gutsy...)
4700+
4701+# import gpg keys
4702+EXIT=0
4703+gpg --import pub.gpg 2>&1 | tee importlog || EXIT=$?
4704+gpg --allow-secret-key-import --import sec.gpg || EXIT=$?
4705+rm -rf *.gpg
4706+test ${EXIT} = 0 || exit ${EXIT}
4707+
4708+set -x
4709+
4710+# determine email of key owner
4711+#grep "public key .* imported" importlog
4712+#grep "public key .* imported" importlog | sed -e 's/>".*$/>/' -e 's/^.*"//'
4713+MAIL=`grep "public key .* imported" importlog | sed -e 's/>".*$/>/' -e 's/^.*"//'`
4714+
4715+SERIES=$1
4716+test -z ${SERIES} && SERIES=unstable
4717+
4718+. version.sh || exit $?
4719+
4720+DEBIAN_VERSION=`echo ${PACKAGE_VERSION} | sed -e s,_,~,g`~ppa1~${SERIES}
4721+
4722+mv debian/changelog changelog_orig || exit $?
4723+cat > debian/changelog <<EOF
4724+armagetronad (${DEBIAN_VERSION}) ${SERIES}; urgency=medium
4725+
4726+ * Updated to new upstream version
4727+
4728+ -- ${MAIL} `date -R`
4729+
4730+EOF
4731+cat changelog_orig >> debian/changelog || exit $?
4732+
4733+. `dirname $0`/rebrand_debian_core.sh || exit $?
4734+
4735+mv *${PACKAGE_VERSION}.tar.gz ${PACKAGE_NAME}_${DEBIAN_VERSION}.orig.tar.gz || exit $?
4736+
4737+mv debian source/ || exit $?
4738+pushd source || exit $?
4739+debuild -S -sa || exit $?
4740+
4741+# cleanup (no, required for testing)
4742+#popd
4743+#rm -rf source
4744
4745=== added file 'docker/build/fakerelease_proto.sh'
4746--- docker/build/fakerelease_proto.sh 1970-01-01 00:00:00 +0000
4747+++ docker/build/fakerelease_proto.sh 2020-07-03 06:03:19 +0000
4748@@ -0,0 +1,3 @@
4749+# move to fakerelease.sh in configured directory to enable quick
4750+# compilation free test builds
4751+export ARMAGETRONAD_FAKERELEASE=true
4752
4753=== added file 'docker/build/make_ci.sh.in'
4754--- docker/build/make_ci.sh.in 1970-01-01 00:00:00 +0000
4755+++ docker/build/make_ci.sh.in 2020-07-03 06:03:19 +0000
4756@@ -0,0 +1,34 @@
4757+#!/bin/bash
4758+
4759+# Helper script for building, just calls make <args>
4760+# Optional first argument: -k, keeps intermediate directories
4761+# (default: delete intermediates)
4762+
4763+set -x
4764+
4765+keep=false
4766+if test "$1" = -k; then
4767+ keep=true
4768+ shift
4769+fi
4770+
4771+EXIT=0
4772+
4773+pushd `dirname $0` || exit $?
4774+
4775+# first make run
4776+if ! make $*; then
4777+ # try again with better debug output
4778+ make -d $* || EXIT=$?
4779+fi
4780+
4781+# remove heavy intermediate directories
4782+if test ${keep} = false; then
4783+ make artifactclean
4784+fi
4785+
4786+popd
4787+
4788+# communicate final make return
4789+exit ${EXIT}
4790+
4791
4792=== added file 'docker/build/make_deploy.sh'
4793--- docker/build/make_deploy.sh 1970-01-01 00:00:00 +0000
4794+++ docker/build/make_deploy.sh 2020-07-03 06:03:19 +0000
4795@@ -0,0 +1,29 @@
4796+#!/bin/bash
4797+
4798+# Helper script for deployment, used form (un)staged_% make targets
4799+# Usage: make_deploy.sh <target to make>
4800+# usually, <target to make> will be 'deploy'
4801+
4802+set -x
4803+
4804+EXIT=0
4805+
4806+# first make run
4807+if ! ${MAKE} $*; then
4808+ # deployment occasionally fails due to network problems, wait a bit and try again
4809+ sleep 300
4810+ if ! ${MAKE} $*; then
4811+ sleep 900
4812+ # last run without fancy arguments
4813+ make $* || EXIT=$?
4814+ fi
4815+fi
4816+
4817+# reset deployment targets
4818+rm -f ../deploy/targets.sh
4819+${MAKE} ../deploy/targets.sh
4820+
4821+# communicate final make return
4822+exit ${EXIT}
4823+
4824+
4825
4826=== added file 'docker/build/prepare_context.sh'
4827--- docker/build/prepare_context.sh 1970-01-01 00:00:00 +0000
4828+++ docker/build/prepare_context.sh 2020-07-03 06:03:19 +0000
4829@@ -0,0 +1,33 @@
4830+#!/bin/bash
4831+
4832+# prepares a context for a docker based build
4833+# usage: prepare_context.sh <target_dir> <files and directories>
4834+
4835+target="$1"
4836+shift
4837+
4838+#echo -e "\e]2;Prepare ${target}\a"
4839+
4840+echo -e "\n\n********************************************************************"
4841+echo -e "Prepare ${target} from $1"
4842+echo -e "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv\n\n"
4843+
4844+set -x
4845+
4846+rm -rf ${target}
4847+mkdir -p ${target}
4848+
4849+if ! cp -lrf context/version.sh $@ ${target}/; then
4850+ rm -rf ${target}/version.sh
4851+ cp -lrf context/version.sh ${target}/ || { rm -rf ${target}; exit 1; }
4852+
4853+ for f in $@; do
4854+ rm -rf ${target}/`basename $f`
4855+ cp -lrf $f ${target}/ || { rm -rf ${target}; exit 1; }
4856+ done
4857+fi
4858+
4859+if test -f fakerelease.sh; then
4860+ rm -rf ${target}/fakerelease.sh
4861+ cp -lrf fakerelease.sh ${target}/
4862+fi
4863
4864=== added file 'docker/build/rebrand_debian_core.sh'
4865--- docker/build/rebrand_debian_core.sh 1970-01-01 00:00:00 +0000
4866+++ docker/build/rebrand_debian_core.sh 2020-07-03 06:03:19 +0000
4867@@ -0,0 +1,24 @@
4868+#/bin/bash
4869+
4870+#set -x
4871+
4872+
4873+
4874+PACKAGE=${PACKAGE_NAME}
4875+NAME=${PACKAGE_TITLE}
4876+
4877+
4878+pushd debian
4879+sed -i -e "s/Armagetron Advanced/${NAME}/g" rules
4880+for f in * man/* bin/* source/*; do
4881+ dest=$(echo $f | sed -e "s,armagetronad,${PACKAGE},g")
4882+ if test ! -d $f; then
4883+ echo $f "->" $dest
4884+ sed -e "s/armagetronad/${PACKAGE}/g" < $f | sed -e "s/${PACKAGE}\.net/armagetronad.net/g" -e "s/${PACKAGE}\.source/armagetronad.source/g" -e "s/${PACKAGE}-armagetronad/armagetronad-armagetronad/g" > $dest.out
4885+ rm -f $f $dest
4886+ mv $dest.out $dest
4887+ fi
4888+done
4889+chmod 755 rules
4890+popd
4891+
4892
4893=== added file 'docker/build/setup_ci_test.sh.in'
4894--- docker/build/setup_ci_test.sh.in 1970-01-01 00:00:00 +0000
4895+++ docker/build/setup_ci_test.sh.in 2020-07-03 06:03:19 +0000
4896@@ -0,0 +1,45 @@
4897+# sets up build environemnt to match CI situation
4898+
4899+function test_targets(){
4900+ . ../deploy/targets.sh
4901+ echo LP_VERSION=${LP_VERSION}
4902+ echo SERIES=${SERIES}
4903+ echo SUFFIX=${SUFFIX}
4904+ echo SF_DIR=${SF_DIR}
4905+ echo LP_SERIES=${LP_SERIES}
4906+ echo ZI_SERIES=${ZI_SERIES}
4907+ echo STEAM_BRANCH=${STEAM_BRANCH}
4908+ echo UBUNTU_PPA=${UBUNTU_PPA}
4909+ echo UPLOAD_SCP${UPLOAD_SCP}
4910+ echo DOWNLOAD_URI_BASE=${DOWNLOAD_URI_BASE}
4911+}
4912+
4913+if @top_srcdir@/docker/scripts/setup_ci_variables_test.sh $*; then
4914+ . @top_srcdir@/docker/scripts/setup_ci_variables_test.sh $*
4915+ . @top_srcdir@/docker/scripts/brand.sh @top_srcdir@
4916+ pushd @top_builddir@
4917+ pushd @abs_top_srcdir@
4918+ ./bootstrap.sh
4919+ popd
4920+ @abs_top_srcdir@/configure --disable-glout progname=${PROGRAM_NAME} progtitle="${PROGRAM_TITLE}"
4921+ popd
4922+ rm -f CI_INFO
4923+ make CI_INFO
4924+ echo ""
4925+ echo ""
4926+ echo '****** CI_INFO ********'
4927+ cat CI_INFO
4928+ OLD_STAGING=${STAGING}
4929+ echo ""
4930+ echo '****** STAGING=true ********'
4931+ STAGING=true
4932+ test_targets
4933+ echo ""
4934+ echo '****** STAGING=false ********'
4935+ STAGING=false
4936+ test_targets
4937+
4938+ echo ""
4939+ STAGING=${OLD_STAGING}
4940+fi
4941+
4942
4943=== added directory 'docker/deploy'
4944=== added file 'docker/deploy/anonymous_secrets.b64'
4945--- docker/deploy/anonymous_secrets.b64 1970-01-01 00:00:00 +0000
4946+++ docker/deploy/anonymous_secrets.b64 2020-07-03 06:03:19 +0000
4947@@ -0,0 +1,104 @@
4948+QlpoOTFBWSZTWWGRinoADcT/hPiQAQBAG//iP///8H////AAAgAIYBNfb7NNd9PufPe3uu92va77
4949+d6fW1q29t7yznu689fffa71r1t89e7617fXbMvvfY+e+vb2n3ut9l7X0d3dryvdxviKp41MJiYjC
4950+aaYEwCMJgExMpQgAIqaYIyYCMmIwgwNGgJjUZNSRA0ephqpkyaYnqZI8EwEwTI0xNDRgmpioAAao
4951+Qyap7TADSaYIap+pmgxoBMmik0AAaqE8AmyNE1PIJsCaaaB6mRT9MCJIAAahAENGmmnqGj1J6aZT
4952+NDARop+jRNIT1PU8UtJ+WC/gDtxUipDLEIQA5ymWIQ65SNKpgKEJgIUhHAAlsTALh5Xf7lznHnFL
4953+nm1he8YrQtc3/FAaInXBjztCKwspm5wf/vWdmBV4v5UQfQ46R+9eZ0EjvUYeaIGmcdelrBfatPGi
4954+zlhuyHUy2QlCWB98fBxf3Dz8sY/i5loJSSAhiZwIJAVk5S+QFdu3R9u0OaY/+R7QfQqs1/H3upYv
4955+e8gePI3U7V0exxCYcubWJOT7z1O/Ax5NKFHDBim3aaglT+0Sm7xvn/1UsGUe2sXF9TJP5vxKMnbq
4956+Wg1AA2bgPwMDbFChVvYA1iarb95h86i3rl3ZLP1/B7MqbD4cVUAtYTnP4O0swKQxFqGUNWh76RLW
4957+h6p+3eHwaT1muDT+wl0GUTKKU8hSSaQMLXO4iUrz2jn8CTBG6VgewQZJZcoyElsQn/MQKoBk3jF5
4958+IAkCMmIYEby+/4j0JZmnrcmNNCuXh6jVlLgjpcYy8le2oejmiTOHB7+ZsMGhXlgWudB9ivr3dkBA
4959+KWgHstX0WkhubAC7plrhG8VFL8vguT4NtRwZY0MkqNiagwYSTjbJwMbg/lS6A4XGQzo+3j6iw/MQ
4960+9Ff0OVeIbGe/rdXb/T901/8/Ze04elAOfR+dHZP6uy1+RLS44KhxGJM4uuGoPDB8/CjxI4RWtaiO
4961+c1nIQ9bl/tJkCDpyMAgHG/mgq3mO6igiDBiRxE0ORFm9jjeEUf0kWUCM/GAUW3fi7gIFFwv1HBSx
4962+eTwD4vcWG45bBVrbuDj3M89m4iENP4U6pDT35Ky1x8CiHIsN14cXlAzRokAoU9DRZtYpwCiJnHK6
4963+84HUEK8rGeANG7NZ5MnJMSZHcJmkOoNH/AGYIqd/tIJBHtStXeHOHA9kHh+R7kRd8eMXJQMm03Wz
4964+2ExxogvzI0WgmRIbZsmwORDEgXsRBItS4gDlNZveESLunzJn/gHmrjmnyy8c1jLI91zPJgmv+r1X
4965+w5o371jp5xC7pXCivZ/HxZC/jC0PnJ42HEzu77usMqOgzXXg/hG8wJ6SXv+QXTZaiX5K1faPYXW0
4966+4jwIqGv1Rv0sH8neaZQ2P+hOUGxWLrjT9UQsBg3mJURCGvRZjVPtXPPvpD3E0eUm8+zIesXd07xJ
4967+p6DvJNMBSPdmfxcLcCLr1s/RKN8zfEaH2wtt/HwRR+uj9NnwK97kq6YPjjSHwqubReegLMs1McTr
4968+GaadwPvxH4b5grzNF0e4xto6BCkdbVdx1XwxrGqnv7L3JX6D32OmwL+65dfIF8nMEOti6sPGvvCf
4969+zrKZPQKRWnlx0vjshw7KviHAx573dbPSrZq1eCgROIdbTBL4JO7RvvQnYtB9gmfbsIYRxj30ZzdQ
4970+1rFWHBeZpNs6bP2tkEe3nULqoW7q3JI0ewKzJkOhnyzFefZZCUfCX1pPhUVOBspDuo6D8A0H/fBZ
4971+ylhEqWVfOwcofGe8USnA6vwLH2pR0L03BupPvLeGKxxUXk6ERSidw+1mWGqfgtQeeVc7jzbMl3b1
4972+i66iiI6zTPfeV/G4XCF3RJU1EkCL9s1AswdFBMCnp+Un6ssereu+WGeOXDFWpKGdQ9LywnIUbV5r
4973+c7vXqcr8V6XTv9JVgYGLdmoWrOPUOUoPvIoK1reynjVjVnWHjRbzZ71izMMTiGrzU6pQlT67m51I
4974+BQkbhUk6IS1rVvJBH77MkHjmsmwijxnYIf8KYKxxO7sK2kkIwikpHGoHkH/HdkzQnSXcxGWYwHp+
4975+cPcHb4qn5IgDMik/IY+i90uyqRGdj1WBlkqDplc231nz5ZQTd5DuKq8dWtI91Z4NI7x7+nctw6Fl
4976+rlcXeqr+dD/4D8wZMUPry6iWSEgq/IChAX10457GHATQchlPsmaYi8Kl3YUyacZWzaJwTJkeQ7jb
4977+YQVcU0sLTDTKIu/3mmtbwv0N/f2AM785X0Oe8+D1AMofBI4ZyVSmYL4ac9nq1m0HB8X65fqQWgEf
4978+k1ENjdoXzrFQj2iz9hoIwJraJK1LAzITPBb87Hxa4CKSqxUQInbp1lLHOeW9twJ/m64h3fA+M7fX
4979+Ppg+QX5qkh0C2izPBbb4qs84D/4xxRuxjindFOjFFRxISGQMC4Ny8m59MBcHd4sOjlGjiF4WtLp9
4980+XoSYWjur2nrebbI7AbhfFViEZk7srWF0T5jD+LwnNE2n7ChiSoOiEx4wXkqX8OGc78gwz25z4xP7
4981+0toRQ7hi1M+eXSlSiTRGsSQrcL3jWmSUhl2uQEuMO36fAI26qYBwADIMi19CKi3mkv0vtALdC1vu
4982+YeT4oMjzvl1NIF0q1VHnUdbQIdIwWa3JXwjzqu+RUmV2gr9T+r5UeWIYaUze2LKJ2GuL+2uiyVB0
4983+ZZ5b33L0EwJnczRogJxrFBZ1krtrXaIlWzyZ3kvWmsgvUXdELq/T1NFbSpPuZgN4At7FZNTN42Al
4984+9cnyMq3xEQVt8oACKb5yAGkkWmoScx697gt5kN4jcRu8Om4q5Z+0BxItuo54sM2TDaHM6r97Bk4b
4985+sC5uC9mCylhcmpVTLkVGblu0O5u4ISNwyA7bJED2rK3wUvrK5JxlMhy2BU4IHmKNa5YQ3OXM2iVU
4986+KGvrL22mZNku8rCpC7PsoMEqHYezJD2cvPsNxCB1bFJVQ+y3FKy1K4Zgf7loCt6mgFCmqJuD21JY
4987+Dd3q6IoXx8OpG01G3wI5cx2hc1ZT6/GgeII6JyA0nRZiXkdGMDYkE4H5/y6FJIh6C2/UwFaw+iBK
4988+xpitAgwFzAuxsLLyaB+g3L37jWB4SD41tfDa8jCgIFvCjgcmDX5OYaOhOoNqnvvzSDvpQqD9qvnq
4989+mHn0q/ThcqLVV+sx0KYp6palpCHpsuNSVA+ZixwbgegSmM5W+4rkSH3ZjEO5wV5v25DJwCFxQDU3
4990+353B0PVFzjtDNCfAq7Lz4dXCOYrgGxqmipHsBBfqje6Ml+IT+sX3gm1stgkQbmLIbvwG9AsQiaHU
4991+bQ+D7Lq3cabBfdCGb9tnr4WsnoHuNwRyAr5C+MRr99iB842FXkmsSupIGS9UJQ2Z2rmh6SyDHOEf
4992+Lolsb4x+TubR8Zera8j+1eY4OpDYhOk2+D1mekqg3DQ0MOlAiTZWT8PNTirJaG9A9ahYvHEDTSyj
4993+XDqcn183mTWYJWFkE2uQTvenZk9zRGz0sfrspjf2DnWPl9n/WcMcl6PcY3rMJooLBMOrV3fkXzeG
4994+sWBPD9bO8TSGlA+CquWZxrPZPYL64y+AYhytBONUXR/296AbdM6BgenHpGkld7Zm33EWcRF99MFh
4995+r4xqgQbV5FxZT6j43NfOixSRivI4+BsyXOMj4VjzYwW8Mb4wTR9/kDNZEzcbgOcp/1U+HoeVwxfD
4996+3nqzBgkQvWt9LLentBrHyobYWv1qVYv9Pv9rj4Qe27hTTIVVynPTtwqVV8pYRskhREkwBVfVzWqR
4997+tmZSD5hdzQx/q7EOenyBBz2ahLojO518Li+6kpe6qYPYJsNkL7gPlxQftbltckjupn3NwY2JB6Zd
4998+IWU8HKaRgq6PPaH6m9RRjA8uf5Gsg5BTtcg1wyPupHX2Lk5pb6i51xb5UVRU3vJ3zqUs0JdXN3tO
4999+jttxvlrKn2kEbC9P2vhaTUN2D3FeUJpiBIzhorZO3oAuwXxO7XmsUUJXH1h65k97KCIqUAciLykR
5000+W5ib6aI6ZX6GnIXStWiVzWoLX7Fg0ImskpoFrPY1Q9hxc+l/D8t47VEUqIHE7Lz5hMOfWliCl8gn
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches