Maintaining submodules in a Git repository

I'm learning new Git tricks thanks to Damien and want to make sure I don't forget any of them, so I'm introducing a new Git tag here on the blog to start writing these down.

I'm working on a project with the team in Paris for the week, and the structure of the project is such that we maintain a main Git repository that pulls in Drupal and a variety of contributed modules using git submodules. To build the full project locally, I first clone our main repository and then issue git submodule init / update commands to get the proper versions of our submodules.

Now, I'm still learning the ropes with Git terminology and repository management, but from what I understand, a submodule folder points to the URL of the repository and a precise commit. It won't automatically track a branch, so when the remote repository has new commits or you make new commits in your submodule repositories, you have to tell the main repository something has changed.

First you would change directories into the submodule and either pull in the new commits or perhaps make your changes, commit them, and push them upstream. Then you would change back into the main repository directory and perform a git add on the submodule directory. Committing this will update the main repository to point to the new current commit in the submodule directory. Pushing this upstream will ensure that everyone else on the project can pull the change and use git submodule update to pull the new commits into their local submodule directories.

Pretty straightforward I suppose?

Facebook Messages

Much ado was made about Mark Zuckerberg's vision for Facebook messaging to function as a replacement for e-mail for the next generation. It's immediate. It's simple. It's natural. And of course it's integrated into a website where users already connect with a lot of the people they communicate with on a regular basis.

I was and still am skeptical. I rarely use Facebook messages, and when I do it's often for multi-party messaging. Occasionally I'll engage in one-on-one conversations, and it is handy to be able to quickly share images, links, etc. But Gmail is still my much more comfortable messaging home.

I did notice one psychological difference in the way I use the different services, though. When I send an e-mail, I always include at least a basic signature, "-Ryan", or my full blown contact information signature for work related e-mail. It actually feels a little rude to me not to. This is a little weird, because it's not like the people I communicate with need to see my name at the end of the e-mail to remember who sent it. However, on Facebook I have no such qualms. I rarely ever include my mini-signature.

Is it because it's more like a private forum? Is it because I expect my message to just be part of an ongoing conversation? Perhaps it's the way I relate to the two services based on their names... I would never send a letter without a signature via snail mail, so why would I send e-mail without one. Conversely, I would never add a signature to a text message, so why would I do so on a Facebook message?

Drupal Commerce in a git.d.o world

Because we were doing our Commerce module development on GitHub and exporting to CVS, we need to make some changes now that the Git migration on d.o is complete. Obviously the main Git repository for the project is now on d.o instead of GitHub. To clone the latest code, you can follow the helpful Git instructions included on Drupal project pages.

All of my D7 projects now include a 7.x-1.x branch that you should track to get the latest commits. I also updated the various dev releases of Commerce, Address Field, and my Commerce contribs to be snapshots of this branch, essentially deprecating master. I'm trying to decide the best thing to do about those pesky master branches and will likely just git rm everything in them and leave behind a README indexing the various HEADs in the repository.

Many people had forks of both the old Commerce repository and my development repository on GitHub. Additionally, some of you may have pending commits that haven't been pulled yet. If this is the case for you, please generate a patch instead of a new pull request and post it to the issue queue. As of this point I have no plans to rewrite the commit history of the new official repository to match the existing history on GitHub, meaning I cannot cleanly pull from your repositories.

(I have read Ben's blog post, and I'm sure there are some other finer aspects of Git that I'm just ignorant of to accommodate this... but I'm not sure it's worth the hassle when forks will need to be updated across the board anyways.)

This seems a little brute force, but I think it's for the best. The commit graph on d.o is now a nice tidy straight line, whereas the old graph on GitHub was a fractured mess that included several instances of duplicated commits thanks to botched merges and branching. We were still learning an appropriate Git workflow at the time and made several mistakes that not only dirtied up the history but also made it hard to sort out how to pull from various forks. (Accordingly, current contributor statistics on Ohloh are inaccurate anyways.)

This does mean some contributor credit in the commits will be lost, but I'll be updating various project pages to credit beta contributors for their commits. Regardless, I've been crediting contributors in commit messages all along, and merge commits show whose repository the merged commits came from. As of this point, I think the loss of a little meta information is worth the clean slate with the new repositories. Flame away in the comments if this is the stupidest idea you've ever heard... just want to make sure my plans are clear.

While we figure out how to handle pull requests in an environment that doesn't natively support them, in your issue please indicate your repository URL (whether it's a d.o sandbox of GitHub fork) and branch that I should pull from to compare. Bonus points for attaching a patch for quick review on site (or linking to the diff on the appropriate web interface). I'll add your repository as a remote so you don't have to post it every time. Additionally, I'd prefer it if you used a single branch per issue you're addressing with the branch name simply being the nid of the issue - makes it quite easy for me to branch and pull locally.

(I should mention that the good ol' patch process is perfectly fine if you don't want to maintain a public repository for me to pull from. You can just make your commits locally and diff 'em all in one fell swoop to create a patch for review.)

This is essentially what we've been doing on GitHub, so no surprises here for existing contributors. I'll leave the GitHub repos up for a while, but I'm updating their READMEs to point to the new repository on d.o. Once tested and approved, these guidelines will find their way into a handbook page for posterity's sake.

Calling all pre-beta testers

This is a quick call for help before I package up a beta release of Drupal Commerce. The last few weeks I've been working around the clock on blocking issues, dependency issues, Rules based pricing and tax (incl. VAT) support, and last minute database tweaks. My wife has been incredibly supportive of me thus far, but now I need help from my friends with a bit more technical acumen.

Here's the deal: for all intents and purposes, this code is beta ready. Database schema changes have mellowed out. The modules have solidified. The core feature set lets you start selling quickly. The Views and Rules integration provides for some fine standard interfaces and workflows. The last few weeks, pcambra has been our SimpleTest hero, and now he's working with recidive to flesh out the functional tests even further.

What it really needs is eyes. Your eyes. If you have a few spare moments, you could greatly help by testing an installation and ensuring there aren't any crazy bugs that I just don't see because of my development environment or selective blindness. These could take the form of installation bugs, odd default configurations in Views / Rules, typos, broken access control, and more. There are bound to be things I'm missing, and I really need your help to know what they are.

Here's how to get started very quickly:

  1. Download Drupal 7.
  2. Download into your sites/all/modules directory the latest dev versions of the following dependencies:
    1. Address Field
    2. Ctools
    3. Views 3
    4. Entity API
    5. Rules 2
  3. (Note: Getting these from CVS would be better to get their latest commits.)

  4. Download into your sites/all/modules directory my Git dev version of Drupal Commerce (or just git clone git://
  5. Download into your profiles directory my Commerce Dev installation profile and download into your sites/all/modules directory Admin Menu (a dependency of the installation profile).
  6. Now install Drupal 7 using the Commerce Dev installation profile and see what happens!
  7. If you're feeling adventurous, use the Standard installation profile and then try to enable the Commerce modules manually to make sure the standard install process works. (You'll have to adjust some permissions, enable the cart block, and build a product display node type from scratch - read more about that in the first issue of Drupal Watchdog. )

Once it's all installed, cruise through the various admin interfaces, settings forms, and front end features and let me know what breaks. Note, I'm not looking for support requests, "How do I...?", or feature requests, "Needs flat rate shipping support." Rather, I want to know what, if anything, of the core feature set just doesn't work.™

One of the latest features to test will be to configure a tax rate for your country / state. Simply browse to admin/commerce/config/taxes and add the tax rate. If you made it a sales tax, it'll show up once you get to checkout. If you made it a VAT, it'll show up inclusive in product prices. Additionally, if you made it a VAT, you can edit products and enter their prices including VAT. Taxes work through the same Rules event as other product pricing rules, so you can try adding a discount rule and fiddle with its weight to see how it interplays with your tax rules.

Drupal Commerce comes with an example payment method module that lets you just put a name in on the checkout form to test payment. You can test additional payment methods if you have developer accounts for Authorize.Net, CyberSource, or PayPal.

Please report any bugs you can turn up (or +1 existing bugs) in our issue tracker. I'll also be hanging out in #drupalcommerce on if you're into IRC.

While you do this, I'll be running tests of my own, reviewing the names and descriptions of all our permissions, and ensuring the customer profile integration with Checkout and Order administration is up to snuff.

With any luck, we'll all be beta testers tomorrow.