Merge branch 'master' of git://repo.or.cz/git/mergetool.git
authorJunio C Hamano <junkio@cox.net>
Fri, 30 Mar 2007 06:08:45 +0000 (23:08 -0700)
committerJunio C Hamano <junkio@cox.net>
Fri, 30 Mar 2007 06:09:40 +0000 (23:09 -0700)
* 'master' of git://repo.or.cz/git/mergetool.git:
mergetool: Clean up description of files and prompts for merge resolutions
mergetool: Make git-rm quiet when resolving a deleted file conflict
mergetool: Add support for Apple Mac OS X's opendiff command
mergetool: Fix abort command when resolving symlinks and deleted files
mergetool: Remove spurious error message if merge.tool config option not set
mergetool: factor out common code
mergetool: portability fix: don't use reserved word function
mergetool: portability fix: don't assume true is in /bin
mergetool: Don't error out in the merge case where the local file is deleted
mergetool: Replace use of "echo -n" with printf(1) to be more portable
Fix minor formatting issue in man page for git-mergetool

20 files changed:
Documentation/RelNotes-1.5.0.6.txt [new file with mode: 0644]
Documentation/git-log.txt
Documentation/git.txt
GIT-VERSION-GEN
Makefile
builtin-read-tree.c
builtin-rm.c
commit.c
connect.c
contrib/emacs/git.el
git-bisect.sh
git-clone.sh
git-commit.sh
git-fetch.sh
gitweb/gitweb.perl
help.c
http-fetch.c
sha1_file.c
t/t6006-rev-list-format.sh [new file with mode: 0755]
upload-pack.c
diff --git a/Documentation/RelNotes-1.5.0.6.txt b/Documentation/RelNotes-1.5.0.6.txt
new file mode 100644 (file)
index 0000000..e15447f
--- /dev/null
@@ -0,0 +1,22 @@
+GIT v1.5.0.6 Release Notes
+==========================
+
+Fixes since v1.5.0.5
+--------------------
+
+* Bugfixes
+
+  - a handful small fixes to gitweb.
+
+  - build procedure for user-manual is fixed not to require locally
+    installed stylesheets.
+
+  - "git commit $paths" on paths whose earlier contents were
+    already updated in the index were failing out.
+
+* Documentation
+
+  - user-manual has better cross references.
+
+  - gitweb installation/deployment procedure is now documented.
+
index 361eaec700bf6401f89c7e631f53414a399affe6..030edaf305a620935840b3ffdcc0ca546d4e43da 100644 (file)
@@ -38,6 +38,11 @@ include::pretty-formats.txt[]
        and <until>, see "SPECIFYING REVISIONS" section in
        gitlink:git-rev-parse[1].
 
+--first-parent::
+       Follow only the first parent commit upon seeing a merge
+       commit.  This  option gives a better overview of the
+       evolution of a particular branch.
+
 -p::
        Show the change the commit introduces in a patch form.
 
index 31397dc5390d79343dc5d6fa5501cd493be0ea21..dceacfac11cf705691067c292efbeecdccb81933 100644 (file)
@@ -35,7 +35,9 @@ ifdef::stalenotes[]
 You are reading the documentation for the latest version of git.
 Documentation for older releases are available here:
 
-* link:v1.5.0.5/git.html[documentation for release 1.5.0.5]
+* link:v1.5.0.6/git.html[documentation for release 1.5.0.6]
+
+* link:v1.5.0.6/RelNotes-1.5.0.6.txt[release notes for 1.5.0.6]
 
 * link:v1.5.0.5/RelNotes-1.5.0.5.txt[release notes for 1.5.0.5]
 
index 551c3916154666e675d2afef5d590bf464684b80..601f30f311b5ed246093c8b626922d4f7a84ad87 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v1.5.1-rc2.GIT
+DEF_VER=v1.5.1-rc3.GIT
 
 LF='
 '
index 51c1fed7116b3816398f3ec4535f027beb71e933..960f98e8013feee2326e3db989838104c487c0d3 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -963,7 +963,7 @@ dist-doc:
 
 clean:
        rm -f *.o mozilla-sha1/*.o arm/*.o ppc/*.o compat/*.o xdiff/*.o \
-               $(LIB_FILE) $(XDIFF_LIB)
+               test-chmtime$X $(LIB_FILE) $(XDIFF_LIB)
        rm -f $(ALL_PROGRAMS) $(BUILT_INS) git$X
        rm -f *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h TAGS tags
        rm -rf autom4te.cache
index 82df94101a20a9ea9c06cd6d6ce8db56d8a7de18..793eae0a5f4cc3d21788a3642f156410ce1ad89d 100644 (file)
@@ -184,7 +184,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
                        if (opts.dir)
                                die("more than one --exclude-per-directory are given.");
 
-                       dir = calloc(1, sizeof(*opts.dir));
+                       dir = xcalloc(1, sizeof(*opts.dir));
                        dir->show_ignored = 1;
                        dir->exclude_per_dir = arg + 24;
                        opts.dir = dir;
index 00dbe399609051647f393e0c543a862a0ba432c8..bf42003a7e79f96bf4964b116ddd3ee79350e682 100644 (file)
@@ -89,20 +89,10 @@ static int check_local_mod(unsigned char *head)
                if (ce_match_stat(ce, &st, 0))
                        errs = error("'%s' has local modifications "
                                     "(hint: try -f)", ce->name);
-               if (no_head)
-                       continue;
-               /*
-                * It is Ok to remove a newly added path, as long as
-                * it is cache-clean.
-                */
-               if (get_tree_entry(head, name, sha1, &mode))
-                       continue;
-               /*
-                * Otherwise make sure the version from the HEAD
-                * matches the index.
-                */
-               if (ce->ce_mode != create_ce_mode(mode) ||
-                   hashcmp(ce->sha1, sha1))
+               if (no_head
+                    || get_tree_entry(head, name, sha1, &mode)
+                    || ce->ce_mode != create_ce_mode(mode)
+                    || hashcmp(ce->sha1, sha1))
                        errs = error("'%s' has changes staged in the index "
                                     "(hint: try -f)", name);
        }
index 718e568855a37586f99f20bcfafd44cf3aa2b657..754d1b8a0b8282fd3d1d6bd8f6ccb21b407504a5 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -654,6 +654,7 @@ static char *get_header(const struct commit *commit, const char *key)
 static char *replace_encoding_header(char *buf, const char *encoding)
 {
        char *encoding_header = strstr(buf, "\nencoding ");
+       char *header_end = strstr(buf, "\n\n");
        char *end_of_encoding_header;
        int encoding_header_pos;
        int encoding_header_len;
@@ -661,8 +662,10 @@ static char *replace_encoding_header(char *buf, const char *encoding)
        int need_len;
        int buflen = strlen(buf) + 1;
 
-       if (!encoding_header)
-               return buf; /* should not happen but be defensive */
+       if (!header_end)
+               header_end = buf + buflen;
+       if (!encoding_header || encoding_header >= header_end)
+               return buf;
        encoding_header++;
        end_of_encoding_header = strchr(encoding_header, '\n');
        if (!end_of_encoding_header)
@@ -760,7 +763,7 @@ static void fill_person(struct interp *table, const char *msg, int len)
        if (msg + start == ep)
                return;
 
-       table[5].value = xstrndup(msg + start, ep - msg + start);
+       table[5].value = xstrndup(msg + start, ep - (msg + start));
 
        /* parse tz */
        for (start = ep - msg + 1; start < len && isspace(msg[start]); start++)
@@ -849,19 +852,23 @@ static long format_commit_message(const struct commit *commit,
        interp_set_entry(table, ITREE_ABBREV,
                        find_unique_abbrev(commit->tree->object.sha1,
                                DEFAULT_ABBREV));
+
+       parents[1] = 0;
        for (i = 0, p = commit->parents;
                        p && i < sizeof(parents) - 1;
                        p = p->next)
-               i += snprintf(parents + i, sizeof(parents) - i - 1, "%s ",
+               i += snprintf(parents + i, sizeof(parents) - i - 1, " %s",
                        sha1_to_hex(p->item->object.sha1));
-       interp_set_entry(table, IPARENTS, parents);
+       interp_set_entry(table, IPARENTS, parents + 1);
+
+       parents[1] = 0;
        for (i = 0, p = commit->parents;
                        p && i < sizeof(parents) - 1;
                        p = p->next)
-               i += snprintf(parents + i, sizeof(parents) - i - 1, "%s ",
+               i += snprintf(parents + i, sizeof(parents) - i - 1, " %s",
                        find_unique_abbrev(p->item->object.sha1,
                                DEFAULT_ABBREV));
-       interp_set_entry(table, IPARENTS_ABBREV, parents);
+       interp_set_entry(table, IPARENTS_ABBREV, parents + 1);
 
        for (i = 0, state = HEADER; msg[i] && state < BODY; i++) {
                int eol;
@@ -884,7 +891,8 @@ static long format_commit_message(const struct commit *commit,
                        fill_person(table + ICOMMITTER_NAME,
                                        msg + i + 10, eol - i - 10);
                else if (!prefixcmp(msg + i, "encoding "))
-                       table[IENCODING].value = xstrndup(msg + i, eol - i);
+                       table[IENCODING].value =
+                               xstrndup(msg + i + 9, eol - i - 9);
                i = eol;
        }
        if (msg[i])
index 5048653639b3eea4c68eaaa4382363b2bc468e06..da89c9cfcf3469dfab789f2644f953ea46666e90 100644 (file)
--- a/connect.c
+++ b/connect.c
@@ -417,6 +417,8 @@ static int git_tcp_connect_sock(char *host)
        if (colon) {
                *colon = 0;
                port = colon + 1;
+               if (!*port)
+                       port = "<none>";
        }
 
        memset(&hints, 0, sizeof(hints));
@@ -425,7 +427,7 @@ static int git_tcp_connect_sock(char *host)
 
        gai = getaddrinfo(host, port, &hints, &ai);
        if (gai)
-               die("Unable to look up %s (%s)", host, gai_strerror(gai));
+               die("Unable to look up %s (port %s) (%s)", host, port, gai_strerror(gai));
 
        for (ai0 = ai; ai; ai = ai->ai_next) {
                sockfd = socket(ai->ai_family,
index 5f22dec5f71bfe2cb983dd9eabbb1b848b252eba..2f9995ea3979350c7cd3883dfc6364e90b8d9bb2 100644 (file)
@@ -263,6 +263,16 @@ and returns the process output as a string."
              (locale-charset-to-coding-system repo-config))
       'utf-8)))
 
+(defun git-get-logoutput-coding-system ()
+  "Return the coding system used for git-log output."
+  (let ((repo-config (or (git-config "i18n.logoutputencoding")
+                         (git-config "i18n.commitencoding"))))
+    (or git-commits-coding-system
+        (and repo-config
+             (fboundp 'locale-charset-to-coding-system)
+             (locale-charset-to-coding-system repo-config))
+      'utf-8)))
+
 (defun git-escape-file-name (name)
   "Escape a file name if necessary."
   (if (string-match "[\n\t\"\\]" name)
@@ -406,6 +416,14 @@ and returns the process output as a string."
           (push (match-string 0) heads))))
     (nreverse heads)))
 
+(defun git-get-commit-description (commit)
+  "Get a one-line description of COMMIT."
+  (let ((coding-system-for-read (git-get-logoutput-coding-system)))
+    (let ((descr (git-call-process-env-string nil "log" "--max-count=1" "--pretty=oneline" commit)))
+      (if (and descr (string-match "\\`\\([0-9a-f]\\{40\\}\\) *\\(.*\\)$" descr))
+          (concat (substring (match-string 1 descr) 0 10) " - " (match-string 2 descr))
+        descr))))
+
 ;;;; File info structure
 ;;;; ------------------------------------------------------------
 
@@ -573,7 +591,7 @@ and returns the process output as a string."
   "Refresh the ewoc header and footer."
   (let ((branch (git-symbolic-ref "HEAD"))
         (head (if (git-empty-db-p) "Nothing committed yet"
-                (substring (git-rev-parse "HEAD") 0 10)))
+                (git-get-commit-description "HEAD")))
         (merge-heads (git-get-merge-heads)))
     (ewoc-set-hf status
                  (format "Directory:  %s\nBranch:     %s\nHead:       %s%s\n"
@@ -584,7 +602,7 @@ and returns the process output as a string."
                          head
                          (if merge-heads
                              (concat "\nMerging:    "
-                                     (mapconcat (lambda (str) (substring str 0 10)) merge-heads " "))
+                                     (mapconcat (lambda (str) (git-get-commit-description str)) merge-heads "\n            "))
                            ""))
                  (if (ewoc-nth status 0) "" "    No changes."))))
 
index fda1712a085fa9271ea1a8e0e581c5d4c6801969..57d6754d34cf711804c7d0189a55a18e47ba5b8a 100755 (executable)
@@ -223,6 +223,14 @@ bisect_replay () {
 }
 
 bisect_run () {
+    # Check that we have everything to run correctly.
+    test -d "$GIT_DIR/refs/bisect" || {
+       echo >&2 'You need to start by "git bisect start".'
+       echo >&2 'And then by "git bisect bad" and "git bisect good".'
+       exit 1
+    }
+    bisect_next_check fail
+
     while true
     do
       echo "running $@"
index 6ba477d1f4ee16c20e3fee7dd881f1645bcb80f1..513b574d13858f1a81e6f66251890d81bf0e55ce 100755 (executable)
@@ -60,7 +60,7 @@ Perhaps git-update-server-info needs to be run there?"
                else
                        tname=$name
                fi
-               git-http-fetch $v -a -w "$tname" "$name" "$1/" || exit 1
+               git-http-fetch $v -a -w "$tname" "$name" "$1" || exit 1
        done <"$clone_tmp/refs"
        rm -fr "$clone_tmp"
        http_fetch "$1/HEAD" "$GIT_DIR/REMOTE_HEAD" ||
index 3656d607d5b91d8d125b5a72b6a2a00aee512618..292cf967e3cbc77e7b49eb7252a756194e917418 100755 (executable)
@@ -371,7 +371,7 @@ t,)
                if test -z "$initial_commit"
                then
                        cp "$THIS_INDEX" "$TMP_INDEX"
-                       GIT_INDEX_FILE="$TMP_INDEX" git-read-tree -m HEAD
+                       GIT_INDEX_FILE="$TMP_INDEX" git-read-tree -i -m HEAD
                else
                        rm -f "$TMP_INDEX"
                fi || exit
index 93349330d45ad43c5c7e146a942d76b78c0e2ee9..fd70696b7479ad08eedbb44b75654f07247cc37b 100755 (executable)
@@ -248,7 +248,7 @@ fetch_per_ref () {
          expr "z$head" : "z$_x40\$" >/dev/null ||
                die "No such ref $remote_name at $remote"
          echo >&2 "Fetching $remote_name from $remote using $proto"
-         git-http-fetch -v -a "$head" "$remote/" || exit
+         git-http-fetch -v -a "$head" "$remote" || exit
          ;;
       rsync://*)
          test -n "$shallow_depth" &&
index 5214050a882650db098f152c5cc032fdcc823232..334858322785d165261ddb926fc990f0f91982dd 100755 (executable)
@@ -3154,7 +3154,7 @@ sub git_blame2 {
        }
        $ftype = git_get_type($hash);
        if ($ftype !~ "blob") {
-               die_error("400 Bad Request", "Object is not a blob");
+               die_error('400 Bad Request', "Object is not a blob");
        }
        open ($fd, "-|", git_cmd(), "blame", '-p', '--',
              $file_name, $hash_base)
@@ -3220,7 +3220,7 @@ sub git_blame2 {
                        print "</td>\n";
                }
                open (my $dd, "-|", git_cmd(), "rev-parse", "$full_rev^")
-                       or die_error("could not open git-rev-parse");
+                       or die_error(undef, "Open git-rev-parse failed");
                my $parent_commit = <$dd>;
                close $dd;
                chomp($parent_commit);
@@ -3622,7 +3622,7 @@ sub git_snapshot {
        $name =~ s/\047/\047\\\047\047/g;
        open my $fd, "-|",
        "$git archive --format=tar --prefix=\'$name\'/ $hash | $command"
-               or die_error(undef, "Execute git-tar-tree failed.");
+               or die_error(undef, "Execute git-tar-tree failed");
        binmode STDOUT, ':raw';
        print <$fd>;
        binmode STDOUT, ':utf8'; # as set at the beginning of gitweb.cgi
diff --git a/help.c b/help.c
index be8651a73977f860a87fb944f6fca52af41a2c28..6a9af4d175f2fe9724a2844df63e4011ba91f1b3 100644 (file)
--- a/help.c
+++ b/help.c
@@ -31,12 +31,6 @@ static int term_columns(void)
        return 80;
 }
 
-static void oom(void)
-{
-       fprintf(stderr, "git: out of memory\n");
-       exit(1);
-}
-
 static inline void mput_char(char c, unsigned int num)
 {
        while(num--)
@@ -54,13 +48,9 @@ static void add_cmdname(const char *name, int len)
        struct cmdname *ent;
        if (cmdname_alloc <= cmdname_cnt) {
                cmdname_alloc = cmdname_alloc + 200;
-               cmdname = realloc(cmdname, cmdname_alloc * sizeof(*cmdname));
-               if (!cmdname)
-                       oom();
+               cmdname = xrealloc(cmdname, cmdname_alloc * sizeof(*cmdname));
        }
        ent = xmalloc(sizeof(*ent) + len);
-       if (!ent)
-               oom();
        ent->len = len;
        memcpy(ent->name, name, len);
        ent->name[len] = 0;
index e6cd11db737e1ed79c3b60d33674c6e0ce38af55..557b40322f22b77a81140ff8f29b2b2be0505581 100644 (file)
@@ -16,8 +16,7 @@ static struct curl_slist *no_pragma_header;
 
 struct alt_base
 {
-       const char *base;
-       int path_len;
+       char *base;
        int got_indices;
        struct packed_git *packs;
        struct alt_base *next;
@@ -158,12 +157,12 @@ static void start_object_request(struct object_request *obj_req)
 
        SHA1_Init(&obj_req->c);
 
-       url = xmalloc(strlen(obj_req->repo->base) + 50);
-       obj_req->url = xmalloc(strlen(obj_req->repo->base) + 50);
+       url = xmalloc(strlen(obj_req->repo->base) + 51);
+       obj_req->url = xmalloc(strlen(obj_req->repo->base) + 51);
        strcpy(url, obj_req->repo->base);
        posn = url + strlen(obj_req->repo->base);
-       strcpy(posn, "objects/");
-       posn += 8;
+       strcpy(posn, "/objects/");
+       posn += 9;
        memcpy(posn, hex, 2);
        posn += 2;
        *(posn++) = '/';
@@ -515,7 +514,6 @@ static void process_alternates_response(void *callback_data)
                        int serverlen = 0;
                        struct alt_base *newalt;
                        char *target = NULL;
-                       char *path;
                        if (data[i] == '/') {
                                /* This counts
                                 * http://git.host/pub/scm/linux.git/
@@ -583,12 +581,6 @@ static void process_alternates_response(void *callback_data)
                                newalt->base = target;
                                newalt->got_indices = 0;
                                newalt->packs = NULL;
-                               path = strstr(target, "//");
-                               if (path) {
-                                       path = strchr(path+2, '/');
-                                       if (path)
-                                               newalt->path_len = strlen(path);
-                               }
 
                                while (tail->next != NULL)
                                        tail = tail->next;
@@ -938,14 +930,14 @@ static char *quote_ref_url(const char *base, const char *ref)
        int len, baselen, ch;
 
        baselen = strlen(base);
-       len = baselen + 6; /* "refs/" + NUL */
+       len = baselen + 7; /* "/refs/" + NUL */
        for (cp = ref; (ch = *cp) != 0; cp++, len++)
                if (needs_quote(ch))
                        len += 2; /* extra two hex plus replacement % */
        qref = xmalloc(len);
        memcpy(qref, base, baselen);
-       memcpy(qref + baselen, "refs/", 5);
-       for (cp = ref, dp = qref + baselen + 5; (ch = *cp) != 0; cp++) {
+       memcpy(qref + baselen, "/refs/", 6);
+       for (cp = ref, dp = qref + baselen + 6; (ch = *cp) != 0; cp++) {
                if (needs_quote(ch)) {
                        *dp++ = '%';
                        *dp++ = hex((ch >> 4) & 0xF);
@@ -999,7 +991,7 @@ int main(int argc, const char **argv)
        const char **write_ref = NULL;
        char **commit_id;
        const char *url;
-       char *path;
+       char *s;
        int arg = 1;
        int rc = 0;
 
@@ -1044,16 +1036,13 @@ int main(int argc, const char **argv)
        no_pragma_header = curl_slist_append(no_pragma_header, "Pragma:");
 
        alt = xmalloc(sizeof(*alt));
-       alt->base = url;
+       alt->base = xmalloc(strlen(url) + 1);
+       strcpy(alt->base, url);
+       for (s = alt->base + strlen(alt->base) - 1; *s == '/'; --s)
+               *s = 0;
        alt->got_indices = 0;
        alt->packs = NULL;
        alt->next = NULL;
-       path = strstr(url, "//");
-       if (path) {
-               path = strchr(path+2, '/');
-               if (path)
-                       alt->path_len = strlen(path);
-       }
 
        if (pull(commits, commit_id, write_ref, url))
                rc = 1;
index 0897b945e5dace8189adc35e6eea389cfc7606af..9c260384201857eb32d07c87e1178fd3947968ee 100644 (file)
@@ -2020,7 +2020,8 @@ int write_sha1_file(void *buf, unsigned long len, const char *type, unsigned cha
        if (write_buffer(fd, compressed, size) < 0)
                die("unable to write sha1 file");
        fchmod(fd, 0444);
-       close(fd);
+       if (close(fd))
+               die("unable to write sha1 file");
        free(compressed);
 
        return move_temp_to_file(tmpfile, filename);
@@ -2155,7 +2156,8 @@ int write_sha1_from_fd(const unsigned char *sha1, int fd, char *buffer,
        inflateEnd(&stream);
 
        fchmod(local, 0444);
-       close(local);
+       if (close(local) != 0)
+               die("unable to write sha1 file");
        SHA1_Final(real_sha1, &c);
        if (ret != Z_STREAM_END) {
                unlink(tmpfile);
diff --git a/t/t6006-rev-list-format.sh b/t/t6006-rev-list-format.sh
new file mode 100755 (executable)
index 0000000..aab17fa
--- /dev/null
@@ -0,0 +1,150 @@
+#!/bin/sh
+
+test_description='git-rev-list --pretty=format test'
+
+. ./test-lib.sh
+
+test_tick
+test_expect_success 'setup' '
+touch foo && git-add foo && git-commit -m "added foo" &&
+  echo changed >foo && git-commit -a -m "changed foo"
+'
+
+# usage: test_format name format_string <expected_output
+test_format() {
+       cat >expect.$1
+       test_expect_success "format $1" "
+git-rev-list --pretty=format:$2 master >output.$1 &&
+git-diff expect.$1 output.$1
+"
+}
+
+test_format hash %H%n%h <<'EOF'
+commit 131a310eb913d107dd3c09a65d1651175898735d
+131a310eb913d107dd3c09a65d1651175898735d
+131a310
+commit 86c75cfd708a0e5868dc876ed5b8bb66c80b4873
+86c75cfd708a0e5868dc876ed5b8bb66c80b4873
+86c75cf
+EOF
+
+test_format tree %T%n%t <<'EOF'
+commit 131a310eb913d107dd3c09a65d1651175898735d
+fe722612f26da5064c32ca3843aa154bdb0b08a0
+fe72261
+commit 86c75cfd708a0e5868dc876ed5b8bb66c80b4873
+4d5fcadc293a348e88f777dc0920f11e7d71441c
+4d5fcad
+EOF
+
+test_format parents %P%n%p <<'EOF'
+commit 131a310eb913d107dd3c09a65d1651175898735d
+86c75cfd708a0e5868dc876ed5b8bb66c80b4873
+86c75cf
+commit 86c75cfd708a0e5868dc876ed5b8bb66c80b4873
+
+
+EOF
+
+# we don't test relative here
+test_format author %an%n%ae%n%ad%n%aD%n%at <<'EOF'
+commit 131a310eb913d107dd3c09a65d1651175898735d
+A U Thor
+author@example.com
+Thu Apr 7 15:13:13 2005 -0700
+Thu, 7 Apr 2005 15:13:13 -0700
+1112911993
+commit 86c75cfd708a0e5868dc876ed5b8bb66c80b4873
+A U Thor
+author@example.com
+Thu Apr 7 15:13:13 2005 -0700
+Thu, 7 Apr 2005 15:13:13 -0700
+1112911993
+EOF
+
+test_format committer %cn%n%ce%n%cd%n%cD%n%ct <<'EOF'
+commit 131a310eb913d107dd3c09a65d1651175898735d
+C O Mitter
+committer@example.com
+Thu Apr 7 15:13:13 2005 -0700
+Thu, 7 Apr 2005 15:13:13 -0700
+1112911993
+commit 86c75cfd708a0e5868dc876ed5b8bb66c80b4873
+C O Mitter
+committer@example.com
+Thu Apr 7 15:13:13 2005 -0700
+Thu, 7 Apr 2005 15:13:13 -0700
+1112911993
+EOF
+
+test_format encoding %e <<'EOF'
+commit 131a310eb913d107dd3c09a65d1651175898735d
+<unknown>
+commit 86c75cfd708a0e5868dc876ed5b8bb66c80b4873
+<unknown>
+EOF
+
+test_format subject %s <<'EOF'
+commit 131a310eb913d107dd3c09a65d1651175898735d
+changed foo
+commit 86c75cfd708a0e5868dc876ed5b8bb66c80b4873
+added foo
+EOF
+
+test_format body %b <<'EOF'
+commit 131a310eb913d107dd3c09a65d1651175898735d
+<unknown>
+commit 86c75cfd708a0e5868dc876ed5b8bb66c80b4873
+<unknown>
+EOF
+
+test_format colors %Credfoo%Cgreenbar%Cbluebaz%Cresetxyzzy <<'EOF'
+commit 131a310eb913d107dd3c09a65d1651175898735d
+\e[31mfoo\e[32mbar\e[34mbaz\e[mxyzzy
+commit 86c75cfd708a0e5868dc876ed5b8bb66c80b4873
+\e[31mfoo\e[32mbar\e[34mbaz\e[mxyzzy
+EOF
+
+cat >commit-msg <<'EOF'
+Test printing of complex bodies
+
+This commit message is much longer than the others,
+and it will be encoded in iso8859-1. We should therefore
+include an iso8859 character: ¡bueno!
+EOF
+test_expect_success 'setup complex body' '
+git-config i18n.commitencoding iso8859-1 &&
+  echo change2 >foo && git-commit -a -F commit-msg
+'
+
+test_format complex-encoding %e <<'EOF'
+commit f58db70b055c5718631e5c61528b28b12090cdea
+iso8859-1
+commit 131a310eb913d107dd3c09a65d1651175898735d
+<unknown>
+commit 86c75cfd708a0e5868dc876ed5b8bb66c80b4873
+<unknown>
+EOF
+
+test_format complex-subject %s <<'EOF'
+commit f58db70b055c5718631e5c61528b28b12090cdea
+Test printing of complex bodies
+commit 131a310eb913d107dd3c09a65d1651175898735d
+changed foo
+commit 86c75cfd708a0e5868dc876ed5b8bb66c80b4873
+added foo
+EOF
+
+test_format complex-body %b <<'EOF'
+commit f58db70b055c5718631e5c61528b28b12090cdea
+This commit message is much longer than the others,
+and it will be encoded in iso8859-1. We should therefore
+include an iso8859 character: ¡bueno!
+
+commit 131a310eb913d107dd3c09a65d1651175898735d
+<unknown>
+commit 86c75cfd708a0e5868dc876ed5b8bb66c80b4873
+<unknown>
+EOF
+
+test_done
index 498bf50eb86f9e437dae89fc631499b73a8ec116..d3a09e78d56642db9b1fb1b1ead34ff60dd8c923 100644 (file)
@@ -119,6 +119,7 @@ static void create_pack_file(void)
                int i;
                struct rev_info revs;
 
+               close(lp_pipe[0]);
                pack_pipe = fdopen(lp_pipe[1], "w");
 
                if (create_full_pack)