From a0c9016abd566e9a8f988dcd387663cd0b2be078 Mon Sep 17 00:00:00 2001 From: Jonathan Tan Date: Fri, 6 Jul 2018 12:34:09 -0700 Subject: upload-pack: send refs' objects despite "filter" A filter line in a request to upload-pack filters out objects regardless of whether they are directly referenced by a "want" line or not. This means that cloning with "--filter=blob:none" (or another filter that excludes blobs) from a repository with at least one ref pointing to a blob (for example, the Git repository itself) results in output like the following: error: missing object referenced by 'refs/tags/junio-gpg-pub' and if that particular blob is not referenced by a fetched tree, the resulting clone fails fsck because there is no object from the remote to vouch that the missing object is a promisor object. Update both the protocol and the upload-pack implementation to include all explicitly specified "want" objects in the packfile regardless of the filter specification. Signed-off-by: Jonathan Tan Signed-off-by: Junio C Hamano --- list-objects.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'list-objects.c') diff --git a/list-objects.c b/list-objects.c index 3eec510357..be4118889a 100644 --- a/list-objects.c +++ b/list-objects.c @@ -47,7 +47,7 @@ static void process_blob(struct rev_info *revs, pathlen = path->len; strbuf_addstr(path, name); - if (filter_fn) + if (!(obj->flags & USER_GIVEN) && filter_fn) r = filter_fn(LOFS_BLOB, obj, path->buf, &path->buf[pathlen], filter_data); @@ -132,7 +132,7 @@ static void process_tree(struct rev_info *revs, } strbuf_addstr(base, name); - if (filter_fn) + if (!(obj->flags & USER_GIVEN) && filter_fn) r = filter_fn(LOFS_BEGIN_TREE, obj, base->buf, &base->buf[baselen], filter_data); @@ -171,7 +171,7 @@ static void process_tree(struct rev_info *revs, cb_data, filter_fn, filter_data); } - if (filter_fn) { + if (!(obj->flags & USER_GIVEN) && filter_fn) { r = filter_fn(LOFS_END_TREE, obj, base->buf, &base->buf[baselen], filter_data); -- cgit v1.2.3