summaryrefslogtreecommitdiff
path: root/transport.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2018-10-19 04:34:08 (GMT)
committerJunio C Hamano <gitster@pobox.com>2018-10-19 04:34:08 (GMT)
commit465e73fff380808f0ba3fb17984ab8636afb6405 (patch)
treef81f0ceaf8764e2895b82935f08adf9668905d65 /transport.c
parent0527fbab689929de47ab3fa7baf1e7618ffa704f (diff)
parent40f327faf543ccaeb03aa0362f3fed7438c2c615 (diff)
downloadgit-465e73fff380808f0ba3fb17984ab8636afb6405.zip
git-465e73fff380808f0ba3fb17984ab8636afb6405.tar.gz
git-465e73fff380808f0ba3fb17984ab8636afb6405.tar.bz2
Merge branch 'tb/filter-alternate-refs'
When pushing into a repository that borrows its objects from an alternate object store, "git receive-pack" that responds to the push request on the other side lists the tips of refs in the alternate to reduce the amount of objects transferred. This sometimes is detrimental when the number of refs in the alternate is absurdly large, in which case the bandwidth saved in potentially fewer objects transferred is wasted in excessively large ref advertisement. The alternate refs that are advertised are now configurable with a pair of configuration variables. * tb/filter-alternate-refs: transport.c: introduce core.alternateRefsPrefixes transport.c: introduce core.alternateRefsCommand transport.c: extract 'fill_alternate_refs_command' transport: drop refnames from for_each_alternate_ref
Diffstat (limited to 'transport.c')
-rw-r--r--transport.c38
1 files changed, 30 insertions, 8 deletions
diff --git a/transport.c b/transport.c
index 046b2f6..f4ffbd9 100644
--- a/transport.c
+++ b/transport.c
@@ -1370,6 +1370,33 @@ literal_copy:
return xstrdup(url);
}
+static void fill_alternate_refs_command(struct child_process *cmd,
+ const char *repo_path)
+{
+ const char *value;
+
+ if (!git_config_get_value("core.alternateRefsCommand", &value)) {
+ cmd->use_shell = 1;
+
+ argv_array_push(&cmd->args, value);
+ argv_array_push(&cmd->args, repo_path);
+ } else {
+ cmd->git_cmd = 1;
+
+ argv_array_pushf(&cmd->args, "--git-dir=%s", repo_path);
+ argv_array_push(&cmd->args, "for-each-ref");
+ argv_array_push(&cmd->args, "--format=%(objectname)");
+
+ if (!git_config_get_value("core.alternateRefsPrefixes", &value)) {
+ argv_array_push(&cmd->args, "--");
+ argv_array_split(&cmd->args, value);
+ }
+ }
+
+ cmd->env = local_repo_env;
+ cmd->out = -1;
+}
+
static void read_alternate_refs(const char *path,
alternate_ref_fn *cb,
void *data)
@@ -1378,12 +1405,7 @@ static void read_alternate_refs(const char *path,
struct strbuf line = STRBUF_INIT;
FILE *fh;
- cmd.git_cmd = 1;
- argv_array_pushf(&cmd.args, "--git-dir=%s", path);
- argv_array_push(&cmd.args, "for-each-ref");
- argv_array_push(&cmd.args, "--format=%(objectname) %(refname)");
- cmd.env = local_repo_env;
- cmd.out = -1;
+ fill_alternate_refs_command(&cmd, path);
if (start_command(&cmd))
return;
@@ -1393,13 +1415,13 @@ static void read_alternate_refs(const char *path,
struct object_id oid;
if (get_oid_hex(line.buf, &oid) ||
- line.buf[GIT_SHA1_HEXSZ] != ' ') {
+ line.buf[GIT_SHA1_HEXSZ]) {
warning(_("invalid line while parsing alternate refs: %s"),
line.buf);
break;
}
- cb(line.buf + GIT_SHA1_HEXSZ + 1, &oid, data);
+ cb(&oid, data);
}
fclose(fh);