This afternoon I got the urge to whip up a quick script to help me when using git and a GitHub hosted repository. Quite often I want to look at the GitHub page of a project I’m working on when I’m sitting on the command line in the repository. So I figured, how could I go about making it easier to open that URL without having to find the link in Chrome or on GitHub’s site. Shell scriping to the rescue!

I realized with a little bit of text manipulation, I could get the git remote show command to help me out. So I took the output

$ git remote show origin
* remote origin
  Fetch URL: git@github.com:smerrell/dotfiles.git
  Push  URL: git@github.com:smerrell/dotfiles.git
  HEAD branch: master
  Remote branches:
    gh-pages tracked
    master   tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':

And grepped it on Fetch URL leaving me with Fetch URL: git@github.com:smerrell/dotfiles.git. From there I cut the first 14 characters using cut -c 14- leaving me with just the git url I was looking for. With just the URL left, I got working on crafting a Sed command to manipulate the URL to what I needed, coming up with this:

sed -r -e 's/\w+@/http:\/\//' -e 's/\.git$//'
-e 's/\.com:/.com\//' -e's/git:/http:/'

This command just replaces the git@ part with http instead, I then stripped off the .git and .com: with .com/. producing the desired http://github.com/smerrell/dotfiles. Awesome!

Once I had the URL I wanted, it became pretty simple to open up the url using my default browser. I simply call start and gave it the url.

OSX Support

After getting this all working on my Windows box at work, I had to see if this would work on OS X. Being confident in my skills I just copied the file over to my Mac, dropped it in the bin and happily tried to run it… Until it blew up on me.

First, I had to remember that on Windows you use start but on OS X you need to use open. That was easy enough though, I just added a quick check to see if I’m on OS X or Windows and set a variable opencmd to the right thing. But then the painful part hit me.

This is when I learned the painful difference between Gnu-based tools and BSD tools. Sed was very unhappy with the parameters I was trying to pass into it. Specifically the -r parameter. The script above uses extended regex to get the special characters of \w and +. Unfortunately BSD Sed uses the -E flag while Gnu Sed uses the -r flag.

Fortunately this is pretty easy to work around as I store the extendedRegex flag in my script and set it depending on the OS I’m on.

The most annoying difference between Gnu Sed and BSD sed though, is the support of Regular Expression Metacharacters. In BSD sed, you do not get the metacharacters, so \w must become [[:space:]]. So now I know a painful difference between Gnu Sed regex extensions and BSD regex extensions. After I replaced the metacharacters I was using with their full version, I ran the script again and it worked! So I now have an easy way to open a GitHub repo from the command line.

I still have many imrovements I could make to this script, but I’m pretty happy with how it turned out after putting about a half hour of work into it. Below is the file in its entirety and you can find it on GitHub as well. Feel free to borrow the script and use it if you find it useful. I’d love to get some feedback on ways to improve what I have so far.