Blame SOURCES/man-db-2.8.7-fix-override-dir-handling.patch

a4b5d2
From c73e7dd16b7915ac9c67a376e014ea1220095348 Mon Sep 17 00:00:00 2001
a4b5d2
From: =?UTF-8?q?Nikola=20Forr=C3=B3?= <nforro@redhat.com>
a4b5d2
Date: Tue, 27 Aug 2019 17:53:03 +0200
a4b5d2
Subject: [PATCH] man(1): Fix override dir handling
a4b5d2
MIME-Version: 1.0
a4b5d2
Content-Type: text/plain; charset=UTF-8
a4b5d2
Content-Transfer-Encoding: 8bit
a4b5d2
a4b5d2
Previously, override dir was affecting only some cases
a4b5d2
of manpath determination.
a4b5d2
a4b5d2
Apply it only when all paths has been gathered instead.
a4b5d2
(Depending on the definition of when the override dir applies,
a4b5d2
this might not be correct).
a4b5d2
a4b5d2
Also look for override dir when sorting candidates.
a4b5d2
a4b5d2
Fixes src/tests/man-9 failing when --with-override-dir=od
a4b5d2
is passed to ./configure.
a4b5d2
a4b5d2
Reported-by: Nikola Forró <nforro@redhat.com>
a4b5d2
Tested-by: Nikola Forró <nforro@redhat.com>
a4b5d2
---
a4b5d2
 src/man.c  | 33 ++++++++++++++++++++++++++++++++
a4b5d2
 src/manp.c | 55 +++++++++++++++++++++---------------------------------
a4b5d2
 2 files changed, 54 insertions(+), 34 deletions(-)
a4b5d2
a4b5d2
diff --git a/src/man.c b/src/man.c
a4b5d2
index 6d1cba7..b3d13d1 100644
a4b5d2
--- a/src/man.c
a4b5d2
+++ b/src/man.c
a4b5d2
@@ -2712,6 +2712,32 @@ static bool duplicate_candidates (struct candidate *left,
a4b5d2
 	return ret;
a4b5d2
 }
a4b5d2
 
a4b5d2
+static int cand1_differs_by_override_dir (const struct candidate *left,
a4b5d2
+		                          const struct candidate *right)
a4b5d2
+{
a4b5d2
+	size_t ov_len, pre_ov_len;
a4b5d2
+
a4b5d2
+	ov_len = strlen (OVERRIDE_DIR);
a4b5d2
+	if (!ov_len)
a4b5d2
+		return 0;
a4b5d2
+
a4b5d2
+	if (!STREQ (left->source->name, right->source->name))
a4b5d2
+		return 0;
a4b5d2
+
a4b5d2
+	pre_ov_len = strlen(right->path);
a4b5d2
+	if (!STRNEQ (left->path, right->path, pre_ov_len))
a4b5d2
+		return 0;
a4b5d2
+
a4b5d2
+	if (left->path[pre_ov_len] != '/')
a4b5d2
+		return 0;
a4b5d2
+	pre_ov_len++;
a4b5d2
+
a4b5d2
+	if (STREQ (left->path + pre_ov_len, OVERRIDE_DIR))
a4b5d2
+		return 1;
a4b5d2
+
a4b5d2
+	return 0;
a4b5d2
+}
a4b5d2
+
a4b5d2
 static int compare_candidates (const struct candidate *left,
a4b5d2
 			       const struct candidate *right)
a4b5d2
 {
a4b5d2
@@ -2801,6 +2827,13 @@ static int compare_candidates (const struct candidate *left,
a4b5d2
 	if (cmp)
a4b5d2
 		return cmp;
a4b5d2
 
a4b5d2
+	/* Sort override dir first
a4b5d2
+	 */
a4b5d2
+	if (cand1_differs_by_override_dir(left, right))
a4b5d2
+		return -1;
a4b5d2
+	if (cand1_differs_by_override_dir(right, left))
a4b5d2
+		return 1;
a4b5d2
+
a4b5d2
 	/* Try comparing based on language. We used to prefer to display a
a4b5d2
 	 * page in the user's preferred language than a page from a better
a4b5d2
 	 * section, but that attracted objections, so now we prefer to get
a4b5d2
diff --git a/src/manp.c b/src/manp.c
a4b5d2
index 5441339..e437183 100644
a4b5d2
--- a/src/manp.c
a4b5d2
+++ b/src/manp.c
a4b5d2
@@ -903,23 +903,6 @@ static char *def_path (enum config_flag flag)
a4b5d2
 	return manpath;
a4b5d2
 }
a4b5d2
 
a4b5d2
-/*
a4b5d2
- * If specified with configure, append OVERRIDE_DIR to dir param and add it
a4b5d2
- * to list.
a4b5d2
- */
a4b5d2
-static void insert_override_dir (gl_list_t list, const char *dir)
a4b5d2
-{
a4b5d2
-	char *override_dir = NULL;
a4b5d2
-
a4b5d2
-	if (!strlen (OVERRIDE_DIR))
a4b5d2
-		return;
a4b5d2
-
a4b5d2
-	if ((override_dir = xasprintf ("%s/%s", dir, OVERRIDE_DIR))) {
a4b5d2
-		add_dir_to_list (list, override_dir);
a4b5d2
-		free (override_dir);
a4b5d2
-	}
a4b5d2
-}
a4b5d2
-
a4b5d2
 /*
a4b5d2
  * For each directory in the user's path, see if it is one of the
a4b5d2
  * directories listed in the man_db.config file.  If so, and it is
a4b5d2
@@ -968,7 +951,6 @@ char *get_manpath_from_path (const char *path, int mandatory)
a4b5d2
 			if (!manpath_map_found)
a4b5d2
 				debug ("is in the config file\n");
a4b5d2
 			manpath_map_found = true;
a4b5d2
-			insert_override_dir (tmplist, config_item->cont);
a4b5d2
 			add_dir_to_list (tmplist, config_item->cont);
a4b5d2
 		} GL_LIST_FOREACH_END (config);
a4b5d2
 
a4b5d2
@@ -989,11 +971,8 @@ char *get_manpath_from_path (const char *path, int mandatory)
a4b5d2
 		debug ("adding mandatory man directories\n");
a4b5d2
 
a4b5d2
 		GL_LIST_FOREACH_START (config, config_item) {
a4b5d2
-			if (config_item->flag == MANDATORY) {
a4b5d2
-				insert_override_dir (tmplist,
a4b5d2
-						     config_item->key);
a4b5d2
+			if (config_item->flag == MANDATORY)
a4b5d2
 				add_dir_to_list (tmplist, config_item->key);
a4b5d2
-			}
a4b5d2
 		} GL_LIST_FOREACH_END (config);
a4b5d2
 	}
a4b5d2
 
a4b5d2
@@ -1078,7 +1057,6 @@ static void add_man_subdirs (gl_list_t list, const char *path)
a4b5d2
 	if (subdir) {
a4b5d2
 		newpath = xasprintf ("%.*s/man", (int) (subdir - path), path);
a4b5d2
 		if (is_directory (newpath) == 1) {
a4b5d2
-			insert_override_dir (list, newpath);
a4b5d2
 			add_dir_to_list (list, newpath);
a4b5d2
 		}
a4b5d2
 		free (newpath);
a4b5d2
@@ -1086,7 +1064,6 @@ static void add_man_subdirs (gl_list_t list, const char *path)
a4b5d2
 
a4b5d2
 	newpath = xasprintf ("%s/man", path);
a4b5d2
 	if (is_directory (newpath) == 1) {
a4b5d2
-		insert_override_dir (list, newpath);
a4b5d2
 		add_dir_to_list (list, newpath);
a4b5d2
 	}
a4b5d2
 	free (newpath);
a4b5d2
@@ -1095,7 +1072,6 @@ static void add_man_subdirs (gl_list_t list, const char *path)
a4b5d2
 		newpath = xasprintf ("%.*s/share/man",
a4b5d2
 				     (int) (subdir - path), path);
a4b5d2
 		if (is_directory (newpath) == 1) {
a4b5d2
-			insert_override_dir (list, newpath);
a4b5d2
 			add_dir_to_list (list, newpath);
a4b5d2
 		}
a4b5d2
 		free (newpath);
a4b5d2
@@ -1103,7 +1079,6 @@ static void add_man_subdirs (gl_list_t list, const char *path)
a4b5d2
 
a4b5d2
 	newpath = xasprintf ("%s/share/man", path);
a4b5d2
 	if (is_directory (newpath) == 1) {
a4b5d2
-		insert_override_dir (list, newpath);
a4b5d2
 		add_dir_to_list (list, newpath);
a4b5d2
 	}
a4b5d2
 	free (newpath);
a4b5d2
@@ -1199,7 +1174,9 @@ gl_list_t create_pathlist (const char *manp)
a4b5d2
 	const struct canonicalized_path *cp;
a4b5d2
 
a4b5d2
 	/* Expand the manpath into a list of (path, canonicalized path)
a4b5d2
-	 * pairs for easier handling.  add_dir_to_path_list only adds items
a4b5d2
+	 * pairs for easier handling. For each entry, add corresponding
a4b5d2
+	 * OVERRIDE_DIR.
a4b5d2
+	 * add_dir_to_path_list only adds items
a4b5d2
 	 * if they do not have the same canonicalized path as an existing
a4b5d2
 	 * item, thereby eliminating duplicates due to symlinks.
a4b5d2
 	 */
a4b5d2
@@ -1208,15 +1185,25 @@ gl_list_t create_pathlist (const char *manp)
a4b5d2
 		(GL_LINKEDHASH_LIST, canonicalized_path_equals,
a4b5d2
 		 canonicalized_path_hash, canonicalized_path_free, false);
a4b5d2
 	for (p = manp;; p = end + 1) {
a4b5d2
+		char *element, *element_override;
a4b5d2
+		ssize_t p_len;
a4b5d2
+
a4b5d2
 		end = strchr (p, ':');
a4b5d2
-		if (end) {
a4b5d2
-			char *element = xstrndup (p, end - p);
a4b5d2
-			add_dir_to_path_list (canonicalized_list, element);
a4b5d2
-			free (element);
a4b5d2
-		} else {
a4b5d2
-			add_dir_to_path_list (canonicalized_list, p);
a4b5d2
-			break;
a4b5d2
+		p_len = end ? end - p : (ssize_t)strlen(p);
a4b5d2
+
a4b5d2
+		element = xstrndup (p, p_len);
a4b5d2
+
a4b5d2
+		if (strlen(OVERRIDE_DIR)) {
a4b5d2
+			element_override = xasprintf("%s/%s", element, OVERRIDE_DIR);
a4b5d2
+			add_dir_to_path_list (canonicalized_list, element_override);
a4b5d2
+			free (element_override);
a4b5d2
 		}
a4b5d2
+
a4b5d2
+		add_dir_to_path_list (canonicalized_list, element);
a4b5d2
+		free (element);
a4b5d2
+
a4b5d2
+		if (!end)
a4b5d2
+			break;
a4b5d2
 	}
a4b5d2
 
a4b5d2
 	list = new_string_list (GL_ARRAY_LIST, false);
a4b5d2
-- 
a4b5d2
2.26.2
a4b5d2