From beccb842f6e5cc31ddfc8b7b66d899809ad6c2b8 Mon Sep 17 00:00:00 2001 From: Bryce Kwon Date: Sat, 31 Oct 2026 19:26:21 -1000 Subject: Report a word where cgitrc expects a number atoi reads "yes" or "true" as 0, so repo.hide=yes, or cgit.hide true in a scanned repository's git config, silently did nothing. The values keep that meaning, since honouring them now would hide repositories on upgrade, but each one is logged with its file and line. --- source/config.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) (limited to 'source/config.c') diff --git a/source/config.c b/source/config.c index ca7c688..bfd31b6 100644 --- a/source/config.c +++ b/source/config.c @@ -11,6 +11,12 @@ #define MAX_INCLUDE_NESTING 8 +struct config_origin config_origin; + +// The newlines read so far from the file being parsed, which place each entry +// on its line. +static int lines_read; + /* * Folds away a carriage return that sits right before a newline so a file * saved with DOS line endings parses the same as one saved with Unix endings. @@ -26,6 +32,8 @@ static int next_char(FILE *f) c = '\r'; } } + if (c == '\n') + lines_read++; return c; } @@ -52,7 +60,7 @@ static int next_content_char(FILE *f) } } -static int read_entry(FILE *f, struct strbuf *name, struct strbuf *value) +static int read_entry(FILE *f, struct strbuf *name, struct strbuf *value, int *line) { int c; @@ -63,6 +71,7 @@ static int read_entry(FILE *f, struct strbuf *name, struct strbuf *value) if (c == EOF) return 0; + *line = lines_read + 1; strbuf_reset(name); while (c != '=' && c != '\n' && c != EOF) { strbuf_addch(name, c); @@ -88,6 +97,10 @@ static int read_entry(FILE *f, struct strbuf *name, struct strbuf *value) int config_file_parse(const char *filename, config_file_value_fn fn) { static int nesting; + // An include is parsed from inside a line of the file that names it, + // which carries on from that line once the include is done. + struct config_origin outer = config_origin; + int outer_lines_read = lines_read; struct strbuf name = STRBUF_INIT; struct strbuf value = STRBUF_INIT; FILE *f; @@ -99,15 +112,42 @@ int config_file_parse(const char *filename, config_file_value_fn fn) return 0; if (!(f = fopen(filename, "r"))) return errno; + config_origin.file = filename; + lines_read = 0; nesting++; - while (read_entry(f, &name, &value)) + while (read_entry(f, &name, &value, &config_origin.line)) fn(name.buf, value.buf); // A directory opens like a file and fails only once it is read. if (ferror(f)) err = errno; nesting--; fclose(f); + config_origin = outer; + lines_read = outer_lines_read; strbuf_release(&name); strbuf_release(&value); return err; } + +int config_int(const char *name, const char *value) +{ + int number = atoi(value); + char *end; + + // Space may follow the digits strtol finds, but nothing else. + strtol(value, &end, 10); + while (end != value && isspace(*end)) + end++; + if (end != value && !*end) + return number; + // The first line alone, since a git config value can hold a newline + // that would forge a log line of its own. + if (config_origin.file) + fprintf(stderr, "[cgit] Reading %s=%.*s in %s line %d as %d, since it is not a whole number\n", + name, (int)strcspn(value, "\n"), value, config_origin.file, + config_origin.line, number); + else + fprintf(stderr, "[cgit] Reading %s=%.*s as %d, since it is not a whole number\n", + name, (int)strcspn(value, "\n"), value, number); + return number; +} -- cgit 2.12.1