Fustigit: gorram Git addresses

Fustigate — (verb) fus·ti·gate
To beat with a club; cudgel.
To criticize harshly.

Build Status

TL;DR

Fustigit will let you "parse" SCP-like address triplets using Ruby's baked-in URI library (... and just a moderate amount of monkey-patching) and turn them into probably-valid URI objects.

What's a Triplet?

A triplet is a format for specifying a remote resource, much like a URI. It looks like this:

# The username is optional but the hostname and pathname are not
<username>@<hostname>:<pathname>

Triplets predate the original ratification of the URI RFC, and are tricksy to parse if you're playing by URI rules since they don't define a protocol and they use a colon to separate the hostname from the pathname. scp and git are the two most common tools that still use triplets.

Why would I need to parse triplets?

The answer is usually "Git" (but sometimes it's scp). Git supports a conveniently inconvenient number of formats for expressing where a remote repository is located and/or what protocol should be used to connect to it. Some of them are perfectly valid URIs. Some of them are not. It's the ones that are not that may be a problem.

---
# These won't parse and they're both SUPER common
- example.com:path/to/repo.git
- [email protected]:user/project.git

# But these will parse, which is great since they're also SUPER common
- https://example.com/user/project.git
- http://example.com/user/project.git

Enter Fustigit.

How (do I use this)?

Carelessly Without a care in the world!

>> URI.parse "[email protected]:mckern/fustigit.git"
URI::InvalidURIError: bad URI(is not URI?): [email protected]:mckern/fustigit.git [/some/path/for/ruby/lib/ruby/2.1.0/uri/common.rb:176:in `split']
>> require 'fustigit'
=> true
>> uri = URI.parse "[email protected]:mckern/fustigit.git"
=> #<URI::SSH:0x007f8459131f98 URL:[email protected]:mckern/fustigit.git>
>> uri.host
=> "github.com"
>> uri.user
=> "git"
>> uri.path
=> "mckern/fustigit.git"
>> uri.to_s
=> "[email protected]:mckern/fustigit.git"
>> 

How (does it work)?

Careful use of Module#prepend and Module#extend in URI and URI::Parser, judicious use of regular expressions, and by defining a few new URI subclasses: URI::Git, URI::SSH, URI::SCP, and URI::RSYNC. Some of these classes then have the Triplet module mixed in, which helps smooth over the conversion between a valid RFC-compliant URI and an address triplet.

What if I'm using Addressable::URI instead of ::URI?

Take a look at Martin Emde's Gitable, which extends Addressable::URI with additional support for Git addresses.

Support & contribution?

In the spirit of Jordan Sissel (a hero to admins and operations people everywhere), if fustigit is not helping you parse weird Git addresses, then there is a bug in fustigit. Please open an issue or submit a pull request if something doesn't work.

License

Fustigate is licensed under the Apache License, Version 2.0.

"When in doubt, use brute force."
Ken Thompson

Maintainer

Ryan McKern <[email protected]>