Merge branch 'rs/maint-tformat-foldline' into maint
authorJunio C Hamano <gitster@pobox.com>
Sat, 27 Dec 2008 22:22:37 +0000 (14:22 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sat, 27 Dec 2008 22:22:37 +0000 (14:22 -0800)
* rs/maint-tformat-foldline:
pretty: support multiline subjects with format:
pretty: factor out format_subject()
pretty: factor out skip_empty_lines()

Documentation/git-send-email.txt
Documentation/git-shortlog.txt
builtin-describe.c
builtin-merge-file.c
daemon.c
t/t6120-describe.sh
index 12788667d43a3f94d46b802cd1225cf8bc517129..b69846e522fdcf07360b51b8d9f8af56fbecaa65 100644 (file)
@@ -197,12 +197,6 @@ Administering
 --[no-]validate::
        Perform sanity checks on patches.
        Currently, validation means the following:
-
---[no-]format-patch::
-       When an argument may be understood either as a reference or as a file name,
-       choose to understand it as a format-patch argument ('--format-patch')
-       or as a file name ('--no-format-patch'). By default, when such a conflict
-       occurs, git send-email will fail.
 +
 --
                *       Warn of patches that contain lines longer than 998 characters; this
@@ -212,6 +206,12 @@ Administering
 Default is the value of 'sendemail.validate'; if this is not set,
 default to '--validate'.
 
+--[no-]format-patch::
+       When an argument may be understood either as a reference or as a file name,
+       choose to understand it as a format-patch argument ('--format-patch')
+       or as a file name ('--no-format-patch'). By default, when such a conflict
+       occurs, git send-email will fail.
+
 
 CONFIGURATION
 -------------
index 7ccf31ccc401fd35a0ed65667be001805436249b..8f7c0e226df8f58712e6a0d78ecec58c96aa2453 100644 (file)
@@ -48,15 +48,41 @@ OPTIONS
 FILES
 -----
 
-If the file `.mailmap` exists, it will be used for mapping author
-email addresses to a real author name. One mapping per line, first
-the author name followed by the email address enclosed by
-'<' and '>'. Use hash '#' for comments. Example:
+If a file `.mailmap` exists at the toplevel of the repository,
+it is used to map an author email address to a canonical real name. This
+can be used to coalesce together commits by the same person where their
+name was spelled differently (whether with the same email address or
+not).
+
+Each line in the file consists, in this order, of the canonical real name
+of an author, whitespace, and an email address (enclosed by '<' and '>')
+to map to the name. Use hash '#' for comments, either on their own line,
+or after the email address.
+
+A canonical name may appear in more than one line, associated with
+different email addresses, but it doesn't make sense for a given address
+to appear more than once (if that happens, a later line overrides the
+earlier ones).
+
+So, for example, if your history contains commits by two authors, Jane
+and Joe, whose names appear in the repository under several forms:
+
+------------
+Joe Developer <joe@example.com>
+Joe R. Developer <joe@example.com>
+Jane Doe <jane@example.com>
+Jane Doe <jane@laptop.(none)>
+Jane D. <jane@desktop.(none)>
+------------
+
+Then, supposing Joe wants his middle name initial used, and Jane prefers
+her family name fully spelled out, a proper `.mailmap` file would look like:
 
 ------------
-# Keep alphabetized
-Adam Morrow <adam@localhost.localdomain>
-Eve Jones <eve@laptop.(none)>
+# Note how we don't need an entry for <jane@laptop.(none)>, because the
+# real name of that author is correct already, and coalesced directly.
+Jane Doe <jane@desktop.(none)>
+Joe R. Developer <joe@random.com>
 ------------
 
 Author
index d2cfb1b0837ffd1ab3b1f69e8dee0ffa36f2e1ab..3a007ed1cafcab82f466d355b63e416b06eb8864 100644 (file)
@@ -158,7 +158,7 @@ static void display_name(struct commit_name *n)
                n->tag = lookup_tag(n->sha1);
                if (!n->tag || parse_tag(n->tag) || !n->tag->tag)
                        die("annotated tag %s not available", n->path);
-               if (strcmp(n->tag->tag, n->path))
+               if (strcmp(n->tag->tag, all ? n->path + 5 : n->path))
                        warning("tag '%s' is really '%s' here", n->tag->tag, n->path);
        }
 
index 9d4e874809f495ad685a7218584041fa001696e5..96edb97a8327ba64cccf64bfa341e94d9f903e94 100644 (file)
@@ -51,8 +51,11 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix)
        argc = parse_options(argc, argv, options, merge_file_usage, 0);
        if (argc != 3)
                usage_with_options(merge_file_usage, options);
-       if (quiet)
-               freopen("/dev/null", "w", stderr);
+       if (quiet) {
+               if (!freopen("/dev/null", "w", stderr))
+                       return error("failed to redirect stderr to /dev/null: "
+                                    "%s\n", strerror(errno));
+       }
 
        for (i = 0; i < 3; i++) {
                if (!names[i])
index 1cef3098d2bd2fb28e2b670ac26c41eebf37dc78..60bf6c743c559676f0c9e0ff8dc6d9a5dfede195 100644 (file)
--- a/daemon.c
+++ b/daemon.c
@@ -150,7 +150,6 @@ static char *path_ok(char *directory)
 {
        static char rpath[PATH_MAX];
        static char interp_path[PATH_MAX];
-       int retried_path = 0;
        char *path;
        char *dir;
 
@@ -219,22 +218,15 @@ static char *path_ok(char *directory)
                dir = rpath;
        }
 
-       do {
-               path = enter_repo(dir, strict_paths);
-               if (path)
-                       break;
-
+       path = enter_repo(dir, strict_paths);
+       if (!path && base_path && base_path_relaxed) {
                /*
                 * if we fail and base_path_relaxed is enabled, try without
                 * prefixing the base path
                 */
-               if (base_path && base_path_relaxed && !retried_path) {
-                       dir = directory;
-                       retried_path = 1;
-                       continue;
-               }
-               break;
-       } while (1);
+               dir = directory;
+               path = enter_repo(dir, strict_paths);
+       }
 
        if (!path) {
                logerror("'%s': unable to chdir or not a git archive", dir);
@@ -405,6 +397,14 @@ static void make_service_overridable(const char *name, int ena)
        die("No such service %s", name);
 }
 
+static char *xstrdup_tolower(const char *str)
+{
+       char *p, *dup = xstrdup(str);
+       for (p = dup; *p; p++)
+               *p = tolower(*p);
+       return dup;
+}
+
 /*
  * Separate the "extra args" information as supplied by the client connection.
  */
@@ -413,7 +413,6 @@ static void parse_extra_args(char *extra_args, int buflen)
        char *val;
        int vallen;
        char *end = extra_args + buflen;
-       char *hp;
 
        while (extra_args < end && *extra_args) {
                saw_extended_args = 1;
@@ -431,7 +430,7 @@ static void parse_extra_args(char *extra_args, int buflen)
                                        tcp_port = xstrdup(port);
                                }
                                free(hostname);
-                               hostname = xstrdup(host);
+                               hostname = xstrdup_tolower(host);
                        }
 
                        /* On to the next one */
@@ -439,20 +438,11 @@ static void parse_extra_args(char *extra_args, int buflen)
                }
        }
 
-       /*
-        * Replace literal host with lowercase-ized hostname.
-        */
-       hp = hostname;
-       if (!hp)
-               return;
-       for ( ; *hp; hp++)
-               *hp = tolower(*hp);
-
        /*
         * Locate canonical hostname and its IP address.
         */
+       if (hostname) {
 #ifndef NO_IPV6
-       {
                struct addrinfo hints;
                struct addrinfo *ai, *ai0;
                int gai;
@@ -476,9 +466,7 @@ static void parse_extra_args(char *extra_args, int buflen)
                        }
                        freeaddrinfo(ai0);
                }
-       }
 #else
-       {
                struct hostent *hent;
                struct sockaddr_in sa;
                char **ap;
@@ -499,8 +487,8 @@ static void parse_extra_args(char *extra_args, int buflen)
                canon_hostname = xstrdup(hent->h_name);
                free(ip_address);
                ip_address = xstrdup(addrbuf);
-       }
 #endif
+       }
 }
 
 
@@ -953,12 +941,8 @@ int main(int argc, char **argv)
                char *arg = argv[i];
 
                if (!prefixcmp(arg, "--listen=")) {
-                   char *p = arg + 9;
-                   char *ph = listen_addr = xmalloc(strlen(arg + 9) + 1);
-                   while (*p)
-                       *ph++ = tolower(*p++);
-                   *ph = 0;
-                   continue;
+                       listen_addr = xstrdup_tolower(arg + 9);
+                       continue;
                }
                if (!prefixcmp(arg, "--port=")) {
                        char *end;
@@ -1118,7 +1102,9 @@ int main(int argc, char **argv)
                struct sockaddr *peer = (struct sockaddr *)&ss;
                socklen_t slen = sizeof(ss);
 
-               freopen("/dev/null", "w", stderr);
+               if (!freopen("/dev/null", "w", stderr))
+                       die("failed to redirect stderr to /dev/null: %s",
+                           strerror(errno));
 
                if (getpeername(0, peer, &slen))
                        peer = NULL;
index e6c9e59b617f4eaaa1148ed29b4ca92116bdf0c2..8c7e081c53eec31d38844d8efb9b942893107b09 100755 (executable)
@@ -100,6 +100,12 @@ check_describe B --tags HEAD^^2^
 check_describe B-0-* --long HEAD^^2^
 check_describe A-3-* --long HEAD^^2
 
+: >err.expect
+check_describe A --all A^0
+test_expect_success 'no warning was displayed for A' '
+       test_cmp err.expect err.actual
+'
+
 test_expect_success 'rename tag A to Q locally' '
        mv .git/refs/tags/A .git/refs/tags/Q
 '