From: Wayne Davison Date: Sat, 10 Sep 2022 22:39:25 +0000 (-0700) Subject: Use dict for capabilities & optimizations in json output. X-Git-Tag: v3.2.7pre1~31 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5c1fa2a21dbce9745483e2ae81afdf1dd9f1fea2;p=thirdparty%2Frsync.git Use dict for capabilities & optimizations in json output. --- diff --git a/support/json-rsync-version b/support/json-rsync-version index 79050e48..02cf3d7c 100755 --- a/support/json-rsync-version +++ b/support/json-rsync-version @@ -30,15 +30,21 @@ def main(): elif line.startswith(' '): if not saw_comma and ',' in line: saw_comma = True + info[sect_name] = { } if saw_comma: - lst = line.strip(' ,').split(', ') + for x in line.strip(' ,').split(', '): + if ' ' in x: + val, var = x.split(' ', 1) + var = var.replace(' ', '_') + info[sect_name][var] = False if val == 'no' else val + else: + info[sect_name][x] = True else: - lst = [ x for x in line.split() if not x.startswith('(') ] - info[sect_name] += lst + info[sect_name] += [ x for x in line.split() if not x.startswith('(') ] elif line == '': break else: - sect_name = line.strip(" \n:").replace(' ', '_').lower() + sect_name = line.strip(' :').replace(' ', '_').lower() info[sect_name] = [ ] saw_comma = False for chk in 'checksum_list compress_list daemon_auth_list'.split(): diff --git a/usage.c b/usage.c index dc66288f..84a94b82 100644 --- a/usage.c +++ b/usage.c @@ -38,7 +38,7 @@ static void print_info_flags(enum logcode f) { STRUCT_STAT *dumstat; BOOL as_json = f == FNONE ? 1 : 0; /* We use 1 == first attribute, 2 == need closing array */ - char line_buf[75], *quot = as_json ? "\"" : ""; + char line_buf[75], item_buf[32]; int line_len, j; char *info_flags[] = { @@ -165,9 +165,25 @@ static void print_info_flags(enum logcode f) for (line_len = 0, j = 0; ; j++) { char *str = info_flags[j], *next_nfo = str ? info_flags[j+1] : NULL; - int str_len = str && *str != '*' ? strlen(str) + (as_json ? 2 : 0) : 1000; int need_comma = next_nfo && *next_nfo != '*' ? 1 : 0; - if (line_len && line_len + 1 + str_len + need_comma >= (int)sizeof line_buf) { + int item_len; + if (!str || *str == '*') + item_len = 1000; + else if (as_json) { + char *space = strchr(str, ' '); + int is_no = space && strncmp(str, "no ", 3) == 0; + char *quot = space && !is_no ? "\"" : ""; + char *item = space ? space + 1 : str; + char *val = !space ? "true" : is_no ? "false" : str; + int val_len = !space ? 4 : is_no ? 5 : space - str; + item_len = snprintf(item_buf, sizeof item_buf, + " \"%s\": %s%.*s%s%s", item, quot, val_len, val, quot, + need_comma ? "," : ""); + for (space = item; (space = strchr(space, ' ')) != NULL; space++) + item_buf[space - item + 2] = '_'; + } else + item_len = snprintf(item_buf, sizeof item_buf, " %s%s", str, need_comma ? "," : ""); + if (line_len && line_len + item_len >= (int)sizeof line_buf) { if (as_json) printf(" %s\n", line_buf); else @@ -179,19 +195,19 @@ static void print_info_flags(enum logcode f) if (*str == '*') { if (as_json) { if (as_json == 2) - printf(" ]"); + printf(" }"); else as_json = 2; - printf(",\n \"%c%s\": [\n", toLower(str+1), str+2); + printf(",\n \"%c%s\": {\n", toLower(str+1), str+2); } else rprintf(f, "%s:\n", str+1); - continue; + } else { + strlcpy(line_buf + line_len, item_buf, sizeof line_buf - line_len); + line_len += item_len; } - line_len += snprintf(line_buf+line_len, sizeof line_buf - line_len, - " %s%s%s%s", quot, str, quot, need_comma ? "," : ""); } if (as_json == 2) - printf(" ]"); + printf(" }"); } static void output_nno_list(enum logcode f, const char *name, struct name_num_obj *nno)