In the late nights when I have time to work on Callisto (my Windows 8 XAML toolkit), I often am making changes that I really wish I could either pair with someone on or at a minimum solicit some feedback. Primarily single-person open source projects are lonely :-).
Last night was no different. I had a user of Callisto having a problem with a specific code path. While my testing of the fix was fine, I didn’t want to rush it without him understanding the simple fix. I had no good way of showing him a combined diff to comment on at the time. My problem was, what I thought, simple: how do I quickly share a diff from a GitHub project without requiring them to have a fork?
I set out to the best place to have an argument, Twitter. I asked the same question and got a lot of different responses, but almost all of them pointing to what appears to be the typical git flow in this matter is to use pull requests for code reviews and sharing potential updates. This really frustrated me as I thought it was unnatural to the goal I was trying to accomplish. Lots of folks told me this was the way to do it and that I was thinking about it wrong. To them I say this is broken. I didn’t want to pollute pull requests to be a mix of legitimate pull requests to “in-flight” code changes that shouldn’t be even considered for merge yet. I simply wanted a quick, light-weight way to share a diff graph.
Paul Betts (as he has always awesomely helped with my GitHub questions) pointed me to the thing I was ultimately looking for:
1: git diff > current.diff
This gave me the output that I needed and Gist understands color coding for this data so I just needed to post it there. Good thing is that GitHub has an API that is relatively simple to understand. Since I’ve been using poshgit as my shell lately I set out to create a CmdLet for my flow. I wanted one command that would grab the diff and post to a Gist and give me the URL. I’ve never touched a line of PowerShell programming before and set out to start.
Honestly, it was painful to understand PowerShell for me in this simple task. The PowerShell “IDE” is slow to help with any really good flow. I wanted some VS experience to bootstrap me and I knew I didn’t want a full-on assembly approach. A PowerShell script should do me just fine. I scoured many sites online and started out with my script. After a few hours of searching/trying I was almost there but still not successful. I ended the night posting back to Twitter with a Gist of my attempt.
It was late, I went to bed. As is how most things happen on the interwebs, I awoke to some pointers to where someone has already done most of the work! Despite my searching I never found something that basically took me 90% there already. This was in the form of PsGist. Boom! This is exactly what I needed. I just needed to modify the input from a literal file to the source of the diff. I spent an unnecessary hour fighting with an unauthorized error on the GitHub API due to some unexpected value being in the string captured after entering credentials, but after that was solved I was done. I decided to merge this back to PsGist and submit a pull request for the new command. A few minutes later and after a few questions/quick modification, it was merged. I now have a simple/fast flow to quickly say “hey, here’s what I’m working on, what do you think?” to anyone without having to do any different branching that isn’t currently in my flow.
1: New-DiffGist -Description "SettingsFlyout fix" -Public
After the module is imported the above command will perform a diff, and immediately post that to Gist and give you the URL (and optionally launch in browser if you use the –Launch param). I know it may sound trivial, but it helps my flow and is the simple thing that I was looking for. Thanks Ryan for the PsGist starting point (and for merging my new CmdLet)!
Hope this helps someone!