aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xgit-pull.sh3
-rw-r--r--sha1_name.c21
-rw-r--r--ssh-fetch.c28
-rw-r--r--symbolic-ref.c2
4 files changed, 45 insertions, 9 deletions
diff --git a/git-pull.sh b/git-pull.sh
index 0290e517c..d4765188b 100755
--- a/git-pull.sh
+++ b/git-pull.sh
@@ -32,7 +32,8 @@ do
strategy_args="${strategy_args}-s $strategy "
;;
-*)
- usage
+ # Pass thru anything that is meant for fetch.
+ break
;;
esac
shift
diff --git a/sha1_name.c b/sha1_name.c
index 8920de1c4..f64755fbc 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -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;
diff --git a/ssh-fetch.c b/ssh-fetch.c
index 05d3e49f2..bf01fbc00 100644
--- a/ssh-fetch.c
+++ b/ssh-fetch.c
@@ -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];
diff --git a/symbolic-ref.c b/symbolic-ref.c
index af087d211..a72d7accb 100644
--- a/symbolic-ref.c
+++ b/symbolic-ref.c
@@ -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));