From: Teng Long <dyroneteng@xxxxxxxxx> Background: The `uploadpack.blobpackfileuri` is made for the "packfile-uri" feature, the feature is similar to a CDN cache, it supports the client to download pack file by a URI directly, without or reducing the server load when make packing and transporting. Reasons: First reason, `uploadpack.blobpackfileuri` supports to exclude a single object, but actually the object type can be not only a blob, so the name is inaccurate currently. Secondly, the name of the old configuration is not abstract enough, this make the furthur extension difficult. If do not change its name, to let different object types use different configuration names, the configuration items will be bloated and difficult to maintain, so the new configuration is more abstract in name. Configuation format diff: old: uploadpack.blobPackfileUri=<object-hash> <pack-hash> <uri> new: uploadpack.excludeobject=<object-hash> <level> <pack-hash> <uri> The new configuration `uploadpack.excludeobject` not only supports to exclude a single object itself, but also to exclude related objects with it at once, the scope of exclusion is determined by the object type and the specified `<level>` value in the entry. -Compatibility: Although a new configuration has been introduced, the old one is available to use and compatible with the new configuration. Signed-off-by: Teng Long <dyroneteng@xxxxxxxxx> --- builtin/pack-objects.c | 33 ++++++++++++++++++++++++++++++++- upload-pack.c | 7 +++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index a41a0a3ea7..75461483c0 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -3061,6 +3061,36 @@ static int git_pack_config(const char *k, const char *v, void *cb) ex->uri = xstrdup(pack_end + 1); oidmap_put(&configured_exclusions, ex); } + if (!strcmp(k, "uploadpack.excludeobject")) { + struct configured_exclusion *ex = xmalloc(sizeof(*ex)); + const char *oid_end, *pack_end, *type_end; + struct object_id pack_hash; + char type[2]; + int level; + + if (parse_oid_hex(v, &ex->e.oid, &oid_end) || + *oid_end != ' ' || + !strlcpy(type, oid_end + 1, sizeof(type)) || + parse_oid_hex(oid_end + 3, &pack_hash, &pack_end) || + *pack_end != ' ') + die(_("value of uploadpack.excludeobject must be " + "of the form '<object-hash> <level> <pack-hash> <uri>' (got '%s')"), v); + if (oidmap_get(&configured_exclusions, &ex->e.oid)) + die(_("object already configured by an earlier " + "uploadpack.excludeobject (got '%s')"), v); + + level = atoi(type); + if (level < ET_SELF || level > ET_REACHABLE) { + die(_("value of <level> must be 0 or 1 or 2 (got '%s')"), v); + } + ex->level = level; + type_end = oid_end + 2; + ex->pack_hash_hex = xcalloc(1, pack_end - type_end); + memcpy(ex->pack_hash_hex, type_end + 1, pack_end - type_end - 1); + ex->uri = xstrdup(pack_end + 1); + oidmap_put(&configured_exclusions, ex); + } + return git_default_config(k, v, cb); } @@ -3887,7 +3917,8 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix) N_("respect islands during delta compression")), OPT_STRING_LIST(0, "uri-protocol", &uri_protocols, N_("protocol"), - N_("exclude any configured uploadpack.blobpackfileuri with this protocol")), + N_("exclude any configured uploadpack.excludeobject or " + "uploadpack.blobpackfileuri with this protocol")), OPT_END(), }; diff --git a/upload-pack.c b/upload-pack.c index 5c1cd19612..d26fb351a3 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -1751,6 +1751,13 @@ int upload_pack_advertise(struct repository *r, strbuf_addstr(value, " packfile-uris"); free(str); } + + if (!repo_config_get_string(the_repository, + "uploadpack.excludeobject", + &str) && str) { + strbuf_addstr(value, " packfile-uris"); + free(str); + } } return 1; -- 2.31.1.453.g945ddc3a74.dirty