Add a config option for remotes to specify a foreign vcs
authorDaniel Barkalow <barkalow@iabervon.org>
Wed, 18 Nov 2009 01:42:25 +0000 (02:42 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 18 Nov 2009 05:45:44 +0000 (21:45 -0800)
If this is set, the url is not required, and the transport always uses
a helper named "git-remote-<value>".

It is a separate configuration option in order to allow a sensible
configuration for foreign systems which either have no meaningful urls
for repositories or which require urls that do not specify the system
used by the repository at that location. However, this only affects
how the name of the helper is determined, not anything about the
interaction with the helper, and the contruction is such that, if the
foreign scm does happen to use a co-named url method, a url with that
method may be used directly.

Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Sverre Rabbelier <srabbelier@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config.txt
remote.c
remote.h
transport.c

index d1e2120e15b37a14eec5b3d1de9752da8f6ad7af..0d9d369ca7637c0c2b9d4130a470b70b35143dae 100644 (file)
@@ -1408,6 +1408,10 @@ remote.<name>.tagopt::
        Setting this value to \--no-tags disables automatic tag following when
        fetching from remote <name>
 
+remote.<name>.vcs::
+       Setting this to a value <vcs> will cause git to interact with
+       the remote with the git-remote-<vcs> helper.
+
 remotes.<group>::
        The list of remotes which are fetched by "git remote update
        <group>".  See linkgit:git-remote[1].
index 15c9cec60ba352a729171381182d4c98eff0bf30..09bb79c22c00a0fe3234218136ba1a6e970078cc 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -54,7 +54,7 @@ static char buffer[BUF_SIZE];
 
 static int valid_remote(const struct remote *remote)
 {
-       return !!remote->url;
+       return (!!remote->url) || (!!remote->foreign_vcs);
 }
 
 static const char *alias_url(const char *url, struct rewrites *r)
@@ -444,6 +444,8 @@ static int handle_config(const char *key, const char *value, void *cb)
        } else if (!strcmp(subkey, ".proxy")) {
                return git_config_string((const char **)&remote->http_proxy,
                                         key, value);
+       } else if (!strcmp(subkey, ".vcs")) {
+               return git_config_string(&remote->foreign_vcs, key, value);
        }
        return 0;
 }
index 5db842087da081abbad96c8f9eed5829140714d2..ac0ce2ff9cb1e787bbb231d2b5d9e9d2cfb2777d 100644 (file)
--- a/remote.h
+++ b/remote.h
@@ -11,6 +11,8 @@ struct remote {
        const char *name;
        int origin;
 
+       const char *foreign_vcs;
+
        const char **url;
        int url_nr;
        int url_alloc;
index 5ae8db6335ee9dc75b39065c27f9fa3cb3d09d9e..13bab4e2a1d95e09b04f4c76247d302522c017d1 100644 (file)
@@ -818,6 +818,11 @@ struct transport *transport_get(struct remote *remote, const char *url)
                url = remote->url[0];
        ret->url = url;
 
+       if (remote && remote->foreign_vcs) {
+               transport_helper_init(ret, remote->foreign_vcs);
+               return ret;
+       }
+
        if (!prefixcmp(url, "rsync:")) {
                ret->get_refs_list = get_refs_via_rsync;
                ret->fetch = fetch_objs_via_rsync;