fd[0] = 0;
fd[1] = 1;
} else {
+ int flags = args.verbose ? CONNECT_VERBOSE : 0;
+ if (args.diag_url)
+ flags |= CONNECT_DIAG_URL;
conn = git_connect(fd, dest, args.uploadpack,
- args.verbose ? CONNECT_VERBOSE : 0);
+ flags);
+ if (!conn)
+ return args.diag_url ? 0 : 1;
}
- get_remote_heads(fd[0], NULL, 0, &ref, 0, NULL);
-
+ get_remote_heads(fd[0], NULL, 0, &ref, 0, NULL, &shallow);
- ref = fetch_pack(&args, fd, conn, ref, dest,
- sought, nr_sought, pack_lockfile_ptr);
+ ref = fetch_pack(&args, fd, conn, ref, dest, sought, nr_sought,
+ &shallow, pack_lockfile_ptr);
if (pack_lockfile) {
printf("lock %s\n", pack_lockfile);
fflush(stdout);
line = packet_read_line(0, &len);
if (!line)
break;
- if (len == 48 && !prefixcmp(line, "shallow ")) {
+
++ if (len == 48 && starts_with(line, "shallow ")) {
+ if (get_sha1_hex(line + 8, old_sha1))
+ die("protocol error: expected shallow sha, got '%s'", line + 8);
+ sha1_array_append(shallow, old_sha1);
+ continue;
+ }
+
if (len < 83 ||
line[40] != ' ' ||
line[81] != ' ' ||
if (!len)
break;
- if (len > 4 && !prefixcmp(buffer, "ERR "))
+ if (len > 4 && starts_with(buffer, "ERR "))
die("remote error: %s", buffer + 4);
- if (len == 48 && !prefixcmp(buffer, "shallow ")) {
++ if (len == 48 && starts_with(buffer, "shallow ")) {
+ if (get_sha1_hex(buffer + 8, old_sha1))
+ die("protocol error: expected shallow sha-1, got '%s'", buffer + 8);
+ if (!shallow_points)
+ die("repository on the other end cannot be shallow");
+ sha1_array_append(shallow_points, old_sha1);
+ continue;
+ }
+
if (len < 42 || get_sha1_hex(buffer, old_sha1) || buffer[40] != ' ')
die("protocol error: expected sha/ref, got '%s'", buffer);
name = buffer + 41;
const char *uploadpack;
int unpacklimit;
int depth;
- unsigned quiet:1,
- keep_pack:1,
- lock_pack:1,
- use_thin_pack:1,
- fetch_all:1,
- stdin_refs:1,
- diag_url:1,
- verbose:1,
- no_progress:1,
- include_tag:1,
- stateless_rpc:1,
- check_self_contained_and_connected:1,
- self_contained_and_connected:1;
+ unsigned quiet:1;
+ unsigned keep_pack:1;
+ unsigned lock_pack:1;
+ unsigned use_thin_pack:1;
+ unsigned fetch_all:1;
+ unsigned stdin_refs:1;
++ unsigned diag_url:1;
+ unsigned verbose:1;
+ unsigned no_progress:1;
+ unsigned include_tag:1;
+ unsigned stateless_rpc:1;
+ unsigned check_self_contained_and_connected:1;
+ unsigned self_contained_and_connected:1;
+ unsigned cloning:1;
+ unsigned update_shallow:1;
};
/*
cur_depth = *(int *)commit->util;
}
}
- if (parse_commit(commit))
- die("invalid commit");
+ parse_commit_or_die(commit);
cur_depth++;
- if (cur_depth >= depth) {
+ if ((depth != INFINITE_DEPTH && cur_depth >= depth) ||
+ (is_repository_shallow() && !commit->parents &&
+ (graft = lookup_commit_graft(commit->object.sha1)) != NULL &&
+ graft->nr_parent < 0)) {
commit_list_insert(commit, &result);
commit->object.flags |= shallow_flag;
commit = NULL;