--- /dev/null
+var url = require('url')
+
+module.exports = function normalize (u) {
+ var parsed = url.parse(u)
+ // If parsing actually alters the URL, it is almost certainly an
+ // scp-style URL, or an invalid one.
+ var altered = u !== url.format(parsed)
+
+ // git is so tricky!
+ // if the path is like ssh://foo:22/some/path then it works, but
+ // it needs the ssh://
+ // If the path is like ssh://foo:some/path then it works, but
+ // only if you remove the ssh://
+ if (parsed.protocol) {
+ parsed.protocol = parsed.protocol.replace(/^git\+/, '')
+ }
+
+ // figure out what we should check out.
+ var checkout = parsed.hash && parsed.hash.substr(1) || 'master'
+ parsed.hash = ''
+
+ var returnedUrl
+ if (altered) {
+ if (u.match(/^git\+https?/) && parsed.pathname.match(/\/?:[^0-9]/)) {
+ returnedUrl = u.replace(/^git\+(.*:[^:]+):(.*)/, '$1/$2')
+ } else if (u.match(/^git\+file/)) {
+ returnedUrl = u.replace(/^git\+/, '')
+ } else {
+ returnedUrl = u.replace(/^(?:git\+)?ssh:\/\//, '')
+ }
+ returnedUrl = returnedUrl.replace(/#[^#]*$/, '')
+ } else {
+ returnedUrl = url.format(parsed)
+ }
+
+ return {
+ url: returnedUrl,
+ branch: checkout
+ }
+}