send-pack: support pushing to a shallow clone

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Nguyễn Thái Ngọc Duy committed Dec 5, 2013 at 20:02 UTC b016918b2f283513758957b06a14eb2f5c2a9619
3 files changed +43 -4
builtin/send-pack.c
+3 -1
@@ -101,6 +101,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)
101 int fd[2];
102 struct child_process *conn;
103 struct sha1_array extra_have = SHA1_ARRAY_INIT;
104 + struct sha1_array shallow = SHA1_ARRAY_INIT;
105 struct ref *remote_refs, *local_refs;
106 int ret;
107 int helper_status = 0;
@@ -232,7 +233,8 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)
233 args.verbose ? CONNECT_VERBOSE : 0);
234 }
235
235 - get_remote_heads(fd[0], NULL, 0, &remote_refs, REF_NORMAL, &extra_have, NULL);
236 + get_remote_heads(fd[0], NULL, 0, &remote_refs, REF_NORMAL,
237 + &extra_have, &shallow);
238
239 transport_verify_remote_names(nr_refspecs, refspecs);
240
t/t5538-push-shallow.sh
+38
@@ -82,4 +82,42 @@ EOF
82 test_cmp expect actual
83 '
84
85 +test_expect_success 'push from shallow to shallow' '
86 + (
87 + cd shallow &&
88 + git --git-dir=../shallow2/.git config receive.shallowupdate true &&
89 + git push ../shallow2/.git +master:refs/remotes/shallow/master &&
90 + git --git-dir=../shallow2/.git config receive.shallowupdate false
91 + ) &&
92 + (
93 + cd shallow2 &&
94 + git log --format=%s shallow/master >actual &&
95 + git fsck &&
96 + cat <<EOF >expect &&
97 +5
98 +4
99 +3
100 +EOF
101 + test_cmp expect actual
102 + )
103 +'
104 +
105 +test_expect_success 'push from full to shallow' '
106 + ! git --git-dir=shallow2/.git cat-file blob `echo 1|git hash-object --stdin` &&
107 + commit 1 &&
108 + git push shallow2/.git +master:refs/remotes/top/master &&
109 + (
110 + cd shallow2 &&
111 + git log --format=%s top/master >actual &&
112 + git fsck &&
113 + cat <<EOF >expect &&
114 +1
115 +4
116 +3
117 +EOF
118 + test_cmp expect actual &&
119 + git cat-file blob `echo 1|git hash-object --stdin` >/dev/null
120 + )
121 +'
122 +
123 test_done
transport.c
+2 -3
@@ -819,11 +819,10 @@ static int git_transport_push(struct transport *transport, struct ref *remote_re
819 struct ref *tmp_refs;
820 connect_setup(transport, 1, 0);
821
822 - get_remote_heads(data->fd[0], NULL, 0, &tmp_refs, REF_NORMAL, NULL, NULL);
822 + get_remote_heads(data->fd[0], NULL, 0, &tmp_refs, REF_NORMAL,
823 + NULL, &data->shallow);
824 data->got_remote_heads = 1;
825 }
825 - if (data->shallow.nr)
826 - die("pushing to a shallow repository is not supported");
826
827 memset(&args, 0, sizeof(args));
828 args.send_mirror = !!(flags & TRANSPORT_PUSH_MIRROR);