From: Junio C Hamano <junkio@cox.net>
Date: Sun, 24 Jul 2005 00:54:03 +0000 (-0700)
Subject: [PATCH] git-peek-remote: show tags and heads from a remote repository.
X-Git-Tag: v0.99.2~17
X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/18705953af75aed190badfccdc107ad0c2f36c93

[PATCH] git-peek-remote: show tags and heads from a remote repository.

Add a git-peek-remote command that talks with upload-pack the
same way git-fetch-pack and git-clone-pack do, to show the
references the remote side has on the standard output.

A later patch introduces git-ls-remote that implements a UI to
store tag values retrieved using this command.

Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
---

diff --git a/Makefile b/Makefile
index d440f82967..e4df945fbc 100644
--- a/Makefile
+++ b/Makefile
@@ -49,7 +49,7 @@ PROG=   git-update-cache git-diff-files git-init-db git-write-tree \
 	git-diff-stages git-rev-parse git-patch-id git-pack-objects \
 	git-unpack-objects git-verify-pack git-receive-pack git-send-pack \
 	git-prune-packed git-fetch-pack git-upload-pack git-clone-pack \
-	git-show-index git-daemon git-var
+	git-show-index git-daemon git-var git-peek-remote
 
 all: $(PROG)
 
@@ -150,6 +150,7 @@ git-send-pack: send-pack.c
 git-prune-packed: prune-packed.c
 git-fetch-pack: fetch-pack.c
 git-var: var.c
+git-peek-remote: peek-remote.c
 
 git-http-pull: LIBS += -lcurl
 git-rev-list: LIBS += -lssl
diff --git a/peek-remote.c b/peek-remote.c
new file mode 100644
index 0000000000..4b1d0d5ba8
--- /dev/null
+++ b/peek-remote.c
@@ -0,0 +1,55 @@
+#include "cache.h"
+#include "refs.h"
+#include "pkt-line.h"
+#include <sys/wait.h>
+
+static const char peek_remote_usage[] =
+"git-peek-remote [--exec=upload-pack] [host:]directory";
+static const char *exec = "git-upload-pack";
+
+static int peek_remote(int fd[2])
+{
+	struct ref *ref;
+
+	get_remote_heads(fd[0], &ref, 0, NULL);
+	packet_flush(fd[1]);
+
+	while (ref) {
+		printf("%s	%s\n", sha1_to_hex(ref->old_sha1), ref->name);
+		ref = ref->next;
+	}
+	return 0;
+}
+
+int main(int argc, char **argv)
+{
+	int i, ret;
+	char *dest = NULL;
+	int fd[2];
+	pid_t pid;
+
+	for (i = 1; i < argc; i++) {
+		char *arg = argv[i];
+
+		if (*arg == '-') {
+			if (!strncmp("--exec=", arg, 7))
+				exec = arg + 7;
+			else
+				usage(peek_remote_usage);
+			continue;
+		}
+		dest = arg;
+		break;
+	}
+	if (!dest || i != argc - 1)
+		usage(peek_remote_usage);
+
+	pid = git_connect(fd, dest, exec);
+	if (pid < 0)
+		return 1;
+	ret = peek_remote(fd);
+	close(fd[0]);
+	close(fd[1]);
+	finish_connect(pid);
+	return ret;
+}