diff options
-rw-r--r-- | Documentation/git-http-pull.txt | 6 | ||||
-rw-r--r-- | Documentation/git-local-pull.txt | 6 | ||||
-rw-r--r-- | Documentation/git-rpull.txt | 6 | ||||
-rw-r--r-- | cache.h | 1 | ||||
-rw-r--r-- | http-pull.c | 4 | ||||
-rw-r--r-- | local-pull.c | 4 | ||||
-rw-r--r-- | pull.c | 7 | ||||
-rw-r--r-- | pull.h | 3 | ||||
-rw-r--r-- | rpull.c | 4 | ||||
-rw-r--r-- | sha1_file.c | 31 |
10 files changed, 66 insertions, 6 deletions
diff --git a/Documentation/git-http-pull.txt b/Documentation/git-http-pull.txt index 59cd090a78..8b54f09c22 100644 --- a/Documentation/git-http-pull.txt +++ b/Documentation/git-http-pull.txt @@ -9,7 +9,7 @@ git-http-pull - Downloads a remote GIT repository via HTTP SYNOPSIS -------- -'git-http-pull' [-c] [-t] [-a] [-v] commit-id url +'git-http-pull' [-c] [-t] [-a] [-v] [-d] commit-id url DESCRIPTION ----------- @@ -21,6 +21,10 @@ Downloads a remote GIT repository via HTTP. Get trees associated with the commit objects. -a:: Get all the objects. +-d:: + Do not check for delta base objects (use this option + only when you know the remote repository is not + deltified). -v:: Report what is downloaded. diff --git a/Documentation/git-local-pull.txt b/Documentation/git-local-pull.txt index 53f5d39682..79d0f5c28f 100644 --- a/Documentation/git-local-pull.txt +++ b/Documentation/git-local-pull.txt @@ -9,7 +9,7 @@ git-local-pull - Duplicates another GIT repository on a local system SYNOPSIS -------- -'git-local-pull' [-c] [-t] [-a] [-l] [-s] [-n] [-v] commit-id path +'git-local-pull' [-c] [-t] [-a] [-l] [-s] [-n] [-v] [-d] commit-id path DESCRIPTION ----------- @@ -23,6 +23,10 @@ OPTIONS Get trees associated with the commit objects. -a:: Get all the objects. +-d:: + Do not check for delta base objects (use this option + only when you know the remote repository is not + deltified). -v:: Report what is downloaded. diff --git a/Documentation/git-rpull.txt b/Documentation/git-rpull.txt index 1807fc571a..3a8386629b 100644 --- a/Documentation/git-rpull.txt +++ b/Documentation/git-rpull.txt @@ -10,7 +10,7 @@ git-rpull - Pulls from a remote repository over ssh connection SYNOPSIS -------- -'git-rpull' [-c] [-t] [-a] [-v] commit-id url +'git-rpull' [-c] [-t] [-a] [-d] [-v] commit-id url DESCRIPTION ----------- @@ -25,6 +25,10 @@ OPTIONS Get trees associated with the commit objects. -a:: Get all the objects. +-d:: + Do not check for delta base objects (use this option + only when you know the remote repository is not + deltified). -v:: Report what is downloaded. @@ -153,6 +153,7 @@ extern char *sha1_file_name(const unsigned char *sha1); extern void * map_sha1_file(const unsigned char *sha1, unsigned long *size); extern int unpack_sha1_header(z_stream *stream, void *map, unsigned long mapsize, void *buffer, unsigned long size); extern int parse_sha1_header(char *hdr, char *type, unsigned long *sizep); +extern int sha1_delta_base(const unsigned char *, unsigned char *); extern void * unpack_sha1_file(void *map, unsigned long mapsize, char *type, unsigned long *size); extern void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size); extern int write_sha1_file(void *buf, unsigned long len, const char *type, unsigned char *return_sha1); diff --git a/http-pull.c b/http-pull.c index ba8585cfd4..551663e492 100644 --- a/http-pull.c +++ b/http-pull.c @@ -103,6 +103,8 @@ int main(int argc, char **argv) get_tree = 1; } else if (argv[arg][1] == 'c') { get_history = 1; + } else if (argv[arg][1] == 'd') { + get_delta = 0; } else if (argv[arg][1] == 'a') { get_all = 1; get_tree = 1; @@ -113,7 +115,7 @@ int main(int argc, char **argv) arg++; } if (argc < arg + 2) { - usage("git-http-pull [-c] [-t] [-a] [-v] commit-id url"); + usage("git-http-pull [-c] [-t] [-a] [-d] [-v] commit-id url"); return 1; } commit_id = argv[arg]; diff --git a/local-pull.c b/local-pull.c index 10d4ca8905..e5d834ff2f 100644 --- a/local-pull.c +++ b/local-pull.c @@ -74,7 +74,7 @@ int fetch(unsigned char *sha1) } static const char *local_pull_usage = -"git-local-pull [-c] [-t] [-a] [-l] [-s] [-n] [-v] commit-id path"; +"git-local-pull [-c] [-t] [-a] [-l] [-s] [-n] [-v] [-d] commit-id path"; /* * By default we only use file copy. @@ -92,6 +92,8 @@ int main(int argc, char **argv) get_tree = 1; else if (argv[arg][1] == 'c') get_history = 1; + else if (argv[arg][1] == 'd') + get_delta = 0; else if (argv[arg][1] == 'a') { get_all = 1; get_tree = 1; @@ -6,6 +6,7 @@ int get_tree = 0; int get_history = 0; +int get_delta = 1; int get_all = 0; int get_verbosely = 0; static unsigned char current_commit_sha1[20]; @@ -37,6 +38,12 @@ static int make_sure_we_have_it(const char *what, unsigned char *sha1) status = fetch(sha1); if (status && what) report_missing(what, sha1); + if (get_delta) { + char delta_sha1[20]; + status = sha1_delta_base(sha1, delta_sha1); + if (0 < status) + status = make_sure_we_have_it(what, delta_sha1); + } return status; } @@ -13,6 +13,9 @@ extern int get_history; /** Set to fetch the trees in the commit history. **/ extern int get_all; +/* Set to zero to skip the check for delta object base. */ +extern int get_delta; + /* Set to be verbose */ extern int get_verbosely; @@ -27,6 +27,8 @@ int main(int argc, char **argv) get_tree = 1; } else if (argv[arg][1] == 'c') { get_history = 1; + } else if (argv[arg][1] == 'd') { + get_delta = 0; } else if (argv[arg][1] == 'a') { get_all = 1; get_tree = 1; @@ -37,7 +39,7 @@ int main(int argc, char **argv) arg++; } if (argc < arg + 2) { - usage("git-rpull [-c] [-t] [-a] [-v] commit-id url"); + usage("git-rpull [-c] [-t] [-a] [-v] [-d] commit-id url"); return 1; } commit_id = argv[arg]; diff --git a/sha1_file.c b/sha1_file.c index af39e8860e..ccfcca07c7 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -401,6 +401,37 @@ void * unpack_sha1_file(void *map, unsigned long mapsize, char *type, unsigned l return unpack_sha1_rest(&stream, hdr, *size); } +int sha1_delta_base(const unsigned char *sha1, unsigned char *base_sha1) +{ + int ret; + unsigned long mapsize, size; + void *map; + z_stream stream; + char hdr[64], type[20]; + void *delta_data_head; + + map = map_sha1_file(sha1, &mapsize); + if (!map) + return -1; + ret = unpack_sha1_header(&stream, map, mapsize, hdr, sizeof(hdr)); + if (ret < Z_OK || parse_sha1_header(hdr, type, &size) < 0) { + ret = -1; + goto out; + } + if (strcmp(type, "delta")) { + ret = 0; + goto out; + } + + delta_data_head = hdr + strlen(hdr) + 1; + ret = 1; + memcpy(base_sha1, delta_data_head, 20); + out: + inflateEnd(&stream); + munmap(map, mapsize); + return ret; +} + void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size) { unsigned long mapsize; |