diff mbox

[projects,pacman] libalpm: ignore .hook suffix when sorting hooks

Message ID 20180609103114.GA10695@Mindship-03
State Not Applicable, archived
Headers show

Commit Message

Emil Velikov via arch-projects June 9, 2018, 10:31 a.m. UTC
It is desirable to have 'a-post.hook' ordered after 'a.hook'. For this,
it is needed to ignore the suffix when sorting.
---

Two years ago, I suggested this patch in https://bugs.archlinux.org/task/49653.
Today, I do so again :-).

Regards,
- Jouke

 lib/libalpm/hook.c | 16 ++++++++++++----
 lib/libalpm/hook.h |  2 ++
 2 files changed, 14 insertions(+), 4 deletions(-)

Comments

Jelle van der Waa June 9, 2018, 1:49 p.m. UTC | #1
On 06/09/18 at 12:31pm, Jouke Witteveen via arch-projects wrote:
> It is desirable to have 'a-post.hook' ordered after 'a.hook'. For this,
> it is needed to ignore the suffix when sorting.
> ---

pacman patches should go to https://lists.archlinux.org/listinfo/pacman-dev

> 
> Two years ago, I suggested this patch in https://bugs.archlinux.org/task/49653.
> Today, I do so again :-).
> 
> Regards,
> - Jouke
> 
>  lib/libalpm/hook.c | 16 ++++++++++++----
>  lib/libalpm/hook.h |  2 ++
>  2 files changed, 14 insertions(+), 4 deletions(-)
> 
> diff --git a/lib/libalpm/hook.c b/lib/libalpm/hook.c
> index 0805e661..d90ed2da 100644
> --- a/lib/libalpm/hook.c
> +++ b/lib/libalpm/hook.c
> @@ -551,7 +551,16 @@ static int _alpm_hook_triggered(alpm_handle_t *handle, struct _alpm_hook_t *hook
>  
>  static int _alpm_hook_cmp(struct _alpm_hook_t *h1, struct _alpm_hook_t *h2)
>  {
> -	return strcmp(h1->name, h2->name);
> +	size_t suflen = strlen(ALPM_HOOK_SUFFIX), l1, l2;
> +	int ret;
> +	l1 = strlen(h1->name) - suflen;
> +	l2 = strlen(h2->name) - suflen;
> +	/* exclude the suffixes from comparison */
> +	ret = strncmp(h1->name, h2->name, l1 <= l2 ? l1 : l2);
> +	if(ret == 0 && l1 != l2) {
> +		return l1 < l2 ? -1 : 1;
> +	}
> +	return ret;
>  }
>  
>  static alpm_list_t *find_hook(alpm_list_t *haystack, const void *needle)
> @@ -634,8 +643,7 @@ int _alpm_hook_run(alpm_handle_t *handle, alpm_hook_when_t when)
>  	alpm_event_hook_t event = { .when = when };
>  	alpm_event_hook_run_t hook_event;
>  	alpm_list_t *i, *hooks = NULL, *hooks_triggered = NULL;
> -	const char *suffix = ".hook";
> -	size_t suflen = strlen(suffix), triggered = 0;
> +	size_t suflen = strlen(ALPM_HOOK_SUFFIX), triggered = 0;
>  	int ret = 0;
>  
>  	for(i = alpm_list_last(handle->hookdirs); i; i = alpm_list_previous(i)) {
> @@ -681,7 +689,7 @@ int _alpm_hook_run(alpm_handle_t *handle, alpm_hook_when_t when)
>  			memcpy(path + dirlen, entry->d_name, name_len + 1);
>  
>  			if(name_len < suflen
> -					|| strcmp(entry->d_name + name_len - suflen, suffix) != 0) {
> +					|| strcmp(entry->d_name + name_len - suflen, ALPM_HOOK_SUFFIX) != 0) {
>  				_alpm_log(handle, ALPM_LOG_DEBUG, "skipping non-hook file %s\n", path);
>  				continue;
>  			}
> diff --git a/lib/libalpm/hook.h b/lib/libalpm/hook.h
> index 364d22d7..30d565df 100644
> --- a/lib/libalpm/hook.h
> +++ b/lib/libalpm/hook.h
> @@ -22,6 +22,8 @@
>  
>  #include "alpm.h"
>  
> +#define ALPM_HOOK_SUFFIX ".hook"
> +
>  int _alpm_hook_run(alpm_handle_t *handle, alpm_hook_when_t when);
>  
>  #endif /* ALPM_HOOK_H */
> -- 
> 2.17.1
diff mbox

Patch

diff --git a/lib/libalpm/hook.c b/lib/libalpm/hook.c
index 0805e661..d90ed2da 100644
--- a/lib/libalpm/hook.c
+++ b/lib/libalpm/hook.c
@@ -551,7 +551,16 @@  static int _alpm_hook_triggered(alpm_handle_t *handle, struct _alpm_hook_t *hook
 
 static int _alpm_hook_cmp(struct _alpm_hook_t *h1, struct _alpm_hook_t *h2)
 {
-	return strcmp(h1->name, h2->name);
+	size_t suflen = strlen(ALPM_HOOK_SUFFIX), l1, l2;
+	int ret;
+	l1 = strlen(h1->name) - suflen;
+	l2 = strlen(h2->name) - suflen;
+	/* exclude the suffixes from comparison */
+	ret = strncmp(h1->name, h2->name, l1 <= l2 ? l1 : l2);
+	if(ret == 0 && l1 != l2) {
+		return l1 < l2 ? -1 : 1;
+	}
+	return ret;
 }
 
 static alpm_list_t *find_hook(alpm_list_t *haystack, const void *needle)
@@ -634,8 +643,7 @@  int _alpm_hook_run(alpm_handle_t *handle, alpm_hook_when_t when)
 	alpm_event_hook_t event = { .when = when };
 	alpm_event_hook_run_t hook_event;
 	alpm_list_t *i, *hooks = NULL, *hooks_triggered = NULL;
-	const char *suffix = ".hook";
-	size_t suflen = strlen(suffix), triggered = 0;
+	size_t suflen = strlen(ALPM_HOOK_SUFFIX), triggered = 0;
 	int ret = 0;
 
 	for(i = alpm_list_last(handle->hookdirs); i; i = alpm_list_previous(i)) {
@@ -681,7 +689,7 @@  int _alpm_hook_run(alpm_handle_t *handle, alpm_hook_when_t when)
 			memcpy(path + dirlen, entry->d_name, name_len + 1);
 
 			if(name_len < suflen
-					|| strcmp(entry->d_name + name_len - suflen, suffix) != 0) {
+					|| strcmp(entry->d_name + name_len - suflen, ALPM_HOOK_SUFFIX) != 0) {
 				_alpm_log(handle, ALPM_LOG_DEBUG, "skipping non-hook file %s\n", path);
 				continue;
 			}
diff --git a/lib/libalpm/hook.h b/lib/libalpm/hook.h
index 364d22d7..30d565df 100644
--- a/lib/libalpm/hook.h
+++ b/lib/libalpm/hook.h
@@ -22,6 +22,8 @@ 
 
 #include "alpm.h"
 
+#define ALPM_HOOK_SUFFIX ".hook"
+
 int _alpm_hook_run(alpm_handle_t *handle, alpm_hook_when_t when);
 
 #endif /* ALPM_HOOK_H */