projects
/
git.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
git-tar-tree: documentation update
[git.git]
/
fetch-pack.c
diff --git
a/fetch-pack.c
b/fetch-pack.c
index
8daa93d
..
7d23a80
100644
(file)
--- a/
fetch-pack.c
+++ b/
fetch-pack.c
@@
-18,6
+18,12
@@
static const char *exec = "git-upload-pack";
#define SEEN (1U << 3)
#define POPPED (1U << 4)
#define SEEN (1U << 3)
#define POPPED (1U << 4)
+/*
+ * After sending this many "have"s if we do not get any new ACK , we
+ * give up traversing our history.
+ */
+#define MAX_IN_VAIN 256
+
static struct commit_list *rev_list = NULL;
static int non_common_revs = 0, multi_ack = 0, use_thin_pack = 0;
static struct commit_list *rev_list = NULL;
static int non_common_revs = 0, multi_ack = 0, use_thin_pack = 0;
@@
-40,7
+46,7
@@
static int rev_list_insert_ref(const char *path, const unsigned char *sha1)
{
struct object *o = deref_tag(parse_object(sha1), path, 0);
{
struct object *o = deref_tag(parse_object(sha1), path, 0);
- if (o && o->type ==
commit_type
)
+ if (o && o->type ==
TYPE_COMMIT
)
rev_list_push((struct commit *)o, SEEN);
return 0;
rev_list_push((struct commit *)o, SEEN);
return 0;
@@
-134,6
+140,8
@@
static int find_common(int fd[2], unsigned char *result_sha1,
int fetching;
int count = 0, flushes = 0, retval;
const unsigned char *sha1;
int fetching;
int count = 0, flushes = 0, retval;
const unsigned char *sha1;
+ unsigned in_vain = 0;
+ int got_continue = 0;
for_each_ref(rev_list_insert_ref);
for_each_ref(rev_list_insert_ref);
@@
-172,6
+180,7
@@
static int find_common(int fd[2], unsigned char *result_sha1,
packet_write(fd[1], "have %s\n", sha1_to_hex(sha1));
if (verbose)
fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
packet_write(fd[1], "have %s\n", sha1_to_hex(sha1));
if (verbose)
fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
+ in_vain++;
if (!(31 & ++count)) {
int ack;
if (!(31 & ++count)) {
int ack;
@@
-200,9
+209,16
@@
static int find_common(int fd[2], unsigned char *result_sha1,
lookup_commit(result_sha1);
mark_common(commit, 0, 1);
retval = 0;
lookup_commit(result_sha1);
mark_common(commit, 0, 1);
retval = 0;
+ in_vain = 0;
+ got_continue = 1;
}
} while (ack);
flushes--;
}
} while (ack);
flushes--;
+ if (got_continue && MAX_IN_VAIN < in_vain) {
+ if (verbose)
+ fprintf(stderr, "giving up\n");
+ break; /* give up */
+ }
}
}
done:
}
}
done:
@@
-235,14
+251,14
@@
static int mark_complete(const char *path, const unsigned char *sha1)
{
struct object *o = parse_object(sha1);
{
struct object *o = parse_object(sha1);
- while (o && o->type ==
tag_type
) {
+ while (o && o->type ==
TYPE_TAG
) {
struct tag *t = (struct tag *) o;
if (!t->tagged)
break; /* broken repository */
o->flags |= COMPLETE;
o = parse_object(t->tagged->sha1);
}
struct tag *t = (struct tag *) o;
if (!t->tagged)
break; /* broken repository */
o->flags |= COMPLETE;
o = parse_object(t->tagged->sha1);
}
- if (o && o->type ==
commit_type
) {
+ if (o && o->type ==
TYPE_COMMIT
) {
struct commit *commit = (struct commit *)o;
commit->object.flags |= COMPLETE;
insert_by_date(commit, &complete);
struct commit *commit = (struct commit *)o;
commit->object.flags |= COMPLETE;
insert_by_date(commit, &complete);
@@
-336,7
+352,7
@@
static int everything_local(struct ref **refs, int nr_match, char **match)
* in sync with the other side at some time after
* that (it is OK if we guess wrong here).
*/
* in sync with the other side at some time after
* that (it is OK if we guess wrong here).
*/
- if (o->type ==
commit_type
) {
+ if (o->type ==
TYPE_COMMIT
) {
struct commit *commit = (struct commit *)o;
if (!cutoff || cutoff < commit->date)
cutoff = commit->date;
struct commit *commit = (struct commit *)o;
if (!cutoff || cutoff < commit->date)
cutoff = commit->date;
@@
-355,7
+371,7
@@
static int everything_local(struct ref **refs, int nr_match, char **match)
struct object *o = deref_tag(lookup_object(ref->old_sha1),
NULL, 0);
struct object *o = deref_tag(lookup_object(ref->old_sha1),
NULL, 0);
- if (!o || o->type !=
commit_type
|| !(o->flags & COMPLETE))
+ if (!o || o->type !=
TYPE_COMMIT
|| !(o->flags & COMPLETE))
continue;
if (!(o->flags & SEEN)) {
continue;
if (!(o->flags & SEEN)) {