Advice for managing two different codebases for one game using Git (browser and iOS versions)

Started by
5 comments, last by Liza Shulyayeva 11 years, 6 months ago
I'm making a JavaScript and HTML5 game. I mostly work in the browser on my Mac, but the final ideal goal is to deploy on iOS as well as browser. Therefore at least a couple of times a week I compile the entire thing using a different framework to deploy to and test on my iPhone. Most of the code ports over nicely, but as you can probably expect some parts require modifications and tweaking (not to mention the fact that the browser version does not need the framework files). This results in my having to change up various piece of code in both files on the day that I test the port. I try to consolidate the code as much as possible and sometimes end up making edits to the iOS code that are ported back to the browser code, or vice versa. Juggling two codebases for the same game can get quite confusing and a hassle in general.

The editing timeline basically looks like this:

  1. Work on browser version, add new features, test, etc. Doing this in the browser allows me to work much more efficiently than compiling and testing in Xcode each time.
  2. End of week port entire thing to iOS framework, deploy to iPhone
  3. That day fix any problems in iOS port, try to consolidate code between the two as much as possible. This results in tweaks being done in both codebases and copies/pasted between each other that day
  4. Continue working on browser version until next port

Right now I use Git for version control, hosting my code on Github for the browser version of the game. I have a dev and master branch. I do not currently use version control for the iOS version at all because I do not know the best way to set this thing up. Should I maintain the entire iOS codebase including the framework in another branch of my main game repo? Should the iOS version be in its own repo? Ideally I'd be able to set it up so that I can just pull relevant files from the browser branch to the iOS branch when I'm testing the port (but sometimes parts of the code would need to be left out, as there are some differences required), then push necessary changes back to both the browser and iOS versions of my hosted code.

I'm not a Git expert and am just not sure what the best way is to go about this. Right now I mostly use it for keeping a main working version of the game in one branch and merging the development branch into it when experimental stuff gets finalised. Fiddling with two sets of code on these porting days is getting confusing and I'm finding myself making mistakes, plus wasting tons of time. Can anyone advise how one might manage this kind of thing better?
Advertisement
Have you thought about using a pre-processor ? Try to keep the overlapping but different parts of your two code bases as small as possible and use pre-processing statements to quickly swtich between them without the need of using two different repositories or redundant code. Here's a open source pre-processor (not only for C/C++).
First, you should use source control for all your source, all the time. This is a lesson you do not want to learn the hard way.

Second, I would set up everything in one remote git archive on separate branches, and have (at least) two local git clones, one for your browser work and one for your iOS work. You can pull and push from each to the remote archive, and cherry-pick back and forth as much as you please. Just remember to always work on a branch until you;re happy, then merge to your main branch -- that way you can cherry-pick entire branches from one project to the other in one go.

If you can factor your code base into appropriate modules (libraries, frameworks) so the the common code is separate from the non-common code, that would also make merges easier.

Stephen M. Webb
Professional Free Software Developer

Thanks for your suggestions. Ashaman, I'm afraid the solution you suggest is a bit over my head at the moment. I'll have to read up on pre-processors and learn more before I can feel confident in using something like this, but thank you for pointing me in the right direction!

Bregma, I think this is the way to go for me at the moment. I'll try setting this up when I get home tonight in the way you suggest.

Thanks again, I appreciate the advice.
Sounds like you're on the right path. As far as pre-processor, think a python script that looks for:
#StartIPhone
....
#StopIPhone

#StartBrowser
...
#EndBrowser

Then spits out a file only including the code between the proper #defines.
You would keep a source folder, and the preprocessor would spit copies of the file out into your build directories
So, you would probably want to set up a folder hierarchy like:
Project
+- Source
+- BrowserVersion
+- iPhoneVersion
+-+- Support files
+-+- Js Files
So, lets say you have game.js, in there you would have

function DoSomeStuff() {
CallingMoreFunctions();
#StartIPhone
iPhoneSpecificNumber += 1;
#EndIPhone
#StartBrowser
IncreaseBrowserNumber();
#EndBrowser
DumbExampleIKnow();
}

then you could run your python script
python preprocessor.py somefile.js
which would copy somefile.js to both your html and ios build directories. The iPhone version does not contain the Start/End Browser block, and the browser version does not contain the Start/End IPhone block.

Run, test, edit, rinse repeat.

I only say python because it's what we use at work, any language would work.
Yes, this is a good example for preprocessors. What preprocessors do basically format your code before passing it on to the compiler. So essentially, you can add/remove certain parts of the source code depending on the flags of the preprocessors you have setup.

For example: you have this code:


doSomething();
#if IPHONE
doiPhoneStuff();
#elif WEB
doWebStuff();
#endif
doSomethingElse();


Before compiling for iPhone, you set IPHONE variable to true, and WEB to false, and thus the code after being preprocessed will look like this:


doSomething();
doiPhoneStuff();
doSomethingElse();
Ah ok, I see what you mean. I'll look into this. I still want to start off by setting up version control for the iOS version properly and seeing how much I can get done with branches to begin with (as I've been meaning to learn to use Git more efficiently as it is anyway), but I think this is something that can definitely come in useful for me in the future, so I'll be sure to learn more.

Thanks for the awesome examples!

This topic is closed to new replies.

Advertisement