#include "help.h"
#include "pkt-line.h"
#include "write-or-die.h"
+#include "urlmatch.h"
struct keyword_entry {
/*
};
static enum {
- ALLOW_NO_CONTROL_CHARACTERS = 0,
- ALLOW_ANSI_COLOR_SEQUENCES = 1<<0,
- ALLOW_ANSI_CURSOR_MOVEMENTS = 1<<1,
- ALLOW_ANSI_ERASE = 1<<2,
- ALLOW_DEFAULT_ANSI_SEQUENCES = ALLOW_ANSI_COLOR_SEQUENCES,
- ALLOW_ALL_CONTROL_CHARACTERS = 1<<3,
-} allow_control_characters = ALLOW_DEFAULT_ANSI_SEQUENCES;
+ ALLOW_CONTROL_SEQUENCES_UNSET = -1,
+ ALLOW_NO_CONTROL_CHARACTERS = 0,
+ ALLOW_ANSI_COLOR_SEQUENCES = 1<<0,
+ ALLOW_ANSI_CURSOR_MOVEMENTS = 1<<1,
+ ALLOW_ANSI_ERASE = 1<<2,
+ ALLOW_DEFAULT_ANSI_SEQUENCES = ALLOW_ANSI_COLOR_SEQUENCES,
+ ALLOW_ALL_CONTROL_CHARACTERS = 1<<3,
+} allow_control_characters = ALLOW_CONTROL_SEQUENCES_UNSET;
static inline int skip_prefix_in_csv(const char *value, const char *prefix,
const char **out)
return 1;
}
-static void parse_allow_control_characters(const char *value)
+int sideband_allow_control_characters_config(const char *var, const char *value)
{
+ switch (git_parse_maybe_bool(value)) {
+ case 0:
+ allow_control_characters = ALLOW_NO_CONTROL_CHARACTERS;
+ return 0;
+ case 1:
+ allow_control_characters = ALLOW_ALL_CONTROL_CHARACTERS;
+ return 0;
+ default:
+ break;
+ }
+
allow_control_characters = ALLOW_NO_CONTROL_CHARACTERS;
while (*value) {
if (skip_prefix_in_csv(value, "default", &value))
else if (skip_prefix_in_csv(value, "false", &value))
allow_control_characters = ALLOW_NO_CONTROL_CHARACTERS;
else
- warning(_("unrecognized value for `sideband."
- "allowControlCharacters`: '%s'"), value);
+ warning(_("unrecognized value for '%s': '%s'"), var, value);
}
+ return 0;
+}
+
+static int sideband_config_callback(const char *var, const char *value,
+ const struct config_context *ctx UNUSED,
+ void *data UNUSED)
+{
+ if (!strcmp(var, "sideband.allowcontrolcharacters"))
+ return sideband_allow_control_characters_config(var, value);
+
+ return 0;
+}
+
+void sideband_apply_url_config(const char *url)
+{
+ struct urlmatch_config config = URLMATCH_CONFIG_INIT;
+ char *normalized_url;
+
+ if (!url)
+ BUG("must not call sideband_apply_url_config(NULL)");
+
+ config.section = "sideband";
+ config.collect_fn = sideband_config_callback;
+
+ normalized_url = url_normalize(url, &config.url);
+ git_config(urlmatch_config_entry, &config);
+ free(normalized_url);
+ string_list_clear(&config.vars, 1);
+ urlmatch_config_release(&config);
}
/* Returns a color setting (GIT_COLOR_NEVER, etc). */
if (use_sideband_colors_cached >= 0)
return use_sideband_colors_cached;
- switch (git_config_get_maybe_bool("sideband.allowcontrolcharacters", &i)) {
- case 0: /* Boolean value */
- allow_control_characters = i ? ALLOW_ALL_CONTROL_CHARACTERS :
- ALLOW_NO_CONTROL_CHARACTERS;
- break;
- case -1: /* non-Boolean value */
- if (git_config_get_string_tmp("sideband.allowcontrolcharacters",
- &value))
- ; /* huh? `get_maybe_bool()` returned -1 */
- else
- parse_allow_control_characters(value);
- break;
- default:
- break; /* not configured */
+ if (allow_control_characters == ALLOW_CONTROL_SEQUENCES_UNSET) {
+ if (!git_config_get_value("sideband.allowcontrolcharacters", &value))
+ sideband_allow_control_characters_config("sideband.allowcontrolcharacters", value);
+
+ if (allow_control_characters == ALLOW_CONTROL_SEQUENCES_UNSET)
+ allow_control_characters = ALLOW_DEFAULT_ANSI_SEQUENCES;
}
if (!git_config_get_string_tmp(key, &value))
test_grep ! "\\^\\[\\[G" decoded
'
+test_expect_success 'allow all control sequences for a specific URL' '
+ write_script .git/eraser <<-\EOF &&
+ printf "error: Ohai!\\r\\033[K" >&2
+ exec "$@"
+ EOF
+ test_config_global uploadPack.packObjectsHook ./eraser &&
+ test_commit one-more-please &&
+
+ rm -rf throw-away &&
+ git clone --no-local . throw-away 2>stderr &&
+ test_decode_color <stderr >color-decoded &&
+ test_decode_csi <color-decoded >decoded &&
+ test_grep ! "CSI \\[K" decoded &&
+ test_grep "\\^\\[\\[K" decoded &&
+
+ rm -rf throw-away &&
+ git -c "sideband.file://.allowControlCharacters=true" \
+ clone --no-local "file://$PWD" throw-away 2>stderr &&
+ test_decode_color <stderr >color-decoded &&
+ test_decode_csi <color-decoded >decoded &&
+ test_grep "CSI \\[K" decoded &&
+ test_grep ! "\\^\\[\\[K" decoded
+'
+
test_done