Fustigit: gorram Git addresses
- Fustigate — (verb) fus·ti·gate
- To beat with a club; cudgel.
- To criticize harshly.
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.
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
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
URI::Parser, judicious use of regular expressions, and by defining a few new
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
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.
Fustigate is licensed under the Apache License, Version 2.0.
"When in doubt, use brute force." ― Ken Thompson
Ryan McKern <[email protected]>