mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-29 08:11:58 +00:00
implement support for username@host:path URLs in transport_find_fn()
This commit is contained in:
parent
17b3d9b92b
commit
58448910a0
@ -10,6 +10,8 @@
|
|||||||
#include "git2/net.h"
|
#include "git2/net.h"
|
||||||
#include "transport.h"
|
#include "transport.h"
|
||||||
|
|
||||||
|
#include <regex.h>
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
char *prefix;
|
char *prefix;
|
||||||
git_transport_cb fn;
|
git_transport_cb fn;
|
||||||
@ -28,15 +30,35 @@ static struct {
|
|||||||
static git_transport_cb transport_find_fn(const char *url)
|
static git_transport_cb transport_find_fn(const char *url)
|
||||||
{
|
{
|
||||||
size_t i = 0;
|
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) {
|
for (i = 0; i < GIT_TRANSPORT_COUNT; ++i) {
|
||||||
if (!strncasecmp(url, transports[i].prefix, strlen(transports[i].prefix)))
|
if (!strncasecmp(url, transports[i].prefix, strlen(transports[i].prefix)))
|
||||||
return transports[i].fn;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************
|
/**************
|
||||||
|
@ -30,6 +30,16 @@ void test_network_remotes__parsing(void)
|
|||||||
cl_assert(!strcmp(git_remote_url(_remote), "git://github.com/libgit2/libgit2"));
|
cl_assert(!strcmp(git_remote_url(_remote), "git://github.com/libgit2/libgit2"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_network_remotes__parsing_ssh_remote(void)
|
||||||
|
{
|
||||||
|
cl_assert( git_remote_valid_url("git@github.com:libgit2/libgit2.git") );
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_network_remotes__parsing_local_path(void)
|
||||||
|
{
|
||||||
|
cl_assert( !git_remote_valid_url("/home/git/repos/libgit2.git") );
|
||||||
|
}
|
||||||
|
|
||||||
void test_network_remotes__refspec_parsing(void)
|
void test_network_remotes__refspec_parsing(void)
|
||||||
{
|
{
|
||||||
cl_assert(!strcmp(git_refspec_src(_refspec), "refs/heads/*"));
|
cl_assert(!strcmp(git_refspec_src(_refspec), "refs/heads/*"));
|
||||||
|
Loading…
Reference in New Issue
Block a user