diff options
author | Ryan Wilcox <rwilcox@wilcoxd.com> | 2012-03-01 02:37:18 +0400 |
---|---|---|
committer | Ryan Wilcox <rwilcox@wilcoxd.com> | 2012-03-01 02:37:18 +0400 |
commit | 58448910a0591c38959bd26de23cbe97e243b0af (patch) | |
tree | e073f43522a7ca321dd4bb5f8f7a5dcea6c131fe /src/transport.c | |
parent | 17b3d9b92b9132be116e4ecfae736de025c5158f (diff) |
implement support for username@host:path URLs in transport_find_fn()
Diffstat (limited to 'src/transport.c')
-rw-r--r-- | src/transport.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/src/transport.c b/src/transport.c index 672eb6e8a..523a9fce2 100644 --- a/src/transport.c +++ b/src/transport.c @@ -10,6 +10,8 @@ #include "git2/net.h" #include "transport.h" +#include <regex.h> + static struct { char *prefix; git_transport_cb fn; @@ -28,15 +30,35 @@ static struct { static git_transport_cb transport_find_fn(const char *url) { size_t i = 0; + regex_t preg; + int error; + git_transport_cb output = NULL; - /* TODO: Parse "example.com:project.git" as an SSH URL */ - + // First, check to see if it's an obvious URL, which a URL scheme for (i = 0; i < GIT_TRANSPORT_COUNT; ++i) { if (!strncasecmp(url, transports[i].prefix, strlen(transports[i].prefix))) return transports[i].fn; } - return NULL; + + // next, see if it matches un-schemed SSH paths used by Git + // if it does not match, it must be a local transport method + // use the slightly old fashioned :alnum: instead of \w or :word:, because + // both are Perl extensions to the Regular Expression language (and not available here) + error = regcomp(&preg, "^[[:alnum:]_]+@[[:alnum:]_]+\\.[[:alnum:]_]+:.+\\.git$", REG_EXTENDED); + if (error < 0) + goto cleanup; + + int rc = regexec(&preg, url, 0, NULL, 0); + if ( rc == REG_NOMATCH ) + output = NULL; // a match was not found - it's probably a file system path + else + output = &git_transport_git; // a match was found! + +cleanup: + regfree(&preg); + + return output; } /************** |