Pull Requests

Ship now has support for GitHub Pull Requests! Nick and I have been working so hard on this for the past several months and there is a ton of neat stuff in this update. Here's a screenshot of our new pull request viewer:

Ship pull requests diff viewer

I'm a big fan of Xcode's versions editor along with its "Show only files with source-control status" button. It's great for looking through my working copy before I do a git commit to make sure my changes exactly match my intent. Just as using Xcode is a big productivity boost compared to looking over my changes using git diff, Ship's pull requests feature is a big jump in productivity compared to GitHub's web interface.

Like an integrated development environment, Ship shows an outline with modified, added, deleted, and renamed files within your project structure. It is a very common practice to structure source code hierarchically, and therefore it is natural to be able to view pull requests this way. It just makes so much more sense to review code by functional area, which is likely already encoded in your project's structure, than it is to have to wade through a flat listing of changes that might as well be randomly ordered.

When viewing a changed file in Ship, you always have access to the full file contents, for both the original and changed source. Ship allows you to see as much context as you need just by scrolling. A scrollable minimap and intelligent navigation controls let you jump quickly through the changes so you can focus on just what you need to and not miss anything.

Reviewing and commenting on changes is simple with Ship. Just like on GitHub's web interface, click on a changed line number in the diff view to add a comment. In Ship, you have access to an enhanced markdown editor with improved support for markdown formatting and inline syntax highlighting, including in code blocks. Files with existing comments are indicated with an icon in the sidebar, and comments within the current file are also called out on the scrollable minimap.

Pull request support in Ship isn't limited just to code review. Pull requests can now be quickly created, searched, navigated, charted, and triaged just like issues in Ship's flexible and fast user interface. The pull request "conversation view" is represented with full fidelity in Ship, including full support for requested reviewers, commits, status checks, merge status, protected branches, and more. Everything you see on screen is live — if somebody pushes a new change, adds a comment, or your build bot sends a status check, you see that reflected instantly.

Ship is available for download now. If you're already using Ship, use the "Check for Updates" menu item to get the latest version. For more information on using Ship with pull requests, check out the documentation. I hope you enjoy using it, and if you run into problems or have any questions, please get in touch with support@realartists.com.

Looks like Nick just sent over a new pull request. I guess we need this too before we can ship Ship ...

Ship pull request conversation overview

Privacy and Security Notes

While Ship does rely on servers that we run to handle receiving notifications from GitHub as well as massaging the occasionally quirky GitHub API into a format that allows for efficient incremental synchronization, these servers are limited to handling Issues and metadata about Pull Requests. When you're viewing your source code in Ship's diff viewer, the contents of your repositories are kept private between your Mac and GitHub, without any intermediary servers.

Here's how it works: when you click "Review Changes" on a pull request in Ship, a bare git repo is created at ~/Library/RealArtists/Ship2/git/$owner/$repo_name (if needed). Ship uses libgit2 to fetch via https the remote refs referred to by the pull request using your OAuth token for authorization. The OAuth token itself is stored securely in your Mac's keychain, and isn't written unencrypted to disk. Fetching updates to the same pull request or other pull requests in the same repo will perform an incremental update, fetching just the new objects as needed into the bare git repo stored locally on your Mac, directly from GitHub. We don't store, access, or transmit your source code via our servers: it's all done directly between you and GitHub.