[PATCH] Diff color version strings
Morgan Adamiec
morganamilo at archlinux.org
Mon Jan 10 19:01:55 UTC 2022
On 10/01/2022 18:38, David Gustavsson wrote:
> In package table, with VerbosePkgLists and Color, color the part of
> package version strings that changes.
>
> Signed-off-by: David Gustavsson <david.e.gustavsson at gmail.com>
> ---
> src/pacman/conf.c | 4 ++++
> src/pacman/conf.h | 2 ++
> src/pacman/util.c | 35 +++++++++++++++++++++++++++++++----
> src/pacman/util.h | 1 +
> 4 files changed, 38 insertions(+), 4 deletions(-)
>
> diff --git a/src/pacman/conf.c b/src/pacman/conf.c
> index f9edf75b..d5c598b9 100644
> --- a/src/pacman/conf.c
> +++ b/src/pacman/conf.c
> @@ -80,6 +80,8 @@ void enable_colors(int colors)
> colstr->err = BOLDRED;
> colstr->faint = GREY46;
> colstr->nocolor = NOCOLOR;
> + colstr->diffrem = RED;
> + colstr->diffadd = GREEN;
> } else {
> colstr->colon = ":: ";
> colstr->title = "";
> @@ -91,6 +93,8 @@ void enable_colors(int colors)
> colstr->err = "";
> colstr->faint = "";
> colstr->nocolor = "";
> + colstr->diffrem = "";
> + colstr->diffadd = "";
> }
> }
>
> diff --git a/src/pacman/conf.h b/src/pacman/conf.h
> index f7916ca9..782b5758 100644
> --- a/src/pacman/conf.h
> +++ b/src/pacman/conf.h
> @@ -33,6 +33,8 @@ typedef struct __colstr_t {
> const char *err;
> const char *faint;
> const char *nocolor;
> + const char *diffrem;
> + const char *diffadd;
> } colstr_t;
>
> typedef struct __config_repo_t {
> diff --git a/src/pacman/util.c b/src/pacman/util.c
> index c0d62826..e998fa98 100644
> --- a/src/pacman/util.c
> +++ b/src/pacman/util.c
> @@ -840,8 +840,10 @@ static alpm_list_t *create_verbose_row(pm_target_t *target)
> {
> char *str;
> off_t size = 0;
> + size_t i = 0;
> double human_size;
> const char *label;
> + const char *version;
> alpm_list_t *ret = NULL;
>
> /* a row consists of the package name, */
> @@ -858,12 +860,28 @@ static alpm_list_t *create_verbose_row(pm_target_t *target)
> add_table_cell(&ret, str, CELL_NORMAL | CELL_FREE);
>
> /* old and new versions */
> - pm_asprintf(&str, "%s",
> - target->remove != NULL ? alpm_pkg_get_version(target->remove) : "");
> + version = alpm_pkg_get_version(target->remove);
> + char old_version[strlen(version) + strlen(config->colstr.diffrem) + strlen(config->colstr.nocolor) + 1];
> + memcpy(old_version, (char *)version, strlen(version) + 1);
> + version = alpm_pkg_get_version(target->install);
> + char new_version[strlen(version) + strlen(config->colstr.diffadd) + strlen(config->colstr.nocolor) + 1];
> + memcpy(new_version, (char *)version, strlen(version) + 1);
> +
> + i = 0;
> + while (old_version[i] != '\0' && new_version[i] != '\0' && old_version[i] == new_version[i]) {
> + i++;
> + }
> + insertstring(old_version, config->colstr.diffrem, i);
> + insertstring(new_version, config->colstr.diffadd, i);
> + snprintf(old_version + i + strlen(old_version + i),
> + strlen(config->colstr.nocolor) + 1, "%s", config->colstr.nocolor);
> + snprintf(new_version + i + strlen(new_version + i),
> + strlen(config->colstr.nocolor) + 1, "%s", config->colstr.nocolor);
> +
> + pm_asprintf(&str, "%s", old_version);
> add_table_cell(&ret, str, CELL_NORMAL | CELL_FREE);
>
> - pm_asprintf(&str, "%s",
> - target->install != NULL ? alpm_pkg_get_version(target->install) : "");
> + pm_asprintf(&str, "%s", new_version);
> add_table_cell(&ret, str, CELL_NORMAL | CELL_FREE);
>
> /* and size */
> @@ -1849,3 +1867,12 @@ void console_erase_line(void)
> {
> printf("\x1B[K");
> }
> +
> +/* inserts string insert into string at index i, modifying string */
> +void insertstring(char *string, const char *insert, size_t i)
> +{
> + char temp[strlen(string) - i + 1];
> + memcpy(temp, string + i, strlen(string + i) + 1);
> + memcpy(string + i, insert, strlen(insert) + 1);
> + memcpy(string + i + strlen(insert), temp, strlen(temp) + 1);
> +}
> diff --git a/src/pacman/util.h b/src/pacman/util.h
> index 52e79915..003961eb 100644
> --- a/src/pacman/util.h
> +++ b/src/pacman/util.h
> @@ -88,6 +88,7 @@ void console_cursor_move_down(unsigned int lines);
> void console_cursor_move_end(void);
> /* Erases line from the current cursor position till the end of the line */
> void console_erase_line(void);
> +void insertstring(char *string, const char *insert, size_t i);
>
> int pm_printf(alpm_loglevel_t level, const char *format, ...) __attribute__((format(printf,2,3)));
> int pm_asprintf(char **string, const char *format, ...) __attribute__((format(printf,2,3)));
My suggestion was to use coloring that follows how alpm's version
comparison works, not just where the first change is.
You can find an example of the code here:
https://github.com/Morganamilo/paru/blob/501e0ba7d1bb356e415f07838057d2f73282bcb7/src/upgrade.rs#L49
Still these are just my comments and I know Allan quite dislikes colour
so I can't say if the patch would be accepted either way.
More information about the pacman-dev
mailing list