[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