I’ve written before about source code respositories and Subversion / Git – about a year ago, in fact.
Suprisingly, lots of people working on software are still not using any “Version Control System” (VCS) !
So let me try a new angle today, and show you how you need only use 5% of those systems to get a huge benefit out of them when dealing with the Arduino sketches and libraries from JeeLabs. Since all the code from JeeLabs is now located at GitHub, the rest of this post will be about Git (and GitHub, a truly phenomenal free web resource).
Why bother with a VCS? Well… I once heard of a little anecdote about a sign at the dentist, which said:
“You don’t have to floss all your teeth, just the ones you want to keep.”
It’s a bit like that with source code. If you don’t write code, or don’t ever change it, then you don’t need to manage it. But if you do, then you know how much effort goes into a working sketch, library, script, program, etc. Things change – either your own code, libraries from others, tools like the Arduino IDE (1.0 broke lots of stuff), even core computer software or hardware. Things always change, and if you want to be able to deal with it, you need VCS.
Not everyone aspires to be a full-time software developer (what an odd world that would be!), but even in the simplest situations you can benefit from version control. Here’s a possible scenario, close to home JeeLabs:
- Suppose you want to use the EtherCard library, but not necessarily with the JeeLabs Ether Card hardware.
- The GitHub page includes a README at the bottom, with a link to the ZIP archive with all the code.
- So you download the ZIP, unpack it, and figure out where to put it so the Arduino IDE can find it.
- Say you want to try out the “backSoon” example, as demo of a tiny web server. You compile and upload.
- It doesn’t work – now what? After a lot of digging and searching, you figure out that the code was written for the SPI select signal tied to Arduino’s digital pin 8 (PB0) whereas your hardware uses pin 10 (PB2).
- After that it’s easy: change “
#define SELECT_BIT 0
” to “#define SELECT_BIT 2
” in enc28j60.cpp. - Fantastic, you’ve cut through the problem and made the EtherCard library work for you. Congratulations!
This is a typical case: code was written for a specific purpose, but a small change makes it more widely usable.
I picked this example, because it is likely that we’ll update the EtherCard library soon to support different pins at runtime. That’ll allow you to leave the EtherCard library alone and set things up in your sketch, i.e. at run time. Note that it’s always a trade-off – some things usually become more general, but only if there’s a need. You can’t write code to cover all the cases. Well, you could, but then you end up with a nightmare (I won’t give examples).
So sometime in the near future, there will be an update to the EtherCard library. That’s when trouble starts…
Because there are now three different versions of the EtherCard library, and you’re about to create a fourth:
- the original EtherCard library on GitHub
- your copy of that library, on your disk, with a tiny change made to it
- the updated! improved! whiter-than-white! new EtherCard library on GitHub
- your copy of the new library, which you’re now forced to update and adjust again
There’s more going on: in this particular case, that update made your small change superfluous. But now the API of the EtherCard library has changed, so you need to change each of your sketches using the EtherCard library.
It’s not hard to see how these little details can turn into a nightmare. You build something, and you end up having to keep track of all sorts of dependencies and changes on your disk. Worse: everyone is wasting their time on this!
Version control systems such as Git can do a lot more, but the key benefit they offer can be summarized as:
You can easily manage THREE different versions of all the source files: the OLD, the NEW, and YOURS.
So if all you want is to use open source code and stay up to date, then Git lets you do that – even if you make changes yourself in any of those files. And it gets even better: if your changes have nothing to do with the changes made to the original code, then all you need to do is to issue the “git pull” command, and the remote changes will be folded into your local copy of the source file – chances are that you can simply re-compile, upload, and keep on running with the latest updates!
If your local changes do interfere or overlap with the changes made to the original code, then “git pull” will detect this and avoid making the changes to prevent it from altering yours (which always take precedence). This is called a “conflict” – and Git offers several (maybe too many) ways to deal with it.
For JeeLabs, all the code is now maintained on a free and public web site called GitHub. You don’t have to have an account there to browse or download any source code. You can not only see all the latest code, you can also look at any previous changes, including the complete history from the moment the first version was placed on GitHub.
Here’s an example: https://git.jeelabs.org/jeelib/commit/6f8415607ff6eef3966363751975c8f807ef9814
You’ll see a comment about the change, the list of files affected, and for each file an exact summary of the changes and some nearby lines for context. This change has been recorded forever. If logged in, you could even discuss it.
Even if you never intend to share your own changes and code, you can see how this resource lets you examine the code I’m providing, the changes I’m making to it over time, and the affected files. You can view a source file as it was at any point in time (wouldn’t it be great if this also included the future?).
Here’s one more gem: say you are looking at the enc28j60.cpp
file, and wondering when what change was made. There’s a way to see where each change came from (and the look at that specific change in a larger context, for example). This annotated source file is generated by “git blame” – follow this link as example.
So what VCS, Git, and GitHub offer is really no less than a Time Machine. But even if you don’t ever use that, Git gives you the ability to keep your code in sync with the changes happening in the original source code repository. And if something gets messed up, you can revert to an older version of the code – without having copies on your disk, which need to be given meaningful names so you can find them back. The “git diff” feature alone is worth it.
Wanna get started? Terrific. Cast your doubts aside, and keep in mind that you need a little time to get used to it.
How to start using Git (and GitHub) depends a bit on your operating system: on Windows, best option might be to install TortoiseGit (see also this intro, which goes a bit deeper). On the Mac, it’s included with the Xcode developer tools, but there’s actually a great app for it called GitHub for Mac, and on Linux it’s probably one of the best supported packages out there, since it came from the same guy who made Linux possible in the first place…
With Git, you can stay up to date, you’ll never lose changes, and you never have to guess who changed what, when, where, why, or how. Is there a new update? Try it! Doesn’t work as expected? Back out! It’s that simple.
Good post – spot on!
I found these 3 videos particularly useful when I first move from SVN to Git – all great beginners introductions:
http://scotland-on-rails.s3.amazonaws.com/1A02_Scott_Chacon.mp4
http://www.youtube.com/watch?v=4XpnKHJAok8
http://skillsmatter.com/podcast/agile-testing/mastering-git-basics
(they were so useful I kept a record of them so I could refer back to them if needed)
There is also an excellent book about Git, available free online: http://progit.org/book/
With regards to the comment about being able to change pins, this is now available in a development branch which is being worked on by Andrew Lindsay: https://git.jeelabs.org/ethercard/tree/development
Ian
Aarg – can’t paste script here. Comment deleted.
Check the General forum for the script that I use on Mac OS X to install/update the JeeLabs libraries.
Sorry about that – yeah, comments are a bit picky here. Do check out the “Github for Mac” app – I find it pretty convenient.