In order to fix branchname DF conflicts during `fetch --prune`, the way
the header is output to the screen needs to be refactored. Here is an
exmaple of the output with the line in question denoted by '>':

        $ git fetch --prune --dry-run upstream
>       From https://github.com/git/git
           a155a5f..5512ac5  maint      -> upstream/maint
           d7aced9..7794a68  master     -> upstream/master
           523f7c4..3e57c29  next       -> upstream/next
         + 462f102...0937cdf pu         -> upstream/pu  (forced update)
           e24105a..5d352bc  todo       -> upstream/todo
         * [new tag]         v1.8.5.2   -> v1.8.5.2
         * [new tag]         v1.8.5.2   -> v1.8.5.2

pretty_url():
This function when passed a transport url will anonymize the transport
of the url. It will strip a trailing '/'. It will also strip a trailing
'.git'. It will return the newly formated url for use. I do not believe
there is a need for stripping the trailing '/' and '.git' from a url,
but it was already there and I wanted to make as little changes as
possible.

print_url():
This function will convert a transport url to a pretty url using
pretty_url(). Then it will print out the pretty url to stderr as
indicated above in the example output. It uses a global variable
named "gshown_url' to prevent this header for being printed twice.

Signed-off-by: Tom Miller <jacker...@gmail.com>
---
 builtin/fetch.c | 60 ++++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 42 insertions(+), 18 deletions(-)

diff --git a/builtin/fetch.c b/builtin/fetch.c
index 3d978eb..b3145f6 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -44,6 +44,42 @@ static struct transport *gtransport;
 static struct transport *gsecondary;
 static const char *submodule_prefix = "";
 static const char *recurse_submodules_default;
+static int gshown_url = 0;
+
+static char *pretty_url(const char *raw_url) {
+       if (raw_url) {
+               int url_len, i;
+               char *pretty_url, *url;
+
+               url = transport_anonymize_url(raw_url);
+
+               url_len = strlen(url);
+               for (i = url_len - 1; url[i] == '/' && 0 <= i; i--)
+                       ;
+               url_len = i + 1;
+               if (4 < i && !strncmp(".git", url + i - 3, 4))
+                       url_len = i - 3;
+
+               pretty_url = xcalloc(1, 1 + url_len);
+               memcpy(pretty_url, url, url_len);
+
+               free(url);
+               return pretty_url;
+       }
+       return xstrdup("foreign");
+}
+
+static void print_url(const char *raw_url) {
+       if (!gshown_url) {
+               char *url = pretty_url(raw_url);
+
+               fprintf(stderr, _("From %s\n"), url);
+
+               gshown_url = 1;
+               free(url);
+       }
+}
+
 
 static int option_parse_recurse_submodules(const struct option *opt,
                                   const char *arg, int unset)
@@ -535,7 +571,7 @@ static int store_updated_refs(const char *raw_url, const 
char *remote_name,
 {
        FILE *fp;
        struct commit *commit;
-       int url_len, i, shown_url = 0, rc = 0;
+       int url_len, i, rc = 0;
        struct strbuf note = STRBUF_INIT;
        const char *what, *kind;
        struct ref *rm;
@@ -546,10 +582,8 @@ static int store_updated_refs(const char *raw_url, const 
char *remote_name,
        if (!fp)
                return error(_("cannot open %s: %s\n"), filename, 
strerror(errno));
 
-       if (raw_url)
-               url = transport_anonymize_url(raw_url);
-       else
-               url = xstrdup("foreign");
+       url = pretty_url(raw_url);
+       url_len = strlen(url);
 
        rm = ref_map;
        if (check_everything_connected(iterate_ref_map, 0, &rm)) {
@@ -606,13 +640,6 @@ static int store_updated_refs(const char *raw_url, const 
char *remote_name,
                                what = rm->name;
                        }
 
-                       url_len = strlen(url);
-                       for (i = url_len - 1; url[i] == '/' && 0 <= i; i--)
-                               ;
-                       url_len = i + 1;
-                       if (4 < i && !strncmp(".git", url + i - 3, 4))
-                               url_len = i - 3;
-
                        strbuf_reset(&note);
                        if (*what) {
                                if (*kind)
@@ -651,13 +678,10 @@ static int store_updated_refs(const char *raw_url, const 
char *remote_name,
                                            REFCOL_WIDTH,
                                            *what ? what : "HEAD");
                        if (note.len) {
-                               if (verbosity >= 0 && !shown_url) {
-                                       fprintf(stderr, _("From %.*s\n"),
-                                                       url_len, url);
-                                       shown_url = 1;
-                               }
-                               if (verbosity >= 0)
+                               if (verbosity >= 0) {
+                                       print_url(raw_url);
                                        fprintf(stderr, " %s\n", note.buf);
+                               }
                        }
                }
        }
-- 
1.8.5.1.163.gd7aced9

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to