From: "Torsten Bögershausen" <tboegi@web.de>
To: git@vger.kernel.org
Cc: tboegi@web.de
Subject: [PATCH v6 05/10] git fetch-pack: Add --diag-url
Date: Thu, 21 Nov 2013 21:40:48 +0100 [thread overview]
Message-ID: <201311212140.49698.tboegi@web.de> (raw)
The main purpose is to trace the URL parser called by git_connect() in
connect.c
The main features of the parser can be listed as this:
- parse out host and path for URLs with a scheme (git:// file:// ssh://)
- parse host names embedded by [] correctly
- extract the port number, if present
- seperate URLs like "file" (which are local)
from URLs like "host:repo" which should use ssh
Add the new parameter "--diag-url" to "git fetch-pack",
which prints the value for protocol, host and path to stderr and exits.
---
builtin/fetch-pack.c | 14 ++++++++++---
connect.c | 27 ++++++++++++++++++++++++
connect.h | 1 +
fetch-pack.h | 1 +
t/t5500-fetch-pack.sh | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 97 insertions(+), 3 deletions(-)
diff --git a/builtin/fetch-pack.c b/builtin/fetch-pack.c
index c8e8582..758b5ac 100644
--- a/builtin/fetch-pack.c
+++ b/builtin/fetch-pack.c
@@ -7,7 +7,7 @@
static const char fetch_pack_usage[] =
"git fetch-pack [--all] [--stdin] [--quiet|-q] [--keep|-k] [--thin] "
"[--include-tag] [--upload-pack=<git-upload-pack>] [--depth=<n>] "
-"[--no-progress] [-v] [<host>:]<directory> [<refs>...]";
+"[--no-progress] [--diag-url] [-v] [<host>:]<directory> [<refs>...]";
static void add_sought_entry_mem(struct ref ***sought, int *nr, int *alloc,
const char *name, int namelen)
@@ -81,6 +81,10 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
args.stdin_refs = 1;
continue;
}
+ if (!strcmp("--diag-url", arg)) {
+ args.diag_url = 1;
+ continue;
+ }
if (!strcmp("-v", arg)) {
args.verbose = 1;
continue;
@@ -146,10 +150,14 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
fd[0] = 0;
fd[1] = 1;
} else {
+ int flags = args.verbose ? CONNECT_VERBOSE : 0;
+ if (args.diag_url)
+ flags |= CONNECT_DIAG_URL;
conn = git_connect(fd, dest, args.uploadpack,
- args.verbose ? CONNECT_VERBOSE : 0);
+ flags);
+ if (!conn)
+ return args.diag_url ? 0 : 1;
}
-
get_remote_heads(fd[0], NULL, 0, &ref, 0, NULL);
ref = fetch_pack(&args, fd, conn, ref, dest,
diff --git a/connect.c b/connect.c
index a6cf345..1b93b4d 100644
--- a/connect.c
+++ b/connect.c
@@ -236,6 +236,19 @@ enum protocol {
PROTO_GIT
};
+static const char *prot_name(enum protocol protocol) {
+ switch (protocol) {
+ case PROTO_LOCAL:
+ return "file";
+ case PROTO_SSH:
+ return "ssh";
+ case PROTO_GIT:
+ return "git";
+ default:
+ return "unkown protocol";
+ }
+}
+
static enum protocol get_protocol(const char *name)
{
if (!strcmp(name, "ssh"))
@@ -670,6 +683,20 @@ struct child_process *git_connect(int fd[2], const char *url,
signal(SIGCHLD, SIG_DFL);
protocol = parse_connect_url(url, &host, &port, &path);
+ if (flags & CONNECT_DIAG_URL) {
+ fprintf(stderr, "Diag: url=%s\n", url ? url : "NULL");
+ fprintf(stderr, "Diag: protocol=%s\n", prot_name(protocol));
+ fprintf(stderr, "Diag: host=%s", host ? host : "NULL");
+ if (port)
+ fprintf(stderr, ":%s\n", port);
+ else
+ fprintf(stderr, "\n");
+ fprintf(stderr, "Diag: path=%s\n", path ? path : "NULL");
+ free(host);
+ free(port);
+ free(path);
+ return NULL;
+ }
if (protocol == PROTO_GIT) {
/* These underlying connection commands die() if they
diff --git a/connect.h b/connect.h
index 64fb7db..527d58a 100644
--- a/connect.h
+++ b/connect.h
@@ -2,6 +2,7 @@
#define CONNECT_H
#define CONNECT_VERBOSE (1u << 0)
+#define CONNECT_DIAG_URL (1u << 1)
extern struct child_process *git_connect(int fd[2], const char *url, const char *prog, int flags);
extern int finish_connect(struct child_process *conn);
extern int git_connection_is_socket(struct child_process *conn);
diff --git a/fetch-pack.h b/fetch-pack.h
index 461cbf3..20ccc12 100644
--- a/fetch-pack.h
+++ b/fetch-pack.h
@@ -14,6 +14,7 @@ struct fetch_pack_args {
use_thin_pack:1,
fetch_all:1,
stdin_refs:1,
+ diag_url:1,
verbose:1,
no_progress:1,
include_tag:1,
diff --git a/t/t5500-fetch-pack.sh b/t/t5500-fetch-pack.sh
index d87ddf7..9136f2a 100755
--- a/t/t5500-fetch-pack.sh
+++ b/t/t5500-fetch-pack.sh
@@ -531,5 +531,62 @@ test_expect_success 'shallow fetch with tags does not break the repository' '
git fsck
)
'
+check_prot_path() {
+ > actual &&
+ (git fetch-pack --diag-url "$1" 2>&1 1>stdout) | grep -v host= >actual &&
+ echo "Diag: url=$1" >expected &&
+ echo "Diag: protocol=$2" >>expected &&
+ echo "Diag: path=$3" >>expected &&
+ test_cmp expected actual
+}
+
+check_prot_host_path() {
+ > actual &&
+ git fetch-pack --diag-url "$1" 2>actual &&
+ echo "Diag: url=$1" >expected &&
+ echo "Diag: protocol=$2" >>expected &&
+ echo "Diag: host=$3" >>expected &&
+ echo "Diag: path=$4" >>expected &&
+ test_cmp expected actual
+}
+
+for r in repo re:po re/po
+do
+ # git or ssh with scheme
+ for p in "ssh+git" "git+ssh" git ssh
+ do
+ for h in host host:12 [::1] [::1]:23
+ do
+ if $(echo $p | grep ssh >/dev/null 2>/dev/null); then
+ hh=$(echo $h | tr -d "[]")
+ pp=ssh
+ else
+ hh=$h
+ pp=$p
+ fi
+ test_expect_success "fetch-pack $p://$h/$r" '
+ check_prot_host_path $p://$h/$r $pp "$hh" "/$r"
+ '
+ # "/~" -> "~" conversion for git
+ test_expect_success "fetch-pack $p://$h/~$r" '
+ check_prot_host_path $p://$h/~$r $pp "$hh" "~$r"
+ '
+ done
+ done
+ # file with scheme
+ for p in file
+ do
+ for h in "" host host:12 [::1] [::1]:23
+ do
+ test_expect_success "fetch-pack $p://$h/$r" '
+ check_prot_path $p://$h/$r $p "/$r"
+ '
+ # No "/~" -> "~" conversion for file
+ test_expect_success "fetch-pack $p://$h/~$r" '
+ check_prot_path $p://$h/~$r $p "/~$r"
+ '
+ done
+ done
+done
test_done
--
1.8.4.457.g424cb08
next reply other threads:[~2013-11-21 20:41 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-21 20:40 Torsten Bögershausen [this message]
2013-11-21 22:46 ` [PATCH v6 05/10] git fetch-pack: Add --diag-url Junio C Hamano
2013-11-22 12:56 ` SZEDER Gábor
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=201311212140.49698.tboegi@web.de \
--to=tboegi@web.de \
--cc=git@vger.kernel.org \
/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).