From: Johan Herland <johan@herland.net>
To: git@vger.kernel.org
Cc: Daniel Barkalow <barkalow@iabervon.org>,
gitster@pobox.com, Johan Herland <johan@herland.net>
Subject: [RFC 03/11] Allow programs to not depend on remotes having urls
Date: Mon, 27 Jul 2009 03:04:11 +0200 [thread overview]
Message-ID: <1248656659-21415-4-git-send-email-johan@herland.net> (raw)
In-Reply-To: <1248656659-21415-1-git-send-email-johan@herland.net>
From: Daniel Barkalow <barkalow@iabervon.org>
For fetch and ls-remote, which use the first url of a remote, have
transport_get() determine this by passing a remote and passing NULL
for the url. For push, which uses every url of a remote, use each url
in turn if there are any, and use NULL if there are none.
This will allow the transport code to do something different if the
location is not specified with a url.
Also, have the message for a fetch say "foreign" if there is no url.
Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Johan Herland <johan@herland.net>
---
builtin-fetch.c | 19 +++++++++++------
builtin-ls-remote.c | 4 +-
builtin-push.c | 54 +++++++++++++++++++++++++++++++++-----------------
transport.c | 3 ++
4 files changed, 52 insertions(+), 28 deletions(-)
diff --git a/builtin-fetch.c b/builtin-fetch.c
index 817dd6b..3f32db6 100644
--- a/builtin-fetch.c
+++ b/builtin-fetch.c
@@ -346,12 +346,17 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
what = rm->name;
}
- url_len = strlen(url);
- for (i = url_len - 1; url[i] == '/' && 0 <= i; i--)
- ;
- url_len = i + 1;
- if (4 < i && !strncmp(".git", url + i - 3, 4))
- url_len = i - 3;
+ if (url) {
+ url_len = strlen(url);
+ for (i = url_len - 1; url[i] == '/' && 0 <= i; i--)
+ ;
+ url_len = i + 1;
+ if (4 < i && !strncmp(".git", url + i - 3, 4))
+ url_len = i - 3;
+ } else {
+ url = "foriegn";
+ url_len = strlen(url);
+ }
note_len = 0;
if (*what) {
@@ -663,7 +668,7 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
if (!remote)
die("Where do you want to fetch from today?");
- transport = transport_get(remote, remote->url[0]);
+ transport = transport_get(remote, NULL);
if (verbosity >= 2)
transport->verbose = 1;
if (verbosity < 0)
diff --git a/builtin-ls-remote.c b/builtin-ls-remote.c
index 78a88f7..4c6fc58 100644
--- a/builtin-ls-remote.c
+++ b/builtin-ls-remote.c
@@ -87,9 +87,9 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)
}
}
remote = nongit ? NULL : remote_get(dest);
- if (remote && !remote->url_nr)
+ if (!nongit && !remote)
die("remote %s has no configured URL", dest);
- transport = transport_get(remote, remote ? remote->url[0] : dest);
+ transport = transport_get(remote, remote ? NULL : dest);
if (uploadpack != NULL)
transport_set_option(transport, TRANS_OPT_UPLOADPACK, uploadpack);
diff --git a/builtin-push.c b/builtin-push.c
index 1d92e22..ae63521 100644
--- a/builtin-push.c
+++ b/builtin-push.c
@@ -88,6 +88,26 @@ static void setup_default_push_refspecs(void)
}
}
+static int push_with_options(struct transport *transport, int flags)
+{
+ int err;
+ if (receivepack)
+ transport_set_option(transport,
+ TRANS_OPT_RECEIVEPACK, receivepack);
+ if (thin)
+ transport_set_option(transport, TRANS_OPT_THIN, "yes");
+
+ if (flags & TRANSPORT_PUSH_VERBOSE)
+ fprintf(stderr, "Pushing to %s\n", transport->url);
+ err = transport_push(transport, refspec_nr, refspec, flags);
+ err |= transport_disconnect(transport);
+
+ if (!err)
+ return 0;
+
+ return 1;
+}
+
static int do_push(const char *repo, int flags)
{
int i, errs;
@@ -136,26 +156,22 @@ static int do_push(const char *repo, int flags)
url = remote->url;
url_nr = remote->url_nr;
}
- for (i = 0; i < url_nr; i++) {
+ if (url_nr) {
+ for (i = 0; i < url_nr; i++) {
+ struct transport *transport =
+ transport_get(remote, url[i]);
+ if (push_with_options(transport, flags)) {
+ error("failed to push some refs to '%s'", url[i]);
+ errs++;
+ }
+ }
+ } else {
struct transport *transport =
- transport_get(remote, url[i]);
- int err;
- if (receivepack)
- transport_set_option(transport,
- TRANS_OPT_RECEIVEPACK, receivepack);
- if (thin)
- transport_set_option(transport, TRANS_OPT_THIN, "yes");
-
- if (flags & TRANSPORT_PUSH_VERBOSE)
- fprintf(stderr, "Pushing to %s\n", url[i]);
- err = transport_push(transport, refspec_nr, refspec, flags);
- err |= transport_disconnect(transport);
-
- if (!err)
- continue;
-
- error("failed to push some refs to '%s'", url[i]);
- errs++;
+ transport_get(remote, NULL);
+ if (push_with_options(transport, flags)) {
+ error("failed to push some refs to foreign system");
+ errs++;
+ }
}
return !!errs;
}
diff --git a/transport.c b/transport.c
index 13fbca4..2864f40 100644
--- a/transport.c
+++ b/transport.c
@@ -793,6 +793,9 @@ struct transport *transport_get(struct remote *remote, const char *url)
struct transport *ret = xcalloc(1, sizeof(*ret));
ret->remote = remote;
+
+ if (!url && remote && remote->url)
+ url = remote->url[0];
ret->url = url;
if (remote && remote->foreign_vcs) {
--
1.6.4.rc3.138.ga6b98.dirty
next prev parent reply other threads:[~2009-07-27 1:05 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-07-27 1:04 [RFC 00/11] Foreign VCS helper program for CVS repositories Johan Herland
2009-07-27 1:04 ` [RFC 01/11] Add specification of git-vcs-* helper programs Johan Herland
2009-07-27 1:04 ` [RFC 02/11] Use a function to determine whether a remote is valid Johan Herland
2009-07-27 1:04 ` Johan Herland [this message]
2009-07-27 18:55 ` [RFC 03/11] Allow programs to not depend on remotes having urls Junio C Hamano
2009-07-27 19:33 ` Daniel Barkalow
2009-07-29 8:57 ` Alex Riesen
2009-07-30 0:24 ` Johan Herland
2009-07-27 1:04 ` [RFC 04/11] Add a transport implementation using git-vcs-* helpers Johan Herland
2009-07-27 1:04 ` [RFC 05/11] Refactor path name parsing into new function: get_path_str() Johan Herland
2009-07-27 1:04 ` [RFC 06/11] Add support for mark references as path names Johan Herland
2009-07-27 14:12 ` Shawn O. Pearce
2009-07-27 18:26 ` Johan Herland
2009-07-27 18:35 ` Shawn O. Pearce
2009-07-28 1:43 ` [RFC 06/11 v2] fast-import: Add support for importing commit notes Johan Herland
2009-07-29 2:18 ` Junio C Hamano
2009-07-29 2:41 ` Johan Herland
2009-07-29 14:26 ` Shawn O. Pearce
2009-07-29 16:20 ` Junio C Hamano
2009-07-30 0:29 ` Johan Herland
2009-07-30 2:35 ` Junio C Hamano
2009-07-29 18:56 ` Junio C Hamano
2009-07-29 23:08 ` Johan Herland
2009-07-27 1:04 ` [RFC 07/11] Preliminary clarifications to git-vcs documentation Johan Herland
2009-07-27 1:04 ` [RFC 08/11] Teach foreign transport code to perform the "capabilities" command Johan Herland
2009-07-27 1:04 ` [RFC 09/11] Introduce a 'marks <filename>' feature to the foreign transport code Johan Herland
2009-07-27 1:04 ` [RFC 11/11] Add simple test cases of git-vcs-cvs functionality Johan Herland
2009-07-27 17:27 ` [RFC 00/11] Foreign VCS helper program for CVS repositories Daniel Barkalow
2009-07-27 18:11 ` Johan Herland
2009-07-27 18:58 ` Daniel Barkalow
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1248656659-21415-4-git-send-email-johan@herland.net \
--to=johan@herland.net \
--cc=barkalow@iabervon.org \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).