@ -11,8 +11,9 @@ static int keep_pack;
@@ -11,8 +11,9 @@ static int keep_pack;
static int quiet;
static int verbose;
static int fetch_all;
static int depth;
static const char fetch_pack_usage[] =
"git-fetch-pack [--all] [-q] [-v] [-k] [--thin] [--exec=upload-pack] [host:]directory <refs>...";
"git-fetch-pack [--all] [-q] [-v] [-k] [--thin] [--exec=upload-pack] [--depth=<n>] [host:]directory <refs>...";
static const char *exec = "git-upload-pack";
#define COMPLETE (1U << 0)
@ -182,10 +183,29 @@ static int find_common(int fd[2], unsigned char *result_sha1,
@@ -182,10 +183,29 @@ static int find_common(int fd[2], unsigned char *result_sha1,
}
if (is_repository_shallow())
write_shallow_commits(fd[1], 1);
if (depth > 0)
packet_write(fd[1], "deepen %d", depth);
packet_flush(fd[1]);
if (!fetching)
return 1;
if (depth > 0) {
char line[1024];
unsigned char sha1[20];
int len;
while ((len = packet_read_line(fd[0], line, sizeof(line)))) {
if (!strncmp("shallow ", line, 8)) {
if (get_sha1_hex(line + 8, sha1))
die("invalid shallow line: %s", line);
/* no need making it shallow if we have it already */
if (lookup_object(sha1))
continue;
register_shallow(sha1);
}
}
}
flushes = 0;
retval = -1;
while ((sha1 = get_rev())) {
@ -576,6 +596,8 @@ int main(int argc, char **argv)
@@ -576,6 +596,8 @@ int main(int argc, char **argv)
char *dest = NULL, **heads;
int fd[2];
pid_t pid;
struct stat st;
struct lock_file lock;
setup_git_directory();
@ -609,6 +631,12 @@ int main(int argc, char **argv)
@@ -609,6 +631,12 @@ int main(int argc, char **argv)
verbose = 1;
continue;
}
if (!strncmp("--depth=", arg, 8)) {
depth = strtol(arg + 8, NULL, 0);
if (stat(git_path("shallow"), &st))
st.st_mtime = 0;
continue;
}
usage(fetch_pack_usage);
}
dest = arg;
@ -618,6 +646,8 @@ int main(int argc, char **argv)
@@ -618,6 +646,8 @@ int main(int argc, char **argv)
}
if (!dest)
usage(fetch_pack_usage);
if (is_repository_shallow() && depth > 0)
die("Deepening of a shallow repository not yet supported!");
pid = git_connect(fd, dest, exec);
if (pid < 0)
return 1;
@ -639,5 +669,34 @@ int main(int argc, char **argv)
@@ -639,5 +669,34 @@ int main(int argc, char **argv)
}
}
if (!ret && depth > 0) {
struct cache_time mtime;
char *shallow = git_path("shallow");
int fd;
mtime.sec = st.st_mtime;
#ifdef USE_NSEC
mtime.usec = st.st_mtim.usec;
#endif
if (stat(shallow, &st)) {
if (mtime.sec)
die("shallow file was removed during fetch");
} else if (st.st_mtime != mtime.sec
#ifdef USE_NSEC
|| st.st_mtim.usec != mtime.usec
#endif
)
die("shallow file was changed during fetch");
fd = hold_lock_file_for_update(&lock, shallow, 1);
if (!write_shallow_commits(fd, 0)) {
unlink(lock.filename);
rollback_lock_file(&lock);
} else {
close(fd);
commit_lock_file(&lock);
}
}
return !!ret;
}