Merge branch 'fixes'

This commit is contained in:
Junio C Hamano 2005-10-03 21:57:35 -07:00
commit 144c83f687
4 changed files with 45 additions and 9 deletions

View File

@ -32,7 +32,8 @@ do
strategy_args="${strategy_args}-s $strategy " strategy_args="${strategy_args}-s $strategy "
;; ;;
-*) -*)
usage # Pass thru anything that is meant for fetch.
break
;; ;;
esac esac
shift shift

View File

@ -91,14 +91,23 @@ static int find_short_packed_object(int len, const unsigned char *match, unsigne
last = mid; last = mid;
} }
if (first < num) { if (first < num) {
unsigned char now[20]; unsigned char now[20], next[20];
nth_packed_object_sha1(p, first, now); nth_packed_object_sha1(p, first, now);
if (match_sha(len, match, now)) { if (match_sha(len, match, now)) {
if (!found) { if (nth_packed_object_sha1(p, first+1, next) ||
memcpy(found_sha1, now, 20); !match_sha(len, match, next)) {
found++; /* 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; found = 2;
break; break;
} }
@ -121,7 +130,7 @@ static int find_unique_short_object(int len, char *canonical,
if (!has_unpacked && !has_packed) if (!has_unpacked && !has_packed)
return -1; return -1;
if (1 < has_unpacked || 1 < has_packed) if (1 < has_unpacked || 1 < has_packed)
return -1; return error("short SHA1 %.*s is ambiguous.", len, canonical);
if (has_unpacked != has_packed) { if (has_unpacked != has_packed) {
memcpy(sha1, (has_packed ? packed_sha1 : unpacked_sha1), 20); memcpy(sha1, (has_packed ? packed_sha1 : unpacked_sha1), 20);
return 0; return 0;

View File

@ -36,12 +36,26 @@ static ssize_t force_write(int fd, void *buffer, size_t length)
return ret; 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) void prefetch(unsigned char *sha1)
{ {
char type = 'o'; 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, &type, 1);
force_write(fd_out, sha1, 20); force_write(fd_out, sha1, 20);
//memcpy(requested + 20 * prefetches++, sha1, 20); prefetches++;
} }
static char conn_buf[4096]; static char conn_buf[4096];
@ -51,6 +65,18 @@ int fetch(unsigned char *sha1)
{ {
int ret; int ret;
signed char remote; 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) { if (conn_buf_posn) {
remote = conn_buf[0]; remote = conn_buf[0];

View File

@ -3,7 +3,7 @@
static const char git_symbolic_ref_usage[] = static const char git_symbolic_ref_usage[] =
"git-symbolic-ref name [ref]"; "git-symbolic-ref name [ref]";
static int check_symref(const char *HEAD) static void check_symref(const char *HEAD)
{ {
unsigned char sha1[20]; unsigned char sha1[20];
const char *git_HEAD = strdup(git_path("%s", HEAD)); const char *git_HEAD = strdup(git_path("%s", HEAD));