Merge branch 'fixes'
authorJunio C Hamano <junkio@cox.net>
Tue, 4 Oct 2005 04:57:35 +0000 (21:57 -0700)
committerJunio C Hamano <junkio@cox.net>
Tue, 4 Oct 2005 04:57:35 +0000 (21:57 -0700)
git-pull.sh
sha1_name.c
ssh-fetch.c
symbolic-ref.c

index 0290e51..d476518 100755 (executable)
@@ -32,7 +32,8 @@ do
                strategy_args="${strategy_args}-s $strategy "
                ;;
        -*)
-               usage
+               # Pass thru anything that is meant for fetch.
+               break
                ;;
        esac
        shift
index 8920de1..f64755f 100644 (file)
@@ -91,14 +91,23 @@ static int find_short_packed_object(int len, const unsigned char *match, unsigne
                        last = mid;
                }
                if (first < num) {
-                       unsigned char now[20];
+                       unsigned char now[20], next[20];
                        nth_packed_object_sha1(p, first, now);
                        if (match_sha(len, match, now)) {
-                               if (!found) {
-                                       memcpy(found_sha1, now, 20);
-                                       found++;
+                               if (nth_packed_object_sha1(p, first+1, next) ||
+                                   !match_sha(len, match, next)) {
+                                       /* unique within this pack */
+                                       if (!found) {
+                                               memcpy(found_sha1, now, 20);
+                                               found++;
+                                       }
+                                       else if (memcmp(found_sha1, now, 20)) {
+                                               found = 2;
+                                               break;
+                                       }
                                }
-                               else if (memcmp(found_sha1, now, 20)) {
+                               else {
+                                       /* not even unique within this pack */
                                        found = 2;
                                        break;
                                }
@@ -121,7 +130,7 @@ static int find_unique_short_object(int len, char *canonical,
        if (!has_unpacked && !has_packed)
                return -1;
        if (1 < has_unpacked || 1 < has_packed)
-               return -1;
+               return error("short SHA1 %.*s is ambiguous.", len, canonical);
        if (has_unpacked != has_packed) {
                memcpy(sha1, (has_packed ? packed_sha1 : unpacked_sha1), 20);
                return 0;
index 05d3e49..bf01fbc 100644 (file)
@@ -36,12 +36,26 @@ static ssize_t force_write(int fd, void *buffer, size_t length)
        return ret;
 }
 
+static int prefetches = 0;
+
+static struct object_list *in_transit = NULL;
+static struct object_list **end_of_transit = &in_transit;
+
 void prefetch(unsigned char *sha1)
 {
        char type = 'o';
+       struct object_list *node;
+       if (prefetches > 100) {
+               fetch(in_transit->item->sha1);
+       }
+       node = xmalloc(sizeof(struct object_list));
+       node->next = NULL;
+       node->item = lookup_unknown_object(sha1);
+       *end_of_transit = node;
+       end_of_transit = &node->next;
        force_write(fd_out, &type, 1);
        force_write(fd_out, sha1, 20);
-       //memcpy(requested + 20 * prefetches++, sha1, 20);
+       prefetches++;
 }
 
 static char conn_buf[4096];
@@ -51,6 +65,18 @@ int fetch(unsigned char *sha1)
 {
        int ret;
        signed char remote;
+       struct object_list *temp;
+
+       if (memcmp(sha1, in_transit->item->sha1, 20)) {
+               // we must have already fetched it to clean the queue
+               return has_sha1_file(sha1) ? 0 : -1;
+       }
+       prefetches--;
+       temp = in_transit;
+       in_transit = in_transit->next;
+       if (!in_transit)
+               end_of_transit = &in_transit;
+       free(temp);
 
        if (conn_buf_posn) {
                remote = conn_buf[0];
index af087d2..a72d7ac 100644 (file)
@@ -3,7 +3,7 @@
 static const char git_symbolic_ref_usage[] =
 "git-symbolic-ref name [ref]";
 
-static int check_symref(const char *HEAD)
+static void check_symref(const char *HEAD)
 {
        unsigned char sha1[20];
        const char *git_HEAD = strdup(git_path("%s", HEAD));