[PATCH] git-branch: avoid getting confused by empty or nonexisting branches.
[gitweb.git] / connect.c
index f01b547574636d109f14c791287e6f4e52502de2..6bf737cbfa1c243b209d90b0198c5e6d37a503c2 100644 (file)
--- a/connect.c
+++ b/connect.c
@@ -7,6 +7,41 @@
 #include <arpa/inet.h>
 #include <netdb.h>
 
+/*
+ * Read all the refs from the other end
+ */
+struct ref **get_remote_heads(int in, struct ref **list, int nr_match, char **match)
+{
+       *list = NULL;
+       for (;;) {
+               struct ref *ref;
+               unsigned char old_sha1[20];
+               static char buffer[1000];
+               char *name;
+               int len;
+
+               len = packet_read_line(in, buffer, sizeof(buffer));
+               if (!len)
+                       break;
+               if (buffer[len-1] == '\n')
+                       buffer[--len] = 0;
+
+               if (len < 42 || get_sha1_hex(buffer, old_sha1) || buffer[40] != ' ')
+                       die("protocol error: expected sha/ref, got '%s'", buffer);
+               name = buffer + 41;
+               if (nr_match && !path_match(name, nr_match, match))
+                       continue;
+               ref = xmalloc(sizeof(*ref) + len - 40);
+               memcpy(ref->old_sha1, old_sha1, 20);
+               memset(ref->new_sha1, 0, 20);
+               memcpy(ref->name, buffer + 41, len - 40);
+               ref->next = NULL;
+               *list = ref;
+               list = &ref->next;
+       }
+       return list;
+}
+
 int get_ack(int fd, unsigned char *result_sha1)
 {
        static char line[1000];