Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/libgit2.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Wilcox <rwilcox@wilcoxd.com>2012-03-01 02:37:18 +0400
committerRyan Wilcox <rwilcox@wilcoxd.com>2012-03-01 02:37:18 +0400
commit58448910a0591c38959bd26de23cbe97e243b0af (patch)
treee073f43522a7ca321dd4bb5f8f7a5dcea6c131fe /src/transport.c
parent17b3d9b92b9132be116e4ecfae736de025c5158f (diff)
implement support for username@host:path URLs in transport_find_fn()
Diffstat (limited to 'src/transport.c')
-rw-r--r--src/transport.c28
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;
}
/**************