<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.thedarkmod.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Taaaki</id>
	<title>The DarkMod Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.thedarkmod.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Taaaki"/>
	<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Special:Contributions/Taaaki"/>
	<updated>2026-04-29T16:32:25Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=TDM_Release_Mechanics&amp;diff=25985</id>
		<title>TDM Release Mechanics</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=TDM_Release_Mechanics&amp;diff=25985"/>
		<updated>2019-11-20T17:45:52Z</updated>

		<summary type="html">&lt;p&gt;Taaaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article describes the process of creating a TDM point release. It will be fleshed out over the next few days/weeks.&lt;br /&gt;
&lt;br /&gt;
The team is using a version control system (SVN) for development, and the objective is to create a set of PK4 file from the repository which can be uploaded to the TDM mirrors. Let&#039;s go through this step by step:&lt;br /&gt;
&lt;br /&gt;
= Development = &lt;br /&gt;
Just for the sake of completeness, this step includes the regular development between two TDM releases. This day-to-day development is always happening on the trunk, so all commits are ending up there. Stuff gets broken, stuff gets fixed, stuff gets evaluated, some might be ripped out again.&lt;br /&gt;
&lt;br /&gt;
= Libraries and License =&lt;br /&gt;
&lt;br /&gt;
A few weeks before release, it is a good idea to revise the set of third-party libraries used.&lt;br /&gt;
Starting from TDM 2.08, it should be easy to check it thanks to the new conventions on third-party stuff (see also [[Libraries and Dependencies]]).&lt;br /&gt;
&lt;br /&gt;
It is necessary to update the &amp;lt;tt&amp;gt;LICENSE.txt&amp;lt;/tt&amp;gt; file in SVN repositories if something is not up-to-date.&lt;br /&gt;
Note that you should commit the same updated file into &#039;&#039;&#039;both&#039;&#039;&#039; source code and assets repos.&lt;br /&gt;
&lt;br /&gt;
= Branching off =&lt;br /&gt;
At some point the team decides that it might be time for a new release - a so-called branch date (some sort of semi-freeze) is suggested and agreed upon. To this date, team members are supposed to wrap up their pending changes and commit them to the trunk. About two to three weeks are long enough of a time span for people to get everything into SVN. &lt;br /&gt;
&lt;br /&gt;
Once the deadline arrives, the &#039;&#039;&#039;release branch&#039;&#039;&#039; is created: [[Image:Create release branch.png|right|350px]]&lt;br /&gt;
* Update your darkmod working copy.&lt;br /&gt;
* Update the darkmod_src repository too.&lt;br /&gt;
* Right-click the darkmod folder to create the branch&lt;br /&gt;
** Select SVN &amp;gt; Branch/Tag...&lt;br /&gt;
** A new dialog appears asking for a URL. Enter a URL like this: [https://server/svn/darkmod/branches/release1.xx https://&amp;lt;darkmod_server_here&amp;gt;/svn/darkmod/branches/release1.xx] where xx is replaced by whatever version the next release will be. &lt;br /&gt;
** You&#039;ll probably want to switch to the new branch once it is created, so make sure the check button at the bottom of the dialog is active.&lt;br /&gt;
** Hit OK to let the SVN server create the branch (the server will create a copy of the trunk, placing it at the URL you specified. It might be notable that the files are not physically copied, the branch requires a marginal amount of additional server space).&lt;br /&gt;
* The same should happen with the darkmod_src repository, the code needs to be frozen as well. Perform the same steps as above, using the URL scheme [https://server/svn/darkmod_src/branches/release1.xx https://&amp;lt;darkmod_server_here&amp;gt;/svn/darkmod_src/branches/release1.xx]&lt;br /&gt;
&lt;br /&gt;
At this point there are two new branches, one for the darkmod repo, one for darkmod_src. Consider them a snapshot of the trunk at the point in time you created the branch. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Commits to the trunk won&#039;t affect this newly created branch. The team members not involved in the release can just continue working as usual. Also note that if you as branch creator had the check button (&amp;quot;switch working copy&amp;quot;) activated, your working copy has been &#039;&#039;switched&#039;&#039; to the release branch. &#039;&#039;Your commits will go to the branch&#039;&#039;, keep that in mind. To learn how to &#039;&#039;merge&#039;&#039; stuff between the trunk and the release branch, see below.&lt;br /&gt;
&lt;br /&gt;
= Compile Game Binaries =&lt;br /&gt;
Before the PK4 files can be assembled into a release package, the code from darkmod_src needs to be re-compiled for the Windows and Linux platforms. This is to make sure that the release is built from the most recent (and hopefully most stable) source. If you&#039;re not a coder, you can either ask your fellow coders to switch to the branch and compile .exe and .dll files for you, or you can bite the bullet and follow the [[TDM Compilation Guide]] to compile them yourself. As Windows user, I recommend setting up an Ubuntu 16.04 64-Bit instance in VirtualBox. The downside of using virtualisation is that compilation takes 30-40 Minutes depending on your CPU power, but you at least don&#039;t need a dual-boot setup, let alone a second PC. &lt;br /&gt;
&lt;br /&gt;
Make sure you compile a &#039;&#039;&#039;release build&#039;&#039;&#039; (debug builds are terribly slow), I also recommend re-compiling everything from scratch everytime you build a binary:&lt;br /&gt;
* Windows/VC++: Menu &#039;&#039;Build&#039;&#039; &amp;gt; &#039;&#039;Rebuild Solution&#039;&#039;&lt;br /&gt;
* Linux: &amp;lt;tt&amp;gt;scons -c &amp;amp;&amp;amp; scons BUILD=&amp;quot;release&amp;quot; TARGET_ARCH=&amp;quot;x86&amp;quot;&amp;lt;/tt&amp;gt; (or &amp;lt;tt&amp;gt;&amp;quot;x64&amp;quot;&amp;lt;/tt&amp;gt;)&lt;br /&gt;
Note that you have to compile both 32-bit and 64-bit build for every platform (Windows and Linux).&lt;br /&gt;
&lt;br /&gt;
Once compiled, move freshly created thedarkmod.x86 and thedarkmod.x64 files from darkmod_src (where they are created by scons) to darkmod directory.&lt;br /&gt;
Then commit the following files &#039;&#039;to the branch&#039;&#039; (all of them must be treated as &amp;quot;modified&amp;quot; by SVN client):&lt;br /&gt;
* ExtLibs.dll&lt;br /&gt;
* ExtLibsx64.dll&lt;br /&gt;
* thedarkmod.x86&lt;br /&gt;
* thedarkmod.x64&lt;br /&gt;
* TheDarkMod.exe&lt;br /&gt;
* TheDarkModx64.exe&lt;br /&gt;
&lt;br /&gt;
= Compile tdm_update =&lt;br /&gt;
tdm_update must be built separately for both Windows and Linux.&lt;br /&gt;
&lt;br /&gt;
Make sure you compile a &#039;&#039;&#039;release build&#039;&#039;&#039;, and recompile everything from scratch:&lt;br /&gt;
* Windows/VC++: Menu &#039;&#039;Build&#039;&#039; &amp;gt; &#039;&#039;Rebuild tdm_update_mfc&#039;&#039;&lt;br /&gt;
* Linux: descend into the tdm_update directory and then do &amp;lt;tt&amp;gt;scons -c &amp;amp;&amp;amp; scons BUILD=&amp;quot;release&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once compiled, copy the results into the darkmod folder:&lt;br /&gt;
&lt;br /&gt;
* Windows/VC++: bin/GuiUpdater/tdm_update.exe -&amp;gt; darkmod/tdm_update.exe&lt;br /&gt;
* Linux: tdm_update.linux -&amp;gt; darkmod/tdm_update.linux&lt;br /&gt;
&lt;br /&gt;
Commit these &#039;&#039;to the branch&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO for 2.07&#039;&#039;&#039;: now we also have 64-bit Linux version of tdm_update (built if you add &amp;lt;tt&amp;gt;TARGET_ARCH=&amp;quot;x64&amp;quot;&amp;lt;/tt&amp;gt; at the end of scons command line).&lt;br /&gt;
It should be renamed to something like tdm_update.linux64 and also committed to the branch.&lt;br /&gt;
&lt;br /&gt;
= The Manifest =&lt;br /&gt;
The &amp;quot;manifest&amp;quot; is a huge text files listing all the files that are nominated to go into the release. Not all files in SVN are supposed to be released (like test files, test maps, other broken or unfinished stuff), so we need a white list. The manifest text file is located in the SVN repository: &#039;&#039;&#039;devel/manifests/darkmod.txt&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Building the Manifest ==&lt;br /&gt;
&lt;br /&gt;
Note: This section is more or less for your understanding, &#039;&#039;&#039;you don&#039;t need to manually generate the manifest anymore&#039;&#039;&#039; as this step is part of the automated process running on the TDM server itself.&lt;br /&gt;
&lt;br /&gt;
The manifest file is generated by the tdm_package application. (The tdm_package sources are in the darkmod_src repository, in a subfolder called tdm_update. There is a VC++ 2013 solution and a sconscript for Linux and Mac builds available. You don&#039;t need to compile it if you&#039;re in Windows, there is a pre-compiled version in the darkmod repo as well, in the devel/packager folder.) &lt;br /&gt;
&lt;br /&gt;
After the generation step the file &#039;&#039;&#039;devel/manifests/darkmod.txt&#039;&#039;&#039; will have been updated. You might want to review the modifications the script made to that file and commit it to the release branch if you&#039;re satisfied.&lt;br /&gt;
&lt;br /&gt;
== What is included in the Manifest ==&lt;br /&gt;
The package application is using the file &amp;lt;tt&amp;gt;devel/manifests/darkmod_maps.txt&amp;lt;/tt&amp;gt; to decide whether to include or exclude stuff. In a first internal step the script will include all files in specific folders:&lt;br /&gt;
 &lt;br /&gt;
 # Include all these files (but without parsing them like maps), each&lt;br /&gt;
 # statement will include files (from SVN) in that folder:&lt;br /&gt;
 INCLUDE def/&lt;br /&gt;
 INCLUDE dds/&lt;br /&gt;
 ...&lt;br /&gt;
 INCLUDE video/&lt;br /&gt;
 INCLUDE xdata/&lt;br /&gt;
As visible in the above example, the sharp character # is used to denote comments. Put that at the beginning of a line to disable the statement.&lt;br /&gt;
&lt;br /&gt;
As next step the algorithm will exclude certain files matching the regular expressions in EXCLUDE statements like this:&lt;br /&gt;
 EXCLUDE dds/darkmod/test&lt;br /&gt;
In 95% of the cases it&#039;s enough to just specify the path of the files you want to exclude (use forward slashes), but you can do more fancy stuff like this:&lt;br /&gt;
 EXCLUDE models/md5/chars/undead/revenant/.*.md5anim&lt;br /&gt;
 EXCLUDE ^(dds/)?models/md5/chars/undead/revenant&lt;br /&gt;
The first line will exclude all MD5ANIM files in the revenant folder. The second line will exclude all files in models/md5/chars/undead/revenant &#039;&#039;&#039;and&#039;&#039;&#039; the ones in &#039;&#039;&#039;dds/&#039;&#039;&#039;models/md5/chars/undead/revenant (the dds/ part is marked to be optional). &lt;br /&gt;
&lt;br /&gt;
In summary, all files that are INCLUDE&#039;d as denoted above and afterwards manage to get through the hundreds of lines of EXCLUDE filters will end up in the manifest file.&lt;br /&gt;
&lt;br /&gt;
= Distribute files into PK4s =&lt;br /&gt;
Each of the roughly 15000 files in the manifest needs to be sorted into the correct PK4. This is done by defining a rules in the file &amp;lt;tt&amp;gt;devel/manifests/darkmod_pk4s.txt&amp;lt;/tt&amp;gt;. Each of the lines there defines a PK4 and which files go into it:&lt;br /&gt;
 # Miscellaneous stuff (GL Progs, Script, Language Files, Rope Arrow)&lt;br /&gt;
 tdm_base01.pk4: ^glprogs, ^script, ^strings, sound\.wav, _emptyname\.wav, ^models/md5/environments, ^dds/models/md5/environments, ...&lt;br /&gt;
Again, lines starting with the sharp # character denote comments.&lt;br /&gt;
&lt;br /&gt;
Leftmost is the PK4 filename, followed by a colon character. To the right of the colon a list comma-separated patterns is defined, whereas each pattern is interpreted as regular expression. As with the &amp;lt;tt&amp;gt;darkmod_maps.txt&amp;lt;/tt&amp;gt; you don&#039;t need to know very much about regular expressions to define those rules, it&#039;s usually enough to write the folder names and use wildcards like &amp;lt;tt&amp;gt;.*.md5anim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build the Package =&lt;br /&gt;
The package is built right on the TDM server - there is a full darkmod repository checked out on the server&#039;s filesystem, and it will be processed through some scripts that are listening to your commands.&lt;br /&gt;
&lt;br /&gt;
Once triggered, the process goes roughly like this, I&#039;ll comment on these steps below:&lt;br /&gt;
&lt;br /&gt;
* The working copy is reverted, such that it is clean.&lt;br /&gt;
* The working copy is switched to the release branch of the version you&#039;re about to release (it must exist at this point).&lt;br /&gt;
* The working copy is implicitly updated by the switch operation.&lt;br /&gt;
* The manifest is generated.&lt;br /&gt;
* The full set of PK4 files is generated (it takes a while, the server CPU is not very powerful).&lt;br /&gt;
* The differential package is generated.&lt;br /&gt;
* The files are copied to a public folder reachable through HTTP such that it can be tested by the team. The team will test it by storing a manipulated tdm_mirrors.txt file next to their tdm_update application.&lt;br /&gt;
&lt;br /&gt;
== Prepare the packaging process ==&lt;br /&gt;
A few steps need to be done before kicking off the process on the server.&lt;br /&gt;
&lt;br /&gt;
* The release branch must be created, with a specific naming convention: https://darkmod_server_here/svn/darkmod/branches/releaseY.XX where Y is the major version and XX is the two-digit minor version, e.g. &amp;quot;release1.08&amp;quot;.&lt;br /&gt;
* The inclusion statements in the &amp;lt;tt&amp;gt;darkmod_maps.txt&amp;lt;/tt&amp;gt; file need to be up to date, make sure everything is committed to the branch.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;tdm_version.txt&amp;lt;/tt&amp;gt; file should be containing the correct version number, it&#039;s located in &amp;lt;tt&amp;gt;devel/release/tdm_version.txt&amp;lt;/tt&amp;gt;. Commit that change to the release branch, needless to say.&lt;br /&gt;
&lt;br /&gt;
== Kicking off the packaging process ==&lt;br /&gt;
There is a special admin page on the server which can be used to kick off the process. The URL has been [http://forums.thedarkmod.com/topic/13179-packaging-and-testing-107/ posted on the forums before], greebo or grayman know the URL. It&#039;s password protected, so you&#039;ll be asked to enter credentials. Once there, you can enter the two version numbers, the one you&#039;re building, and the previous one (the latest released one). E.g.: 1.08 and 1.07. It&#039;s sufficient to enter the currently released one, e.g. 1.07, into the second field and the website will automatically fill in the next version number in the first field - you can override it if really necessary.&lt;br /&gt;
&lt;br /&gt;
Once you start the process you&#039;ll be presented a text window with some progress information, and you can watch the messages emitted by the svn client and the tdm_package application running on the server. It takes a while, about half an hour, until the package is built.&lt;br /&gt;
&lt;br /&gt;
= Prepare the internal package test =&lt;br /&gt;
The team needs to have access to the package as created above for internal testing, so tell them to download a specially prepared tdm_mirrors.txt. You can find one attached to the first post here: http://forums.thedarkmod.com/topic/13179-packaging-and-testing-107/&lt;br /&gt;
&lt;br /&gt;
The linked post above already contains a few instructions you can copy from. Basically, instruct the team to use the &amp;lt;tt&amp;gt;--keep-mirrors&amp;lt;/tt&amp;gt; switch when starting the tdm_update application, and to copy the tdm_mirrors.txt file into their test folder before running it. If the &amp;lt;tt&amp;gt;--keep-mirrors&amp;lt;/tt&amp;gt; option is omitted the updater will connect to the regular TDM update mirrors, which is not the point.&lt;br /&gt;
&lt;br /&gt;
= The Test &amp;amp; Bugfix cycle =&lt;br /&gt;
Once the testers post their bug reports, the dev team needs to get moving to fix them. It&#039;s recommended that all fixes will be committed to the trunk (both for darkmod and darkmod_src repos), and the release manager should merge the changes into the release branch.&lt;br /&gt;
&lt;br /&gt;
== Merge Fixes into the Release Branch ==&lt;br /&gt;
Let&#039;s assume there is a fix that got committed to darkmod SVN in order to fix an issue discovered in the test package. Proceed like this to merge it to the release branch. &lt;br /&gt;
* Make sure your local working copy is switched to the release branch. &lt;br /&gt;
* Now right-click the darkmod folder and choose SVN &amp;gt; Merge&lt;br /&gt;
* Select &#039;&#039;Merge a range of revisions&#039;&#039;&lt;br /&gt;
* As &#039;&#039;URL to merge from&#039;&#039; use the address of the trunk: [https://server/svn/darkmod/trunk https://&amp;lt;darkmod_server&amp;gt;/svn/darkmod/trunk]&lt;br /&gt;
* In the field revision range to merge you need to specify which exact change you intend to merge. It&#039;s easier if you click the &amp;quot;Show Log&amp;quot; button right next to the entry field to view the SVN Log of the trunk. You can either select a single commit, or you can select a range of commits. Perhaps double-check the changes of that checkin.&lt;br /&gt;
* Hit &#039;&#039;Next&#039;&#039;, then &#039;&#039;Merge&#039;&#039;.&lt;br /&gt;
* Important: the changes will be incorporated into your &#039;&#039;working copy&#039;&#039;. If you want these changes to actually be stored in the release branch, you need to perform the &#039;&#039;commit&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Special note for code changes: once these are committed to darkmod_src trunk, you need to merge them just like described above. Then you&#039;re going to recompile the game binaries (I recommend from scratch) and commit the tdm_game01.pk4 / tdm_game02.pk4 files to the darkmod release branch too.&lt;br /&gt;
&lt;br /&gt;
== Update the Test Package ==&lt;br /&gt;
Re-package the TDM package, as described above. Just make sure everything is committed to the release branch and kick off another build process.&lt;br /&gt;
&lt;br /&gt;
== Test again ==&lt;br /&gt;
Inform your testers about the update and which things got changed since the last test. Instruct them to update their test installation (don&#039;t forget to mention --keep-mirrors) and enter the next round of testing.&lt;br /&gt;
&lt;br /&gt;
= Release Time: Upload &amp;amp; Cleanup =&lt;br /&gt;
Once the day has come to release the next version, connect to the TDM server using a secure shell (SSH) client, like [http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html PuTTY].&lt;br /&gt;
&lt;br /&gt;
Follow these steps, there are some things that need to be done afterwards, they are necessary for the &#039;&#039;next&#039;&#039; release to function properly:&lt;br /&gt;
&lt;br /&gt;
* Rebuild binaries from scratch, place in darkmod folder, and commit the darkmod folder.&lt;br /&gt;
* 7-zip the Windows files: TheDarkMod.pdb, TheDarkModx64.pdb, ExtLibs.pdb, ExtLibsx64.pdb, and place them into the trunk darkmod/devel/release/debugging/2.0x folder. Add that folder to SVN and commit it.&lt;br /&gt;
* Update the darkmod 2.0x branch tree and merge the just-placed debugging files to that branch. Commit the 2.0x branch.&lt;br /&gt;
* Create the final package remotely as described above (through the website). &lt;br /&gt;
* The above step will generate a new crc_info.txt and a tdm_version_info.txt file on the server.&lt;br /&gt;
* The packaging script will take care of checking these two files into SVN for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Check in the newly generated manifest, it should still be in the folder where the packaging script left it. Note: The packaging script will check this file in automatically for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Create a tag for the darkmod and darkmod_src repositories (/tags/2.0x) - copy it from the latest revision in the corresponding release branch.&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Copy package from /usr/local/www/update.thedarkmod.com/ to /usr/local/tdm_releases/2.0x/ for archiving. The next package process will need it there.&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Copy /usr/local/tdm_releases/1.05/index.html to /usr/local/tdm_releases/2.0x&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Move all differential packages back to /usr/local/www/update.thedarkmod.com/&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Copy the one differential update package updating to the new 2.0x version back to /usr/local/tdm_releases/2.0x. In the following line, (y = x-1).&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* At this point, the /usr/local/tdm_releases/2.0x folder contains a valid TDM 2.0x release, the one that will be pushed to all the mirrors. Examine it for double safety.&lt;br /&gt;
* Examine the upload_to_all_mirrors.sh shell script, to see if it fits your needs.&lt;br /&gt;
* Start uploading to all mirrors.&lt;br /&gt;
** &amp;lt;tt&amp;gt;./upload_to_all_mirrors.sh 2.0x&amp;lt;/tt&amp;gt;&lt;br /&gt;
** Update the rsyncd config on update.thedarkmod.com to point to the new release folder (taaaki will need to do this).&lt;br /&gt;
* Update tdm_mirrors.txt and tdm_version.xml on thedarkmod.com/update: ask taaaki to do that. The tdm_mirrors.txt file is probably fine, but the tdm_version.xml needs to be updated.&lt;br /&gt;
&lt;br /&gt;
== Update the Wiki ==&lt;br /&gt;
&lt;br /&gt;
The wiki contains one page for each release. You can find them all in the [[:Category:What&#039;s New]] category. &lt;br /&gt;
&lt;br /&gt;
First update the current release page:&lt;br /&gt;
&lt;br /&gt;
* Change the &amp;quot;roadmap&amp;quot; link on the current release to a &amp;quot;changelog&amp;quot; link by swapping &#039;&#039;&amp;quot;roadmap_page.php?version_id=XX&amp;quot;&#039;&#039; with &#039;&#039;&amp;quot;changelog_page.php?version=XX&amp;quot;&#039;&#039;.&lt;br /&gt;
* Add the &#039;&#039;&amp;lt;nowiki&amp;gt;{{released|2.01|2014-01-30}}&amp;lt;/nowiki&amp;gt;&#039;&#039; Template on top of the current release page with the correct date.&lt;br /&gt;
&lt;br /&gt;
Then add a new page for the next release. To do this, add a link to it in this template: [[Template:Whatsnew]] by editing it. After saving the template, a link to the new release version page appears in the list and in the category. Edit this page and insert some text into it (you can copy it from an older release page).&lt;br /&gt;
&lt;br /&gt;
Also insert a link to the current roadmap on the bugtracker, you can find out the version_id by looking at [http://bugs.thedarkmod.com/roadmap_page.php the roadmap page].&lt;br /&gt;
&lt;br /&gt;
== Update the Website ==&lt;br /&gt;
&lt;br /&gt;
Be sure to update the following pages on the website to reflect the latest release version:&lt;br /&gt;
* [http://www.thedarkmod.com/downloads/ http://www.thedarkmod.com/downloads/]&lt;br /&gt;
* [http://www.thedarkmod.com/download-the-mod/ http://www.thedarkmod.com/download-the-mod/]&lt;br /&gt;
* [http://www.thedarkmod.com/download-sourcecode/ http://www.thedarkmod.com/download-sourcecode/]&lt;br /&gt;
&lt;br /&gt;
To generate the latest source code package for the page above:&lt;br /&gt;
* Check out the code from the release tag. E.g. svn checkout https://svn.thedarkmod.com/svn/darkmod_src/tags/x.yy&lt;br /&gt;
* Remove (or exclude) the .svn from the working copy folder&lt;br /&gt;
* Create a 7zip archive with the following naming convention: thedarkmod.x.yy.src.7z&lt;br /&gt;
** 7z a -r ../thedarkmod.x.yy.src.7z ./* &lt;br /&gt;
* Upload the source code archive to http://www.thedarkmod.com/sources (ask taaaki for assistance with this or use the ftp upload user)&lt;br /&gt;
&lt;br /&gt;
== Hotfixes ==&lt;br /&gt;
In the event of game-breaking bugs making it into the release, it is possible to rebuild the release with the same version number. This should only be done when absolutely necessary. The process is essentially as follows:&lt;br /&gt;
* Merge the bug fixes into the current release branch (include the recompiled binaries).&lt;br /&gt;
* Re-run the &amp;quot;Testing&amp;quot; package build and test the updated release from http://update.thedarkmod.com/testing/&lt;br /&gt;
* If all is in order, proceed to generate the &amp;quot;Release&amp;quot; package as above and deploy the updated release to the mirrors.&lt;br /&gt;
** Note: it may be necessary to tweak the create_package.sh file to exclude the creation of the release tag - be sure to revert back to the original after the hotfix process has been completed (TODO: an additional option should be added to the release management screen to handle with automatically).&lt;br /&gt;
** Manually create a new release tag for darkmod/ and darkmod_src/ (E.g. darkmod/tags/2.05hotfix and darkmod_src/tags/2.05hotfix repectively).&lt;br /&gt;
** Update the source code package and re-upload to the website if necessary.&lt;br /&gt;
&lt;br /&gt;
= Glossary =&lt;br /&gt;
* Release Fileset: the PK4 files forming the actual release. &lt;br /&gt;
* SVN: an acronym for Subversion, a version control system&lt;br /&gt;
* Commit: The process of a team member uploading files to the SVN repository - a commit always creates a new SVN revision.&lt;br /&gt;
* Mirrors: The servers where the PK4 files are stored for download by the updater.&lt;br /&gt;
* updater: The TDM Updater executable, used for downloading and updating TDM.&lt;br /&gt;
* binary: Source code is compiled into so-called binaries. This can be an executable (.exe) file or a module (.dll/.so).&lt;br /&gt;
* darkmod_src: The code repository holding all the TDM source files, including the tdm_update application.&lt;br /&gt;
* branch: A tree in the SVN repository. Several branches can co-exist side-by-side without interfering.&lt;br /&gt;
* trunk: The main branch where all the ongoing development is happening.&lt;br /&gt;
&lt;br /&gt;
{{todo}}&lt;/div&gt;</summary>
		<author><name>Taaaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Cutscenes_Part_1:_Cameras&amp;diff=19370</id>
		<title>Cutscenes Part 1: Cameras</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Cutscenes_Part_1:_Cameras&amp;diff=19370"/>
		<updated>2017-07-04T20:13:43Z</updated>

		<summary type="html">&lt;p&gt;Taaaki: /* The Scene */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==The Scene==&lt;br /&gt;
&lt;br /&gt;
In the scene we&#039;ll be creating, a City Watch guard is meeting an informant to hear about an upcoming bank heist. The script is simple: the two actors walk onstage, talk, and depart. The map is called &#039;&#039;Snitch&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
FM authors use two different work setups: &#039;&#039;Project&#039;&#039;, and &#039;&#039;Non-Project&#039;&#039;. For an overview, see [[Startpack Mappers&#039; Guide#Project versus Non-Project?]]. The files in this tutorial are available in Project form. Those who prefer the Non-Project form can place the files in the appropriate directories.&lt;br /&gt;
&lt;br /&gt;
Download [http://ftp.thedarkmod.com/tutorials/Cutscenes%20by%20grayman/snitch.zip snitch.zip] and extract it into your &#039;&#039;Doom 3&#039;&#039; folder. What you&#039;re getting is a set of maps with a dressed set, two actors, a player start near some handy buttons, and a script to run the scene. Each article in this series comes with its own starting map for you to work with, and a &amp;quot;finished&amp;quot; map to check against.&lt;br /&gt;
&lt;br /&gt;
==Camera Creation==&lt;br /&gt;
[[Image:Camera1.jpg|200px|thumb|right|Camera1]]&lt;br /&gt;
&lt;br /&gt;
Open the map &#039;&#039;snitch1.map&#039;&#039; in Dark Radiant. In this map, center stage is the bulletin board on the north wall (+Y direction) of the courtyard. The two actors wait offstage, the guard at the end of a hallway to the NE, the informant on a porch to the West.&lt;br /&gt;
&lt;br /&gt;
Let&#039;s add the first of four cameras. Create a camera entity (&#039;&#039;darkmod/func/func_cameraview&#039;&#039;) and move it so its origin is 32 units over the top of the bush in the SE corner. Give it the following Property/Value pairs:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;name&amp;quot; &amp;quot;Camera1&amp;quot;&lt;br /&gt;
* &amp;quot;trigger&amp;quot; &amp;quot;1&amp;quot; (this camera will work when triggered)&lt;br /&gt;
&lt;br /&gt;
When setting up any scene, you should first present an &#039;&#039;Establishing Shot&#039;&#039; to give the player a sense of where the scene is taking place. Is it in a dining room, in an alley, on the roof of a Builder cathedral? Camera1 will give us our Establishing Shot, pulled back enough to present the courtyard and show where the scene is taking place.&lt;br /&gt;
{{clear}}&lt;br /&gt;
==Point the Camera==&lt;br /&gt;
[[Image:target_null_1.jpg|200px|thumb|right|target_null_1]]&lt;br /&gt;
&lt;br /&gt;
Camera1 needs to be told where to look. To give it a focal point, create a target entity (&#039;&#039;base/target_null&#039;&#039;) and place it near the center of the bulletin board. Give it the following Property/Value pair:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;name&amp;quot; &amp;quot;target_null_1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
It&#039;s a good idea to use matching numbers in your camera/target pairs if you&#039;ll be using multiple cameras in a scene. There&#039;ll be less confusion as you develop your scene.&lt;br /&gt;
&lt;br /&gt;
To point the camera at its target, give Camera1 the following Property/Value pair:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;target&amp;quot; &amp;quot;target_null_1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
For a stationary shot, this is all you need to do.&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
==Camera Control==&lt;br /&gt;
&lt;br /&gt;
Camera control is done through scripting. If you&#039;re new to scripting, you can read [[A Beginner&#039;s Guide to Scripting]] to gain an understanding of the power of scripts.&lt;br /&gt;
&lt;br /&gt;
Let&#039;s look at the script that controls Camera1. Open &#039;&#039;snitch1.script&#039;&#039;, which sits alongside &#039;&#039;snitch1.map&#039;&#039; in the &#039;&#039;snitch&#039;&#039; folder.&lt;br /&gt;
&lt;br /&gt;
If you haven&#039;t worked with scripts before, here&#039;s an overview of the file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef __SNITCH_SCRIPT__&lt;br /&gt;
#define __SNITCH_SCRIPT__&lt;br /&gt;
&lt;br /&gt;
void Roll1()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Roll2()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#endif /* __SNITCH_SCRIPT__ */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Script parts:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;#ifndef, #define,&#039;&#039; and &#039;&#039;#endif&#039;&#039; directives prevent this script from being included more than once.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;main()&#039;&#039; is a function (program, routine) executed once at the start of your map. Use it to initialize script-based activities.&lt;br /&gt;
&lt;br /&gt;
* Each &#039;&#039;RollN()&#039;&#039; is a function to be executed at some point as the player plays your map.&lt;br /&gt;
&lt;br /&gt;
Let&#039;s look at the function Roll1():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Roll1()&lt;br /&gt;
{&lt;br /&gt;
   sys.println(&amp;quot;Roll1 running&amp;quot;); // debug&lt;br /&gt;
&lt;br /&gt;
   $Camera1.activate($player1);  // Switch view&lt;br /&gt;
   sys.wait(13);		 // duration of view&lt;br /&gt;
&lt;br /&gt;
   $Camera1.activate($player1);  // Return control to player&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What does each line do?&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;sys.println()&#039;&#039; prints a text line to the console. This is useful when you&#039;re unsure whether a particular function is executing or not.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;$Camera1.activate($player1)&#039;&#039; triggers Camera1. &#039;&#039;$Camera1&#039;&#039; is the name of the entity, &#039;&#039;activate&#039;&#039; is what you want it to do (in this case, trigger), and &#039;&#039;$player1&#039;&#039; is the name of the entity triggering it. Triggering a camera removes control from the player and paints the screen with whatever the camera is looking at.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;sys.wait(13)&#039;&#039; says to wait 13 seconds. So our shot is 13 seconds long.&lt;br /&gt;
&lt;br /&gt;
* The second &#039;&#039;$Camera1.activate($player1)&#039;&#039; deactivates the camera and returns control to the player.&lt;br /&gt;
&lt;br /&gt;
[[Image:target_callscriptfunction.jpg|200px|thumb|right|Roll1]]&lt;br /&gt;
Now, how do we run this function? Find the &#039;&#039;info_player_start&#039;&#039; in the SW corner of the map. Next to it you&#039;ll see three buttons with three yellow cubes above them. Each cube is a &#039;&#039;darkmod/targets/atdm:target_callscriptfunction&#039;&#039; entity. Each button is targeted to activate one of these entities, which, in turn, calls a function in the script file.&lt;br /&gt;
&lt;br /&gt;
The leftmost &#039;&#039;target_callscriptfunction&#039;&#039; has these Property/Value pairs:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;name&amp;quot; &amp;quot;Roll1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;call&amp;quot; &amp;quot;Roll1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
So when you push the leftmost button, it triggers Roll1, which calls the function Roll1(). When you design your own scenes, you don&#039;t have to use buttons to get the cameras started. You can use any type of trigger targeted at a &#039;&#039;target_callscriptfunction&#039;&#039;, or even a call from another script function, to get things moving.&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
==Roll Camera 1==&lt;br /&gt;
[[Image:Master Shot.jpg|200px|thumb|right|Establishing Shot]]&lt;br /&gt;
Let&#039;s run what we have so far.&lt;br /&gt;
&lt;br /&gt;
* Save the map, build it, and run it.&lt;br /&gt;
&lt;br /&gt;
When the map starts, both actors will begin walking toward the bulletin board. (Don&#039;t worry about them attacking you; they&#039;re both on Team 0.) Once they&#039;ve reached it, press the leftmost button on the wall to your right. Camera1 takes over and paints your Establishing Shot on the screen for 13 seconds. When it&#039;s finished, control returns to you.&lt;br /&gt;
{{clear}}&lt;br /&gt;
==Add a Second Camera==&lt;br /&gt;
[[Image:Camera2.jpg|200px|thumb|right|Camera2]]&lt;br /&gt;
&lt;br /&gt;
There are two &#039;&#039;path_corners&#039;&#039; in front of the bulletin board. Create another &#039;&#039;func_cameraview&#039;&#039; and place it between the bulletin board and the top of the leftmost &#039;&#039;path_corner&#039;&#039;.  Give it the following Property/Value pairs:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;name&amp;quot; &amp;quot;Camera2&amp;quot;&lt;br /&gt;
* &amp;quot;trigger&amp;quot; &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Create another &#039;&#039;target_null&#039;&#039; and place it near the top of the rightmost &#039;&#039;path_corner&#039;&#039;. Give it the following Property/Value pair:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;name&amp;quot; &amp;quot;target_null_2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Now point Camera2 at its target by giving it the following Property/Value pair:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;target&amp;quot; &amp;quot;target_null_2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Camera2 will give us a medium shot of the guard.&lt;br /&gt;
&lt;br /&gt;
Take a look at the middle button near the player start. It targets the middle &#039;&#039;target_callscriptfunction&#039;&#039;, which calls the Roll2() script function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Roll2()&lt;br /&gt;
{&lt;br /&gt;
   sys.println(&amp;quot;Roll2 running&amp;quot;); // debug&lt;br /&gt;
&lt;br /&gt;
   $Camera1.activate($player1);  // Switch view&lt;br /&gt;
   sys.wait(5);			 // duration of view&lt;br /&gt;
&lt;br /&gt;
   $Camera2.activate($player1);  // Switch view&lt;br /&gt;
   sys.wait(5);			 // duration of view&lt;br /&gt;
&lt;br /&gt;
   $Camera2.activate($player1);  // Return control to player&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Roll2() rolls Camera1 for 5 seconds, rolls Camera2 for 5 seconds, then returns control to the player. &lt;br /&gt;
{{clear}}&lt;br /&gt;
==Roll Cameras 1 and 2==&lt;br /&gt;
[[Image:Guard.jpg|200px|thumb|right|Medium Shot of Guard]]&lt;br /&gt;
&lt;br /&gt;
Save, build, and run the map. Once the actors are in place, press the middle button. A 5-second Establishing Shot will be followed by a 5-second medium shot of the guard. Note that the guard is backlit, so his face is dark. We&#039;ll take care of that later when we talk about lighting.&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
==Add the Third and Fourth Cameras==&lt;br /&gt;
[[Image:Camera3.jpg|200px|thumb|right|Camera3]]&lt;br /&gt;
[[Image:Camera4.jpg|200px|thumb|right|Camera4]]&lt;br /&gt;
&lt;br /&gt;
Let&#039;s add a medium shot of the informant by placing Camera3 just behind the guard&#039;s shoulder and target_null_3 near the top of the leftmost path_corner.&lt;br /&gt;
&lt;br /&gt;
* Place a final camera, Camera4, near the western porch and place its target_null_4 near the player start. Remember to set the &#039;&#039;target&#039;&#039; property on each camera.&lt;br /&gt;
&lt;br /&gt;
The third &#039;&#039;target_callscriptfunction&#039;&#039; near the player start calls Roll3() in the script file. Looking at Roll3(), we see that it rolls Camera1 for 3 seconds, Camera2 for 7 seconds, Camera3 for 4 seconds, and Camera4 for 5 seconds.&lt;br /&gt;
&lt;br /&gt;
What&#039;s the purpose of Camera4? When Camera4&#039;s view comes on the screen, you&#039;ll see that the player is invisible. You know you&#039;re on that porch, because you just pushed the button. This invisibility allows the mapper to place the player anywhere in the scene. We&#039;ll see why this is important when we discuss sound later.&lt;br /&gt;
&lt;br /&gt;
* Save, build, run, and press button 3.&lt;br /&gt;
{{clear}}&lt;br /&gt;
==Wrapup==&lt;br /&gt;
&lt;br /&gt;
In Part 1, we&#039;ve taken a look at placing stationary cameras in a scene, pointing them, passing control to them, and switching cameras.&lt;br /&gt;
&lt;br /&gt;
Alongside &#039;&#039;snitch1.map&#039;&#039; and &#039;&#039;snitch1.script&#039;&#039;, which we&#039;ve been using above, you&#039;ll find &#039;&#039;snitch1a.map&#039;&#039; and &#039;&#039;snitch1a.script&#039;&#039;, which include the cameras and targets we&#039;ve discussed. You can build and run &#039;&#039;snitch1a.map&#039;&#039; and compare it to your own work.&lt;br /&gt;
&lt;br /&gt;
Of course, you can go on and add more cameras to your map. Don&#039;t forget to change the &#039;&#039;*.script&#039;&#039; file!&lt;br /&gt;
&lt;br /&gt;
In Part 2, we&#039;ll investigate splines and how they&#039;re used for camera movement.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Template: Cutscenes}}&lt;/div&gt;</summary>
		<author><name>Taaaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Cutscenes&amp;diff=19369</id>
		<title>Cutscenes</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Cutscenes&amp;diff=19369"/>
		<updated>2017-07-04T19:48:36Z</updated>

		<summary type="html">&lt;p&gt;Taaaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Contributed by Grayman. Leave comments and questions [http://forums.thedarkmod.com/topic/11690-cutscene-wiki-page/ here].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This article discusses the use of cameras and conversations to create map cutscenes.&lt;br /&gt;
&lt;br /&gt;
Though information on these topics already exists, there isn&#039;t a single place that shows you how to create a scene using these features.&lt;br /&gt;
&lt;br /&gt;
Hopefully, the following will fill in that gap.&lt;br /&gt;
&lt;br /&gt;
Before you begin, you should have a basic understanding of how to edit with Dark Radiant, and how to build and run maps.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Part 1: Cameras&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Part 2: Splines and Camera Movement&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Part 3: Lighting, Placing the Player, and Conversations&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Part 4: Extras&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Part 5: &amp;quot;Somewhere Above the City&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Template: Cutscenes}}&lt;br /&gt;
&lt;br /&gt;
{{tutorial-editing|sort=Cutscenes}}&lt;/div&gt;</summary>
		<author><name>Taaaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=TDM_Release_Mechanics&amp;diff=19122</id>
		<title>TDM Release Mechanics</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=TDM_Release_Mechanics&amp;diff=19122"/>
		<updated>2017-03-12T12:58:15Z</updated>

		<summary type="html">&lt;p&gt;Taaaki: /* Hotfixes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article describes the process of creating a TDM point release. It will be fleshed out over the next few days/weeks.&lt;br /&gt;
&lt;br /&gt;
The team is using a version control system (SVN) for development, and the objective is to create a set of PK4 file from the repository which can be uploaded to the TDM mirrors. Let&#039;s go through this step by step:&lt;br /&gt;
&lt;br /&gt;
= Development = &lt;br /&gt;
Just for the sake of completeness, this step includes the regular development between two TDM releases. This day-to-day development is always happening on the trunk, so all commits are ending up there. Stuff gets broken, stuff gets fixed, stuff gets evaluated, some might be ripped out again.&lt;br /&gt;
&lt;br /&gt;
= Branching off =&lt;br /&gt;
At some point the team decides that it might be time for a new release - a so-called branch date (some sort of semi-freeze) is suggested and agreed upon. To this date, team members are supposed to wrap up their pending changes and commit them to the trunk. About two to three weeks are long enough of a time span for people to get everything into SVN. &lt;br /&gt;
&lt;br /&gt;
Once the deadline arrives, the &#039;&#039;&#039;release branch&#039;&#039;&#039; is created: [[Image:Create release branch.png|right|350px]]&lt;br /&gt;
* Update your darkmod working copy.&lt;br /&gt;
* Update the darkmod_src repository too.&lt;br /&gt;
* Right-click the darkmod folder to create the branch&lt;br /&gt;
** Select SVN &amp;gt; Branch/Tag...&lt;br /&gt;
** A new dialog appears asking for a URL. Enter a URL like this: [https://server/svn/darkmod/branches/release1.xx https://&amp;lt;darkmod_server_here&amp;gt;/svn/darkmod/branches/release1.xx] where xx is replaced by whatever version the next release will be. &lt;br /&gt;
** You&#039;ll probably want to switch to the new branch once it is created, so make sure the check button at the bottom of the dialog is active.&lt;br /&gt;
** Hit OK to let the SVN server create the branch (the server will create a copy of the trunk, placing it at the URL you specified. It might be notable that the files are not physically copied, the branch requires a marginal amount of additional server space).&lt;br /&gt;
* The same should happen with the darkmod_src repository, the code needs to be frozen as well. Perform the same steps as above, using the URL scheme [https://server/svn/darkmod_src/branches/release1.xx https://&amp;lt;darkmod_server_here&amp;gt;/svn/darkmod_src/branches/release1.xx]&lt;br /&gt;
&lt;br /&gt;
At this point there are two new branches, one for the darkmod repo, one for darkmod_src. Consider them a snapshot of the trunk at the point in time you created the branch. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; commits to the trunk won&#039;t affect this newly created branch. The team members not involved in the release can just continue working as usual. Also note that if you as branch creator had the check button (&amp;quot;switch working copy&amp;quot;) activated, your working copy has been &#039;&#039;switched&#039;&#039; to the release branch. &#039;&#039;Your commits will go to the branch&#039;&#039;, keep that in mind. To learn how to &#039;&#039;merge&#039;&#039; stuff between the trunk and the release branch, see below.&lt;br /&gt;
&lt;br /&gt;
= Compile Game Binaries =&lt;br /&gt;
Before the PK4 files can be assembled into a release package, the code from darkmod_src needs to be re-compiled for the Windows and Linux platforms. This is to make sure that the release is built from the most recent (and hopefully most stable) source. If you&#039;re not a coder, you can either ask your fellow coders to switch to the branch and compile the tdm_gameNN.pk4 for you, or you can bite the bullet and follow the [[TDM Compilation Guide]] to compile it yourself. As Windows user, I recommend setting up an Ubuntu 10.04 32-Bit instance in VirtualBox. The downside of using virtualisation is that compilation takes 30-40 Minutes depending on your CPU power, but you at least don&#039;t need a dual-boot setup, let alone a second PC. &lt;br /&gt;
&lt;br /&gt;
Make sure you compile a &#039;&#039;&#039;release build&#039;&#039;&#039; (debug builds are terribly slow), I also recommend re-compiling everything from scratch everytime you build a binary:&lt;br /&gt;
* Windows/VC++: Menu &#039;&#039;Build&#039;&#039; &amp;gt; &#039;&#039;Rebuild Solution&#039;&#039;&lt;br /&gt;
* Linux: &amp;lt;tt&amp;gt;scons -c &amp;amp;&amp;amp; scons BUILD=&amp;quot;release&amp;quot; BUILD_GAMEPAK=&amp;quot;1&amp;quot;&amp;lt;/tt&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Once compiled, make sure that the tdm_game01.pk4 is updated with the newly compiled DLL and the tdm_game02.pk4 is copied over from darkmod_src (where it is created after compilation) to darkmod and commit these two files &#039;&#039;to the branch&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Also commit TheDarkMod.exe and thedarkmod.x86 &#039;&#039;to the branch&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Compile tdm_update =&lt;br /&gt;
tdm_update must be built separately for both Windows and Linux.&lt;br /&gt;
&lt;br /&gt;
Make sure you compile a &#039;&#039;&#039;release build&#039;&#039;&#039;, and recompile everything from scratch:&lt;br /&gt;
* Windows/VC++: Menu &#039;&#039;Build&#039;&#039; &amp;gt; &#039;&#039;Rebuild tdm_update_mfc&#039;&#039;&lt;br /&gt;
* Linux: descend into the tdm_update directory and then do &amp;lt;tt&amp;gt;scons -c &amp;amp;&amp;amp; scons BUILD=&amp;quot;release&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once compiled, copy the results into the darkmod folder:&lt;br /&gt;
&lt;br /&gt;
* Windows/VC++: bin/GuiUpdater/tdm_update.exe -&amp;gt; darkmod/tdm_update.exe&lt;br /&gt;
* Linux: tdm_update.linux -&amp;gt; darkmod/tdm_update.linux&lt;br /&gt;
&lt;br /&gt;
Commit these &#039;&#039;to the branch&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= The Manifest =&lt;br /&gt;
The &amp;quot;manifest&amp;quot; is a huge text files listing all the files that are nominated to go into the release. Not all files in SVN are supposed to be released (like test files, test maps, other broken or unfinished stuff), so we need a white list. The manifest text file is located in the SVN repository: &#039;&#039;&#039;devel/manifests/darkmod.txt&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Building the Manifest ==&lt;br /&gt;
&lt;br /&gt;
Note: This section is more or less for your understanding, &#039;&#039;&#039;you don&#039;t need to manually generate the manifest anymore&#039;&#039;&#039; as this step is part of the automated process running on the TDM server itself.&lt;br /&gt;
&lt;br /&gt;
The manifest file is generated by the tdm_package application. (The tdm_package sources are in the darkmod_src repository, in a subfolder called tdm_update. There is a VC++ 2010 solution and a sconscript for Linux and Mac builds available. You don&#039;t need to compile it if you&#039;re in Windows, there is a pre-compiled version in the darkmod repo as well, in the devel/packager folder.) &lt;br /&gt;
&lt;br /&gt;
After the generation step the file &#039;&#039;&#039;devel/manifests/darkmod.txt&#039;&#039;&#039; will have been updated. You might want to review the modifications the script made to that file and commit it to the release branch if you&#039;re satisfied.&lt;br /&gt;
&lt;br /&gt;
== What is included in the Manifest ==&lt;br /&gt;
The package application is using the file &amp;lt;tt&amp;gt;devel/manifests/darkmod_maps.txt&amp;lt;/tt&amp;gt; to decide whether to include or exclude stuff. In a first internal step the script will include all files in specific folders:&lt;br /&gt;
 &lt;br /&gt;
 # Include all these files (but without parsing them like maps), each&lt;br /&gt;
 # statement will include files (from SVN) in that folder:&lt;br /&gt;
 INCLUDE def/&lt;br /&gt;
 INCLUDE dds/&lt;br /&gt;
 ...&lt;br /&gt;
 INCLUDE video/&lt;br /&gt;
 INCLUDE xdata/&lt;br /&gt;
As visible in the above example, the sharp character # is used to denote comments. Put that at the beginning of a line to disable the statement.&lt;br /&gt;
&lt;br /&gt;
As next step the algorithm will exclude certain files matching the regular expressions in EXCLUDE statements like this:&lt;br /&gt;
 EXCLUDE dds/darkmod/test&lt;br /&gt;
In 95% of the cases it&#039;s enough to just specify the path of the files you want to exclude (use forward slashes), but you can do more fancy stuff like this:&lt;br /&gt;
 EXCLUDE models/md5/chars/undead/revenant/.*.md5anim&lt;br /&gt;
 EXCLUDE ^(dds/)?models/md5/chars/undead/revenant&lt;br /&gt;
The first line will exclude all MD5ANIM files in the revenant folder. The second line will exclude all files in models/md5/chars/undead/revenant &#039;&#039;&#039;and&#039;&#039;&#039; the ones in &#039;&#039;&#039;dds/&#039;&#039;&#039;models/md5/chars/undead/revenant (the dds/ part is marked to be optional). &lt;br /&gt;
&lt;br /&gt;
In summary, all files that are INCLUDE&#039;d as denoted above and afterwards manage to get through the hundreds of lines of EXCLUDE filters will end up in the manifest file.&lt;br /&gt;
&lt;br /&gt;
= Distribute files into PK4s =&lt;br /&gt;
Each of the roughly 15000 files in the manifest needs to be sorted into the correct PK4. This is done by defining a rules in the file &amp;lt;tt&amp;gt;devel/manifests/darkmod_pk4s.txt&amp;lt;/tt&amp;gt;. Each of the lines there defines a PK4 and which files go into it:&lt;br /&gt;
 # Miscellaneous stuff (GL Progs, Script, Language Files, Rope Arrow)&lt;br /&gt;
 tdm_base01.pk4: ^glprogs, ^script, ^strings, sound\.wav, _emptyname\.wav, ^models/md5/environments, ^dds/models/md5/environments, ...&lt;br /&gt;
Again, lines starting with the sharp # character denote comments.&lt;br /&gt;
&lt;br /&gt;
Leftmost is the PK4 filename, followed by a colon character. To the right of the colon a list comma-separated patterns is defined, whereas each pattern is interpreted as regular expression. As with the &amp;lt;tt&amp;gt;darkmod_maps.txt&amp;lt;/tt&amp;gt; you don&#039;t need to know very much about regular expressions to define those rules, it&#039;s usually enough to write the folder names and use wildcards like &amp;lt;tt&amp;gt;.*.md5anim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build the Package =&lt;br /&gt;
The package is built right on the TDM server - there is a full darkmod repository checked out on the server&#039;s filesystem, and it will be processed through some scripts that are listening to your commands.&lt;br /&gt;
&lt;br /&gt;
Once triggered, the process goes roughly like this, I&#039;ll comment on these steps below:&lt;br /&gt;
&lt;br /&gt;
* The working copy is reverted, such that it is clean.&lt;br /&gt;
* The working copy is switched to the release branch of the version you&#039;re about to release (it must exist at this point).&lt;br /&gt;
* The working copy is implicitly updated by the switch operation.&lt;br /&gt;
* The manifest is generated.&lt;br /&gt;
* The full set of PK4 files is generated (it takes a while, the server CPU is not very powerful).&lt;br /&gt;
* The differential package is generated.&lt;br /&gt;
* The files are copied to a public folder reachable through HTTP such that it can be tested by the team. The team will test it by storing a manipulated tdm_mirrors.txt file next to their tdm_update application.&lt;br /&gt;
&lt;br /&gt;
== Prepare the packaging process ==&lt;br /&gt;
A few steps need to be done before kicking off the process on the server.&lt;br /&gt;
&lt;br /&gt;
* The release branch must be created, with a specific naming convention: https://darkmod_server_here/svn/darkmod/branches/releaseY.XX where Y is the major version and XX is the two-digit minor version, e.g. &amp;quot;release1.08&amp;quot;.&lt;br /&gt;
* The inclusion statements in the &amp;lt;tt&amp;gt;darkmod_maps.txt&amp;lt;/tt&amp;gt; file need to be up to date, make sure everything is committed to the branch.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;tdm_version.txt&amp;lt;/tt&amp;gt; file should be containing the correct version number, it&#039;s located in &amp;lt;tt&amp;gt;devel/release/tdm_version.txt&amp;lt;/tt&amp;gt;. Commit that change to the release branch, needless to say.&lt;br /&gt;
&lt;br /&gt;
== Kicking off the packaging process ==&lt;br /&gt;
There is a special admin page on the server which can be used to kick off the process. The URL has been [http://forums.thedarkmod.com/topic/13179-packaging-and-testing-107/ posted on the forums before], greebo or grayman know the URL. It&#039;s password protected, so you&#039;ll be asked to enter credentials. Once there, you can enter the two version numbers, the one you&#039;re building, and the previous one (the latest released one). E.g.: 1.08 and 1.07. It&#039;s sufficient to enter the currently released one, e.g. 1.07, into the second field and the website will automatically fill in the next version number in the first field - you can override it if really necessary.&lt;br /&gt;
&lt;br /&gt;
Once you start the process you&#039;ll be presented a text window with some progress information, and you can watch the messages emitted by the svn client and the tdm_package application running on the server. It takes a while, about half an hour, until the package is built.&lt;br /&gt;
&lt;br /&gt;
= Prepare the internal package test =&lt;br /&gt;
The team needs to have access to the package as created above for internal testing, so tell them to download a specially prepared tdm_mirrors.txt. You can find one attached to the first post here: http://forums.thedarkmod.com/topic/13179-packaging-and-testing-107/&lt;br /&gt;
&lt;br /&gt;
The linked post above already contains a few instructions you can copy from. Basically, instruct the team to use the &amp;lt;tt&amp;gt;--keep-mirrors&amp;lt;/tt&amp;gt; switch when starting the tdm_update application, and to copy the tdm_mirrors.txt file into their test folder before running it. If the &amp;lt;tt&amp;gt;--keep-mirrors&amp;lt;/tt&amp;gt; option is omitted the updater will connect to the regular TDM update mirrors, which is not the point.&lt;br /&gt;
&lt;br /&gt;
= The Test &amp;amp; Bugfix cycle =&lt;br /&gt;
Once the testers post their bug reports, the dev team needs to get moving to fix them. It&#039;s recommended that all fixes will be committed to the trunk (both for darkmod and darkmod_src repos), and the release manager should merge the changes into the release branch.&lt;br /&gt;
&lt;br /&gt;
== Merge Fixes into the Release Branch ==&lt;br /&gt;
Let&#039;s assume there is a fix that got committed to darkmod SVN in order to fix an issue discovered in the test package. Proceed like this to merge it to the release branch. &lt;br /&gt;
* Make sure your local working copy is switched to the release branch. &lt;br /&gt;
* Now right-click the darkmod folder and choose SVN &amp;gt; Merge&lt;br /&gt;
* Select &#039;&#039;Merge a range of revisions&#039;&#039;&lt;br /&gt;
* As &#039;&#039;URL to merge from&#039;&#039; use the address of the trunk: [https://server/svn/darkmod/trunk https://&amp;lt;darkmod_server&amp;gt;/svn/darkmod/trunk]&lt;br /&gt;
* In the field revision range to merge you need to specify which exact change you intend to merge. It&#039;s easier if you click the &amp;quot;Show Log&amp;quot; button right next to the entry field to view the SVN Log of the trunk. You can either select a single commit, or you can select a range of commits. Perhaps double-check the changes of that checkin.&lt;br /&gt;
* Hit &#039;&#039;Next&#039;&#039;, then &#039;&#039;Merge&#039;&#039;.&lt;br /&gt;
* Important: the changes will be incorporated into your &#039;&#039;working copy&#039;&#039;. If you want these changes to actually be stored in the release branch, you need to perform the &#039;&#039;commit&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Special note for code changes: once these are committed to darkmod_src trunk, you need to merge them just like described above. Then you&#039;re going to recompile the game binaries (I recommend from scratch) and commit the tdm_game01.pk4 / tdm_game02.pk4 files to the darkmod release branch too.&lt;br /&gt;
&lt;br /&gt;
== Update the Test Package ==&lt;br /&gt;
Re-package the TDM package, as described above. Just make sure everything is committed to the release branch and kick off another build process.&lt;br /&gt;
&lt;br /&gt;
== Test again ==&lt;br /&gt;
Inform your testers about the update and which things got changed since the last test. Instruct them to update their test installation (don&#039;t forget to mention --keep-mirrors) and enter the next round of testing.&lt;br /&gt;
&lt;br /&gt;
= Release Time: Upload &amp;amp; Cleanup =&lt;br /&gt;
Once the day has come to release the next version, connect to the TDM server using a secure shell (SSH) client, like [http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html PuTTY].&lt;br /&gt;
&lt;br /&gt;
Follow these steps, there are some things that need to be done afterwards, they are necessary for the &#039;&#039;next&#039;&#039; release to function properly:&lt;br /&gt;
&lt;br /&gt;
* Rebuild binaries from scratch, place in darkmod folder, and commit the darkmod folder.&lt;br /&gt;
* 7-zip the Windows gamex86.pdb and TheDarkMod.pdb files and place them in the trunk darkmod/devel/release/debugging/2.0x folder. Add that folder to SVN and commit it.&lt;br /&gt;
* Update the darkmod 2.0x branch tree and merge the just-placed debugging files to that branch. Commit the 2.0x branch.&lt;br /&gt;
* Create the final package remotely as described above (through the website). &lt;br /&gt;
* The above step will generate a new crc_info.txt and a tdm_version_info.txt file on the server.&lt;br /&gt;
* The packaging script will take care of checking these two files into SVN for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Check in the newly generated manifest, it should still be in the folder where the packaging script left it. Note: The packaging script will check this file in automatically for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Create a tag for the darkmod and darkmod_src repositories (/tags/2.0x) - copy it from the latest revision in the corresponding release branch.&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Copy package from /usr/local/www/update.thedarkmod.com/ to /usr/local/tdm_releases/2.0x/ for archiving. The next package process will need it there.&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Copy /usr/local/tdm_releases/1.05/index.html to /usr/local/tdm_releases/2.0x&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Move all differential packages back to /usr/local/www/update.thedarkmod.com/&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Copy the one differential update package updating to the new 2.0x version back to /usr/local/tdm_releases/2.0x. In the following line, (y = x-1).&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* At this point, the /usr/local/tdm_releases/2.0x folder contains a valid TDM 2.0x release, the one that will be pushed to all the mirrors. Examine it for double safety.&lt;br /&gt;
* Examine the upload_to_all_mirrors.sh shell script, to see if it fits your needs.&lt;br /&gt;
* Start uploading to all mirrors.&lt;br /&gt;
** &amp;lt;tt&amp;gt;./upload_to_all_mirrors.sh 2.0x&amp;lt;/tt&amp;gt;&lt;br /&gt;
** Update the rsyncd config on update.thedarkmod.com to point to the new release folder (taaaki will need to do this).&lt;br /&gt;
* Update tdm_mirrors.txt and tdm_version.xml on thedarkmod.com/update: ask taaaki to do that. The tdm_mirrors.txt file is probably fine, but the tdm_version.xml needs to be updated.&lt;br /&gt;
&lt;br /&gt;
== Update the Wiki ==&lt;br /&gt;
&lt;br /&gt;
The wiki contains one page for each release. You can find them all in the [[:Category:What&#039;s New]] category. &lt;br /&gt;
&lt;br /&gt;
First update the current release page:&lt;br /&gt;
&lt;br /&gt;
* Change the &amp;quot;roadmap&amp;quot; link on the current release to a &amp;quot;changelog&amp;quot; link by swapping &#039;&#039;&amp;quot;roadmap_page.php?version_id=XX&amp;quot;&#039;&#039; with &#039;&#039;&amp;quot;changelog_page.php?version=XX&amp;quot;&#039;&#039;.&lt;br /&gt;
* Add the &#039;&#039;&amp;lt;nowiki&amp;gt;{{released|2.01|2014-01-30}}&amp;lt;/nowiki&amp;gt;&#039;&#039; Template on top of the current release page with the correct date.&lt;br /&gt;
&lt;br /&gt;
Then add a new page for the next release. To do this, add a link to it in this template: [[Template:Whatsnew]] by editing it. After saving the template, a link to the new release version page appears in the list and in the category. Edit this page and insert some text into it (you can copy it from an older release page).&lt;br /&gt;
&lt;br /&gt;
Also insert a link to the current roadmap on the bugtracker, you can find out the version_id by looking at [http://bugs.thedarkmod.com/roadmap_page.php the roadmap page].&lt;br /&gt;
&lt;br /&gt;
== Update the Website ==&lt;br /&gt;
&lt;br /&gt;
Be sure to update the following pages on the website to reflect the latest release version:&lt;br /&gt;
* [http://www.thedarkmod.com/downloads/ http://www.thedarkmod.com/downloads/]&lt;br /&gt;
* [http://www.thedarkmod.com/download-the-mod/ http://www.thedarkmod.com/download-the-mod/]&lt;br /&gt;
* [http://www.thedarkmod.com/download-sourcecode/ http://www.thedarkmod.com/download-sourcecode/]&lt;br /&gt;
&lt;br /&gt;
To generate the latest source code package for the page above:&lt;br /&gt;
* Check out the code from the release tag. E.g. svn checkout https://svn.thedarkmod.com/svn/darkmod_src/tags/x.yy&lt;br /&gt;
* Remove (or exclude) the .svn from the working copy folder&lt;br /&gt;
* Create a 7zip archive with the following naming convention: thedarkmod.x.yy.src.7z&lt;br /&gt;
** 7z a -r ../thedarkmod.x.yy.src.7z ./* &lt;br /&gt;
* Upload the source code archive to http://www.thedarkmod.com/sources (ask taaaki for assistance with this or use the ftp upload user)&lt;br /&gt;
&lt;br /&gt;
== Hotfixes ==&lt;br /&gt;
In the event of game-breaking bugs making it into the release, it is possible to rebuild the release with the same version number. This should only be done when absolutely necessary. The process is essentially as follows:&lt;br /&gt;
* Merge the bug fixes into the current release branch (include the recompiled binaries).&lt;br /&gt;
* Re-run the &amp;quot;Testing&amp;quot; package build and test the updated release from http://update.thedarkmod.com/testing/&lt;br /&gt;
* If all is in order, proceed to generate the &amp;quot;Release&amp;quot; package as above and deploy the updated release to the mirrors.&lt;br /&gt;
** Note: it may be necessary to tweak the create_package.sh file to exclude the creation of the release tag - be sure to revert back to the original after the hotfix process has been completed (TODO: an additional option should be added to the release management screen to handle with automatically).&lt;br /&gt;
** Manually create a new release tag for darkmod/ and darkmod_src/ (E.g. darkmod/tags/2.05hotfix and darkmod_src/tags/2.05hotfix repectively).&lt;br /&gt;
** Update the source code package and re-upload to the website if necessary.&lt;br /&gt;
&lt;br /&gt;
= Glossary =&lt;br /&gt;
* Release Fileset: the PK4 files forming the actual release. &lt;br /&gt;
* SVN: an acronym for Subversion, a version control system&lt;br /&gt;
* Commit: The process of a team member uploading files to the SVN repository - a commit always creates a new SVN revision.&lt;br /&gt;
* Mirrors: The servers where the PK4 files are stored for download by the updater.&lt;br /&gt;
* updater: The TDM Updater executable, used for downloading and updating TDM.&lt;br /&gt;
* binary: Source code is compiled into so-called binaries. This can be an executable (.exe) file or a module (.dll/.so).&lt;br /&gt;
* darkmod_src: The code repository holding all the TDM source files, including the tdm_update application.&lt;br /&gt;
* branch: A tree in the SVN repository. Several branches can co-exist side-by-side without interfering.&lt;br /&gt;
* trunk: The main branch where all the ongoing development is happening.&lt;br /&gt;
&lt;br /&gt;
{{todo}}&lt;/div&gt;</summary>
		<author><name>Taaaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=TDM_Release_Mechanics&amp;diff=19121</id>
		<title>TDM Release Mechanics</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=TDM_Release_Mechanics&amp;diff=19121"/>
		<updated>2017-03-12T12:57:13Z</updated>

		<summary type="html">&lt;p&gt;Taaaki: /* Update the Website */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article describes the process of creating a TDM point release. It will be fleshed out over the next few days/weeks.&lt;br /&gt;
&lt;br /&gt;
The team is using a version control system (SVN) for development, and the objective is to create a set of PK4 file from the repository which can be uploaded to the TDM mirrors. Let&#039;s go through this step by step:&lt;br /&gt;
&lt;br /&gt;
= Development = &lt;br /&gt;
Just for the sake of completeness, this step includes the regular development between two TDM releases. This day-to-day development is always happening on the trunk, so all commits are ending up there. Stuff gets broken, stuff gets fixed, stuff gets evaluated, some might be ripped out again.&lt;br /&gt;
&lt;br /&gt;
= Branching off =&lt;br /&gt;
At some point the team decides that it might be time for a new release - a so-called branch date (some sort of semi-freeze) is suggested and agreed upon. To this date, team members are supposed to wrap up their pending changes and commit them to the trunk. About two to three weeks are long enough of a time span for people to get everything into SVN. &lt;br /&gt;
&lt;br /&gt;
Once the deadline arrives, the &#039;&#039;&#039;release branch&#039;&#039;&#039; is created: [[Image:Create release branch.png|right|350px]]&lt;br /&gt;
* Update your darkmod working copy.&lt;br /&gt;
* Update the darkmod_src repository too.&lt;br /&gt;
* Right-click the darkmod folder to create the branch&lt;br /&gt;
** Select SVN &amp;gt; Branch/Tag...&lt;br /&gt;
** A new dialog appears asking for a URL. Enter a URL like this: [https://server/svn/darkmod/branches/release1.xx https://&amp;lt;darkmod_server_here&amp;gt;/svn/darkmod/branches/release1.xx] where xx is replaced by whatever version the next release will be. &lt;br /&gt;
** You&#039;ll probably want to switch to the new branch once it is created, so make sure the check button at the bottom of the dialog is active.&lt;br /&gt;
** Hit OK to let the SVN server create the branch (the server will create a copy of the trunk, placing it at the URL you specified. It might be notable that the files are not physically copied, the branch requires a marginal amount of additional server space).&lt;br /&gt;
* The same should happen with the darkmod_src repository, the code needs to be frozen as well. Perform the same steps as above, using the URL scheme [https://server/svn/darkmod_src/branches/release1.xx https://&amp;lt;darkmod_server_here&amp;gt;/svn/darkmod_src/branches/release1.xx]&lt;br /&gt;
&lt;br /&gt;
At this point there are two new branches, one for the darkmod repo, one for darkmod_src. Consider them a snapshot of the trunk at the point in time you created the branch. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; commits to the trunk won&#039;t affect this newly created branch. The team members not involved in the release can just continue working as usual. Also note that if you as branch creator had the check button (&amp;quot;switch working copy&amp;quot;) activated, your working copy has been &#039;&#039;switched&#039;&#039; to the release branch. &#039;&#039;Your commits will go to the branch&#039;&#039;, keep that in mind. To learn how to &#039;&#039;merge&#039;&#039; stuff between the trunk and the release branch, see below.&lt;br /&gt;
&lt;br /&gt;
= Compile Game Binaries =&lt;br /&gt;
Before the PK4 files can be assembled into a release package, the code from darkmod_src needs to be re-compiled for the Windows and Linux platforms. This is to make sure that the release is built from the most recent (and hopefully most stable) source. If you&#039;re not a coder, you can either ask your fellow coders to switch to the branch and compile the tdm_gameNN.pk4 for you, or you can bite the bullet and follow the [[TDM Compilation Guide]] to compile it yourself. As Windows user, I recommend setting up an Ubuntu 10.04 32-Bit instance in VirtualBox. The downside of using virtualisation is that compilation takes 30-40 Minutes depending on your CPU power, but you at least don&#039;t need a dual-boot setup, let alone a second PC. &lt;br /&gt;
&lt;br /&gt;
Make sure you compile a &#039;&#039;&#039;release build&#039;&#039;&#039; (debug builds are terribly slow), I also recommend re-compiling everything from scratch everytime you build a binary:&lt;br /&gt;
* Windows/VC++: Menu &#039;&#039;Build&#039;&#039; &amp;gt; &#039;&#039;Rebuild Solution&#039;&#039;&lt;br /&gt;
* Linux: &amp;lt;tt&amp;gt;scons -c &amp;amp;&amp;amp; scons BUILD=&amp;quot;release&amp;quot; BUILD_GAMEPAK=&amp;quot;1&amp;quot;&amp;lt;/tt&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Once compiled, make sure that the tdm_game01.pk4 is updated with the newly compiled DLL and the tdm_game02.pk4 is copied over from darkmod_src (where it is created after compilation) to darkmod and commit these two files &#039;&#039;to the branch&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Also commit TheDarkMod.exe and thedarkmod.x86 &#039;&#039;to the branch&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Compile tdm_update =&lt;br /&gt;
tdm_update must be built separately for both Windows and Linux.&lt;br /&gt;
&lt;br /&gt;
Make sure you compile a &#039;&#039;&#039;release build&#039;&#039;&#039;, and recompile everything from scratch:&lt;br /&gt;
* Windows/VC++: Menu &#039;&#039;Build&#039;&#039; &amp;gt; &#039;&#039;Rebuild tdm_update_mfc&#039;&#039;&lt;br /&gt;
* Linux: descend into the tdm_update directory and then do &amp;lt;tt&amp;gt;scons -c &amp;amp;&amp;amp; scons BUILD=&amp;quot;release&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once compiled, copy the results into the darkmod folder:&lt;br /&gt;
&lt;br /&gt;
* Windows/VC++: bin/GuiUpdater/tdm_update.exe -&amp;gt; darkmod/tdm_update.exe&lt;br /&gt;
* Linux: tdm_update.linux -&amp;gt; darkmod/tdm_update.linux&lt;br /&gt;
&lt;br /&gt;
Commit these &#039;&#039;to the branch&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= The Manifest =&lt;br /&gt;
The &amp;quot;manifest&amp;quot; is a huge text files listing all the files that are nominated to go into the release. Not all files in SVN are supposed to be released (like test files, test maps, other broken or unfinished stuff), so we need a white list. The manifest text file is located in the SVN repository: &#039;&#039;&#039;devel/manifests/darkmod.txt&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Building the Manifest ==&lt;br /&gt;
&lt;br /&gt;
Note: This section is more or less for your understanding, &#039;&#039;&#039;you don&#039;t need to manually generate the manifest anymore&#039;&#039;&#039; as this step is part of the automated process running on the TDM server itself.&lt;br /&gt;
&lt;br /&gt;
The manifest file is generated by the tdm_package application. (The tdm_package sources are in the darkmod_src repository, in a subfolder called tdm_update. There is a VC++ 2010 solution and a sconscript for Linux and Mac builds available. You don&#039;t need to compile it if you&#039;re in Windows, there is a pre-compiled version in the darkmod repo as well, in the devel/packager folder.) &lt;br /&gt;
&lt;br /&gt;
After the generation step the file &#039;&#039;&#039;devel/manifests/darkmod.txt&#039;&#039;&#039; will have been updated. You might want to review the modifications the script made to that file and commit it to the release branch if you&#039;re satisfied.&lt;br /&gt;
&lt;br /&gt;
== What is included in the Manifest ==&lt;br /&gt;
The package application is using the file &amp;lt;tt&amp;gt;devel/manifests/darkmod_maps.txt&amp;lt;/tt&amp;gt; to decide whether to include or exclude stuff. In a first internal step the script will include all files in specific folders:&lt;br /&gt;
 &lt;br /&gt;
 # Include all these files (but without parsing them like maps), each&lt;br /&gt;
 # statement will include files (from SVN) in that folder:&lt;br /&gt;
 INCLUDE def/&lt;br /&gt;
 INCLUDE dds/&lt;br /&gt;
 ...&lt;br /&gt;
 INCLUDE video/&lt;br /&gt;
 INCLUDE xdata/&lt;br /&gt;
As visible in the above example, the sharp character # is used to denote comments. Put that at the beginning of a line to disable the statement.&lt;br /&gt;
&lt;br /&gt;
As next step the algorithm will exclude certain files matching the regular expressions in EXCLUDE statements like this:&lt;br /&gt;
 EXCLUDE dds/darkmod/test&lt;br /&gt;
In 95% of the cases it&#039;s enough to just specify the path of the files you want to exclude (use forward slashes), but you can do more fancy stuff like this:&lt;br /&gt;
 EXCLUDE models/md5/chars/undead/revenant/.*.md5anim&lt;br /&gt;
 EXCLUDE ^(dds/)?models/md5/chars/undead/revenant&lt;br /&gt;
The first line will exclude all MD5ANIM files in the revenant folder. The second line will exclude all files in models/md5/chars/undead/revenant &#039;&#039;&#039;and&#039;&#039;&#039; the ones in &#039;&#039;&#039;dds/&#039;&#039;&#039;models/md5/chars/undead/revenant (the dds/ part is marked to be optional). &lt;br /&gt;
&lt;br /&gt;
In summary, all files that are INCLUDE&#039;d as denoted above and afterwards manage to get through the hundreds of lines of EXCLUDE filters will end up in the manifest file.&lt;br /&gt;
&lt;br /&gt;
= Distribute files into PK4s =&lt;br /&gt;
Each of the roughly 15000 files in the manifest needs to be sorted into the correct PK4. This is done by defining a rules in the file &amp;lt;tt&amp;gt;devel/manifests/darkmod_pk4s.txt&amp;lt;/tt&amp;gt;. Each of the lines there defines a PK4 and which files go into it:&lt;br /&gt;
 # Miscellaneous stuff (GL Progs, Script, Language Files, Rope Arrow)&lt;br /&gt;
 tdm_base01.pk4: ^glprogs, ^script, ^strings, sound\.wav, _emptyname\.wav, ^models/md5/environments, ^dds/models/md5/environments, ...&lt;br /&gt;
Again, lines starting with the sharp # character denote comments.&lt;br /&gt;
&lt;br /&gt;
Leftmost is the PK4 filename, followed by a colon character. To the right of the colon a list comma-separated patterns is defined, whereas each pattern is interpreted as regular expression. As with the &amp;lt;tt&amp;gt;darkmod_maps.txt&amp;lt;/tt&amp;gt; you don&#039;t need to know very much about regular expressions to define those rules, it&#039;s usually enough to write the folder names and use wildcards like &amp;lt;tt&amp;gt;.*.md5anim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build the Package =&lt;br /&gt;
The package is built right on the TDM server - there is a full darkmod repository checked out on the server&#039;s filesystem, and it will be processed through some scripts that are listening to your commands.&lt;br /&gt;
&lt;br /&gt;
Once triggered, the process goes roughly like this, I&#039;ll comment on these steps below:&lt;br /&gt;
&lt;br /&gt;
* The working copy is reverted, such that it is clean.&lt;br /&gt;
* The working copy is switched to the release branch of the version you&#039;re about to release (it must exist at this point).&lt;br /&gt;
* The working copy is implicitly updated by the switch operation.&lt;br /&gt;
* The manifest is generated.&lt;br /&gt;
* The full set of PK4 files is generated (it takes a while, the server CPU is not very powerful).&lt;br /&gt;
* The differential package is generated.&lt;br /&gt;
* The files are copied to a public folder reachable through HTTP such that it can be tested by the team. The team will test it by storing a manipulated tdm_mirrors.txt file next to their tdm_update application.&lt;br /&gt;
&lt;br /&gt;
== Prepare the packaging process ==&lt;br /&gt;
A few steps need to be done before kicking off the process on the server.&lt;br /&gt;
&lt;br /&gt;
* The release branch must be created, with a specific naming convention: https://darkmod_server_here/svn/darkmod/branches/releaseY.XX where Y is the major version and XX is the two-digit minor version, e.g. &amp;quot;release1.08&amp;quot;.&lt;br /&gt;
* The inclusion statements in the &amp;lt;tt&amp;gt;darkmod_maps.txt&amp;lt;/tt&amp;gt; file need to be up to date, make sure everything is committed to the branch.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;tdm_version.txt&amp;lt;/tt&amp;gt; file should be containing the correct version number, it&#039;s located in &amp;lt;tt&amp;gt;devel/release/tdm_version.txt&amp;lt;/tt&amp;gt;. Commit that change to the release branch, needless to say.&lt;br /&gt;
&lt;br /&gt;
== Kicking off the packaging process ==&lt;br /&gt;
There is a special admin page on the server which can be used to kick off the process. The URL has been [http://forums.thedarkmod.com/topic/13179-packaging-and-testing-107/ posted on the forums before], greebo or grayman know the URL. It&#039;s password protected, so you&#039;ll be asked to enter credentials. Once there, you can enter the two version numbers, the one you&#039;re building, and the previous one (the latest released one). E.g.: 1.08 and 1.07. It&#039;s sufficient to enter the currently released one, e.g. 1.07, into the second field and the website will automatically fill in the next version number in the first field - you can override it if really necessary.&lt;br /&gt;
&lt;br /&gt;
Once you start the process you&#039;ll be presented a text window with some progress information, and you can watch the messages emitted by the svn client and the tdm_package application running on the server. It takes a while, about half an hour, until the package is built.&lt;br /&gt;
&lt;br /&gt;
= Prepare the internal package test =&lt;br /&gt;
The team needs to have access to the package as created above for internal testing, so tell them to download a specially prepared tdm_mirrors.txt. You can find one attached to the first post here: http://forums.thedarkmod.com/topic/13179-packaging-and-testing-107/&lt;br /&gt;
&lt;br /&gt;
The linked post above already contains a few instructions you can copy from. Basically, instruct the team to use the &amp;lt;tt&amp;gt;--keep-mirrors&amp;lt;/tt&amp;gt; switch when starting the tdm_update application, and to copy the tdm_mirrors.txt file into their test folder before running it. If the &amp;lt;tt&amp;gt;--keep-mirrors&amp;lt;/tt&amp;gt; option is omitted the updater will connect to the regular TDM update mirrors, which is not the point.&lt;br /&gt;
&lt;br /&gt;
= The Test &amp;amp; Bugfix cycle =&lt;br /&gt;
Once the testers post their bug reports, the dev team needs to get moving to fix them. It&#039;s recommended that all fixes will be committed to the trunk (both for darkmod and darkmod_src repos), and the release manager should merge the changes into the release branch.&lt;br /&gt;
&lt;br /&gt;
== Merge Fixes into the Release Branch ==&lt;br /&gt;
Let&#039;s assume there is a fix that got committed to darkmod SVN in order to fix an issue discovered in the test package. Proceed like this to merge it to the release branch. &lt;br /&gt;
* Make sure your local working copy is switched to the release branch. &lt;br /&gt;
* Now right-click the darkmod folder and choose SVN &amp;gt; Merge&lt;br /&gt;
* Select &#039;&#039;Merge a range of revisions&#039;&#039;&lt;br /&gt;
* As &#039;&#039;URL to merge from&#039;&#039; use the address of the trunk: [https://server/svn/darkmod/trunk https://&amp;lt;darkmod_server&amp;gt;/svn/darkmod/trunk]&lt;br /&gt;
* In the field revision range to merge you need to specify which exact change you intend to merge. It&#039;s easier if you click the &amp;quot;Show Log&amp;quot; button right next to the entry field to view the SVN Log of the trunk. You can either select a single commit, or you can select a range of commits. Perhaps double-check the changes of that checkin.&lt;br /&gt;
* Hit &#039;&#039;Next&#039;&#039;, then &#039;&#039;Merge&#039;&#039;.&lt;br /&gt;
* Important: the changes will be incorporated into your &#039;&#039;working copy&#039;&#039;. If you want these changes to actually be stored in the release branch, you need to perform the &#039;&#039;commit&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Special note for code changes: once these are committed to darkmod_src trunk, you need to merge them just like described above. Then you&#039;re going to recompile the game binaries (I recommend from scratch) and commit the tdm_game01.pk4 / tdm_game02.pk4 files to the darkmod release branch too.&lt;br /&gt;
&lt;br /&gt;
== Update the Test Package ==&lt;br /&gt;
Re-package the TDM package, as described above. Just make sure everything is committed to the release branch and kick off another build process.&lt;br /&gt;
&lt;br /&gt;
== Test again ==&lt;br /&gt;
Inform your testers about the update and which things got changed since the last test. Instruct them to update their test installation (don&#039;t forget to mention --keep-mirrors) and enter the next round of testing.&lt;br /&gt;
&lt;br /&gt;
= Release Time: Upload &amp;amp; Cleanup =&lt;br /&gt;
Once the day has come to release the next version, connect to the TDM server using a secure shell (SSH) client, like [http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html PuTTY].&lt;br /&gt;
&lt;br /&gt;
Follow these steps, there are some things that need to be done afterwards, they are necessary for the &#039;&#039;next&#039;&#039; release to function properly:&lt;br /&gt;
&lt;br /&gt;
* Rebuild binaries from scratch, place in darkmod folder, and commit the darkmod folder.&lt;br /&gt;
* 7-zip the Windows gamex86.pdb and TheDarkMod.pdb files and place them in the trunk darkmod/devel/release/debugging/2.0x folder. Add that folder to SVN and commit it.&lt;br /&gt;
* Update the darkmod 2.0x branch tree and merge the just-placed debugging files to that branch. Commit the 2.0x branch.&lt;br /&gt;
* Create the final package remotely as described above (through the website). &lt;br /&gt;
* The above step will generate a new crc_info.txt and a tdm_version_info.txt file on the server.&lt;br /&gt;
* The packaging script will take care of checking these two files into SVN for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Check in the newly generated manifest, it should still be in the folder where the packaging script left it. Note: The packaging script will check this file in automatically for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Create a tag for the darkmod and darkmod_src repositories (/tags/2.0x) - copy it from the latest revision in the corresponding release branch.&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Copy package from /usr/local/www/update.thedarkmod.com/ to /usr/local/tdm_releases/2.0x/ for archiving. The next package process will need it there.&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Copy /usr/local/tdm_releases/1.05/index.html to /usr/local/tdm_releases/2.0x&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Move all differential packages back to /usr/local/www/update.thedarkmod.com/&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Copy the one differential update package updating to the new 2.0x version back to /usr/local/tdm_releases/2.0x. In the following line, (y = x-1).&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* At this point, the /usr/local/tdm_releases/2.0x folder contains a valid TDM 2.0x release, the one that will be pushed to all the mirrors. Examine it for double safety.&lt;br /&gt;
* Examine the upload_to_all_mirrors.sh shell script, to see if it fits your needs.&lt;br /&gt;
* Start uploading to all mirrors.&lt;br /&gt;
** &amp;lt;tt&amp;gt;./upload_to_all_mirrors.sh 2.0x&amp;lt;/tt&amp;gt;&lt;br /&gt;
** Update the rsyncd config on update.thedarkmod.com to point to the new release folder (taaaki will need to do this).&lt;br /&gt;
* Update tdm_mirrors.txt and tdm_version.xml on thedarkmod.com/update: ask taaaki to do that. The tdm_mirrors.txt file is probably fine, but the tdm_version.xml needs to be updated.&lt;br /&gt;
&lt;br /&gt;
== Update the Wiki ==&lt;br /&gt;
&lt;br /&gt;
The wiki contains one page for each release. You can find them all in the [[:Category:What&#039;s New]] category. &lt;br /&gt;
&lt;br /&gt;
First update the current release page:&lt;br /&gt;
&lt;br /&gt;
* Change the &amp;quot;roadmap&amp;quot; link on the current release to a &amp;quot;changelog&amp;quot; link by swapping &#039;&#039;&amp;quot;roadmap_page.php?version_id=XX&amp;quot;&#039;&#039; with &#039;&#039;&amp;quot;changelog_page.php?version=XX&amp;quot;&#039;&#039;.&lt;br /&gt;
* Add the &#039;&#039;&amp;lt;nowiki&amp;gt;{{released|2.01|2014-01-30}}&amp;lt;/nowiki&amp;gt;&#039;&#039; Template on top of the current release page with the correct date.&lt;br /&gt;
&lt;br /&gt;
Then add a new page for the next release. To do this, add a link to it in this template: [[Template:Whatsnew]] by editing it. After saving the template, a link to the new release version page appears in the list and in the category. Edit this page and insert some text into it (you can copy it from an older release page).&lt;br /&gt;
&lt;br /&gt;
Also insert a link to the current roadmap on the bugtracker, you can find out the version_id by looking at [http://bugs.thedarkmod.com/roadmap_page.php the roadmap page].&lt;br /&gt;
&lt;br /&gt;
== Update the Website ==&lt;br /&gt;
&lt;br /&gt;
Be sure to update the following pages on the website to reflect the latest release version:&lt;br /&gt;
* [http://www.thedarkmod.com/downloads/ http://www.thedarkmod.com/downloads/]&lt;br /&gt;
* [http://www.thedarkmod.com/download-the-mod/ http://www.thedarkmod.com/download-the-mod/]&lt;br /&gt;
* [http://www.thedarkmod.com/download-sourcecode/ http://www.thedarkmod.com/download-sourcecode/]&lt;br /&gt;
&lt;br /&gt;
To generate the latest source code package for the page above:&lt;br /&gt;
* Check out the code from the release tag. E.g. svn checkout https://svn.thedarkmod.com/svn/darkmod_src/tags/x.yy&lt;br /&gt;
* Remove (or exclude) the .svn from the working copy folder&lt;br /&gt;
* Create a 7zip archive with the following naming convention: thedarkmod.x.yy.src.7z&lt;br /&gt;
** 7z a -r ../thedarkmod.x.yy.src.7z ./* &lt;br /&gt;
* Upload the source code archive to http://www.thedarkmod.com/sources (ask taaaki for assistance with this or use the ftp upload user)&lt;br /&gt;
&lt;br /&gt;
== Hotfixes ==&lt;br /&gt;
In the event of game-breaking bugs making it into the release, it is possible to rebuild the release with the same version number. This should only be done when absolutely necessary. The process is essentially as follows:&lt;br /&gt;
* Merge the bug fixes into the current release branch (include the recompiled binaries).&lt;br /&gt;
* Re-run the &amp;quot;Testing&amp;quot; package build and test the updated release from http://update.thedarkmod.com/testing/&lt;br /&gt;
* If all is in order, proceed to generate the &amp;quot;Release&amp;quot; package as above and deploy the updated release to the mirrors.&lt;br /&gt;
** Note: it may be necessary to tweak the create_package.sh file to exclude the creation of the release tag (TODO: an additional option should be added to the release management screen to handle with automatically).&lt;br /&gt;
** Manually create a new release tag for darkmod/ and darkmod_src/ (E.g. darkmod/tags/2.05hotfix and darkmod_src/tags/2.05hotfix repectively).&lt;br /&gt;
** Update the source code package and re-upload to the website if necessary.&lt;br /&gt;
&lt;br /&gt;
= Glossary =&lt;br /&gt;
* Release Fileset: the PK4 files forming the actual release. &lt;br /&gt;
* SVN: an acronym for Subversion, a version control system&lt;br /&gt;
* Commit: The process of a team member uploading files to the SVN repository - a commit always creates a new SVN revision.&lt;br /&gt;
* Mirrors: The servers where the PK4 files are stored for download by the updater.&lt;br /&gt;
* updater: The TDM Updater executable, used for downloading and updating TDM.&lt;br /&gt;
* binary: Source code is compiled into so-called binaries. This can be an executable (.exe) file or a module (.dll/.so).&lt;br /&gt;
* darkmod_src: The code repository holding all the TDM source files, including the tdm_update application.&lt;br /&gt;
* branch: A tree in the SVN repository. Several branches can co-exist side-by-side without interfering.&lt;br /&gt;
* trunk: The main branch where all the ongoing development is happening.&lt;br /&gt;
&lt;br /&gt;
{{todo}}&lt;/div&gt;</summary>
		<author><name>Taaaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=TDM_Release_Mechanics&amp;diff=19120</id>
		<title>TDM Release Mechanics</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=TDM_Release_Mechanics&amp;diff=19120"/>
		<updated>2017-03-12T12:55:37Z</updated>

		<summary type="html">&lt;p&gt;Taaaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article describes the process of creating a TDM point release. It will be fleshed out over the next few days/weeks.&lt;br /&gt;
&lt;br /&gt;
The team is using a version control system (SVN) for development, and the objective is to create a set of PK4 file from the repository which can be uploaded to the TDM mirrors. Let&#039;s go through this step by step:&lt;br /&gt;
&lt;br /&gt;
= Development = &lt;br /&gt;
Just for the sake of completeness, this step includes the regular development between two TDM releases. This day-to-day development is always happening on the trunk, so all commits are ending up there. Stuff gets broken, stuff gets fixed, stuff gets evaluated, some might be ripped out again.&lt;br /&gt;
&lt;br /&gt;
= Branching off =&lt;br /&gt;
At some point the team decides that it might be time for a new release - a so-called branch date (some sort of semi-freeze) is suggested and agreed upon. To this date, team members are supposed to wrap up their pending changes and commit them to the trunk. About two to three weeks are long enough of a time span for people to get everything into SVN. &lt;br /&gt;
&lt;br /&gt;
Once the deadline arrives, the &#039;&#039;&#039;release branch&#039;&#039;&#039; is created: [[Image:Create release branch.png|right|350px]]&lt;br /&gt;
* Update your darkmod working copy.&lt;br /&gt;
* Update the darkmod_src repository too.&lt;br /&gt;
* Right-click the darkmod folder to create the branch&lt;br /&gt;
** Select SVN &amp;gt; Branch/Tag...&lt;br /&gt;
** A new dialog appears asking for a URL. Enter a URL like this: [https://server/svn/darkmod/branches/release1.xx https://&amp;lt;darkmod_server_here&amp;gt;/svn/darkmod/branches/release1.xx] where xx is replaced by whatever version the next release will be. &lt;br /&gt;
** You&#039;ll probably want to switch to the new branch once it is created, so make sure the check button at the bottom of the dialog is active.&lt;br /&gt;
** Hit OK to let the SVN server create the branch (the server will create a copy of the trunk, placing it at the URL you specified. It might be notable that the files are not physically copied, the branch requires a marginal amount of additional server space).&lt;br /&gt;
* The same should happen with the darkmod_src repository, the code needs to be frozen as well. Perform the same steps as above, using the URL scheme [https://server/svn/darkmod_src/branches/release1.xx https://&amp;lt;darkmod_server_here&amp;gt;/svn/darkmod_src/branches/release1.xx]&lt;br /&gt;
&lt;br /&gt;
At this point there are two new branches, one for the darkmod repo, one for darkmod_src. Consider them a snapshot of the trunk at the point in time you created the branch. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; commits to the trunk won&#039;t affect this newly created branch. The team members not involved in the release can just continue working as usual. Also note that if you as branch creator had the check button (&amp;quot;switch working copy&amp;quot;) activated, your working copy has been &#039;&#039;switched&#039;&#039; to the release branch. &#039;&#039;Your commits will go to the branch&#039;&#039;, keep that in mind. To learn how to &#039;&#039;merge&#039;&#039; stuff between the trunk and the release branch, see below.&lt;br /&gt;
&lt;br /&gt;
= Compile Game Binaries =&lt;br /&gt;
Before the PK4 files can be assembled into a release package, the code from darkmod_src needs to be re-compiled for the Windows and Linux platforms. This is to make sure that the release is built from the most recent (and hopefully most stable) source. If you&#039;re not a coder, you can either ask your fellow coders to switch to the branch and compile the tdm_gameNN.pk4 for you, or you can bite the bullet and follow the [[TDM Compilation Guide]] to compile it yourself. As Windows user, I recommend setting up an Ubuntu 10.04 32-Bit instance in VirtualBox. The downside of using virtualisation is that compilation takes 30-40 Minutes depending on your CPU power, but you at least don&#039;t need a dual-boot setup, let alone a second PC. &lt;br /&gt;
&lt;br /&gt;
Make sure you compile a &#039;&#039;&#039;release build&#039;&#039;&#039; (debug builds are terribly slow), I also recommend re-compiling everything from scratch everytime you build a binary:&lt;br /&gt;
* Windows/VC++: Menu &#039;&#039;Build&#039;&#039; &amp;gt; &#039;&#039;Rebuild Solution&#039;&#039;&lt;br /&gt;
* Linux: &amp;lt;tt&amp;gt;scons -c &amp;amp;&amp;amp; scons BUILD=&amp;quot;release&amp;quot; BUILD_GAMEPAK=&amp;quot;1&amp;quot;&amp;lt;/tt&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Once compiled, make sure that the tdm_game01.pk4 is updated with the newly compiled DLL and the tdm_game02.pk4 is copied over from darkmod_src (where it is created after compilation) to darkmod and commit these two files &#039;&#039;to the branch&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Also commit TheDarkMod.exe and thedarkmod.x86 &#039;&#039;to the branch&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Compile tdm_update =&lt;br /&gt;
tdm_update must be built separately for both Windows and Linux.&lt;br /&gt;
&lt;br /&gt;
Make sure you compile a &#039;&#039;&#039;release build&#039;&#039;&#039;, and recompile everything from scratch:&lt;br /&gt;
* Windows/VC++: Menu &#039;&#039;Build&#039;&#039; &amp;gt; &#039;&#039;Rebuild tdm_update_mfc&#039;&#039;&lt;br /&gt;
* Linux: descend into the tdm_update directory and then do &amp;lt;tt&amp;gt;scons -c &amp;amp;&amp;amp; scons BUILD=&amp;quot;release&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once compiled, copy the results into the darkmod folder:&lt;br /&gt;
&lt;br /&gt;
* Windows/VC++: bin/GuiUpdater/tdm_update.exe -&amp;gt; darkmod/tdm_update.exe&lt;br /&gt;
* Linux: tdm_update.linux -&amp;gt; darkmod/tdm_update.linux&lt;br /&gt;
&lt;br /&gt;
Commit these &#039;&#039;to the branch&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= The Manifest =&lt;br /&gt;
The &amp;quot;manifest&amp;quot; is a huge text files listing all the files that are nominated to go into the release. Not all files in SVN are supposed to be released (like test files, test maps, other broken or unfinished stuff), so we need a white list. The manifest text file is located in the SVN repository: &#039;&#039;&#039;devel/manifests/darkmod.txt&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Building the Manifest ==&lt;br /&gt;
&lt;br /&gt;
Note: This section is more or less for your understanding, &#039;&#039;&#039;you don&#039;t need to manually generate the manifest anymore&#039;&#039;&#039; as this step is part of the automated process running on the TDM server itself.&lt;br /&gt;
&lt;br /&gt;
The manifest file is generated by the tdm_package application. (The tdm_package sources are in the darkmod_src repository, in a subfolder called tdm_update. There is a VC++ 2010 solution and a sconscript for Linux and Mac builds available. You don&#039;t need to compile it if you&#039;re in Windows, there is a pre-compiled version in the darkmod repo as well, in the devel/packager folder.) &lt;br /&gt;
&lt;br /&gt;
After the generation step the file &#039;&#039;&#039;devel/manifests/darkmod.txt&#039;&#039;&#039; will have been updated. You might want to review the modifications the script made to that file and commit it to the release branch if you&#039;re satisfied.&lt;br /&gt;
&lt;br /&gt;
== What is included in the Manifest ==&lt;br /&gt;
The package application is using the file &amp;lt;tt&amp;gt;devel/manifests/darkmod_maps.txt&amp;lt;/tt&amp;gt; to decide whether to include or exclude stuff. In a first internal step the script will include all files in specific folders:&lt;br /&gt;
 &lt;br /&gt;
 # Include all these files (but without parsing them like maps), each&lt;br /&gt;
 # statement will include files (from SVN) in that folder:&lt;br /&gt;
 INCLUDE def/&lt;br /&gt;
 INCLUDE dds/&lt;br /&gt;
 ...&lt;br /&gt;
 INCLUDE video/&lt;br /&gt;
 INCLUDE xdata/&lt;br /&gt;
As visible in the above example, the sharp character # is used to denote comments. Put that at the beginning of a line to disable the statement.&lt;br /&gt;
&lt;br /&gt;
As next step the algorithm will exclude certain files matching the regular expressions in EXCLUDE statements like this:&lt;br /&gt;
 EXCLUDE dds/darkmod/test&lt;br /&gt;
In 95% of the cases it&#039;s enough to just specify the path of the files you want to exclude (use forward slashes), but you can do more fancy stuff like this:&lt;br /&gt;
 EXCLUDE models/md5/chars/undead/revenant/.*.md5anim&lt;br /&gt;
 EXCLUDE ^(dds/)?models/md5/chars/undead/revenant&lt;br /&gt;
The first line will exclude all MD5ANIM files in the revenant folder. The second line will exclude all files in models/md5/chars/undead/revenant &#039;&#039;&#039;and&#039;&#039;&#039; the ones in &#039;&#039;&#039;dds/&#039;&#039;&#039;models/md5/chars/undead/revenant (the dds/ part is marked to be optional). &lt;br /&gt;
&lt;br /&gt;
In summary, all files that are INCLUDE&#039;d as denoted above and afterwards manage to get through the hundreds of lines of EXCLUDE filters will end up in the manifest file.&lt;br /&gt;
&lt;br /&gt;
= Distribute files into PK4s =&lt;br /&gt;
Each of the roughly 15000 files in the manifest needs to be sorted into the correct PK4. This is done by defining a rules in the file &amp;lt;tt&amp;gt;devel/manifests/darkmod_pk4s.txt&amp;lt;/tt&amp;gt;. Each of the lines there defines a PK4 and which files go into it:&lt;br /&gt;
 # Miscellaneous stuff (GL Progs, Script, Language Files, Rope Arrow)&lt;br /&gt;
 tdm_base01.pk4: ^glprogs, ^script, ^strings, sound\.wav, _emptyname\.wav, ^models/md5/environments, ^dds/models/md5/environments, ...&lt;br /&gt;
Again, lines starting with the sharp # character denote comments.&lt;br /&gt;
&lt;br /&gt;
Leftmost is the PK4 filename, followed by a colon character. To the right of the colon a list comma-separated patterns is defined, whereas each pattern is interpreted as regular expression. As with the &amp;lt;tt&amp;gt;darkmod_maps.txt&amp;lt;/tt&amp;gt; you don&#039;t need to know very much about regular expressions to define those rules, it&#039;s usually enough to write the folder names and use wildcards like &amp;lt;tt&amp;gt;.*.md5anim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build the Package =&lt;br /&gt;
The package is built right on the TDM server - there is a full darkmod repository checked out on the server&#039;s filesystem, and it will be processed through some scripts that are listening to your commands.&lt;br /&gt;
&lt;br /&gt;
Once triggered, the process goes roughly like this, I&#039;ll comment on these steps below:&lt;br /&gt;
&lt;br /&gt;
* The working copy is reverted, such that it is clean.&lt;br /&gt;
* The working copy is switched to the release branch of the version you&#039;re about to release (it must exist at this point).&lt;br /&gt;
* The working copy is implicitly updated by the switch operation.&lt;br /&gt;
* The manifest is generated.&lt;br /&gt;
* The full set of PK4 files is generated (it takes a while, the server CPU is not very powerful).&lt;br /&gt;
* The differential package is generated.&lt;br /&gt;
* The files are copied to a public folder reachable through HTTP such that it can be tested by the team. The team will test it by storing a manipulated tdm_mirrors.txt file next to their tdm_update application.&lt;br /&gt;
&lt;br /&gt;
== Prepare the packaging process ==&lt;br /&gt;
A few steps need to be done before kicking off the process on the server.&lt;br /&gt;
&lt;br /&gt;
* The release branch must be created, with a specific naming convention: https://darkmod_server_here/svn/darkmod/branches/releaseY.XX where Y is the major version and XX is the two-digit minor version, e.g. &amp;quot;release1.08&amp;quot;.&lt;br /&gt;
* The inclusion statements in the &amp;lt;tt&amp;gt;darkmod_maps.txt&amp;lt;/tt&amp;gt; file need to be up to date, make sure everything is committed to the branch.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;tdm_version.txt&amp;lt;/tt&amp;gt; file should be containing the correct version number, it&#039;s located in &amp;lt;tt&amp;gt;devel/release/tdm_version.txt&amp;lt;/tt&amp;gt;. Commit that change to the release branch, needless to say.&lt;br /&gt;
&lt;br /&gt;
== Kicking off the packaging process ==&lt;br /&gt;
There is a special admin page on the server which can be used to kick off the process. The URL has been [http://forums.thedarkmod.com/topic/13179-packaging-and-testing-107/ posted on the forums before], greebo or grayman know the URL. It&#039;s password protected, so you&#039;ll be asked to enter credentials. Once there, you can enter the two version numbers, the one you&#039;re building, and the previous one (the latest released one). E.g.: 1.08 and 1.07. It&#039;s sufficient to enter the currently released one, e.g. 1.07, into the second field and the website will automatically fill in the next version number in the first field - you can override it if really necessary.&lt;br /&gt;
&lt;br /&gt;
Once you start the process you&#039;ll be presented a text window with some progress information, and you can watch the messages emitted by the svn client and the tdm_package application running on the server. It takes a while, about half an hour, until the package is built.&lt;br /&gt;
&lt;br /&gt;
= Prepare the internal package test =&lt;br /&gt;
The team needs to have access to the package as created above for internal testing, so tell them to download a specially prepared tdm_mirrors.txt. You can find one attached to the first post here: http://forums.thedarkmod.com/topic/13179-packaging-and-testing-107/&lt;br /&gt;
&lt;br /&gt;
The linked post above already contains a few instructions you can copy from. Basically, instruct the team to use the &amp;lt;tt&amp;gt;--keep-mirrors&amp;lt;/tt&amp;gt; switch when starting the tdm_update application, and to copy the tdm_mirrors.txt file into their test folder before running it. If the &amp;lt;tt&amp;gt;--keep-mirrors&amp;lt;/tt&amp;gt; option is omitted the updater will connect to the regular TDM update mirrors, which is not the point.&lt;br /&gt;
&lt;br /&gt;
= The Test &amp;amp; Bugfix cycle =&lt;br /&gt;
Once the testers post their bug reports, the dev team needs to get moving to fix them. It&#039;s recommended that all fixes will be committed to the trunk (both for darkmod and darkmod_src repos), and the release manager should merge the changes into the release branch.&lt;br /&gt;
&lt;br /&gt;
== Merge Fixes into the Release Branch ==&lt;br /&gt;
Let&#039;s assume there is a fix that got committed to darkmod SVN in order to fix an issue discovered in the test package. Proceed like this to merge it to the release branch. &lt;br /&gt;
* Make sure your local working copy is switched to the release branch. &lt;br /&gt;
* Now right-click the darkmod folder and choose SVN &amp;gt; Merge&lt;br /&gt;
* Select &#039;&#039;Merge a range of revisions&#039;&#039;&lt;br /&gt;
* As &#039;&#039;URL to merge from&#039;&#039; use the address of the trunk: [https://server/svn/darkmod/trunk https://&amp;lt;darkmod_server&amp;gt;/svn/darkmod/trunk]&lt;br /&gt;
* In the field revision range to merge you need to specify which exact change you intend to merge. It&#039;s easier if you click the &amp;quot;Show Log&amp;quot; button right next to the entry field to view the SVN Log of the trunk. You can either select a single commit, or you can select a range of commits. Perhaps double-check the changes of that checkin.&lt;br /&gt;
* Hit &#039;&#039;Next&#039;&#039;, then &#039;&#039;Merge&#039;&#039;.&lt;br /&gt;
* Important: the changes will be incorporated into your &#039;&#039;working copy&#039;&#039;. If you want these changes to actually be stored in the release branch, you need to perform the &#039;&#039;commit&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Special note for code changes: once these are committed to darkmod_src trunk, you need to merge them just like described above. Then you&#039;re going to recompile the game binaries (I recommend from scratch) and commit the tdm_game01.pk4 / tdm_game02.pk4 files to the darkmod release branch too.&lt;br /&gt;
&lt;br /&gt;
== Update the Test Package ==&lt;br /&gt;
Re-package the TDM package, as described above. Just make sure everything is committed to the release branch and kick off another build process.&lt;br /&gt;
&lt;br /&gt;
== Test again ==&lt;br /&gt;
Inform your testers about the update and which things got changed since the last test. Instruct them to update their test installation (don&#039;t forget to mention --keep-mirrors) and enter the next round of testing.&lt;br /&gt;
&lt;br /&gt;
= Release Time: Upload &amp;amp; Cleanup =&lt;br /&gt;
Once the day has come to release the next version, connect to the TDM server using a secure shell (SSH) client, like [http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html PuTTY].&lt;br /&gt;
&lt;br /&gt;
Follow these steps, there are some things that need to be done afterwards, they are necessary for the &#039;&#039;next&#039;&#039; release to function properly:&lt;br /&gt;
&lt;br /&gt;
* Rebuild binaries from scratch, place in darkmod folder, and commit the darkmod folder.&lt;br /&gt;
* 7-zip the Windows gamex86.pdb and TheDarkMod.pdb files and place them in the trunk darkmod/devel/release/debugging/2.0x folder. Add that folder to SVN and commit it.&lt;br /&gt;
* Update the darkmod 2.0x branch tree and merge the just-placed debugging files to that branch. Commit the 2.0x branch.&lt;br /&gt;
* Create the final package remotely as described above (through the website). &lt;br /&gt;
* The above step will generate a new crc_info.txt and a tdm_version_info.txt file on the server.&lt;br /&gt;
* The packaging script will take care of checking these two files into SVN for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Check in the newly generated manifest, it should still be in the folder where the packaging script left it. Note: The packaging script will check this file in automatically for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Create a tag for the darkmod and darkmod_src repositories (/tags/2.0x) - copy it from the latest revision in the corresponding release branch.&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Copy package from /usr/local/www/update.thedarkmod.com/ to /usr/local/tdm_releases/2.0x/ for archiving. The next package process will need it there.&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Copy /usr/local/tdm_releases/1.05/index.html to /usr/local/tdm_releases/2.0x&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Move all differential packages back to /usr/local/www/update.thedarkmod.com/&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Copy the one differential update package updating to the new 2.0x version back to /usr/local/tdm_releases/2.0x. In the following line, (y = x-1).&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* At this point, the /usr/local/tdm_releases/2.0x folder contains a valid TDM 2.0x release, the one that will be pushed to all the mirrors. Examine it for double safety.&lt;br /&gt;
* Examine the upload_to_all_mirrors.sh shell script, to see if it fits your needs.&lt;br /&gt;
* Start uploading to all mirrors.&lt;br /&gt;
** &amp;lt;tt&amp;gt;./upload_to_all_mirrors.sh 2.0x&amp;lt;/tt&amp;gt;&lt;br /&gt;
** Update the rsyncd config on update.thedarkmod.com to point to the new release folder (taaaki will need to do this).&lt;br /&gt;
* Update tdm_mirrors.txt and tdm_version.xml on thedarkmod.com/update: ask taaaki to do that. The tdm_mirrors.txt file is probably fine, but the tdm_version.xml needs to be updated.&lt;br /&gt;
&lt;br /&gt;
== Update the Wiki ==&lt;br /&gt;
&lt;br /&gt;
The wiki contains one page for each release. You can find them all in the [[:Category:What&#039;s New]] category. &lt;br /&gt;
&lt;br /&gt;
First update the current release page:&lt;br /&gt;
&lt;br /&gt;
* Change the &amp;quot;roadmap&amp;quot; link on the current release to a &amp;quot;changelog&amp;quot; link by swapping &#039;&#039;&amp;quot;roadmap_page.php?version_id=XX&amp;quot;&#039;&#039; with &#039;&#039;&amp;quot;changelog_page.php?version=XX&amp;quot;&#039;&#039;.&lt;br /&gt;
* Add the &#039;&#039;&amp;lt;nowiki&amp;gt;{{released|2.01|2014-01-30}}&amp;lt;/nowiki&amp;gt;&#039;&#039; Template on top of the current release page with the correct date.&lt;br /&gt;
&lt;br /&gt;
Then add a new page for the next release. To do this, add a link to it in this template: [[Template:Whatsnew]] by editing it. After saving the template, a link to the new release version page appears in the list and in the category. Edit this page and insert some text into it (you can copy it from an older release page).&lt;br /&gt;
&lt;br /&gt;
Also insert a link to the current roadmap on the bugtracker, you can find out the version_id by looking at [http://bugs.thedarkmod.com/roadmap_page.php the roadmap page].&lt;br /&gt;
&lt;br /&gt;
== Update the Website ==&lt;br /&gt;
&lt;br /&gt;
Be sure to update the following pages on the website to reflect the latest release version:&lt;br /&gt;
* [http://www.thedarkmod.com/downloads/]&lt;br /&gt;
* [http://www.thedarkmod.com/download-the-mod/]&lt;br /&gt;
* [http://www.thedarkmod.com/download-sourcecode/]&lt;br /&gt;
&lt;br /&gt;
To generate the latest source code package for the page above:&lt;br /&gt;
* Check out the code from the release tag. E.g. svn checkout https://svn.thedarkmod.com/svn/darkmod_src/tags/x.yy&lt;br /&gt;
* Remove (or exclude) the .svn from the working copy folder&lt;br /&gt;
* Create a 7zip archive with the following naming convention: thedarkmod.x.yy.src.7z&lt;br /&gt;
** 7z a -r ../thedarkmod.x.yy.src.7z ./* &lt;br /&gt;
* Upload the source code archive to http://www.thedarkmod.com/sources (ask taaaki for assistance with this or use the ftp upload user)&lt;br /&gt;
&lt;br /&gt;
== Hotfixes ==&lt;br /&gt;
In the event of game-breaking bugs making it into the release, it is possible to rebuild the release with the same version number. This should only be done when absolutely necessary. The process is essentially as follows:&lt;br /&gt;
* Merge the bug fixes into the current release branch (include the recompiled binaries).&lt;br /&gt;
* Re-run the &amp;quot;Testing&amp;quot; package build and test the updated release from http://update.thedarkmod.com/testing/&lt;br /&gt;
* If all is in order, proceed to generate the &amp;quot;Release&amp;quot; package as above and deploy the updated release to the mirrors.&lt;br /&gt;
** Note: it may be necessary to tweak the create_package.sh file to exclude the creation of the release tag (TODO: an additional option should be added to the release management screen to handle with automatically).&lt;br /&gt;
** Manually create a new release tag for darkmod/ and darkmod_src/ (E.g. darkmod/tags/2.05hotfix and darkmod_src/tags/2.05hotfix repectively).&lt;br /&gt;
** Update the source code package and re-upload to the website if necessary.&lt;br /&gt;
&lt;br /&gt;
= Glossary =&lt;br /&gt;
* Release Fileset: the PK4 files forming the actual release. &lt;br /&gt;
* SVN: an acronym for Subversion, a version control system&lt;br /&gt;
* Commit: The process of a team member uploading files to the SVN repository - a commit always creates a new SVN revision.&lt;br /&gt;
* Mirrors: The servers where the PK4 files are stored for download by the updater.&lt;br /&gt;
* updater: The TDM Updater executable, used for downloading and updating TDM.&lt;br /&gt;
* binary: Source code is compiled into so-called binaries. This can be an executable (.exe) file or a module (.dll/.so).&lt;br /&gt;
* darkmod_src: The code repository holding all the TDM source files, including the tdm_update application.&lt;br /&gt;
* branch: A tree in the SVN repository. Several branches can co-exist side-by-side without interfering.&lt;br /&gt;
* trunk: The main branch where all the ongoing development is happening.&lt;br /&gt;
&lt;br /&gt;
{{todo}}&lt;/div&gt;</summary>
		<author><name>Taaaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=TDM_Release_Mechanics&amp;diff=19118</id>
		<title>TDM Release Mechanics</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=TDM_Release_Mechanics&amp;diff=19118"/>
		<updated>2017-03-10T21:58:26Z</updated>

		<summary type="html">&lt;p&gt;Taaaki: /* Release Time: Upload &amp;amp; Cleanup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article describes the process of creating a TDM point release. It will be fleshed out over the next few days/weeks.&lt;br /&gt;
&lt;br /&gt;
The team is using a version control system (SVN) for development, and the objective is to create a set of PK4 file from the repository which can be uploaded to the TDM mirrors. Let&#039;s go through this step by step:&lt;br /&gt;
&lt;br /&gt;
= Development = &lt;br /&gt;
Just for the sake of completeness, this step includes the regular development between two TDM releases. This day-to-day development is always happening on the trunk, so all commits are ending up there. Stuff gets broken, stuff gets fixed, stuff gets evaluated, some might be ripped out again.&lt;br /&gt;
&lt;br /&gt;
= Branching off =&lt;br /&gt;
At some point the team decides that it might be time for a new release - a so-called branch date (some sort of semi-freeze) is suggested and agreed upon. To this date, team members are supposed to wrap up their pending changes and commit them to the trunk. About two to three weeks are long enough of a time span for people to get everything into SVN. &lt;br /&gt;
&lt;br /&gt;
Once the deadline arrives, the &#039;&#039;&#039;release branch&#039;&#039;&#039; is created: [[Image:Create release branch.png|right|350px]]&lt;br /&gt;
* Update your darkmod working copy.&lt;br /&gt;
* Update the darkmod_src repository too.&lt;br /&gt;
* Right-click the darkmod folder to create the branch&lt;br /&gt;
** Select SVN &amp;gt; Branch/Tag...&lt;br /&gt;
** A new dialog appears asking for a URL. Enter a URL like this: [https://server/svn/darkmod/branches/release1.xx https://&amp;lt;darkmod_server_here&amp;gt;/svn/darkmod/branches/release1.xx] where xx is replaced by whatever version the next release will be. &lt;br /&gt;
** You&#039;ll probably want to switch to the new branch once it is created, so make sure the check button at the bottom of the dialog is active.&lt;br /&gt;
** Hit OK to let the SVN server create the branch (the server will create a copy of the trunk, placing it at the URL you specified. It might be notable that the files are not physically copied, the branch requires a marginal amount of additional server space).&lt;br /&gt;
* The same should happen with the darkmod_src repository, the code needs to be frozen as well. Perform the same steps as above, using the URL scheme [https://server/svn/darkmod_src/branches/release1.xx https://&amp;lt;darkmod_server_here&amp;gt;/svn/darkmod_src/branches/release1.xx]&lt;br /&gt;
&lt;br /&gt;
At this point there are two new branches, one for the darkmod repo, one for darkmod_src. Consider them a snapshot of the trunk at the point in time you created the branch. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; commits to the trunk won&#039;t affect this newly created branch. The team members not involved in the release can just continue working as usual. Also note that if you as branch creator had the check button (&amp;quot;switch working copy&amp;quot;) activated, your working copy has been &#039;&#039;switched&#039;&#039; to the release branch. &#039;&#039;Your commits will go to the branch&#039;&#039;, keep that in mind. To learn how to &#039;&#039;merge&#039;&#039; stuff between the trunk and the release branch, see below.&lt;br /&gt;
&lt;br /&gt;
= Compile Game Binaries =&lt;br /&gt;
Before the PK4 files can be assembled into a release package, the code from darkmod_src needs to be re-compiled for the Windows and Linux platforms. This is to make sure that the release is built from the most recent (and hopefully most stable) source. If you&#039;re not a coder, you can either ask your fellow coders to switch to the branch and compile the tdm_gameNN.pk4 for you, or you can bite the bullet and follow the [[TDM Compilation Guide]] to compile it yourself. As Windows user, I recommend setting up an Ubuntu 10.04 32-Bit instance in VirtualBox. The downside of using virtualisation is that compilation takes 30-40 Minutes depending on your CPU power, but you at least don&#039;t need a dual-boot setup, let alone a second PC. &lt;br /&gt;
&lt;br /&gt;
Make sure you compile a &#039;&#039;&#039;release build&#039;&#039;&#039; (debug builds are terribly slow), I also recommend re-compiling everything from scratch everytime you build a binary:&lt;br /&gt;
* Windows/VC++: Menu &#039;&#039;Build&#039;&#039; &amp;gt; &#039;&#039;Rebuild Solution&#039;&#039;&lt;br /&gt;
* Linux: &amp;lt;tt&amp;gt;scons -c &amp;amp;&amp;amp; scons BUILD=&amp;quot;release&amp;quot; BUILD_GAMEPAK=&amp;quot;1&amp;quot;&amp;lt;/tt&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Once compiled, make sure that the tdm_game01.pk4 is updated with the newly compiled DLL and the tdm_game02.pk4 is copied over from darkmod_src (where it is created after compilation) to darkmod and commit these two files &#039;&#039;to the branch&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Also commit TheDarkMod.exe and thedarkmod.x86 &#039;&#039;to the branch&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Compile tdm_update =&lt;br /&gt;
tdm_update must be built separately for both Windows and Linux.&lt;br /&gt;
&lt;br /&gt;
Make sure you compile a &#039;&#039;&#039;release build&#039;&#039;&#039;, and recompile everything from scratch:&lt;br /&gt;
* Windows/VC++: Menu &#039;&#039;Build&#039;&#039; &amp;gt; &#039;&#039;Rebuild tdm_update_mfc&#039;&#039;&lt;br /&gt;
* Linux: descend into the tdm_update directory and then do &amp;lt;tt&amp;gt;scons -c &amp;amp;&amp;amp; scons BUILD=&amp;quot;release&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once compiled, copy the results into the darkmod folder:&lt;br /&gt;
&lt;br /&gt;
* Windows/VC++: bin/GuiUpdater/tdm_update.exe -&amp;gt; darkmod/tdm_update.exe&lt;br /&gt;
* Linux: tdm_update.linux -&amp;gt; darkmod/tdm_update.linux&lt;br /&gt;
&lt;br /&gt;
Commit these &#039;&#039;to the branch&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= The Manifest =&lt;br /&gt;
The &amp;quot;manifest&amp;quot; is a huge text files listing all the files that are nominated to go into the release. Not all files in SVN are supposed to be released (like test files, test maps, other broken or unfinished stuff), so we need a white list. The manifest text file is located in the SVN repository: &#039;&#039;&#039;devel/manifests/darkmod.txt&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Building the Manifest ==&lt;br /&gt;
&lt;br /&gt;
Note: This section is more or less for your understanding, &#039;&#039;&#039;you don&#039;t need to manually generate the manifest anymore&#039;&#039;&#039; as this step is part of the automated process running on the TDM server itself.&lt;br /&gt;
&lt;br /&gt;
The manifest file is generated by the tdm_package application. (The tdm_package sources are in the darkmod_src repository, in a subfolder called tdm_update. There is a VC++ 2010 solution and a sconscript for Linux and Mac builds available. You don&#039;t need to compile it if you&#039;re in Windows, there is a pre-compiled version in the darkmod repo as well, in the devel/packager folder.) &lt;br /&gt;
&lt;br /&gt;
After the generation step the file &#039;&#039;&#039;devel/manifests/darkmod.txt&#039;&#039;&#039; will have been updated. You might want to review the modifications the script made to that file and commit it to the release branch if you&#039;re satisfied.&lt;br /&gt;
&lt;br /&gt;
== What is included in the Manifest ==&lt;br /&gt;
The package application is using the file &amp;lt;tt&amp;gt;devel/manifests/darkmod_maps.txt&amp;lt;/tt&amp;gt; to decide whether to include or exclude stuff. In a first internal step the script will include all files in specific folders:&lt;br /&gt;
 &lt;br /&gt;
 # Include all these files (but without parsing them like maps), each&lt;br /&gt;
 # statement will include files (from SVN) in that folder:&lt;br /&gt;
 INCLUDE def/&lt;br /&gt;
 INCLUDE dds/&lt;br /&gt;
 ...&lt;br /&gt;
 INCLUDE video/&lt;br /&gt;
 INCLUDE xdata/&lt;br /&gt;
As visible in the above example, the sharp character # is used to denote comments. Put that at the beginning of a line to disable the statement.&lt;br /&gt;
&lt;br /&gt;
As next step the algorithm will exclude certain files matching the regular expressions in EXCLUDE statements like this:&lt;br /&gt;
 EXCLUDE dds/darkmod/test&lt;br /&gt;
In 95% of the cases it&#039;s enough to just specify the path of the files you want to exclude (use forward slashes), but you can do more fancy stuff like this:&lt;br /&gt;
 EXCLUDE models/md5/chars/undead/revenant/.*.md5anim&lt;br /&gt;
 EXCLUDE ^(dds/)?models/md5/chars/undead/revenant&lt;br /&gt;
The first line will exclude all MD5ANIM files in the revenant folder. The second line will exclude all files in models/md5/chars/undead/revenant &#039;&#039;&#039;and&#039;&#039;&#039; the ones in &#039;&#039;&#039;dds/&#039;&#039;&#039;models/md5/chars/undead/revenant (the dds/ part is marked to be optional). &lt;br /&gt;
&lt;br /&gt;
In summary, all files that are INCLUDE&#039;d as denoted above and afterwards manage to get through the hundreds of lines of EXCLUDE filters will end up in the manifest file.&lt;br /&gt;
&lt;br /&gt;
= Distribute files into PK4s =&lt;br /&gt;
Each of the roughly 15000 files in the manifest needs to be sorted into the correct PK4. This is done by defining a rules in the file &amp;lt;tt&amp;gt;devel/manifests/darkmod_pk4s.txt&amp;lt;/tt&amp;gt;. Each of the lines there defines a PK4 and which files go into it:&lt;br /&gt;
 # Miscellaneous stuff (GL Progs, Script, Language Files, Rope Arrow)&lt;br /&gt;
 tdm_base01.pk4: ^glprogs, ^script, ^strings, sound\.wav, _emptyname\.wav, ^models/md5/environments, ^dds/models/md5/environments, ...&lt;br /&gt;
Again, lines starting with the sharp # character denote comments.&lt;br /&gt;
&lt;br /&gt;
Leftmost is the PK4 filename, followed by a colon character. To the right of the colon a list comma-separated patterns is defined, whereas each pattern is interpreted as regular expression. As with the &amp;lt;tt&amp;gt;darkmod_maps.txt&amp;lt;/tt&amp;gt; you don&#039;t need to know very much about regular expressions to define those rules, it&#039;s usually enough to write the folder names and use wildcards like &amp;lt;tt&amp;gt;.*.md5anim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build the Package =&lt;br /&gt;
The package is built right on the TDM server - there is a full darkmod repository checked out on the server&#039;s filesystem, and it will be processed through some scripts that are listening to your commands.&lt;br /&gt;
&lt;br /&gt;
Once triggered, the process goes roughly like this, I&#039;ll comment on these steps below:&lt;br /&gt;
&lt;br /&gt;
* The working copy is reverted, such that it is clean.&lt;br /&gt;
* The working copy is switched to the release branch of the version you&#039;re about to release (it must exist at this point).&lt;br /&gt;
* The working copy is implicitly updated by the switch operation.&lt;br /&gt;
* The manifest is generated.&lt;br /&gt;
* The full set of PK4 files is generated (it takes a while, the server CPU is not very powerful).&lt;br /&gt;
* The differential package is generated.&lt;br /&gt;
* The files are copied to a public folder reachable through HTTP such that it can be tested by the team. The team will test it by storing a manipulated tdm_mirrors.txt file next to their tdm_update application.&lt;br /&gt;
&lt;br /&gt;
== Prepare the packaging process ==&lt;br /&gt;
A few steps need to be done before kicking off the process on the server.&lt;br /&gt;
&lt;br /&gt;
* The release branch must be created, with a specific naming convention: https://darkmod_server_here/svn/darkmod/branches/releaseY.XX where Y is the major version and XX is the two-digit minor version, e.g. &amp;quot;release1.08&amp;quot;.&lt;br /&gt;
* The inclusion statements in the &amp;lt;tt&amp;gt;darkmod_maps.txt&amp;lt;/tt&amp;gt; file need to be up to date, make sure everything is committed to the branch.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;tdm_version.txt&amp;lt;/tt&amp;gt; file should be containing the correct version number, it&#039;s located in &amp;lt;tt&amp;gt;devel/release/tdm_version.txt&amp;lt;/tt&amp;gt;. Commit that change to the release branch, needless to say.&lt;br /&gt;
&lt;br /&gt;
== Kicking off the packaging process ==&lt;br /&gt;
There is a special admin page on the server which can be used to kick off the process. The URL has been [http://forums.thedarkmod.com/topic/13179-packaging-and-testing-107/ posted on the forums before], greebo or grayman know the URL. It&#039;s password protected, so you&#039;ll be asked to enter credentials. Once there, you can enter the two version numbers, the one you&#039;re building, and the previous one (the latest released one). E.g.: 1.08 and 1.07. It&#039;s sufficient to enter the currently released one, e.g. 1.07, into the second field and the website will automatically fill in the next version number in the first field - you can override it if really necessary.&lt;br /&gt;
&lt;br /&gt;
Once you start the process you&#039;ll be presented a text window with some progress information, and you can watch the messages emitted by the svn client and the tdm_package application running on the server. It takes a while, about half an hour, until the package is built.&lt;br /&gt;
&lt;br /&gt;
= Prepare the internal package test =&lt;br /&gt;
The team needs to have access to the package as created above for internal testing, so tell them to download a specially prepared tdm_mirrors.txt. You can find one attached to the first post here: http://forums.thedarkmod.com/topic/13179-packaging-and-testing-107/&lt;br /&gt;
&lt;br /&gt;
The linked post above already contains a few instructions you can copy from. Basically, instruct the team to use the &amp;lt;tt&amp;gt;--keep-mirrors&amp;lt;/tt&amp;gt; switch when starting the tdm_update application, and to copy the tdm_mirrors.txt file into their test folder before running it. If the &amp;lt;tt&amp;gt;--keep-mirrors&amp;lt;/tt&amp;gt; option is omitted the updater will connect to the regular TDM update mirrors, which is not the point.&lt;br /&gt;
&lt;br /&gt;
= The Test &amp;amp; Bugfix cycle =&lt;br /&gt;
Once the testers post their bug reports, the dev team needs to get moving to fix them. It&#039;s recommended that all fixes will be committed to the trunk (both for darkmod and darkmod_src repos), and the release manager should merge the changes into the release branch.&lt;br /&gt;
&lt;br /&gt;
== Merge Fixes into the Release Branch ==&lt;br /&gt;
Let&#039;s assume there is a fix that got committed to darkmod SVN in order to fix an issue discovered in the test package. Proceed like this to merge it to the release branch. &lt;br /&gt;
* Make sure your local working copy is switched to the release branch. &lt;br /&gt;
* Now right-click the darkmod folder and choose SVN &amp;gt; Merge&lt;br /&gt;
* Select &#039;&#039;Merge a range of revisions&#039;&#039;&lt;br /&gt;
* As &#039;&#039;URL to merge from&#039;&#039; use the address of the trunk: [https://server/svn/darkmod/trunk https://&amp;lt;darkmod_server&amp;gt;/svn/darkmod/trunk]&lt;br /&gt;
* In the field revision range to merge you need to specify which exact change you intend to merge. It&#039;s easier if you click the &amp;quot;Show Log&amp;quot; button right next to the entry field to view the SVN Log of the trunk. You can either select a single commit, or you can select a range of commits. Perhaps double-check the changes of that checkin.&lt;br /&gt;
* Hit &#039;&#039;Next&#039;&#039;, then &#039;&#039;Merge&#039;&#039;.&lt;br /&gt;
* Important: the changes will be incorporated into your &#039;&#039;working copy&#039;&#039;. If you want these changes to actually be stored in the release branch, you need to perform the &#039;&#039;commit&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Special note for code changes: once these are committed to darkmod_src trunk, you need to merge them just like described above. Then you&#039;re going to recompile the game binaries (I recommend from scratch) and commit the tdm_game01.pk4 / tdm_game02.pk4 files to the darkmod release branch too.&lt;br /&gt;
&lt;br /&gt;
== Update the Test Package ==&lt;br /&gt;
Re-package the TDM package, as described above. Just make sure everything is committed to the release branch and kick off another build process.&lt;br /&gt;
&lt;br /&gt;
== Test again ==&lt;br /&gt;
Inform your testers about the update and which things got changed since the last test. Instruct them to update their test installation (don&#039;t forget to mention --keep-mirrors) and enter the next round of testing.&lt;br /&gt;
&lt;br /&gt;
= Release Time: Upload &amp;amp; Cleanup =&lt;br /&gt;
Once the day has come to release the next version, connect to the TDM server using a secure shell (SSH) client, like [http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html PuTTY].&lt;br /&gt;
&lt;br /&gt;
Follow these steps, there are some things that need to be done afterwards, they are necessary for the &#039;&#039;next&#039;&#039; release to function properly:&lt;br /&gt;
&lt;br /&gt;
* Rebuild binaries from scratch, place in darkmod folder, and commit the darkmod folder.&lt;br /&gt;
* 7-zip the Windows gamex86.pdb and TheDarkMod.pdb files and place them in the trunk darkmod/devel/release/debugging/2.0x folder. Add that folder to SVN and commit it.&lt;br /&gt;
* Update the darkmod 2.0x branch tree and merge the just-placed debugging files to that branch. Commit the 2.0x branch.&lt;br /&gt;
* Create the final package remotely as described above (through the website). &lt;br /&gt;
* The above step will generate a new crc_info.txt and a tdm_version_info.txt file on the server.&lt;br /&gt;
* The packaging script will take care of checking these two files into SVN for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Check in the newly generated manifest, it should still be in the folder where the packaging script left it. Note: The packaging script will check this file in automatically for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Create a tag for the darkmod and darkmod_src repositories (/tags/2.0x) - copy it from the latest revision in the corresponding release branch.&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Copy package from /usr/local/www/update.thedarkmod.com/ to /usr/local/tdm_releases/2.0x/ for archiving. The next package process will need it there.&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Copy /usr/local/tdm_releases/1.05/index.html to /usr/local/tdm_releases/2.0x&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Move all differential packages back to /usr/local/www/update.thedarkmod.com/&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* Copy the one differential update package updating to the new 2.0x version back to /usr/local/tdm_releases/2.0x. In the following line, (y = x-1).&lt;br /&gt;
** The packaging script will perform this task for &amp;quot;Release&amp;quot; packages.&lt;br /&gt;
* At this point, the /usr/local/tdm_releases/2.0x folder contains a valid TDM 2.0x release, the one that will be pushed to all the mirrors. Examine it for double safety.&lt;br /&gt;
* Examine the upload_to_all_mirrors.sh shell script, to see if it fits your needs.&lt;br /&gt;
* Start uploading to all mirrors.&lt;br /&gt;
** &amp;lt;tt&amp;gt;./upload_to_all_mirrors.sh 2.0x&amp;lt;/tt&amp;gt;&lt;br /&gt;
** Update the rsyncd config on update.thedarkmod.com to point to the new release folder (taaaki will need to do this).&lt;br /&gt;
* Update tdm_mirrors.txt and tdm_version.xml on thedarkmod.com/update: ask taaaki to do that. The tdm_mirrors.txt file is probably fine, but the tdm_version.xml needs to be updated.&lt;br /&gt;
&lt;br /&gt;
== Update the Wiki ==&lt;br /&gt;
&lt;br /&gt;
The wiki contains one page for each release. You can find them all in the [[:Category:What&#039;s New]] category. &lt;br /&gt;
&lt;br /&gt;
First update the current release page:&lt;br /&gt;
&lt;br /&gt;
* Change the &amp;quot;roadmap&amp;quot; link on the current release to a &amp;quot;changelog&amp;quot; link by swapping &#039;&#039;&amp;quot;roadmap_page.php?version_id=XX&amp;quot;&#039;&#039; with &#039;&#039;&amp;quot;changelog_page.php?version=XX&amp;quot;&#039;&#039;.&lt;br /&gt;
* Add the &#039;&#039;&amp;lt;nowiki&amp;gt;{{released|2.01|2014-01-30}}&amp;lt;/nowiki&amp;gt;&#039;&#039; Template on top of the current release page with the correct date.&lt;br /&gt;
&lt;br /&gt;
Then add a new page for the next release. To do this, add a link to it in this template: [[Template:Whatsnew]] by editing it. After saving the template, a link to the new release version page appears in the list and in the category. Edit this page and insert some text into it (you can copy it from an older release page).&lt;br /&gt;
&lt;br /&gt;
Also insert a link to the current roadmap on the bugtracker, you can find out the version_id by looking at [http://bugs.thedarkmod.com/roadmap_page.php the roadmap page].&lt;br /&gt;
&lt;br /&gt;
= Glossary =&lt;br /&gt;
* Release Fileset: the PK4 files forming the actual release. &lt;br /&gt;
* SVN: an acronym for Subversion, a version control system&lt;br /&gt;
* Commit: The process of a team member uploading files to the SVN repository - a commit always creates a new SVN revision.&lt;br /&gt;
* Mirrors: The servers where the PK4 files are stored for download by the updater.&lt;br /&gt;
* updater: The TDM Updater executable, used for downloading and updating TDM.&lt;br /&gt;
* binary: Source code is compiled into so-called binaries. This can be an executable (.exe) file or a module (.dll/.so).&lt;br /&gt;
* darkmod_src: The code repository holding all the TDM source files, including the tdm_update application.&lt;br /&gt;
* branch: A tree in the SVN repository. Several branches can co-exist side-by-side without interfering.&lt;br /&gt;
* trunk: The main branch where all the ongoing development is happening.&lt;br /&gt;
&lt;br /&gt;
{{todo}}&lt;/div&gt;</summary>
		<author><name>Taaaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Main_Page&amp;diff=18451</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Main_Page&amp;diff=18451"/>
		<updated>2016-07-26T16:17:26Z</updated>

		<summary type="html">&lt;p&gt;Taaaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Welcome to the dark wiki.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot; width=&amp;quot;95%&amp;quot; cellspacing=&amp;quot;10&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;width:50%; vertical-align:top; padding:2em; border:1px solid #e1e1e1; background-color:#f9f9f9&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;br/&amp;gt; [[Image:Tdm_wiki_logo.png|link=http://www.thedarkmod.com/downloads/]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 10px;font-family: Verdana, Helvetica, sans-serif;font-size:2em; letter-spacing: 20;font-weight:bold&amp;quot;&amp;gt;[[http://www.thedarkmod.com/downloads/ Download here]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;letter-spacing: 1px&amp;quot;&amp;gt;The Dark Mod 2.04 Released: &#039;&#039;&#039;2016-07-12&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;letter-spacing: 1px;font-size:small&amp;quot;&amp;gt;See the [http://wiki.thedarkmod.com/index.php?title=What%27s_new Changelog]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To see (or add to) a list of all available missions, click below.&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 10px;font-family: Verdana, Helvetica, sans-serif;font-size:1.6em; letter-spacing: 20;font-weight:bold&amp;quot;&amp;gt;&lt;br /&gt;
[[Fan Missions for The Dark Mod]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;Having problems? Check out the &amp;lt;br /&amp;gt;&amp;lt;div style=&amp;quot;padding: 10px;font-family: Verdana, Helvetica, sans-serif;font-size:2em; letter-spacing: 20;font-weight:bold&amp;quot;&amp;gt;&#039;&#039;&#039;[[FAQ|Frequently Asked Questions]]&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;vertical-align:top; padding:2em; border:1px solid #e1e1e1; background-color:#f9f9f9&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;font-size:130%&amp;quot;&amp;gt;&#039;&#039;&#039;Topics:&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; [[Installation]] / [[FAQ]] : Information how to get The Dark Mod running.&lt;br /&gt;
; [[Bindings and User Settings]] : Key binding and interface documentation.&lt;br /&gt;
; [[The Dark Mod Gameplay]] : The instruction manual for how to play TDM missions.&lt;br /&gt;
; [[Universe]] : Information about The Dark Mod universe and setting&lt;br /&gt;
; [[:Category:Tutorial|Tutorials]] : Complete tutorials about setting up certain characteristics&lt;br /&gt;
; [[:Category:Editing|Editing]] : Information about level design and the tools&lt;br /&gt;
; [[DarkRadiant]] : Documents concerning the Dark Mod&#039;s own level editor ([[:Category:DarkRadiant|article index]]).&lt;br /&gt;
; [[Textures]] : Explanation of material shaders and image files&lt;br /&gt;
; [[Modeling]] : Modeling and file format information&lt;br /&gt;
; [[Animation]] : General tips, and software tutorials&lt;br /&gt;
; [[Sound]] : Soundeffects, ambients and how to get them ingame&lt;br /&gt;
; [[Coding]] : Source code modification, level and GUI scripting&lt;br /&gt;
; [[Release]] : How to pack a mission, and get it tested and released!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Taaaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.04&amp;diff=18435</id>
		<title>What&#039;s new in TDM 2.04</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.04&amp;diff=18435"/>
		<updated>2016-07-13T18:14:12Z</updated>

		<summary type="html">&lt;p&gt;Taaaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- keywords whats new --&amp;gt;&lt;br /&gt;
See the [http://bugs.thedarkmod.com/changelog_page.php?version_id=71 changelog] on our bugtracker.&lt;br /&gt;
{{released|2.04|2016-07-12}}&lt;br /&gt;
&lt;br /&gt;
== AI ==&lt;br /&gt;
* grayman enhanced AI searching to allow for wider, more realistic searches.&lt;br /&gt;
* grayman fixed some issues with AI relighting lights.&lt;br /&gt;
* grayman fixed the infamous &amp;quot;barmaid gets stuck while peeing&amp;quot; problem in &amp;quot;Inn Business&amp;quot;.&lt;br /&gt;
* grayman allowed AI to see weapons dropped by other AI.&lt;br /&gt;
* grayman fixed the &amp;quot;AI get stuck in sit-down &amp;amp; get up&amp;quot; cycle. This was causing them to scoot themselves out of the map.&lt;br /&gt;
&lt;br /&gt;
== Coding ==&lt;br /&gt;
&lt;br /&gt;
* Demagogue has created a new override that allows mappers to simply override location ambients with another sound&lt;br /&gt;
* SteveL has fixed a glitch that resulted in occasional sound popping&lt;br /&gt;
* SteveL has adjusted the grabber so that it is easier to lift up objects without banging into things&lt;br /&gt;
* SteveL has fixed breakable glass behavior&lt;br /&gt;
* SteveL has fixed collision behavior on skin swapping&lt;br /&gt;
* SteveL has fixed distant decals rendering over the top of objects they should be behind&lt;br /&gt;
* SteveL has optimized particle bounds calculations to reduce map load times&lt;br /&gt;
* SteveL has created a new &amp;quot;ai_see&amp;quot; argument for lights so mappers can create decorative lighting without illuminating the player accidentally&lt;br /&gt;
* SteveL has fixed a bug where lod_bias objects leave collision models behind on map start when set to be removed&lt;br /&gt;
* SteveL has improved Dmap (map compiling) performance dramatically by removing logspam and decoupling vsync&lt;br /&gt;
* SteveL has created an new quicksave system that alternates between files to prevent corruption caused by poor OS file handling.&lt;br /&gt;
* SteveL has fixed the shadow bobbing that happens when a player holds a lantern in water&lt;br /&gt;
* Rebb has fixed Ambient shading on rotated models&lt;br /&gt;
* grayman has repaired the savegame crash caused by card players.&lt;br /&gt;
* Agent Jones has fixed a few stability issues with the Mission Downloader&lt;br /&gt;
&lt;br /&gt;
== Assets ==&lt;br /&gt;
&lt;br /&gt;
* No significant asset changes. A massive set of new assets will appear in 2.05.&lt;br /&gt;
&lt;br /&gt;
== GUIs ==&lt;br /&gt;
&lt;br /&gt;
* grayman expanded the space allotted to the current mission name to accommodate longer names.&lt;br /&gt;
* SteveL has added Durandall&#039;s Inventory GUI system which allows for mouse based inventory management&lt;br /&gt;
&lt;br /&gt;
== Scripting ==&lt;br /&gt;
&lt;br /&gt;
* Obstortte has created a new combination lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{whatsnew|sort=204}}&lt;/div&gt;</summary>
		<author><name>Taaaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=TDM_Release_Mechanics&amp;diff=18428</id>
		<title>TDM Release Mechanics</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=TDM_Release_Mechanics&amp;diff=18428"/>
		<updated>2016-07-09T15:50:12Z</updated>

		<summary type="html">&lt;p&gt;Taaaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article describes the process of creating a TDM point release. It will be fleshed out over the next few days/weeks.&lt;br /&gt;
&lt;br /&gt;
The team is using a version control system (SVN) for development, and the objective is to create a set of PK4 file from the repository which can be uploaded to the TDM mirrors. Let&#039;s go through this step by step:&lt;br /&gt;
&lt;br /&gt;
= Development = &lt;br /&gt;
Just for the sake of completeness, this step includes the regular development between two TDM releases. This day-to-day development is always happening on the trunk, so all commits are ending up there. Stuff gets broken, stuff gets fixed, stuff gets evaluated, some might be ripped out again.&lt;br /&gt;
&lt;br /&gt;
= Branching off =&lt;br /&gt;
At some point the team decides that it might be time for a new release - a so-called branch date (some sort of semi-freeze) is suggested and agreed upon. To this date, team members are supposed to wrap up their pending changes and commit them to the trunk. About two to three weeks are long enough of a time span for people to get everything into SVN. &lt;br /&gt;
&lt;br /&gt;
Once the deadline arrives, the &#039;&#039;&#039;release branch&#039;&#039;&#039; is created: [[Image:Create release branch.png|right|350px]]&lt;br /&gt;
* Update your darkmod working copy.&lt;br /&gt;
* Update the darkmod_src repository too.&lt;br /&gt;
* Right-click the darkmod folder to create the branch&lt;br /&gt;
** Select SVN &amp;gt; Branch/Tag...&lt;br /&gt;
** A new dialog appears asking for a URL. Enter a URL like this: [https://server/svn/darkmod/branches/release1.xx https://&amp;lt;darkmod_server_here&amp;gt;/svn/darkmod/branches/release1.xx] where xx is replaced by whatever version the next release will be. &lt;br /&gt;
** You&#039;ll probably want to switch to the new branch once it is created, so make sure the check button at the bottom of the dialog is active.&lt;br /&gt;
** Hit OK to let the SVN server create the branch (the server will create a copy of the trunk, placing it at the URL you specified. It might be notable that the files are not physically copied, the branch requires a marginal amount of additional server space).&lt;br /&gt;
* The same should happen with the darkmod_src repository, the code needs to be frozen as well. Perform the same steps as above, using the URL scheme [https://server/svn/darkmod_src/branches/release1.xx https://&amp;lt;darkmod_server_here&amp;gt;/svn/darkmod_src/branches/release1.xx]&lt;br /&gt;
&lt;br /&gt;
At this point there are two new branches, one for the darkmod repo, one for darkmod_src. Consider them a snapshot of the trunk at the point in time you created the branch. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; commits to the trunk won&#039;t affect this newly created branch. The team members not involved in the release can just continue working as usual. Also note that if you as branch creator had the check button (&amp;quot;switch working copy&amp;quot;) activated, your working copy has been &#039;&#039;switched&#039;&#039; to the release branch. &#039;&#039;Your commits will go to the branch&#039;&#039;, keep that in mind. To learn how to &#039;&#039;merge&#039;&#039; stuff between the trunk and the release branch, see below.&lt;br /&gt;
&lt;br /&gt;
= Compile Game Binaries =&lt;br /&gt;
Before the PK4 files can be assembled into a release package, the code from darkmod_src needs to be re-compiled for the Windows and Linux platforms. This is to make sure that the release is built from the most recent (and hopefully most stable) source. If you&#039;re not a coder, you can either ask your fellow coders to switch to the branch and compile the tdm_gameNN.pk4 for you, or you can bite the bullet and follow the [[TDM Compilation Guide]] to compile it yourself. As Windows user, I recommend setting up an Ubuntu 10.04 32-Bit instance in VirtualBox. The downside of using virtualisation is that compilation takes 30-40 Minutes depending on your CPU power, but you at least don&#039;t need a dual-boot setup, let alone a second PC. &lt;br /&gt;
&lt;br /&gt;
Make sure you compile a &#039;&#039;&#039;release build&#039;&#039;&#039; (debug builds are terribly slow), I also recommend re-compiling everything from scratch everytime you build a binary:&lt;br /&gt;
* Windows/VC++: Menu &#039;&#039;Build&#039;&#039; &amp;gt; &#039;&#039;Rebuild Solution&#039;&#039;&lt;br /&gt;
* Linux: &amp;lt;tt&amp;gt;scons -c &amp;amp;&amp;amp; scons BUILD=&amp;quot;release&amp;quot; BUILD_GAMEPAK=&amp;quot;1&amp;quot;&amp;lt;/tt&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Once compiled, make sure that the tdm_game01.pk4 is updated with the newly compiled DLL and the tdm_game02.pk4 is copied over from darkmod_src (where it is created after compilation) to darkmod and commit these two files &#039;&#039;to the branch&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Also commit TheDarkMod.exe and thedarkmod.x86 &#039;&#039;to the branch&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Compile tdm_update =&lt;br /&gt;
tdm_update must be built separately for both Windows and Linux.&lt;br /&gt;
&lt;br /&gt;
Make sure you compile a &#039;&#039;&#039;release build&#039;&#039;&#039;, and recompile everything from scratch:&lt;br /&gt;
* Windows/VC++: Menu &#039;&#039;Build&#039;&#039; &amp;gt; &#039;&#039;Rebuild tdm_update_mfc&#039;&#039;&lt;br /&gt;
* Linux: descend into the tdm_update directory and then do &amp;lt;tt&amp;gt;scons -c &amp;amp;&amp;amp; scons BUILD=&amp;quot;release&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once compiled, copy the results into the darkmod folder:&lt;br /&gt;
&lt;br /&gt;
* Windows/VC++: bin/GuiUpdater/tdm_update.exe -&amp;gt; darkmod/tdm_update.exe&lt;br /&gt;
* Linux: tdm_update.linux -&amp;gt; darkmod/tdm_update.linux&lt;br /&gt;
&lt;br /&gt;
Commit these &#039;&#039;to the branch&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= The Manifest =&lt;br /&gt;
The &amp;quot;manifest&amp;quot; is a huge text files listing all the files that are nominated to go into the release. Not all files in SVN are supposed to be released (like test files, test maps, other broken or unfinished stuff), so we need a white list. The manifest text file is located in the SVN repository: &#039;&#039;&#039;devel/manifests/darkmod.txt&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Building the Manifest ==&lt;br /&gt;
&lt;br /&gt;
Note: This section is more or less for your understanding, &#039;&#039;&#039;you don&#039;t need to manually generate the manifest anymore&#039;&#039;&#039; as this step is part of the automated process running on the TDM server itself.&lt;br /&gt;
&lt;br /&gt;
The manifest file is generated by the tdm_package application. (The tdm_package sources are in the darkmod_src repository, in a subfolder called tdm_update. There is a VC++ 2010 solution and a sconscript for Linux and Mac builds available. You don&#039;t need to compile it if you&#039;re in Windows, there is a pre-compiled version in the darkmod repo as well, in the devel/packager folder.) &lt;br /&gt;
&lt;br /&gt;
After the generation step the file &#039;&#039;&#039;devel/manifests/darkmod.txt&#039;&#039;&#039; will have been updated. You might want to review the modifications the script made to that file and commit it to the release branch if you&#039;re satisfied.&lt;br /&gt;
&lt;br /&gt;
== What is included in the Manifest ==&lt;br /&gt;
The package application is using the file &amp;lt;tt&amp;gt;devel/manifests/darkmod_maps.txt&amp;lt;/tt&amp;gt; to decide whether to include or exclude stuff. In a first internal step the script will include all files in specific folders:&lt;br /&gt;
 &lt;br /&gt;
 # Include all these files (but without parsing them like maps), each&lt;br /&gt;
 # statement will include files (from SVN) in that folder:&lt;br /&gt;
 INCLUDE def/&lt;br /&gt;
 INCLUDE dds/&lt;br /&gt;
 ...&lt;br /&gt;
 INCLUDE video/&lt;br /&gt;
 INCLUDE xdata/&lt;br /&gt;
As visible in the above example, the sharp character # is used to denote comments. Put that at the beginning of a line to disable the statement.&lt;br /&gt;
&lt;br /&gt;
As next step the algorithm will exclude certain files matching the regular expressions in EXCLUDE statements like this:&lt;br /&gt;
 EXCLUDE dds/darkmod/test&lt;br /&gt;
In 95% of the cases it&#039;s enough to just specify the path of the files you want to exclude (use forward slashes), but you can do more fancy stuff like this:&lt;br /&gt;
 EXCLUDE models/md5/chars/undead/revenant/.*.md5anim&lt;br /&gt;
 EXCLUDE ^(dds/)?models/md5/chars/undead/revenant&lt;br /&gt;
The first line will exclude all MD5ANIM files in the revenant folder. The second line will exclude all files in models/md5/chars/undead/revenant &#039;&#039;&#039;and&#039;&#039;&#039; the ones in &#039;&#039;&#039;dds/&#039;&#039;&#039;models/md5/chars/undead/revenant (the dds/ part is marked to be optional). &lt;br /&gt;
&lt;br /&gt;
In summary, all files that are INCLUDE&#039;d as denoted above and afterwards manage to get through the hundreds of lines of EXCLUDE filters will end up in the manifest file.&lt;br /&gt;
&lt;br /&gt;
= Distribute files into PK4s =&lt;br /&gt;
Each of the roughly 15000 files in the manifest needs to be sorted into the correct PK4. This is done by defining a rules in the file &amp;lt;tt&amp;gt;devel/manifests/darkmod_pk4s.txt&amp;lt;/tt&amp;gt;. Each of the lines there defines a PK4 and which files go into it:&lt;br /&gt;
 # Miscellaneous stuff (GL Progs, Script, Language Files, Rope Arrow)&lt;br /&gt;
 tdm_base01.pk4: ^glprogs, ^script, ^strings, sound\.wav, _emptyname\.wav, ^models/md5/environments, ^dds/models/md5/environments, ...&lt;br /&gt;
Again, lines starting with the sharp # character denote comments.&lt;br /&gt;
&lt;br /&gt;
Leftmost is the PK4 filename, followed by a colon character. To the right of the colon a list comma-separated patterns is defined, whereas each pattern is interpreted as regular expression. As with the &amp;lt;tt&amp;gt;darkmod_maps.txt&amp;lt;/tt&amp;gt; you don&#039;t need to know very much about regular expressions to define those rules, it&#039;s usually enough to write the folder names and use wildcards like &amp;lt;tt&amp;gt;.*.md5anim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build the Package =&lt;br /&gt;
The package is built right on the TDM server - there is a full darkmod repository checked out on the server&#039;s filesystem, and it will be processed through some scripts that are listening to your commands.&lt;br /&gt;
&lt;br /&gt;
Once triggered, the process goes roughly like this, I&#039;ll comment on these steps below:&lt;br /&gt;
&lt;br /&gt;
* The working copy is reverted, such that it is clean.&lt;br /&gt;
* The working copy is switched to the release branch of the version you&#039;re about to release (it must exist at this point).&lt;br /&gt;
* The working copy is implicitly updated by the switch operation.&lt;br /&gt;
* The manifest is generated.&lt;br /&gt;
* The full set of PK4 files is generated (it takes a while, the server CPU is not very powerful).&lt;br /&gt;
* The differential package is generated.&lt;br /&gt;
* The files are copied to a public folder reachable through HTTP such that it can be tested by the team. The team will test it by storing a manipulated tdm_mirrors.txt file next to their tdm_update application.&lt;br /&gt;
&lt;br /&gt;
== Prepare the packaging process ==&lt;br /&gt;
A few steps need to be done before kicking off the process on the server.&lt;br /&gt;
&lt;br /&gt;
* The release branch must be created, with a specific naming convention: https://darkmod_server_here/svn/darkmod/branches/releaseY.XX where Y is the major version and XX is the two-digit minor version, e.g. &amp;quot;release1.08&amp;quot;.&lt;br /&gt;
* The inclusion statements in the &amp;lt;tt&amp;gt;darkmod_maps.txt&amp;lt;/tt&amp;gt; file need to be up to date, make sure everything is committed to the branch.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;tdm_version.txt&amp;lt;/tt&amp;gt; file should be containing the correct version number, it&#039;s located in &amp;lt;tt&amp;gt;devel/release/tdm_version.txt&amp;lt;/tt&amp;gt;. Commit that change to the release branch, needless to say.&lt;br /&gt;
&lt;br /&gt;
== Kicking off the packaging process ==&lt;br /&gt;
There is a special admin page on the server which can be used to kick off the process. The URL has been [http://forums.thedarkmod.com/topic/13179-packaging-and-testing-107/ posted on the forums before], greebo or grayman know the URL. It&#039;s password protected, so you&#039;ll be asked to enter credentials. Once there, you can enter the two version numbers, the one you&#039;re building, and the previous one (the latest released one). E.g.: 1.08 and 1.07. It&#039;s sufficient to enter the currently released one, e.g. 1.07, into the second field and the website will automatically fill in the next version number in the first field - you can override it if really necessary.&lt;br /&gt;
&lt;br /&gt;
Once you start the process you&#039;ll be presented a text window with some progress information, and you can watch the messages emitted by the svn client and the tdm_package application running on the server. It takes a while, about half an hour, until the package is built.&lt;br /&gt;
&lt;br /&gt;
= Prepare the internal package test =&lt;br /&gt;
The team needs to have access to the package as created above for internal testing, so tell them to download a specially prepared tdm_mirrors.txt. You can find one attached to the first post here: http://forums.thedarkmod.com/topic/13179-packaging-and-testing-107/&lt;br /&gt;
&lt;br /&gt;
The linked post above already contains a few instructions you can copy from. Basically, instruct the team to use the &amp;lt;tt&amp;gt;--keep-mirrors&amp;lt;/tt&amp;gt; switch when starting the tdm_update application, and to copy the tdm_mirrors.txt file into their test folder before running it. If the &amp;lt;tt&amp;gt;--keep-mirrors&amp;lt;/tt&amp;gt; option is omitted the updater will connect to the regular TDM update mirrors, which is not the point.&lt;br /&gt;
&lt;br /&gt;
= The Test &amp;amp; Bugfix cycle =&lt;br /&gt;
Once the testers post their bug reports, the dev team needs to get moving to fix them. It&#039;s recommended that all fixes will be committed to the trunk (both for darkmod and darkmod_src repos), and the release manager should merge the changes into the release branch.&lt;br /&gt;
&lt;br /&gt;
== Merge Fixes into the Release Branch ==&lt;br /&gt;
Let&#039;s assume there is a fix that got committed to darkmod SVN in order to fix an issue discovered in the test package. Proceed like this to merge it to the release branch. &lt;br /&gt;
* Make sure your local working copy is switched to the release branch. &lt;br /&gt;
* Now right-click the darkmod folder and choose SVN &amp;gt; Merge&lt;br /&gt;
* Select &#039;&#039;Merge a range of revisions&#039;&#039;&lt;br /&gt;
* As &#039;&#039;URL to merge from&#039;&#039; use the address of the trunk: [https://server/svn/darkmod/trunk https://&amp;lt;darkmod_server&amp;gt;/svn/darkmod/trunk]&lt;br /&gt;
* In the field revision range to merge you need to specify which exact change you intend to merge. It&#039;s easier if you click the &amp;quot;Show Log&amp;quot; button right next to the entry field to view the SVN Log of the trunk. You can either select a single commit, or you can select a range of commits. Perhaps double-check the changes of that checkin.&lt;br /&gt;
* Hit &#039;&#039;Next&#039;&#039;, then &#039;&#039;Merge&#039;&#039;.&lt;br /&gt;
* Important: the changes will be incorporated into your &#039;&#039;working copy&#039;&#039;. If you want these changes to actually be stored in the release branch, you need to perform the &#039;&#039;commit&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Special note for code changes: once these are committed to darkmod_src trunk, you need to merge them just like described above. Then you&#039;re going to recompile the game binaries (I recommend from scratch) and commit the tdm_game01.pk4 / tdm_game02.pk4 files to the darkmod release branch too.&lt;br /&gt;
&lt;br /&gt;
== Update the Test Package ==&lt;br /&gt;
Re-package the TDM package, as described above. Just make sure everything is committed to the release branch and kick off another build process.&lt;br /&gt;
&lt;br /&gt;
== Test again ==&lt;br /&gt;
Inform your testers about the update and which things got changed since the last test. Instruct them to update their test installation (don&#039;t forget to mention --keep-mirrors) and enter the next round of testing.&lt;br /&gt;
&lt;br /&gt;
= Release Time: Upload &amp;amp; Cleanup =&lt;br /&gt;
Once the day has come to release the next version, connect to the TDM server using a secure shell (SSH) client, like [http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html PuTTY].&lt;br /&gt;
&lt;br /&gt;
Follow these steps, there are some things that need to be done afterwards, they are necessary for the &#039;&#039;next&#039;&#039; release to function properly:&lt;br /&gt;
&lt;br /&gt;
* Rebuild binaries from scratch, place in darkmod folder, and commit the darkmod folder.&lt;br /&gt;
* 7-zip the Windows gamex86.pdb and TheDarkMod.pdb files and place them in the trunk darkmod/devel/release/debugging/2.0x folder. Add that folder to SVN and commit it.&lt;br /&gt;
* Update the darkmod 2.0x branch tree and merge the just-placed debugging files to that branch. Commit the 2.0x branch.&lt;br /&gt;
* Create the final package remotely as described above (through the website). &lt;br /&gt;
* The above step will generate a new crc_info.txt and a tdm_version_info.txt file on the server.&lt;br /&gt;
* Copy this crc_info.txt and tdm_version_info.txt to the folder packaging/darkmod/devel/release/version_info/2.0x and commit:&lt;br /&gt;
** &amp;lt;tt&amp;gt;cd /usr/local/tdm_releases/packaging/darkmod/devel/release/version_info&amp;lt;/tt&amp;gt; &lt;br /&gt;
** &amp;lt;tt&amp;gt;mkdir 2.0x (replace the x)&amp;lt;/tt&amp;gt; &lt;br /&gt;
** &amp;lt;tt&amp;gt;cd 2.0x&amp;lt;/tt&amp;gt; &lt;br /&gt;
** &amp;lt;tt&amp;gt;cp /usr/local/www/update.thedarkmod.com/crc_info.txt .&amp;lt;/tt&amp;gt; &lt;br /&gt;
** &amp;lt;tt&amp;gt;cp /usr/local/www/update.thedarkmod.com/tdm_version_info.txt .&amp;lt;/tt&amp;gt; &lt;br /&gt;
** &amp;lt;tt&amp;gt;cd ..&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;svn add 2.0x&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;svn ci --username=&amp;lt;YOUR_SVN_USER&amp;gt; -m &amp;quot;&amp;lt;YOUR COMMIT MESSAGE&amp;gt;&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Check in the newly generated manifest, it should still be in the folder where the packaging script left it:&lt;br /&gt;
** &amp;lt;tt&amp;gt;cd /usr/local/tdm_releases/packaging/darkmod/devel/manifests&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;svn ci --username=&amp;lt;YOUR_SVN_USER&amp;gt; -m &amp;quot;&amp;lt;YOUR COMMIT MESSAGE&amp;gt;&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Create a tag for the darkmod and darkmod_src repositories (/tags/2.0x) - copy it from the latest revision in the corresponding release branch.&lt;br /&gt;
** Switch your darkmod working copy to the 2.0x release branch&lt;br /&gt;
** Choose SVN &amp;gt; Branch/Tag and fill in the dialog fields with the following:&lt;br /&gt;
*** From WC/URL: https://svn.thedarkmod.com/svn/darkmod/branches/release2.0x&lt;br /&gt;
*** To Path: /tags/2.0x&lt;br /&gt;
*** Log message: Tag for 2.0x release&lt;br /&gt;
*** Create a copy in the repository from: HEAD revision in the repository&lt;br /&gt;
** Same goes for the darkmod_src repository, just replace /darkmod/ with /darkmod_src/ above.&lt;br /&gt;
* Copy package from /usr/local/www/update.thedarkmod.com/ to /usr/local/tdm_releases/2.0x/ for archiving. The next package process will need it there.&lt;br /&gt;
** cd /usr/local/tdm_releases&lt;br /&gt;
** mkdir 2.0x&lt;br /&gt;
** cp -r /usr/local/www/update.thedarkmod.com/* 2.0x&lt;br /&gt;
* Copy /usr/local/tdm_releases/1.05/index.html to /usr/local/tdm_releases/2.0x&lt;br /&gt;
* Move all differential packages back to /usr/local/www/update.thedarkmod.com/&lt;br /&gt;
** &amp;lt;tt&amp;gt;mv /usr/local/tdm_releases/2.0x/tdm_update_1.0*.zip /usr/local/www/update.thedarkmod.com/&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;mv /usr/local/tdm_releases/2.0x/tdm_update_2.0*.zip /usr/local/www/update.thedarkmod.com/&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Copy the one differential update package updating to the new 2.0x version back to /usr/local/tdm_releases/2.0x&lt;br /&gt;
** &amp;lt;tt&amp;gt;cp /usr/local/www/update.thedarkmod.com/tdm_update_2.0y_to_2.0x.zip to /usr/local/tdm_releases/2.0x&amp;lt;/tt&amp;gt; (y = x-1)&lt;br /&gt;
* At this point, the /usr/local/tdm_releases/2.0x folder contains a valid TDM 2.0x release, the one that will be pushed to all the mirrors. Examine it for double safety.&lt;br /&gt;
* Examine the upload_to_all_mirrors.sh shell script, to see if it fits your needs.&lt;br /&gt;
* Start uploading to all mirrors.&lt;br /&gt;
** &amp;lt;tt&amp;gt;./upload_to_all_mirrors.sh 2.0x&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Update tdm_mirrors.txt and tdm_version.xml on thedarkmod.com/update: ask taaaki to do that. The tdm_mirrors.txt file is probably fine, but the tdm_version.xml needs to be updated.&lt;br /&gt;
&lt;br /&gt;
== Update the Wiki ==&lt;br /&gt;
&lt;br /&gt;
The wiki contains one page for each release. You can find them all in the [[:Category:What&#039;s New]] category. &lt;br /&gt;
&lt;br /&gt;
First update the current release page:&lt;br /&gt;
&lt;br /&gt;
* Change the &amp;quot;roadmap&amp;quot; link on the current release to a &amp;quot;changelog&amp;quot; link by swapping &#039;&#039;&amp;quot;roadmap_page.php?version_id=XX&amp;quot;&#039;&#039; with &#039;&#039;&amp;quot;changelog_page.php?version=XX&amp;quot;&#039;&#039;.&lt;br /&gt;
* Add the &#039;&#039;&amp;lt;nowiki&amp;gt;{{released|2.01|2014-01-30}}&amp;lt;/nowiki&amp;gt;&#039;&#039; Template on top of the current release page with the correct date.&lt;br /&gt;
&lt;br /&gt;
Then add a new page for the next release. To do this, add a link to it in this template: [[Template:Whatsnew]] by editing it. After saving the template, a link to the new release version page appears in the list and in the category. Edit this page and insert some text into it (you can copy it from an older release page).&lt;br /&gt;
&lt;br /&gt;
Also insert a link to the current roadmap on the bugtracker, you can find out the version_id by looking at [http://bugs.thedarkmod.com/roadmap_page.php the roadmap page].&lt;br /&gt;
&lt;br /&gt;
= Glossary =&lt;br /&gt;
* Release Fileset: the PK4 files forming the actual release. &lt;br /&gt;
* SVN: an acronym for Subversion, a version control system&lt;br /&gt;
* Commit: The process of a team member uploading files to the SVN repository - a commit always creates a new SVN revision.&lt;br /&gt;
* Mirrors: The servers where the PK4 files are stored for download by the updater.&lt;br /&gt;
* updater: The TDM Updater executable, used for downloading and updating TDM.&lt;br /&gt;
* binary: Source code is compiled into so-called binaries. This can be an executable (.exe) file or a module (.dll/.so).&lt;br /&gt;
* darkmod_src: The code repository holding all the TDM source files, including the tdm_update application.&lt;br /&gt;
* branch: A tree in the SVN repository. Several branches can co-exist side-by-side without interfering.&lt;br /&gt;
* trunk: The main branch where all the ongoing development is happening.&lt;br /&gt;
&lt;br /&gt;
{{todo}}&lt;/div&gt;</summary>
		<author><name>Taaaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=TDM_Release_Mechanics&amp;diff=18427</id>
		<title>TDM Release Mechanics</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=TDM_Release_Mechanics&amp;diff=18427"/>
		<updated>2016-07-09T15:45:32Z</updated>

		<summary type="html">&lt;p&gt;Taaaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article describes the process of creating a TDM point release. It will be fleshed out over the next few days/weeks.&lt;br /&gt;
&lt;br /&gt;
The team is using a version control system (SVN) for development, and the objective is to create a set of PK4 file from the repository which can be uploaded to the TDM mirrors. Let&#039;s go through this step by step:&lt;br /&gt;
&lt;br /&gt;
= Development = &lt;br /&gt;
Just for the sake of completeness, this step includes the regular development between two TDM releases. This day-to-day development is always happening on the trunk, so all commits are ending up there. Stuff gets broken, stuff gets fixed, stuff gets evaluated, some might be ripped out again.&lt;br /&gt;
&lt;br /&gt;
= Branching off =&lt;br /&gt;
At some point the team decides that it might be time for a new release - a so-called branch date (some sort of semi-freeze) is suggested and agreed upon. To this date, team members are supposed to wrap up their pending changes and commit them to the trunk. About two to three weeks are long enough of a time span for people to get everything into SVN. &lt;br /&gt;
&lt;br /&gt;
Once the deadline arrives, the &#039;&#039;&#039;release branch&#039;&#039;&#039; is created: [[Image:Create release branch.png|right|350px]]&lt;br /&gt;
* Update your darkmod working copy.&lt;br /&gt;
* Update the darkmod_src repository too.&lt;br /&gt;
* Right-click the darkmod folder to create the branch&lt;br /&gt;
** Select SVN &amp;gt; Branch/Tag...&lt;br /&gt;
** A new dialog appears asking for a URL. Enter a URL like this: [https://server/svn/darkmod/branches/release1.xx https://&amp;lt;darkmod_server_here&amp;gt;/svn/darkmod/branches/release1.xx] where xx is replaced by whatever version the next release will be. &lt;br /&gt;
** You&#039;ll probably want to switch to the new branch once it is created, so make sure the check button at the bottom of the dialog is active.&lt;br /&gt;
** Hit OK to let the SVN server create the branch (the server will create a copy of the trunk, placing it at the URL you specified. It might be notable that the files are not physically copied, the branch requires a marginal amount of additional server space).&lt;br /&gt;
* The same should happen with the darkmod_src repository, the code needs to be frozen as well. Perform the same steps as above, using the URL scheme [https://server/svn/darkmod_src/branches/release1.xx https://&amp;lt;darkmod_server_here&amp;gt;/svn/darkmod_src/branches/release1.xx]&lt;br /&gt;
&lt;br /&gt;
At this point there are two new branches, one for the darkmod repo, one for darkmod_src. Consider them a snapshot of the trunk at the point in time you created the branch. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; commits to the trunk won&#039;t affect this newly created branch. The team members not involved in the release can just continue working as usual. Also note that if you as branch creator had the check button (&amp;quot;switch working copy&amp;quot;) activated, your working copy has been &#039;&#039;switched&#039;&#039; to the release branch. &#039;&#039;Your commits will go to the branch&#039;&#039;, keep that in mind. To learn how to &#039;&#039;merge&#039;&#039; stuff between the trunk and the release branch, see below.&lt;br /&gt;
&lt;br /&gt;
= Compile Game Binaries =&lt;br /&gt;
Before the PK4 files can be assembled into a release package, the code from darkmod_src needs to be re-compiled for the Windows and Linux platforms. This is to make sure that the release is built from the most recent (and hopefully most stable) source. If you&#039;re not a coder, you can either ask your fellow coders to switch to the branch and compile the tdm_gameNN.pk4 for you, or you can bite the bullet and follow the [[TDM Compilation Guide]] to compile it yourself. As Windows user, I recommend setting up an Ubuntu 10.04 32-Bit instance in VirtualBox. The downside of using virtualisation is that compilation takes 30-40 Minutes depending on your CPU power, but you at least don&#039;t need a dual-boot setup, let alone a second PC. &lt;br /&gt;
&lt;br /&gt;
Make sure you compile a &#039;&#039;&#039;release build&#039;&#039;&#039; (debug builds are terribly slow), I also recommend re-compiling everything from scratch everytime you build a binary:&lt;br /&gt;
* Windows/VC++: Menu &#039;&#039;Build&#039;&#039; &amp;gt; &#039;&#039;Rebuild Solution&#039;&#039;&lt;br /&gt;
* Linux: &amp;lt;tt&amp;gt;scons -c &amp;amp;&amp;amp; scons BUILD=&amp;quot;release&amp;quot; BUILD_GAMEPAK=&amp;quot;1&amp;quot;&amp;lt;/tt&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Once compiled, make sure that the tdm_game01.pk4 is updated with the newly compiled DLL and the tdm_game02.pk4 is copied over from darkmod_src (where it is created after compilation) to darkmod and commit these two files &#039;&#039;to the branch&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Also commit TheDarkMod.exe and thedarkmod.x86 &#039;&#039;to the branch&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Compile tdm_update =&lt;br /&gt;
tdm_update must be built separately for both Windows and Linux.&lt;br /&gt;
&lt;br /&gt;
Make sure you compile a &#039;&#039;&#039;release build&#039;&#039;&#039;, and recompile everything from scratch:&lt;br /&gt;
* Windows/VC++: Menu &#039;&#039;Build&#039;&#039; &amp;gt; &#039;&#039;Rebuild tdm_update_mfc&#039;&#039;&lt;br /&gt;
* Linux: descend into the tdm_update directory and then do &amp;lt;tt&amp;gt;scons -c &amp;amp;&amp;amp; scons BUILD=&amp;quot;release&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once compiled, copy the results into the darkmod folder:&lt;br /&gt;
&lt;br /&gt;
* Windows/VC++: bin/GuiUpdater/tdm_update.exe -&amp;gt; darkmod/tdm_update.exe&lt;br /&gt;
* Linux: tdm_update.linux -&amp;gt; darkmod/tdm_update.linux&lt;br /&gt;
&lt;br /&gt;
Commit these &#039;&#039;to the branch&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= The Manifest =&lt;br /&gt;
The &amp;quot;manifest&amp;quot; is a huge text files listing all the files that are nominated to go into the release. Not all files in SVN are supposed to be released (like test files, test maps, other broken or unfinished stuff), so we need a white list. The manifest text file is located in the SVN repository: &#039;&#039;&#039;devel/manifests/darkmod.txt&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Building the Manifest ==&lt;br /&gt;
&lt;br /&gt;
Note: This section is more or less for your understanding, &#039;&#039;&#039;you don&#039;t need to manually generate the manifest anymore&#039;&#039;&#039; as this step is part of the automated process running on the TDM server itself.&lt;br /&gt;
&lt;br /&gt;
The manifest file is generated by the tdm_package application. (The tdm_package sources are in the darkmod_src repository, in a subfolder called tdm_update. There is a VC++ 2010 solution and a sconscript for Linux and Mac builds available. You don&#039;t need to compile it if you&#039;re in Windows, there is a pre-compiled version in the darkmod repo as well, in the devel/packager folder.) &lt;br /&gt;
&lt;br /&gt;
After the generation step the file &#039;&#039;&#039;devel/manifests/darkmod.txt&#039;&#039;&#039; will have been updated. You might want to review the modifications the script made to that file and commit it to the release branch if you&#039;re satisfied.&lt;br /&gt;
&lt;br /&gt;
== What is included in the Manifest ==&lt;br /&gt;
The package application is using the file &amp;lt;tt&amp;gt;devel/manifests/darkmod_maps.txt&amp;lt;/tt&amp;gt; to decide whether to include or exclude stuff. In a first internal step the script will include all files in specific folders:&lt;br /&gt;
 &lt;br /&gt;
 # Include all these files (but without parsing them like maps), each&lt;br /&gt;
 # statement will include files (from SVN) in that folder:&lt;br /&gt;
 INCLUDE def/&lt;br /&gt;
 INCLUDE dds/&lt;br /&gt;
 ...&lt;br /&gt;
 INCLUDE video/&lt;br /&gt;
 INCLUDE xdata/&lt;br /&gt;
As visible in the above example, the sharp character # is used to denote comments. Put that at the beginning of a line to disable the statement.&lt;br /&gt;
&lt;br /&gt;
As next step the algorithm will exclude certain files matching the regular expressions in EXCLUDE statements like this:&lt;br /&gt;
 EXCLUDE dds/darkmod/test&lt;br /&gt;
In 95% of the cases it&#039;s enough to just specify the path of the files you want to exclude (use forward slashes), but you can do more fancy stuff like this:&lt;br /&gt;
 EXCLUDE models/md5/chars/undead/revenant/.*.md5anim&lt;br /&gt;
 EXCLUDE ^(dds/)?models/md5/chars/undead/revenant&lt;br /&gt;
The first line will exclude all MD5ANIM files in the revenant folder. The second line will exclude all files in models/md5/chars/undead/revenant &#039;&#039;&#039;and&#039;&#039;&#039; the ones in &#039;&#039;&#039;dds/&#039;&#039;&#039;models/md5/chars/undead/revenant (the dds/ part is marked to be optional). &lt;br /&gt;
&lt;br /&gt;
In summary, all files that are INCLUDE&#039;d as denoted above and afterwards manage to get through the hundreds of lines of EXCLUDE filters will end up in the manifest file.&lt;br /&gt;
&lt;br /&gt;
= Distribute files into PK4s =&lt;br /&gt;
Each of the roughly 15000 files in the manifest needs to be sorted into the correct PK4. This is done by defining a rules in the file &amp;lt;tt&amp;gt;devel/manifests/darkmod_pk4s.txt&amp;lt;/tt&amp;gt;. Each of the lines there defines a PK4 and which files go into it:&lt;br /&gt;
 # Miscellaneous stuff (GL Progs, Script, Language Files, Rope Arrow)&lt;br /&gt;
 tdm_base01.pk4: ^glprogs, ^script, ^strings, sound\.wav, _emptyname\.wav, ^models/md5/environments, ^dds/models/md5/environments, ...&lt;br /&gt;
Again, lines starting with the sharp # character denote comments.&lt;br /&gt;
&lt;br /&gt;
Leftmost is the PK4 filename, followed by a colon character. To the right of the colon a list comma-separated patterns is defined, whereas each pattern is interpreted as regular expression. As with the &amp;lt;tt&amp;gt;darkmod_maps.txt&amp;lt;/tt&amp;gt; you don&#039;t need to know very much about regular expressions to define those rules, it&#039;s usually enough to write the folder names and use wildcards like &amp;lt;tt&amp;gt;.*.md5anim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build the Package =&lt;br /&gt;
The package is built right on the TDM server - there is a full darkmod repository checked out on the server&#039;s filesystem, and it will be processed through some scripts that are listening to your commands.&lt;br /&gt;
&lt;br /&gt;
Once triggered, the process goes roughly like this, I&#039;ll comment on these steps below:&lt;br /&gt;
&lt;br /&gt;
* The working copy is reverted, such that it is clean.&lt;br /&gt;
* The working copy is switched to the release branch of the version you&#039;re about to release (it must exist at this point).&lt;br /&gt;
* The working copy is implicitly updated by the switch operation.&lt;br /&gt;
* The manifest is generated.&lt;br /&gt;
* The full set of PK4 files is generated (it takes a while, the server CPU is not very powerful).&lt;br /&gt;
* The differential package is generated.&lt;br /&gt;
* The files are copied to a public folder reachable through HTTP such that it can be tested by the team. The team will test it by storing a manipulated tdm_mirrors.txt file next to their tdm_update application.&lt;br /&gt;
&lt;br /&gt;
== Prepare the packaging process ==&lt;br /&gt;
A few steps need to be done before kicking off the process on the server.&lt;br /&gt;
&lt;br /&gt;
* The release branch must be created, with a specific naming convention: https://darkmod_server_here/svn/darkmod/branches/releaseY.XX where Y is the major version and XX is the two-digit minor version, e.g. &amp;quot;release1.08&amp;quot;.&lt;br /&gt;
* The inclusion statements in the &amp;lt;tt&amp;gt;darkmod_maps.txt&amp;lt;/tt&amp;gt; file need to be up to date, make sure everything is committed to the branch.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;tdm_version.txt&amp;lt;/tt&amp;gt; file should be containing the correct version number, it&#039;s located in &amp;lt;tt&amp;gt;devel/release/tdm_version.txt&amp;lt;/tt&amp;gt;. Commit that change to the release branch, needless to say.&lt;br /&gt;
&lt;br /&gt;
== Kicking off the packaging process ==&lt;br /&gt;
There is a special admin page on the server which can be used to kick off the process. The URL has been [http://forums.thedarkmod.com/topic/13179-packaging-and-testing-107/ posted on the forums before], greebo or grayman know the URL. It&#039;s password protected, so you&#039;ll be asked to enter credentials. Once there, you can enter the two version numbers, the one you&#039;re building, and the previous one (the latest released one). E.g.: 1.08 and 1.07. It&#039;s sufficient to enter the currently released one, e.g. 1.07, into the second field and the website will automatically fill in the next version number in the first field - you can override it if really necessary.&lt;br /&gt;
&lt;br /&gt;
Once you start the process you&#039;ll be presented a text window with some progress information, and you can watch the messages emitted by the svn client and the tdm_package application running on the server. It takes a while, about half an hour, until the package is built.&lt;br /&gt;
&lt;br /&gt;
= Prepare the internal package test =&lt;br /&gt;
The team needs to have access to the package as created above for internal testing, so tell them to download a specially prepared tdm_mirrors.txt. You can find one attached to the first post here: http://forums.thedarkmod.com/topic/13179-packaging-and-testing-107/&lt;br /&gt;
&lt;br /&gt;
The linked post above already contains a few instructions you can copy from. Basically, instruct the team to use the &amp;lt;tt&amp;gt;--keep-mirrors&amp;lt;/tt&amp;gt; switch when starting the tdm_update application, and to copy the tdm_mirrors.txt file into their test folder before running it. If the &amp;lt;tt&amp;gt;--keep-mirrors&amp;lt;/tt&amp;gt; option is omitted the updater will connect to the regular TDM update mirrors, which is not the point.&lt;br /&gt;
&lt;br /&gt;
= The Test &amp;amp; Bugfix cycle =&lt;br /&gt;
Once the testers post their bug reports, the dev team needs to get moving to fix them. It&#039;s recommended that all fixes will be committed to the trunk (both for darkmod and darkmod_src repos), and the release manager should merge the changes into the release branch.&lt;br /&gt;
&lt;br /&gt;
== Merge Fixes into the Release Branch ==&lt;br /&gt;
Let&#039;s assume there is a fix that got committed to darkmod SVN in order to fix an issue discovered in the test package. Proceed like this to merge it to the release branch. &lt;br /&gt;
* Make sure your local working copy is switched to the release branch. &lt;br /&gt;
* Now right-click the darkmod folder and choose SVN &amp;gt; Merge&lt;br /&gt;
* Select &#039;&#039;Merge a range of revisions&#039;&#039;&lt;br /&gt;
* As &#039;&#039;URL to merge from&#039;&#039; use the address of the trunk: [https://server/svn/darkmod/trunk https://&amp;lt;darkmod_server&amp;gt;/svn/darkmod/trunk]&lt;br /&gt;
* In the field revision range to merge you need to specify which exact change you intend to merge. It&#039;s easier if you click the &amp;quot;Show Log&amp;quot; button right next to the entry field to view the SVN Log of the trunk. You can either select a single commit, or you can select a range of commits. Perhaps double-check the changes of that checkin.&lt;br /&gt;
* Hit &#039;&#039;Next&#039;&#039;, then &#039;&#039;Merge&#039;&#039;.&lt;br /&gt;
* Important: the changes will be incorporated into your &#039;&#039;working copy&#039;&#039;. If you want these changes to actually be stored in the release branch, you need to perform the &#039;&#039;commit&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Special note for code changes: once these are committed to darkmod_src turnk, you need to merge them just like described above. Then you&#039;re going to recompile the game binaries (I recommend from scratch) and commit the tdm_game01.pk4 / tdm_game02.pk4 files to the darkmod release branch too.&lt;br /&gt;
&lt;br /&gt;
== Update the Test Package ==&lt;br /&gt;
Re-package the TDM package, as described above. Just make sure everything is committed to the release branch and kick off another build process.&lt;br /&gt;
&lt;br /&gt;
== Test again ==&lt;br /&gt;
Inform your testers about the update and which things got changed since the last test. Instruct them to update their test installation (don&#039;t forget to mention --keep-mirrors) and enter the next round of testing.&lt;br /&gt;
&lt;br /&gt;
= Release Time: Upload &amp;amp; Cleanup =&lt;br /&gt;
Once the day has come to release the next version, connect to the TDM server using a secure shell (SSH) client, like [http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html PuTTY].&lt;br /&gt;
&lt;br /&gt;
Follow these steps, there are some things that need to be done afterwards, they are necessary for the &#039;&#039;next&#039;&#039; release to function properly:&lt;br /&gt;
&lt;br /&gt;
* Rebuild binaries from scratch, place in darkmod folder, and commit the darkmod folder.&lt;br /&gt;
* 7-zip the Windows gamex86.pdb and TheDarkMod.pdb files and place them in the trunk darkmod/devel/release/debugging/2.0x folder. Add that folder to SVN and commit it.&lt;br /&gt;
* Update the darkmod 2.0x branch tree and merge the just-placed debugging files to that branch. Commit the 2.0x branch.&lt;br /&gt;
* Create the final package remotely as described above (through the website). &lt;br /&gt;
* The above step will generate a new crc_info.txt and a tdm_version_info.txt file on the server.&lt;br /&gt;
* Copy this crc_info.txt and tdm_version_info.txt to the folder packaging/darkmod/devel/release/version_info/2.0x and commit:&lt;br /&gt;
** &amp;lt;tt&amp;gt;cd /usr/local/tdm_releases/packaging/darkmod/devel/release/version_info&amp;lt;/tt&amp;gt; &lt;br /&gt;
** &amp;lt;tt&amp;gt;mkdir 2.0x (replace the x)&amp;lt;/tt&amp;gt; &lt;br /&gt;
** &amp;lt;tt&amp;gt;cd 2.0x&amp;lt;/tt&amp;gt; &lt;br /&gt;
** &amp;lt;tt&amp;gt;cp /usr/local/www/update.thedarkmod.com/crc_info.txt .&amp;lt;/tt&amp;gt; &lt;br /&gt;
** &amp;lt;tt&amp;gt;cp /usr/local/www/update.thedarkmod.com/tdm_version_info.txt .&amp;lt;/tt&amp;gt; &lt;br /&gt;
** &amp;lt;tt&amp;gt;cd ..&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;svn add 2.0x&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;svn ci --username=&amp;lt;YOUR_SVN_USER&amp;gt; -m &amp;quot;&amp;lt;YOUR COMMIT MESSAGE&amp;gt;&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Check in the newly generated manifest, it should still be in the folder where the packaging script left it:&lt;br /&gt;
** &amp;lt;tt&amp;gt;cd /usr/local/tdm_releases/packaging/darkmod/devel/manifests&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;svn ci --username=&amp;lt;YOUR_SVN_USER&amp;gt; -m &amp;quot;&amp;lt;YOUR COMMIT MESSAGE&amp;gt;&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Create a tag for the darkmod and darkmod_src repositories (/tags/2.0x) - copy it from the latest revision in the corresponding release branch.&lt;br /&gt;
** Switch your darkmod working copy to the 2.0x release branch&lt;br /&gt;
** Choose SVN &amp;gt; Branch/Tag and fill in the dialog fields with the following:&lt;br /&gt;
*** From WC/URL: https://svn.thedarkmod.com/svn/darkmod/branches/release2.0x&lt;br /&gt;
*** To Path: /tags/2.0x&lt;br /&gt;
*** Log message: Tag for 2.0x release&lt;br /&gt;
*** Create a copy in the repository from: HEAD revision in the repository&lt;br /&gt;
** Same goes for the darkmod_src repository, just replace /darkmod/ with /darkmod_src/ above.&lt;br /&gt;
* Copy package from /usr/local/www/update.thedarkmod.com/ to /usr/local/tdm_releases/2.0x/ for archiving. The next package process will need it there.&lt;br /&gt;
** cd /usr/local/tdm_releases&lt;br /&gt;
** mkdir 2.0x&lt;br /&gt;
** cp -r /usr/local/www/update.thedarkmod.com/* 2.0x&lt;br /&gt;
* Copy /usr/local/tdm_releases/1.05/index.html to /usr/local/tdm_releases/2.0x&lt;br /&gt;
* Move all differential packages back to /usr/local/www/update.thedarkmod.com/&lt;br /&gt;
** &amp;lt;tt&amp;gt;mv /usr/local/tdm_releases/2.0x/tdm_update_1.0*.zip /usr/local/www/update.thedarkmod.com/&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;mv /usr/local/tdm_releases/2.0x/tdm_update_2.0*.zip /usr/local/www/update.thedarkmod.com/&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Copy the one differential update package updating to the new 2.0x version back to /usr/local/tdm_releases/2.0x&lt;br /&gt;
** &amp;lt;tt&amp;gt;cp /usr/local/www/update.thedarkmod.com/tdm_update_2.0y_to_2.0x.zip to /usr/local/tdm_releases/2.0x&amp;lt;/tt&amp;gt; (y = x-1)&lt;br /&gt;
* At this point, the /usr/local/tdm_releases/2.0x folder contains a valid TDM 2.0x release, the one that will be pushed to all the mirrors. Examine it for double safety.&lt;br /&gt;
* Examine the upload_to_all_mirrors.sh shell script, to see if it fits your needs.&lt;br /&gt;
* Start uploading to all mirrors.&lt;br /&gt;
** &amp;lt;tt&amp;gt;./upload_to_all_mirrors.sh 2.0x&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Update tdm_mirrors.txt and tdm_version.xml on thedarkmod.com/update: ask taaaki to do that. The tdm_mirrors.txt file is probably fine, but the tdm_version.xml needs to be updated.&lt;br /&gt;
&lt;br /&gt;
== Update the Wiki ==&lt;br /&gt;
&lt;br /&gt;
The wiki contains one page for each release. You can find them all in the [[:Category:What&#039;s New]] category. &lt;br /&gt;
&lt;br /&gt;
First update the current release page:&lt;br /&gt;
&lt;br /&gt;
* Change the &amp;quot;roadmap&amp;quot; link on the current release to a &amp;quot;changelog&amp;quot; link by swapping &#039;&#039;&amp;quot;roadmap_page.php?version_id=XX&amp;quot;&#039;&#039; with &#039;&#039;&amp;quot;changelog_page.php?version=XX&amp;quot;&#039;&#039;.&lt;br /&gt;
* Add the &#039;&#039;&amp;lt;nowiki&amp;gt;{{released|2.01|2014-01-30}}&amp;lt;/nowiki&amp;gt;&#039;&#039; Template on top of the current release page with the correct date.&lt;br /&gt;
&lt;br /&gt;
Then add a new page for the next release. To do this, add a link to it in this template: [[Template:Whatsnew]] by editing it. After saving the template, a link to the new release version page appears in the list and in the category. Edit this page and insert some text into it (you can copy it from an older release page).&lt;br /&gt;
&lt;br /&gt;
Also insert a link to the current roadmap on the bugtracker, you can find out the version_id by looking at [http://bugs.thedarkmod.com/roadmap_page.php the roadmap page].&lt;br /&gt;
&lt;br /&gt;
= Glossary =&lt;br /&gt;
* Release Fileset: the PK4 files forming the actual release. &lt;br /&gt;
* SVN: an acronym for Subversion, a version control system&lt;br /&gt;
* Commit: The process of a team member uploading files to the SVN repository - a commit always creates a new SVN revision.&lt;br /&gt;
* Mirrors: The servers where the PK4 files are stored for download by the updater.&lt;br /&gt;
* updater: The TDM Updater executable, used for downloading and updating TDM.&lt;br /&gt;
* binary: Source code is compiled into so-called binaries. This can be an executable (.exe) file or a module (.dll/.so).&lt;br /&gt;
* darkmod_src: The code repository holding all the TDM source files, including the tdm_update application.&lt;br /&gt;
* branch: A tree in the SVN repository. Several branches can co-exist side-by-side without interfering.&lt;br /&gt;
* trunk: The main branch where all the ongoing development is happening.&lt;br /&gt;
&lt;br /&gt;
{{todo}}&lt;/div&gt;</summary>
		<author><name>Taaaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Template:Whatsnew&amp;diff=18094</id>
		<title>Template:Whatsnew</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Template:Whatsnew&amp;diff=18094"/>
		<updated>2015-02-08T21:06:09Z</updated>

		<summary type="html">&lt;p&gt;Taaaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
This template displays a &amp;quot;See also&amp;quot; section with links to other changelogs. Also:{{template-help|name=whatsnew|sort=Whatsnew}}&lt;br /&gt;
&lt;br /&gt;
Here is a preview:&lt;br /&gt;
-----&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[What&#039;s new in TDM 2.03]]&#039;&#039;&#039; (Older releases: [[What&#039;s new in TDM 2.02|v2.02]], [[What&#039;s new in TDM 2.01|v2.01]], [[What&#039;s new in TDM 2.00|v2.00]], [[What&#039;s new in TDM 1.08|v1.08]], [[What&#039;s new in TDM 1.07|v1.07]], [[What&#039;s new in TDM 1.06|v1.06]], [[What&#039;s new in TDM 1.05|v1.05]], [[What&#039;s new in TDM 1.04|v1.04]], [[What&#039;s new in TDM 1.03|v1.03]], [[What&#039;s new in TDM 1.02|v1.02]], [[What&#039;s new in TDM 1.01|v1.01]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[What&#039;s new in TDM 2.03]]&#039;&#039;&#039; (Older releases: [[What&#039;s new in TDM 2.02|v2.02]], [[What&#039;s new in TDM 2.01|v2.01]], [[What&#039;s new in TDM 2.00|v2.00]], [[What&#039;s new in TDM 1.08|v1.08]], [[What&#039;s new in TDM 1.07|v1.07]], [[What&#039;s new in TDM 1.06|v1.06]], [[What&#039;s new in TDM 1.05|v1.05]], [[What&#039;s new in TDM 1.04|v1.04]], [[What&#039;s new in TDM 1.03|v1.03]], [[What&#039;s new in TDM 1.02|v1.02]], [[What&#039;s new in TDM 1.01|v1.01]])&lt;br /&gt;
* [http://thedarkmod.com/downloads.php Download TDM]&lt;br /&gt;
&lt;br /&gt;
[[Category:What&#039;s New|{{{sort|{{PAGENAME}}}}}]]&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Taaaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Template:Whatsnew&amp;diff=18093</id>
		<title>Template:Whatsnew</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Template:Whatsnew&amp;diff=18093"/>
		<updated>2015-02-08T21:05:13Z</updated>

		<summary type="html">&lt;p&gt;Taaaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
This template displays a &amp;quot;See also&amp;quot; section with links to other changelogs. Also:{{template-help|name=whatsnew|sort=Whatsnew}}&lt;br /&gt;
&lt;br /&gt;
Here is a preview:&lt;br /&gt;
-----&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[What&#039;s new in TDM 2.02]]&#039;&#039;&#039; (Older releases: [[What&#039;s new in TDM 2.01|v2.01]], [[What&#039;s new in TDM 2.00|v2.00]], [[What&#039;s new in TDM 1.08|v1.08]], [[What&#039;s new in TDM 1.07|v1.07]], [[What&#039;s new in TDM 1.06|v1.06]], [[What&#039;s new in TDM 1.05|v1.05]], [[What&#039;s new in TDM 1.04|v1.04]], [[What&#039;s new in TDM 1.03|v1.03]], [[What&#039;s new in TDM 1.02|v1.02]], [[What&#039;s new in TDM 1.01|v1.01]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[What&#039;s new in TDM 2.03]]&#039;&#039;&#039; (Older releases: [[What&#039;s new in TDM 2.02|v2.02]], [[What&#039;s new in TDM 2.01|v2.01]], [[What&#039;s new in TDM 2.00|v2.00]], [[What&#039;s new in TDM 1.08|v1.08]], [[What&#039;s new in TDM 1.07|v1.07]], [[What&#039;s new in TDM 1.06|v1.06]], [[What&#039;s new in TDM 1.05|v1.05]], [[What&#039;s new in TDM 1.04|v1.04]], [[What&#039;s new in TDM 1.03|v1.03]], [[What&#039;s new in TDM 1.02|v1.02]], [[What&#039;s new in TDM 1.01|v1.01]])&lt;br /&gt;
* [http://thedarkmod.com/downloads.php Download TDM]&lt;br /&gt;
&lt;br /&gt;
[[Category:What&#039;s New|{{{sort|{{PAGENAME}}}}}]]&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Taaaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.04&amp;diff=18092</id>
		<title>What&#039;s new in TDM 2.04</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.04&amp;diff=18092"/>
		<updated>2015-02-08T21:04:10Z</updated>

		<summary type="html">&lt;p&gt;Taaaki: Created page with &amp;quot;&amp;lt;!-- keywords whats new --&amp;gt; See the [http://bugs.thedarkmod.com/roadmap_page.php?version_id=71 roadmap] on our bugtracker. &amp;lt;!--See also the [http://bugs.thedarkmod.com/changel...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- keywords whats new --&amp;gt;&lt;br /&gt;
See the [http://bugs.thedarkmod.com/roadmap_page.php?version_id=71 roadmap] on our bugtracker.&lt;br /&gt;
&amp;lt;!--See also the [http://bugs.thedarkmod.com/changelog_page.php?version_id=71 changelog] on our bugtracker.--&amp;gt;&lt;br /&gt;
{{notreleasedyet|2.04}}&lt;br /&gt;
&amp;lt;!--{{released|2.04|2015-xx-xx}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== AI ==&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Coding ==&lt;br /&gt;
&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Assets ==&lt;br /&gt;
&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GUIs ==&lt;br /&gt;
&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Scripting ==&lt;br /&gt;
&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{whatsnew|sort=204}}&lt;/div&gt;</summary>
		<author><name>Taaaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.03&amp;diff=18091</id>
		<title>What&#039;s new in TDM 2.03</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.03&amp;diff=18091"/>
		<updated>2015-02-08T20:52:08Z</updated>

		<summary type="html">&lt;p&gt;Taaaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- keywords whats new --&amp;gt;&lt;br /&gt;
&amp;lt;!--See the [http://bugs.thedarkmod.com/roadmap_page.php?version_id=66 roadmap] on our bugtracker.--&amp;gt;&lt;br /&gt;
See also the [http://bugs.thedarkmod.com/changelog_page.php?version_id=66 changelog] on our bugtracker.&lt;br /&gt;
&amp;lt;!--{{notreleasedyet|2.03}}--&amp;gt;&lt;br /&gt;
{{released|2.03|2015-02-08}}&lt;br /&gt;
== AI ==&lt;br /&gt;
&lt;br /&gt;
* AI will react if they are hit by an opening door (grayman)&lt;br /&gt;
* Regular helmets no longer protect sleeping AI from KOs (grayman)&lt;br /&gt;
* AI now coordinate their searches when many AI are involved in the same search--some AI will run to guard choke points (grayman)&lt;br /&gt;
* New AI barks for AI searching together; new searching animations (Springheel)&lt;br /&gt;
* new animation for AI noticing they have been pickpocketed (Arcturus)&lt;br /&gt;
* The Lanternbot&#039;s whistle will now properly alert nearby AI&lt;br /&gt;
* AI are far less likely to see directly behind themselves when turning their head&lt;br /&gt;
* Running AI handle doors better&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Coding ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* the LOD system has been extended to cover AI and animated objects (SteveL)&lt;br /&gt;
* Soft Particles: particle effects will no longer show harsh edges when intersecting geometry (SteveL)&lt;br /&gt;
* Water distortion no longer distorts things in front of the water (SteveL) &lt;br /&gt;
* The Stats screen now tracks the number of game saves, and mappers can limit number of saves (Obsttorte)&lt;br /&gt;
* The skybox used to flash grey when the player clipped into geometry while mantling. This is fixed. (SteveL)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Assets ==&lt;br /&gt;
&lt;br /&gt;
* numerous new models and skins have been added to the mod (Springheel)&lt;br /&gt;
* several new light entities have been added (Springheel)&lt;br /&gt;
* A number of entities are now using the LOD system by default, allowing for higher poly models close up (Springheel)&lt;br /&gt;
* loot textures have been given more shine to make them a bit easier to pick out (Springheel)&lt;br /&gt;
* Many AI use LOD stages to allow for better performance. (Springheel)&lt;br /&gt;
* Several AI have had their meshes and textures upgraded (Springheel)&lt;br /&gt;
* A new &amp;quot;maiden&amp;quot; vocal set has been added (script: Springheel, vocals: Amber)&lt;br /&gt;
* A new female townsfolk AI has been added (Springheel)&lt;br /&gt;
* movable candles will now cast a soft shadow when carried (Springheel)&lt;br /&gt;
* The spyglass will be properly round regardless of screen resolution (AluminumHaste)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GUIs ==&lt;br /&gt;
&lt;br /&gt;
* Main menu now lists the currently installed mission (grayman)&lt;br /&gt;
* The loading bar now accurate reflects the amount of time it takes a mission to load (grayman)&lt;br /&gt;
&lt;br /&gt;
== Scripting ==&lt;br /&gt;
&lt;br /&gt;
* Various script events for string manipulation have been added. (Tels)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Internationalization (I18N) ==&lt;br /&gt;
&lt;br /&gt;
* Updated the German translation. (Tels)&lt;br /&gt;
* Swedish can now be selected in the menu (the translation is still missing). (Tels)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{whatsnew|sort=203}}&lt;/div&gt;</summary>
		<author><name>Taaaki</name></author>
	</entry>
</feed>