diff options
-rw-r--r-- | Documentation/git-http-pull.txt | 5 | ||||
-rw-r--r-- | Documentation/git-local-pull.txt | 5 | ||||
-rw-r--r-- | Documentation/git-rpull.txt | 5 | ||||
-rw-r--r-- | http-pull.c | 4 | ||||
-rw-r--r-- | local-pull.c | 4 | ||||
-rw-r--r-- | pull.c | 15 | ||||
-rw-r--r-- | pull.h | 4 | ||||
-rw-r--r-- | rpull.c | 4 | ||||
-rw-r--r-- | t/t5100-delta-pull.sh | 79 |
9 files changed, 113 insertions, 12 deletions
diff --git a/Documentation/git-http-pull.txt b/Documentation/git-http-pull.txt index 8b54f09c2..e4b7b3789 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] [-d] commit-id url +'git-http-pull' [-c] [-t] [-a] [-v] [-d] [--recover] commit-id url DESCRIPTION ----------- @@ -25,6 +25,9 @@ Downloads a remote GIT repository via HTTP. Do not check for delta base objects (use this option only when you know the remote repository is not deltified). +--recover:: + Check dependency of deltified object more carefully than + usual, to recover after earlier pull that was interrupted. -v:: Report what is downloaded. diff --git a/Documentation/git-local-pull.txt b/Documentation/git-local-pull.txt index 79d0f5c28..4bc66e77b 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] [-d] commit-id path +'git-local-pull' [-c] [-t] [-a] [-l] [-s] [-n] [-v] [-d] [--recover] commit-id path DESCRIPTION ----------- @@ -27,6 +27,9 @@ OPTIONS Do not check for delta base objects (use this option only when you know the remote repository is not deltified). +--recover:: + Check dependency of deltified object more carefully than + usual, to recover after earlier pull that was interrupted. -v:: Report what is downloaded. diff --git a/Documentation/git-rpull.txt b/Documentation/git-rpull.txt index 3a8386629..a6c40ae97 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] [-d] [-v] commit-id url +'git-rpull' [-c] [-t] [-a] [-d] [-v] [--recover] commit-id url DESCRIPTION ----------- @@ -29,6 +29,9 @@ OPTIONS Do not check for delta base objects (use this option only when you know the remote repository is not deltified). +--recover:: + Check dependency of deltified object more carefully than + usual, to recover after earlier pull that was interrupted. -v:: Report what is downloaded. diff --git a/http-pull.c b/http-pull.c index 551663e49..ec7f66af8 100644 --- a/http-pull.c +++ b/http-pull.c @@ -105,6 +105,8 @@ int main(int argc, char **argv) get_history = 1; } else if (argv[arg][1] == 'd') { get_delta = 0; + } else if (!strcmp(argv[arg], "--recover")) { + get_delta = 2; } else if (argv[arg][1] == 'a') { get_all = 1; get_tree = 1; @@ -115,7 +117,7 @@ int main(int argc, char **argv) arg++; } if (argc < arg + 2) { - usage("git-http-pull [-c] [-t] [-a] [-d] [-v] commit-id url"); + usage("git-http-pull [-c] [-t] [-a] [-d] [-v] [--recover] commit-id url"); return 1; } commit_id = argv[arg]; diff --git a/local-pull.c b/local-pull.c index e5d834ff2..afdba9f52 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] [-d] commit-id path"; +"git-local-pull [-c] [-t] [-a] [-l] [-s] [-n] [-v] [-d] [--recover] commit-id path"; /* * By default we only use file copy. @@ -94,6 +94,8 @@ int main(int argc, char **argv) get_history = 1; else if (argv[arg][1] == 'd') get_delta = 0; + else if (!strcmp(argv[arg], "--recover")) + get_delta = 2; else if (argv[arg][1] == 'a') { get_all = 1; get_tree = 1; @@ -6,6 +6,7 @@ int get_tree = 0; int get_history = 0; +/* 1 means "get delta", 2 means "really check delta harder */ int get_delta = 1; int get_all = 0; int get_verbosely = 0; @@ -32,12 +33,16 @@ static void report_missing(const char *what, const unsigned char *missing) static int make_sure_we_have_it(const char *what, unsigned char *sha1) { - int status; - if (has_sha1_file(sha1)) + int status = 0; + + if (!has_sha1_file(sha1)) { + status = fetch(sha1); + if (status && what) + report_missing(what, sha1); + } + else if (get_delta < 2) return 0; - status = fetch(sha1); - if (status && what) - report_missing(what, sha1); + if (get_delta) { char delta_sha1[20]; status = sha1_delta_base(sha1, delta_sha1); @@ -13,7 +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. */ +/* Set to zero to skip the check for delta object base; + * set to two to check delta dependency even for objects we already have. + */ extern int get_delta; /* Set to be verbose */ @@ -52,6 +52,8 @@ int main(int argc, char **argv) get_history = 1; } else if (argv[arg][1] == 'd') { get_delta = 0; + } else if (!strcmp(argv[arg], "--recover")) { + get_delta = 2; } else if (argv[arg][1] == 'a') { get_all = 1; get_tree = 1; @@ -62,7 +64,7 @@ int main(int argc, char **argv) arg++; } if (argc < arg + 2) { - usage("git-rpull [-c] [-t] [-a] [-v] [-d] commit-id url"); + usage("git-rpull [-c] [-t] [-a] [-v] [-d] [--recover] commit-id url"); return 1; } commit_id = argv[arg]; diff --git a/t/t5100-delta-pull.sh b/t/t5100-delta-pull.sh new file mode 100644 index 000000000..8693c5ce8 --- /dev/null +++ b/t/t5100-delta-pull.sh @@ -0,0 +1,79 @@ +#!/bin/sh +# +# Copyright (c) 2005 Junio C Hamano +# + +test_description='Test pulling deltified objects + +' +. ./test-lib.sh + +locate_obj='s|\(..\)|.git/objects/\1/|' + +test_expect_success \ + setup \ + 'cat ../README >a && + git-update-cache --add a && + a0=`git-ls-files --stage | + sed -e '\''s/^[0-7]* \([0-9a-f]*\) .*/\1/'\''` && + + sed -e 's/test/TEST/g' ../README >a && + git-update-cache a && + a1=`git-ls-files --stage | + sed -e '\''s/^[0-7]* \([0-9a-f]*\) .*/\1/'\''` && + tree=`git-write-tree` && + commit=`git-commit-tree $tree </dev/null` && + a0f=`echo "$a0" | sed -e "$locate_obj"` && + a1f=`echo "$a1" | sed -e "$locate_obj"` && + echo commit $commit && + echo a0 $a0 && + echo a1 $a1 && + ls -l $a0f $a1f && + echo $commit >.git/HEAD && + git-mkdelta -v $a0 $a1 && + ls -l $a0f $a1f' + +# Now commit has a tree that records delitified "a" whose SHA1 is a1. +# Create a new repo and pull this commit into it. + +test_expect_success \ + 'setup and cd into new repo' \ + 'mkdir dest && cd dest && rm -fr .git && git-init-db' + +test_expect_success \ + 'pull from deltified repo into a new repo without -d' \ + 'rm -fr .git a && git-init-db && + git-local-pull -v -a $commit ../.git/ && + git-cat-file blob $a1 >a && + diff -u a ../a' + +test_expect_failure \ + 'pull from deltified repo into a new repo with -d' \ + 'rm -fr .git a && git-init-db && + git-local-pull -v -a -d $commit ../.git/ && + git-cat-file blob $a1 >a && + diff -u a ../a' + +test_expect_failure \ + 'pull from deltified repo after delta failure without --recover' \ + 'rm -f a && + git-local-pull -v -a $commit ../.git/ && + git-cat-file blob $a1 >a && + diff -u a ../a' + +test_expect_success \ + 'pull from deltified repo after delta failure with --recover' \ + 'rm -f a && + git-local-pull -v -a --recover $commit ../.git/ && + git-cat-file blob $a1 >a && + diff -u a ../a' + +test_expect_success \ + 'missing-tree or missing-blob should be re-fetched without --recover' \ + 'rm -f a $a0f $a1f && + git-local-pull -v -a $commit ../.git/ && + git-cat-file blob $a1 >a && + diff -u a ../a' + +test_done + |