Difference between revisions of "AlliedModders Planning"
m |
m |
||
Line 1: | Line 1: | ||
__FORCETOC__ | __FORCETOC__ | ||
− | This is sort of a major push for AlliedModders to be a bit more streamlined. Some of the problems we're encountering: | + | This is sort of a major push for AlliedModders to be a bit more streamlined. We're encountering growth problems, especially as our personnel has dwindled quite low recently. This document discusses some changes I'm proposing. Anyone is free to discuss this on the forums or add comments into this document. |
+ | |||
+ | Some of the problems we're encountering: | ||
*We're finding it hard to manage multiple projects in a unified way. | *We're finding it hard to manage multiple projects in a unified way. | ||
*There are site disparities, Metamod:Source and SourceMod and AMX Mod X each have entirely different backends. | *There are site disparities, Metamod:Source and SourceMod and AMX Mod X each have entirely different backends. | ||
Line 7: | Line 9: | ||
*Subversion doesn't cut it -- Mercurial might handle things better. Subversion basically has no branching or tagging support, and it has no real branch merging capabilities. This is a real problem for SourceMod which has pretty active development. | *Subversion doesn't cut it -- Mercurial might handle things better. Subversion basically has no branching or tagging support, and it has no real branch merging capabilities. This is a real problem for SourceMod which has pretty active development. | ||
*We still don't have a main site, and MediaWiki still has authentication problems since its handling of usernames is broken. | *We still don't have a main site, and MediaWiki still has authentication problems since its handling of usernames is broken. | ||
− | |||
− | |||
Some of the benefits we'd gain from the ideas in this document: | Some of the benefits we'd gain from the ideas in this document: | ||
Line 18: | Line 18: | ||
− | = | + | =Mercurial= |
Subversion doesn't let us branch nicely or create user-specific branches without forever mucking up the central repository. It's difficult to do merges. Mercurial seems to solve these problems, but our build process will be majorly affected. | Subversion doesn't let us branch nicely or create user-specific branches without forever mucking up the central repository. It's difficult to do merges. Mercurial seems to solve these problems, but our build process will be majorly affected. | ||
+ | An excellent tutorial for how Mercurial works is [http://www.selenic.com/mercurial/wiki/index.cgi/UnderstandingMercurial here]. | ||
− | =The Revision Problem= | + | ==The Revision Problem== |
Mercurial tracks revisions with 160-bit IDs (40 digits of hex), called "changeset IDs." Mercurial has aesthetic revision numbers only; they're not guarantees like they are in Subversion. Revision numbers are properties of a repository clone, not the overall repository. This means that if two people make changes locally, those revisions will be different, and will change again once pushed upstream. | Mercurial tracks revisions with 160-bit IDs (40 digits of hex), called "changeset IDs." Mercurial has aesthetic revision numbers only; they're not guarantees like they are in Subversion. Revision numbers are properties of a repository clone, not the overall repository. This means that if two people make changes locally, those revisions will be different, and will change again once pushed upstream. | ||
This problem is somewhat mitigated by the fact that the central repository will have reliable revision numbers, but that's still not good enough since branching will generate multiple revisions. Branching also makes the revision numbers awkward since users assign meaning to them where none exists (for example, "1.0.1.1234 versus 1.1.0.1231 doesn't make sense because 1.1 is later than 1.0.1"). | This problem is somewhat mitigated by the fact that the central repository will have reliable revision numbers, but that's still not good enough since branching will generate multiple revisions. Branching also makes the revision numbers awkward since users assign meaning to them where none exists (for example, "1.0.1.1234 versus 1.1.0.1231 doesn't make sense because 1.1 is later than 1.0.1"). | ||
− | + | =Eliminating Revision Numbers= | |
+ | Even in our current Subversion system, revision numbers have become meaningless because they can't be easily interpreted by users. They're simply confusing, and regardless of whether we move to Mercurial, eliminating these numbers is a good idea. | ||
− | == | + | ==Problems== |
− | There are | + | There are two problems. The first is that we need to display '''something'''. The automated builds system means we need some way of identifying a specific build, both programmatically, and visually (for users). |
− | + | The programmatic part is important for our "fetchdlls" utility which is used for debugging. This utility reads an mdmp file and downloads matching binaries from our package repository -- this makes debugging with our symbol server really easy. There are two invariants that fetchdlls needs to work: | |
− | + | *A way to match a [http://msdn.microsoft.com/en-us/library/ms680392(VS.85).aspx MINIDUMP_MODULE] structure to a downloadable path, and; | |
− | + | *A download mechanism | |
− | |||
− | |||
− | * | ||
− | |||
− | + | Currently, fetchdlls uses the revision number in the product version slot, but eliminating the revision number will prevent that from working. We could shim it for Subversion by keeping the local number in version.rc, but this seems bad as it would prevent us from eliminating the messy version bumping logic, and the version number would still technically be visible. | |
− | + | The only solution I can think of to this problem, a solution that is scalable, is to use the binary checksums instead of the version ID. This would require some sort of website that would keep track of the checksum -> changeset mapping, in order to get a package back. This would be part of a new automation system that would quickly follow the versioning changes. I'd probably rewrite fetchdlls in C#. | |
Line 62: | Line 60: | ||
==Phase 0== | ==Phase 0== | ||
− | *Apply new versioning scheme, whatever it may be | + | *Apply new versioning scheme, whatever it may be. |
==Phase 1== | ==Phase 1== | ||
Line 75: | Line 73: | ||
*Move the pdbstore to be centralized client-side. This can be accomplished by making a more advanced symstore wrapper that will remove anything older than 30 days, and then (in a similar SSH tunnel method as above), rsync all changes upstream to the webserver. The exact mechanism is still up in the air, but rsync would probably suffice (as long as we can stomach cygwin). | *Move the pdbstore to be centralized client-side. This can be accomplished by making a more advanced symstore wrapper that will remove anything older than 30 days, and then (in a similar SSH tunnel method as above), rsync all changes upstream to the webserver. The exact mechanism is still up in the air, but rsync would probably suffice (as long as we can stomach cygwin). | ||
*Remove the Symbols repository. | *Remove the Symbols repository. | ||
+ | *Rewrite fetchdlls to support the new layout. | ||
==Phase 3== | ==Phase 3== |
Revision as of 05:33, 31 May 2008
This is sort of a major push for AlliedModders to be a bit more streamlined. We're encountering growth problems, especially as our personnel has dwindled quite low recently. This document discusses some changes I'm proposing. Anyone is free to discuss this on the forums or add comments into this document.
Some of the problems we're encountering:
- We're finding it hard to manage multiple projects in a unified way.
- There are site disparities, Metamod:Source and SourceMod and AMX Mod X each have entirely different backends.
- Similarly, each site has a different version of the mirror system script.
- Subversion doesn't cut it -- Mercurial might handle things better. Subversion basically has no branching or tagging support, and it has no real branch merging capabilities. This is a real problem for SourceMod which has pretty active development.
- We still don't have a main site, and MediaWiki still has authentication problems since its handling of usernames is broken.
Some of the benefits we'd gain from the ideas in this document:
- Much easier branching, branch merging, and tracking of merged changesets
- With Mercurial, pulling changes from other parties is much easier
- Getting rid of revision numbers on products will eliminate confusion
- We can get the symbol store and fetchdlls utility totally streamlined for postmortem debugging
- We can get rid of the package/symbol repositories and save gigs of wasted disk space
Contents
Mercurial
Subversion doesn't let us branch nicely or create user-specific branches without forever mucking up the central repository. It's difficult to do merges. Mercurial seems to solve these problems, but our build process will be majorly affected.
An excellent tutorial for how Mercurial works is here.
The Revision Problem
Mercurial tracks revisions with 160-bit IDs (40 digits of hex), called "changeset IDs." Mercurial has aesthetic revision numbers only; they're not guarantees like they are in Subversion. Revision numbers are properties of a repository clone, not the overall repository. This means that if two people make changes locally, those revisions will be different, and will change again once pushed upstream.
This problem is somewhat mitigated by the fact that the central repository will have reliable revision numbers, but that's still not good enough since branching will generate multiple revisions. Branching also makes the revision numbers awkward since users assign meaning to them where none exists (for example, "1.0.1.1234 versus 1.1.0.1231 doesn't make sense because 1.1 is later than 1.0.1").
Eliminating Revision Numbers
Even in our current Subversion system, revision numbers have become meaningless because they can't be easily interpreted by users. They're simply confusing, and regardless of whether we move to Mercurial, eliminating these numbers is a good idea.
Problems
There are two problems. The first is that we need to display something. The automated builds system means we need some way of identifying a specific build, both programmatically, and visually (for users).
The programmatic part is important for our "fetchdlls" utility which is used for debugging. This utility reads an mdmp file and downloads matching binaries from our package repository -- this makes debugging with our symbol server really easy. There are two invariants that fetchdlls needs to work:
- A way to match a MINIDUMP_MODULE structure to a downloadable path, and;
- A download mechanism
Currently, fetchdlls uses the revision number in the product version slot, but eliminating the revision number will prevent that from working. We could shim it for Subversion by keeping the local number in version.rc, but this seems bad as it would prevent us from eliminating the messy version bumping logic, and the version number would still technically be visible.
The only solution I can think of to this problem, a solution that is scalable, is to use the binary checksums instead of the version ID. This would require some sort of website that would keep track of the checksum -> changeset mapping, in order to get a package back. This would be part of a new automation system that would quickly follow the versioning changes. I'd probably rewrite fetchdlls in C#.
Automation
Right now we use subversion for all of the packages. This is getting to be troublesome. It makes fetchdlls extraordinarily complicated when it really does not have to be, and the hourly builds just accumulate with no way of being deleted. The package repository is 1.7GB and growing.
It would be a lot simpler if we could just throw a single package on the webserver and forget about it. We could even keep a rotation of, say, 30 days' worth of packages in a rotation. This would let us remove cruft and keep enough binaries around for debugging. The problem is that people rely on the repositories to perform diffs.
I don't have any good ideas on solving that problem, because there's no way to selectively rotate things out of a versioning system. The only solution I can think of is providing people with, say, a perl or bash script that does the job for them. This could go through two routes: using local repositories, or simply doing a HTTP fetch from the web server and then doing a diff.
License Changes
I don't want to keep hacking up our private->public sync script. DS has faithfully maintained it until now, but I believe he will be as glad as I to do away with it. A move to Mercurial would have either of the following benefits:
- We could keep the JIT closed source and shove it in a private repository, OR
- Just open source the thing finally, it's not very special, and have everything be together.
Phases
Phase 0
- Apply new versioning scheme, whatever it may be.
Phase 1
- Redo the automation so it simply sends the packages upstream to FTP
- Use an SSH tunnel to notify of new packages, so we don't have to do something idiotic like mirrors.pl for the mirror system
- Redo the package system so only 30 days worth of builds are available
- Write a script to help users diff between packages?
- Transition C# build tool to vs2k5 during this downtime
- Remove the Packages repository entirely (transitioning AMX Mod X to this will be trivial).
Phase 2
- Move the pdbstore to be centralized client-side. This can be accomplished by making a more advanced symstore wrapper that will remove anything older than 30 days, and then (in a similar SSH tunnel method as above), rsync all changes upstream to the webserver. The exact mechanism is still up in the air, but rsync would probably suffice (as long as we can stomach cygwin).
- Remove the Symbols repository.
- Rewrite fetchdlls to support the new layout.
Phase 3
(Maybe)
- Add hg.alliedmods.net pointing to our "repository roots," which will be per-project. For example, hg.alliedmods.net/sourcemod.
- From there, import trunk as "sourcemod."
- Branch every major release off as separate repositories, from the appropriate revisions.
- Tag minor releases.
- Update all links we can find on the site and in the docs.
Phase 4
(Assuming Phase 3)
- Add /metamodsource, import trunk and branches.
- Branch every major release off as separate repositories, from the appropriate revisions.
- Tag minor releases.
- Update all links we can find on the site and in the docs.
- Create new repositories for the hl2sdk stuff. This way, the AlliedModders root organization will look like:
- hl2sdk
- hl2sdk
- hl2sdk-ob
- metamodsource
- metamodsource
- metamodsource-1.0
- metamodsource-1.1
- metamodsource-1.2
- metamodsource-1.3
- metamodsource-1.4
- metamodsource-1.6
- sourcemod
- sourcemod
- sourcemod-1.0
- hl2sdk
Phase 5
We really, really still need a CMS to make this packaging, mirroring, etc business much more streamlined. But this phase is so far in the future I expect other phases to creep in before it. This is more a mind dump than anything, but here goes --
- Moving from flyspray to bugzilla. After using bugzilla, I'm convinced that its massive feature set far outweights the few permissions issues we ran into. flyspray is severely lacking, and even though bugzilla isn't the nicest looking tool, it's templated and professionally done. It has little things that really count, like..
- Not e-mailing the person who made the change to a report
- A much, MUCH better attachment system that allows for attachment reviews
- More focused on triaging and patch management than flyspray, which is simply a list of tasks with some basic statistics
- Moving from MediaWiki, which (I view) as a very, very outdated piece of software. From version 1.5 to 1.10 I have noticed no real usability or feature set changes, and the installation/upgrade process is always very buggy for us. Its administration and permissions model is laughably limited. A possible target for this is DekiWiki which Mozilla is supposedly converting to. It's open source and it's actually a CMS, which (perhaps) could kill two birds with one stone.