commit:     5e5cba1176c8bfa39405b5cf29dcf50c08f8fc66
Author:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Fri Dec 27 17:25:28 2019 +0000
Commit:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Fri Dec 27 17:25:28 2019 +0000
URL:        https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=5e5cba11

main: use cannonical repo paths for repos.conf and PORTDIR

Make sure we compare the same locations by using realpath()

Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>

 main.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/main.c b/main.c
index b5404cb..f0a8841 100644
--- a/main.c
+++ b/main.c
@@ -639,7 +639,10 @@ read_one_repos_conf(const char *repos_conf, char **primary)
 {
        int nsec;
        char *conf;
-       const char *main_repo, *repo, *path;
+       char rrepo[_Q_PATH_MAX];
+       const char *main_repo;
+       const char *repo;
+       const char *path;
        dictionary *dict;
 
        if (getenv("DEBUG"))
@@ -662,6 +665,10 @@ read_one_repos_conf(const char *repos_conf, char **primary)
                        size_t n;
                        char *overlay;
 
+                       /* try not to get confused by symlinks etc. */
+                       if (realpath(path, rrepo) != NULL)
+                               path = rrepo;
+
                        array_for_each(overlay_names, n, overlay) {
                                if (strcmp(overlay, repo) == 0)
                                        break;
@@ -906,12 +913,18 @@ initialize_portage_env(void)
                var = &vars_to_read[11];  /* PORTDIR */
 
                if (strcmp(var->src, STR_DEFAULT) != 0 || array_cnt(overlays) 
== 0) {
+                       char roverlay[_Q_PATH_MAX];
+                       /* get cannonical path, we do so for repos.conf too */
+                       if (realpath(main_overlay, roverlay) == NULL)
+                               snprintf(roverlay, sizeof(roverlay), "%s", 
main_overlay);
                        array_for_each(overlays, i, overlay) {
-                               if (strcmp(overlay, main_overlay) == 0)
+                               if (strcmp(overlay, roverlay) == 0)
                                        break;
                                overlay = NULL;
                        }
                        if (overlay == NULL) {  /* add PORTDIR to overlays */
+                               free(main_overlay);
+                               main_overlay = xstrdup(roverlay);
                                xarraypush_ptr(overlays, main_overlay);
                                xarraypush_str(overlay_names, "<PORTDIR>");
                                xarraypush_str(overlay_src, var->src);

Reply via email to