diff options
author | Junio C Hamano <gitster@pobox.com> | 2013-02-17 15:25:57 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2013-02-17 15:25:57 -0800 |
commit | ce735bf7fd66c6404e86e5a313f35abc0394b838 (patch) | |
tree | ac1605c58fb6a3b12c90a4085cc6a0a7ada64da9 /builtin | |
parent | abea4dc76a675d4ac0f27a2367256dc31981d1ca (diff) | |
parent | daebaa78137d59693a808c1f0bdec0ecb40fc12e (diff) | |
download | git-ce735bf7fd66c6404e86e5a313f35abc0394b838.tar.gz git-ce735bf7fd66c6404e86e5a313f35abc0394b838.tar.xz |
Merge branch 'jc/hidden-refs'
Allow the server side to redact the refs/ namespace it shows to the
client.
Will merge to 'master'.
* jc/hidden-refs:
upload/receive-pack: allow hiding ref hierarchies
upload-pack: simplify request validation
upload-pack: share more code
Diffstat (limited to 'builtin')
-rw-r--r-- | builtin/receive-pack.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index e8878de45..62ba6e7a3 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -59,6 +59,11 @@ static enum deny_action parse_deny_action(const char *var, const char *value) static int receive_pack_config(const char *var, const char *value, void *cb) { + int status = parse_hide_refs_config(var, value, "receive"); + + if (status) + return status; + if (strcmp(var, "receive.denydeletes") == 0) { deny_deletes = git_config_bool(var, value); return 0; @@ -119,6 +124,9 @@ static int receive_pack_config(const char *var, const char *value, void *cb) static void show_ref(const char *path, const unsigned char *sha1) { + if (ref_is_hidden(path)) + return; + if (sent_capabilities) packet_write(1, "%s %s\n", sha1_to_hex(sha1), path); else @@ -685,6 +693,20 @@ static int iterate_receive_command_list(void *cb_data, unsigned char sha1[20]) return -1; /* end of list */ } +static void reject_updates_to_hidden(struct command *commands) +{ + struct command *cmd; + + for (cmd = commands; cmd; cmd = cmd->next) { + if (cmd->error_string || !ref_is_hidden(cmd->ref_name)) + continue; + if (is_null_sha1(cmd->new_sha1)) + cmd->error_string = "deny deleting a hidden ref"; + else + cmd->error_string = "deny updating a hidden ref"; + } +} + static void execute_commands(struct command *commands, const char *unpacker_error) { struct command *cmd; @@ -701,6 +723,8 @@ static void execute_commands(struct command *commands, const char *unpacker_erro 0, &cmd)) set_connectivity_errors(commands); + reject_updates_to_hidden(commands); + if (run_receive_hook(commands, "pre-receive", 0)) { for (cmd = commands; cmd; cmd = cmd->next) { if (!cmd->error_string) |