Refactor to do diff per commit and only show conflicted changes in merges.
authorStephen Haberman <stephen@exigencecorp.com>
Fri, 22 Aug 2008 12:28:06 +0000 (07:28 -0500)
committerStephen Haberman <stephen@exigencecorp.com>
Fri, 22 Aug 2008 12:28:06 +0000 (07:28 -0500)
22 files changed:
server/functions
server/post-receive-email
tests/t2200-1.txt
tests/t2200-server-post-receive-email.sh
tests/t2201-1.txt
tests/t2201-2.txt
tests/t2201-3.txt
tests/t2201-4.txt
tests/t2201-5.txt
tests/t2201-6.txt
tests/t2201-7.txt
tests/t2201-8.txt
tests/t2201-server-post-receive-email-tags.sh
tests/t2202-1.txt
tests/t2202-3.txt
tests/t2202-4.txt
tests/t2202-5.txt
tests/t2202-6.txt
tests/t2202-server-post-receive-email-branches.sh
tests/t2203-1.txt
tests/t2203-2.txt
tests/t2203-server-post-receive-email-stable.sh

index 28ad90f..5e4616a 100644 (file)
@@ -8,6 +8,83 @@
 # as it will replace only the first match, compared to the canonical "grep -v"
 # approach which will throw out multiple matches if the same commit is referred
 # to by multiple branches.
+#
+# Excellent, excellent docs from Andy Parkin's email script
+#
+##################################################
+#
+# Consider this:
+#   1 --- 2 --- O --- X --- 3 --- 4 --- N
+#
+# O is $oldrev for $refname
+# N is $newrev for $refname
+# X is a revision pointed to by some other ref, for which we may
+#   assume that an email has already been generated.
+# In this case we want to issue an email containing only revisions
+# 3, 4, and N.  Given (almost) by
+#
+#  git rev-list N ^O --not --all
+#
+# The reason for the "almost", is that the "--not --all" will take
+# precedence over the "N", and effectively will translate to
+#
+#  git rev-list N ^O ^X ^N
+#
+# So, we need to build up the list more carefully.  git rev-parse
+# will generate a list of revs that may be fed into git rev-list.
+# We can get it to make the "--not --all" part and then filter out
+# the "^N" with:
+#
+#  git rev-parse --not --all | grep -v N
+#
+# Then, using the --stdin switch to git rev-list we have effectively
+# manufactured
+#
+#  git rev-list N ^O ^X
+#
+# This leaves a problem when someone else updates the repository
+# while this script is running.  Their new value of the ref we're
+# working on would be included in the "--not --all" output; and as
+# our $newrev would be an ancestor of that commit, it would exclude
+# all of our commits.  What we really want is to exclude the current
+# value of $refname from the --not list, rather than N itself.  So:
+#
+#  git rev-parse --not --all | grep -v $(git rev-parse $refname)
+#
+# Get's us to something pretty safe (apart from the small time
+# between refname being read, and git rev-parse running - for that,
+# I give up)
+#
+#
+# Next problem, consider this:
+#   * --- B --- * --- O ($oldrev)
+#          \
+#           * --- X --- * --- N ($newrev)
+#
+# That is to say, there is no guarantee that oldrev is a strict
+# subset of newrev (it would have required a --force, but that's
+# allowed).  So, we can't simply say rev-list $oldrev..$newrev.
+# Instead we find the common base of the two revs and list from
+# there.
+#
+# As above, we need to take into account the presence of X; if
+# another branch is already in the repository and points at some of
+# the revisions that we are about to output - we don't want them.
+# The solution is as before: git rev-parse output filtered.
+#
+# Finally, tags: 1 --- 2 --- O --- T --- 3 --- 4 --- N
+#
+# Tags pushed into the repository generate nice shortlog emails that
+# summarise the commits between them and the previous tag.  However,
+# those emails don't include the full commit messages that we output
+# for a branch update.  Therefore we still want to output revisions
+# that have been output on a tag email.
+#
+# Luckily, git rev-parse includes just the tool.  Instead of using
+# "--all" we use "--branches"; this has the added benefit that
+# "remotes/" will be ignored as well.
+#
+##################################################
 function set_new_commits() {
        nl=$'\n'
 
index 1e08c8a..7bc974e 100755 (executable)
@@ -160,26 +160,25 @@ generate_email_header()
 generate_create_branch_email()
 {
        # This is a new branch and so oldrev is not valid
-       echo "        at  $newrev ($newrev_type)"
-       echo ""
-
-       echo $LOGBEGIN
-       # This shows all log entries that are not already covered by
-       # another ref - i.e. commits that are now accessible from this
-       # ref that were previously not accessible
-       # (see generate_update_branch_email for the explanation of this
-       # command)
+       git rev-list --pretty=format:"        at %h %s" --no-walk "$newrev" | grep -vP "^commit"
 
        set_new_commits
-       echo "$new_commits" | git rev-list --pretty --reverse --stdin
-       echo $LOGEND
 
        echo ""
-       echo "Summary of changes:"
+       echo $LOGBEGIN
+       echo "$new_commits" | git rev-list --reverse --stdin | while read commit ; do
+               echo ""
+               git rev-list --no-walk --pretty "$commit"
+               git diff-tree --cc "$commit"
+               echo ""
+               echo $LOGEND
+       done
 
        oldest_new=$(echo "$new_commits" | git rev-list --stdin | tail -n 1)
        if [ "$oldest_new" != "" ] ; then
-               git diff-tree --stat -p $oldest_new^..$newrev
+               echo ""
+               echo "Summary of changes:"
+               git diff-tree --stat $oldest_new^..$newrev
        fi
 }
 
@@ -188,121 +187,20 @@ generate_create_branch_email()
 #
 generate_update_branch_email()
 {
-       # Consider this:
-       #   1 --- 2 --- O --- X --- 3 --- 4 --- N
-       #
-       # O is $oldrev for $refname
-       # N is $newrev for $refname
-       # X is a revision pointed to by some other ref, for which we may
-       #   assume that an email has already been generated.
-       # In this case we want to issue an email containing only revisions
-       # 3, 4, and N.  Given (almost) by
-       #
-       #  git rev-list N ^O --not --all
-       #
-       # The reason for the "almost", is that the "--not --all" will take
-       # precedence over the "N", and effectively will translate to
-       #
-       #  git rev-list N ^O ^X ^N
-       #
-       # So, we need to build up the list more carefully.  git rev-parse
-       # will generate a list of revs that may be fed into git rev-list.
-       # We can get it to make the "--not --all" part and then filter out
-       # the "^N" with:
-       #
-       #  git rev-parse --not --all | grep -v N
-       #
-       # Then, using the --stdin switch to git rev-list we have effectively
-       # manufactured
-       #
-       #  git rev-list N ^O ^X
-       #
-       # This leaves a problem when someone else updates the repository
-       # while this script is running.  Their new value of the ref we're
-       # working on would be included in the "--not --all" output; and as
-       # our $newrev would be an ancestor of that commit, it would exclude
-       # all of our commits.  What we really want is to exclude the current
-       # value of $refname from the --not list, rather than N itself.  So:
-       #
-       #  git rev-parse --not --all | grep -v $(git rev-parse $refname)
-       #
-       # Get's us to something pretty safe (apart from the small time
-       # between refname being read, and git rev-parse running - for that,
-       # I give up)
-       #
-       #
-       # Next problem, consider this:
-       #   * --- B --- * --- O ($oldrev)
-       #          \
-       #           * --- X --- * --- N ($newrev)
-       #
-       # That is to say, there is no guarantee that oldrev is a strict
-       # subset of newrev (it would have required a --force, but that's
-       # allowed).  So, we can't simply say rev-list $oldrev..$newrev.
-       # Instead we find the common base of the two revs and list from
-       # there.
-       #
-       # As above, we need to take into account the presence of X; if
-       # another branch is already in the repository and points at some of
-       # the revisions that we are about to output - we don't want them.
-       # The solution is as before: git rev-parse output filtered.
-       #
-       # Finally, tags: 1 --- 2 --- O --- T --- 3 --- 4 --- N
-       #
-       # Tags pushed into the repository generate nice shortlog emails that
-       # summarise the commits between them and the previous tag.  However,
-       # those emails don't include the full commit messages that we output
-       # for a branch update.  Therefore we still want to output revisions
-       # that have been output on a tag email.
-       #
-       # Luckily, git rev-parse includes just the tool.  Instead of using
-       # "--all" we use "--branches"; this has the added benefit that
-       # "remotes/" will be ignored as well.
-
-       # List all of the revisions that were removed by this update, in a
-       # fast forward update, this list will be empty, because rev-list O
-       # ^N is empty.  For a non fast forward, O ^N is the list of removed
-       # revisions
-       fast_forward=""
-       rev=""
-       for rev in $(git rev-list $newrev..$oldrev)
-       do
-               revtype=$(git cat-file -t "$rev")
-               echo "  discards  $rev ($revtype)"
-       done
-       if [ -z "$rev" ]; then
-               fast_forward=1
-       fi
+       # List all of the revisions that were removed by this update (hopefully empty)
+       git rev-list --first-parent --pretty=format:"  discards %h %s" $newrev..$oldrev | grep -vP "^commit"
 
-       # List all the revisions from baserev to newrev in a kind of
-       # "table-of-contents"; note this list can include revisions that
-       # have already had notification emails and is present to show the
-       # full detail of the change from rolling back the old revision to
-       # the base revision and then forward to the new revision
-       # Changed: added --first-parent to not go down merge commits
-       for rev in $(git rev-list --first-parent $oldrev..$newrev)
-       do
-               revtype=$(git cat-file -t "$rev")
-               echo "       via  $rev ($revtype)"
-       done
+       # List all of the revisions that were added by this update
+       git rev-list --first-parent --pretty=format:"       via %h %s" $oldrev..$newrev | grep -vP "^commit"
 
-       if [ "$fast_forward" ]; then
-               echo "      from  $oldrev ($oldrev_type)"
+       removed=$(git rev-list $newrev..$oldrev)
+       if [ "$removed" == "" ] ; then
+               git rev-list --no-walk --pretty=format:"      from %h %s" $oldrev | grep -vP "^commit"
        else
-               #  1. Existing revisions were removed.  In this case newrev
-               #     is a subset of oldrev - this is the reverse of a
-               #     fast-forward, a rewind
-               #  2. New revisions were added on top of an old revision,
-               #     this is a rewind and addition.
-
-               # (1) certainly happened, (2) possibly.  When (2) hasn't
-               # happened, we set a flag to indicate that no log printout
-               # is required.
-
+               # Must be rewind, could be rewind+addition
                echo ""
 
-               # Find the common ancestor of the old and new revisions and
-               # compare it with newrev
+               # Find the common ancestor of the old and new revisions and compare it with newrev
                baserev=$(git merge-base $oldrev $newrev)
                rewind_only=""
                if [ "$baserev" = "$newrev" ]; then
@@ -338,31 +236,29 @@ generate_update_branch_email()
                echo "not appeared on any other notification email; so we list those"
                echo "revisions in full, below."
 
+               set_new_commits
+
                echo ""
                echo $LOGBEGIN
-
-               set_new_commits
-               echo "$new_commits" | git rev-list --reverse --pretty --stdin
+               echo "$new_commits" | git rev-list --reverse --stdin | while read commit ; do
+                       echo ""
+                       git rev-list --no-walk --pretty "$commit"
+                       git diff-tree --cc "$commit"
+                       echo ""
+                       echo $LOGEND
+               done
 
                # XXX: Need a way of detecting whether git rev-list actually
                # outputted anything, so that we can issue a "no new
                # revisions added by this update" message
-
-               echo $LOGEND
        else
                echo "No new revisions were added by this update."
        fi
 
-       # The diffstat is shown from the old revision to the new revision.
-       # This is to show the truth of what happened in this change.
-       # There's no point showing the stat from the base to the new
-       # revision because the base is effectively a random revision at this
-       # point - the user will be interested in what this revision changed
-       # - including the undoing of previous revisions in the case of
-       # non-fast forward updates.
+       # Show the diffstat which is what really happened (new commits/whatever aside)
        echo ""
        echo "Summary of changes:"
-       git diff-tree --stat -p --find-copies-harder $oldrev..$newrev
+       git diff-tree --stat --find-copies-harder $oldrev..$newrev
 }
 
 #
@@ -384,7 +280,7 @@ generate_delete_branch_email()
 #
 generate_create_atag_email()
 {
-       echo "        at  $newrev ($newrev_type)"
+       echo "        at $newrev ($newrev_type)"
        generate_atag_email
 }
 
@@ -394,8 +290,8 @@ generate_create_atag_email()
 #
 generate_update_atag_email()
 {
-       echo "        to  $newrev ($newrev_type)"
-       echo "      from  $oldrev (which is now obsolete)"
+       echo "        to $newrev ($newrev_type)"
+       echo "      from $oldrev (which is now obsolete)"
        generate_atag_email
 }
 
@@ -413,25 +309,22 @@ generate_atag_email()
        tagged=%(taggerdate)' $refname
        )
 
-       echo "   tagging  $tagobject ($tagtype)"
+       echo "   tagging $tagobject ($tagtype)"
        case "$tagtype" in
        commit)
-
                # If the tagged object is a commit, then we assume this is a
-               # release, and so we calculate which tag this tag is
-               # replacing
+               # release, and so we calculate which tag this tag is replacing
                prevtag=$(git describe --abbrev=0 $newrev^ 2>/dev/null)
-
                if [ -n "$prevtag" ]; then
-                       echo "  replaces  $prevtag"
+                       echo "  replaces $prevtag"
                fi
                ;;
        *)
-               echo "    length  $(git cat-file -s $tagobject) bytes"
+               echo "    length $(git cat-file -s $tagobject) bytes"
                ;;
        esac
-       echo " tagged by  $tagger"
-       echo "        on  $tagged"
+       echo " tagged by $tagger"
+       echo "        on $tagged"
 
        echo ""
        echo $LOGBEGIN
@@ -468,7 +361,7 @@ generate_atag_email()
 #
 generate_delete_atag_email()
 {
-       echo "       was  $oldrev"
+       echo "       was $oldrev ($oldrev_type)"
        echo ""
        echo $LOGEND
        git show -s --pretty=oneline $oldrev
@@ -483,7 +376,7 @@ generate_delete_atag_email()
 #
 generate_create_ltag_email()
 {
-       echo "        at  $newrev ($newrev_type)"
+       echo "        at $newrev ($newrev_type)"
        generate_ltag_email
 }
 
@@ -493,8 +386,8 @@ generate_create_ltag_email()
 #
 generate_update_ltag_email()
 {
-       echo "        to  $newrev ($newrev_type)"
-       echo "      from  $oldrev"
+       echo "        to $newrev ($newrev_type)"
+       echo "      from $oldrev ($oldrev_type)"
        generate_ltag_email
 }
 
@@ -531,7 +424,7 @@ generate_ltag_email()
 #
 generate_delete_ltag_email()
 {
-       echo "       was  $oldrev"
+       echo "       was $oldrev ($oldrev_type)"
        echo ""
        echo $LOGEND
        git show -s --pretty=oneline $oldrev
index 6a2e503..cd80be7 100644 (file)
@@ -7,26 +7,22 @@ X-Git-Oldrev: $old_commit_hash
 X-Git-Newrev: $new_commit_hash
 
 The branch, master has been updated
-       via  $new_commit_hash (commit)
-      from  $old_commit_hash (commit)
+       via $new_commit_abbrev simple commit
+      from $old_commit_abbrev setup
 
 Those revisions listed above that are new to this repository have
 not appeared on any other notification email; so we list those
 revisions in full, below.
 
 - Log -----------------------------------------------------------------
+
 commit $new_commit_hash
 Author: A U Thor <author@example.com>
 Date:   $new_commit_date
 
     simple commit
 
------------------------------------------------------------------------
-
-Summary of changes:
- a |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
+$new_commit_hash
 diff --git a/a b/a
 index 146f275..b38f23c 100644
 --- a/a
@@ -34,3 +30,9 @@ index 146f275..b38f23c 100644
 @@ -1 +1 @@
 -setup
 +simple commit
+
+-----------------------------------------------------------------------
+
+Summary of changes:
+ a |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
index 3cda758..3b42aff 100644 (file)
@@ -24,13 +24,17 @@ test_expect_success 'setup' '
 install_post_receive_hook 'post-receive-email'
 
 test_expect_success 'simple commit' '
+       old_commit_hash=$(git rev-parse HEAD) &&
+       old_commit_abbrev=$(git rev-parse --short HEAD) &&
+
        echo $test_name >a &&
        git commit -a -m "$test_name" &&
        git push &&
-       old_commit_hash=$(git rev-parse HEAD^) &&
        new_commit_hash=$(git rev-parse HEAD) &&
        new_commit_date=$(git log -n 1 --pretty=format:%cd HEAD) &&
-       interpolate ../t2200-1.txt 1.txt old_commit_hash new_commit_hash new_commit_date &&
+       new_commit_abbrev=$(git rev-parse --short HEAD) &&
+
+       interpolate ../t2200-1.txt 1.txt old_commit_hash old_commit_abbrev new_commit_hash new_commit_date new_commit_abbrev &&
        test_cmp 1.txt server/.git/refs.heads.master.out
 '
 
index 9c92c37..d19fb71 100644 (file)
@@ -7,10 +7,10 @@ X-Git-Oldrev: 0000000000000000000000000000000000000000
 X-Git-Newrev: $tag_hash
 
 The annotated tag, 1.0 has been created
-        at  $tag_hash (tag)
-   tagging  $new_commit_hash (commit)
- tagged by  C O Mitter
-        on  $tag_date
+        at $tag_hash (tag)
+   tagging $new_commit_hash (commit)
+ tagged by C O Mitter
+        on $tag_date
 
 - Log -----------------------------------------------------------------
 1.0
index 6e8a611..c00a443 100644 (file)
@@ -7,37 +7,50 @@ X-Git-Oldrev: $old_commit_hash
 X-Git-Newrev: $new_commit_hash
 
 The branch, master has been updated
-       via  $new_commit_hash (commit)
-       via  $prior_commit_hash (commit)
-      from  $old_commit_hash (commit)
+       via $new_commit_abbrev commit on annotated tagged branch 2
+       via $prior_commit_abbrev commit on annotated tagged branch
+      from $old_commit_abbrev setup
 
 Those revisions listed above that are new to this repository have
 not appeared on any other notification email; so we list those
 revisions in full, below.
 
 - Log -----------------------------------------------------------------
+
 commit $prior_commit_hash
 Author: A U Thor <author@example.com>
 Date:   $prior_commit_date
 
     commit on annotated tagged branch
 
+$prior_commit_hash
+diff --git a/a b/a
+index 146f275..815c4fa 100644
+--- a/a
++++ b/a
+@@ -1 +1 @@
+-setup
++commit on annotated tagged branch
+
+-----------------------------------------------------------------------
+
 commit $new_commit_hash
 Author: A U Thor <author@example.com>
 Date:   $new_commit_date
 
     commit on annotated tagged branch 2
 
------------------------------------------------------------------------
-
-Summary of changes:
- a |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
+$new_commit_hash
 diff --git a/a b/a
-index 146f275..7d07572 100644
+index 815c4fa..7d07572 100644
 --- a/a
 +++ b/a
 @@ -1 +1 @@
--setup
+-commit on annotated tagged branch
 +commit on annotated tagged branch 2
+
+-----------------------------------------------------------------------
+
+Summary of changes:
+ a |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
index 71de2a7..3646a09 100644 (file)
@@ -7,11 +7,11 @@ X-Git-Oldrev: 0000000000000000000000000000000000000000
 X-Git-Newrev: $tag_hash
 
 The annotated tag, 2.0 has been created
-        at  $tag_hash (tag)
-   tagging  $new_commit_hash (commit)
-  replaces  1.0
- tagged by  C O Mitter
-        on  $tag_date
+        at $tag_hash (tag)
+   tagging $new_commit_hash (commit)
+  replaces 1.0
+ tagged by C O Mitter
+        on $tag_date
 
 - Log -----------------------------------------------------------------
 2.0
index af4bc95..0cc9d47 100644 (file)
@@ -7,7 +7,7 @@ X-Git-Oldrev: 0000000000000000000000000000000000000000
 X-Git-Newrev: $new_commit_hash
 
 The tag, 2.1 has been created
-        at  $new_commit_hash (commit)
+        at $new_commit_hash (commit)
 
 - Log -----------------------------------------------------------------
 commit $new_commit_hash
index bdc6c1c..70379a7 100644 (file)
@@ -7,8 +7,8 @@ X-Git-Oldrev: $old_commit_hash
 X-Git-Newrev: $new_commit_hash
 
 The tag, 2.1 has been updated
-        to  $new_commit_hash (commit)
-      from  $old_commit_hash
+        to $new_commit_hash (commit)
+      from $old_commit_hash (commit)
 
 - Log -----------------------------------------------------------------
 commit $new_commit_hash
index 9bbbb78..a0f2f93 100644 (file)
@@ -7,7 +7,7 @@ X-Git-Oldrev: $old_commit_hash
 X-Git-Newrev: 0000000000000000000000000000000000000000
 
 The tag, 2.1 has been deleted
-       was  $old_commit_hash
+       was $old_commit_hash (commit)
 
 -----------------------------------------------------------------------
 $old_commit_hash force update lightweight tag
index 4a45321..afcf165 100644 (file)
@@ -7,12 +7,12 @@ X-Git-Oldrev: $old_tag_hash
 X-Git-Newrev: $new_tag_hash
 
 The annotated tag, 2.0 has been updated
-        to  $new_tag_hash (tag)
-      from  $old_tag_hash (which is now obsolete)
-   tagging  $new_commit_hash (commit)
-  replaces  1.0
- tagged by  C O Mitter
-        on  $tag_date
+        to $new_tag_hash (tag)
+      from $old_tag_hash (which is now obsolete)
+   tagging $new_commit_hash (commit)
+  replaces 1.0
+ tagged by C O Mitter
+        on $tag_date
 
 - Log -----------------------------------------------------------------
 2.0
index cf26a25..669dedd 100644 (file)
@@ -7,7 +7,7 @@ X-Git-Oldrev: $old_tag_hash
 X-Git-Newrev: 0000000000000000000000000000000000000000
 
 The annotated tag, 2.0 has been deleted
-       was  $old_tag_hash
+       was $old_tag_hash (tag)
 
 -----------------------------------------------------------------------
 tag 2.0
index 8195671..480f9cf 100644 (file)
@@ -36,19 +36,23 @@ test_expect_success 'create annotated tag' '
 
 test_expect_success 'commit on annotated tagged branch' '
        old_commit_hash=$(git rev-parse HEAD) &&
+       old_commit_abbrev=$(git rev-parse --short HEAD) &&
+
        echo "$test_name" >a &&
        git commit -a -m "$test_name" &&
        prior_commit_hash=$(git rev-parse HEAD) &&
        prior_commit_date=$(git log -n 1 --pretty=format:%cd HEAD) &&
+       prior_commit_abbrev=$(git rev-parse --short HEAD) &&
 
        echo "$test_name 2" >a &&
        git commit -a -m "$test_name 2" &&
        new_commit_hash=$(git rev-parse HEAD) &&
        new_commit_date=$(git log -n 1 --pretty=format:%cd HEAD) &&
+       new_commit_abbrev=$(git rev-parse --short HEAD) &&
 
        git push &&
        new_commit_abbrev=$(git rev-list -n 1 --pretty=format:%h HEAD | grep -v commit) &&
-       interpolate ../t2201-2.txt 2.txt old_commit_hash new_commit_hash new_commit_date new_commit_abbrev prior_commit_hash prior_commit_date &&
+       interpolate ../t2201-2.txt 2.txt old_commit_hash new_commit_hash new_commit_date new_commit_abbrev prior_commit_hash prior_commit_date old_commit_abbrev prior_commit_abbrev new_commit_abbrev &&
        test_cmp 2.txt server/.git/refs.heads.master.out
 '
 
index 8a44ccc..3e5566c 100644 (file)
@@ -7,31 +7,44 @@ X-Git-Oldrev: 0000000000000000000000000000000000000000
 X-Git-Newrev: $new_commit_hash
 
 The branch, topic has been created
-        at  $new_commit_hash (commit)
+        at $new_commit_abbrev create branch on topic 2
 
 - Log -----------------------------------------------------------------
+
 commit $prior_commit_hash
 Author: A U Thor <author@example.com>
 Date:   $prior_commit_date
 
     create branch on topic
 
+$prior_commit_hash
+diff --git a/a b/a
+index 146f275..55da47f 100644
+--- a/a
++++ b/a
+@@ -1 +1 @@
+-setup
++create branch
+
+-----------------------------------------------------------------------
+
 commit $new_commit_hash
 Author: A U Thor <author@example.com>
 Date:   $new_commit_date
 
     create branch on topic 2
 
------------------------------------------------------------------------
-
-Summary of changes:
- a |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
+$new_commit_hash
 diff --git a/a b/a
-index 146f275..8516a40 100644
+index 55da47f..8516a40 100644
 --- a/a
 +++ b/a
 @@ -1 +1 @@
--setup
+-create branch
 +create branch 2
+
+-----------------------------------------------------------------------
+
+Summary of changes:
+ a |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
index e175c3f..a6d04c8 100644 (file)
@@ -7,9 +7,6 @@ X-Git-Oldrev: 0000000000000000000000000000000000000000
 X-Git-Newrev: $existing_commit_hash
 
 The branch, topic2 has been created
-        at  $existing_commit_hash (commit)
+        at $existing_commit_abbrev create branch on topic 2
 
 - Log -----------------------------------------------------------------
------------------------------------------------------------------------
-
-Summary of changes:
index 5916d3b..ffab4be 100644 (file)
@@ -7,24 +7,15 @@ X-Git-Oldrev: $old_commit_hash
 X-Git-Newrev: $existing_commit_hash
 
 The branch, topic has been updated
-       via  $existing_commit_hash (commit)
-      from  $old_commit_hash (commit)
+       via $existing_commit_abbrev update branch with existing commits does not replay them on topic
+      from $old_commit_abbrev create branch on topic 2
 
 Those revisions listed above that are new to this repository have
 not appeared on any other notification email; so we list those
 revisions in full, below.
 
 - Log -----------------------------------------------------------------
------------------------------------------------------------------------
 
 Summary of changes:
  a |    2 +-
  1 files changed, 1 insertions(+), 1 deletions(-)
-
-diff --git a/a b/a
-index 8516a40..5c0be09 100644
---- a/a
-+++ b/a
-@@ -1 +1 @@
--create branch 2
-+update branch with existing commits does not replay them
index 634a0ee..ca00200 100644 (file)
@@ -7,7 +7,7 @@ X-Git-Oldrev: $old_commit_hash
 X-Git-Newrev: $new_commit_hash
 
 The branch, topic has been updated
-  discards  $old_commit_hash (commit)
+  discards $old_commit_abbrev update branch with existing commits does not replay them on topic
 
 This update discarded existing revisions and left the branch pointing at
 a previous point in the repository history.
@@ -24,11 +24,3 @@ No new revisions were added by this update.
 Summary of changes:
  a |    2 +-
  1 files changed, 1 insertions(+), 1 deletions(-)
-
-diff --git a/a b/a
-index 5c0be09..8516a40 100644
---- a/a
-+++ b/a
-@@ -1 +1 @@
--update branch with existing commits does not replay them
-+create branch 2
index eb0f086..218bcde 100644 (file)
@@ -7,8 +7,8 @@ X-Git-Oldrev: $old_commit_hash
 X-Git-Newrev: $new_commit_hash
 
 The branch, topic has been updated
-  discards  $old_commit_hash (commit)
-       via  $new_commit_hash (commit)
+  discards $old_commit_abbrev create branch on topic 2
+       via $new_commit_abbrev rewind and continue branch on topic
 
 This update added new revisions after undoing existing revisions.  That is
 to say, the old revision is not a strict subset of the new revision.  This
@@ -28,22 +28,24 @@ not appeared on any other notification email; so we list those
 revisions in full, below.
 
 - Log -----------------------------------------------------------------
+
 commit $new_commit_hash
 Author: A U Thor <author@example.com>
 Date:   $new_commit_date
 
     rewind and continue branch on topic
 
------------------------------------------------------------------------
-
-Summary of changes:
- a |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
+$new_commit_hash
 diff --git a/a b/a
-index 8516a40..a30ab5b 100644
+index 55da47f..a30ab5b 100644
 --- a/a
 +++ b/a
 @@ -1 +1 @@
--create branch 2
+-create branch
 +rewind and continue branch
+
+-----------------------------------------------------------------------
+
+Summary of changes:
+ a |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
index f6239de..830a860 100644 (file)
@@ -33,22 +33,24 @@ test_expect_success 'create branch' '
        echo "$test_name 2" >a &&
        git commit -a -m "$test_name on topic 2 " &&
        new_commit_hash=$(git rev-parse HEAD) &&
+       new_commit_abbrev=$(git rev-parse --short HEAD) &&
        new_commit_date=$(git log -n 1 --pretty=format:%cd HEAD) &&
 
        git push origin topic &&
 
-       interpolate ../t2202-1.txt 1.txt new_commit_hash new_commit_date prior_commit_hash prior_commit_date &&
+       interpolate ../t2202-1.txt 1.txt new_commit_hash new_commit_abbrev new_commit_date prior_commit_hash prior_commit_date &&
        test_cmp 1.txt server/.git/refs.heads.topic.out
 '
 
 test_expect_success 'create branch with existing commits does not replay them' '
        git checkout -b topic2 topic &&
        existing_commit_hash=$(git rev-parse HEAD) &&
+       existing_commit_abbrev=$(git rev-parse --short HEAD) &&
        existing_commit_date=$(git log -n 1 --pretty=format:%cd HEAD) &&
 
        git push origin topic2 &&
 
-       interpolate ../t2202-3.txt 3.txt existing_commit_hash existing_commit_date &&
+       interpolate ../t2202-3.txt 3.txt existing_commit_hash existing_commit_abbrev existing_commit_date &&
        test_cmp 3.txt server/.git/refs.heads.topic2.out
 '
 
@@ -61,38 +63,43 @@ test_expect_success 'update branch with existing commits does not replay them' '
 
        git checkout topic &&
        old_commit_hash=$(git rev-parse HEAD) &&
+       old_commit_abbrev=$(git rev-parse --short HEAD) &&
        git merge topic2 &&
        existing_commit_hash=$(git rev-parse HEAD) &&
+       existing_commit_abbrev=$(git rev-parse --short HEAD) &&
        git push &&
 
-       interpolate ../t2202-4.txt 4.txt old_commit_hash existing_commit_hash &&
+       interpolate ../t2202-4.txt 4.txt old_commit_hash old_commit_abbrev existing_commit_hash existing_commit_abbrev &&
        test_cmp 4.txt server/.git/refs.heads.topic.out
 '
 
 test_expect_success 'rewind branch' '
        git checkout topic &&
        old_commit_hash=$(git rev-parse HEAD) &&
+       old_commit_abbrev=$(git rev-parse --short HEAD) &&
 
        git reset --hard HEAD^ &&
        git push --force &&
        new_commit_hash=$(git rev-parse HEAD) &&
 
-       interpolate ../t2202-5.txt 5.txt old_commit_hash new_commit_hash &&
+       interpolate ../t2202-5.txt 5.txt old_commit_hash new_commit_hash old_commit_abbrev &&
        test_cmp 5.txt server/.git/refs.heads.topic.out
 '
 
 test_expect_success 'rewind and continue branch' '
        git checkout topic &&
        old_commit_hash=$(git rev-parse HEAD) &&
+       old_commit_abbrev=$(git rev-parse --short HEAD) &&
 
        git reset --hard HEAD^ &&
        echo "$test_name" >a &&
        git commit -a -m "$test_name on topic" &&
        new_commit_hash=$(git rev-parse HEAD) &&
+       new_commit_abbrev=$(git rev-parse --short HEAD) &&
        new_commit_date=$(git log -n 1 --pretty=format:%cd HEAD) &&
 
        git push --force &&
-       interpolate ../t2202-6.txt 6.txt old_commit_hash new_commit_hash new_commit_date &&
+       interpolate ../t2202-6.txt 6.txt old_commit_hash new_commit_hash new_commit_date new_commit_abbrev old_commit_abbrev &&
        test_cmp 6.txt server/.git/refs.heads.topic.out
 '
 
index 1c96334..2279ac1 100644 (file)
@@ -7,14 +7,15 @@ X-Git-Oldrev: $old_commit_hash
 X-Git-Newrev: $new_commit_hash
 
 The branch, topic1 has been updated
-       via  $new_commit_hash (commit)
-      from  $old_commit_hash (commit)
+       via $new_commit_abbrev Merge branch 'stable' into topic1
+      from $old_commit_abbrev move topic1
 
 Those revisions listed above that are new to this repository have
 not appeared on any other notification email; so we list those
 revisions in full, below.
 
 - Log -----------------------------------------------------------------
+
 commit $new_commit_hash
 Merge: $old_commit_hash $second_stable_hash
 Author: A U Thor <author@example.com>
@@ -22,6 +23,8 @@ Date:   $new_commit_date
 
     Merge branch 'stable' into topic1
 
+$new_commit_hash
+
 -----------------------------------------------------------------------
 
 Summary of changes:
@@ -29,25 +32,3 @@ Summary of changes:
  b |    2 +-
  c |    2 +-
  3 files changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/a b/a
-index 146f275..1c043c5 100644
---- a/a
-+++ b/a
-@@ -1 +1 @@
--setup
-+merge in stable 2
-diff --git a/b b/b
-index 146f275..1c043c5 100644
---- a/b
-+++ b/b
-@@ -1 +1 @@
--setup
-+merge in stable 2
-diff --git a/c b/c
-index 146f275..1c043c5 100644
---- a/c
-+++ b/c
-@@ -1 +1 @@
--setup
-+merge in stable 2
index 5b0ad73..81f3c52 100644 (file)
@@ -7,14 +7,15 @@ X-Git-Oldrev: $old_commit_hash
 X-Git-Newrev: $new_commit_hash
 
 The branch, topic1 has been updated
-       via  $new_commit_hash (commit)
-      from  $old_commit_hash (commit)
+       via $new_commit_abbrev Merge branch 'stable' into topic1
+      from $old_commit_abbrev move topic1
 
 Those revisions listed above that are new to this repository have
 not appeared on any other notification email; so we list those
 revisions in full, below.
 
 - Log -----------------------------------------------------------------
+
 commit $new_commit_hash
 Merge: $old_commit_hash $second_stable_hash
 Author: A U Thor <author@example.com>
@@ -25,6 +26,16 @@ Date:   $new_commit_date
     Conflicts:
        a
 
+$new_commit_hash
+diff --cc a
+index a67d715,96d4816..01a17ba
+--- a/a
++++ b/a
+@@@ -1,1 -1,1 +1,1 @@@
+- merge in stable with conflict on topic1
+ -merge in stable with conflict 2
+++merge in stable with conflict 2 merged topic1
+
 -----------------------------------------------------------------------
 
 Summary of changes:
@@ -32,25 +43,3 @@ Summary of changes:
  b |    2 +-
  c |    2 +-
  3 files changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/a b/a
-index a67d715..01a17ba 100644
---- a/a
-+++ b/a
-@@ -1 +1 @@
--merge in stable with conflict on topic1
-+merge in stable with conflict 2 merged topic1
-diff --git a/b b/b
-index 1c043c5..96d4816 100644
---- a/b
-+++ b/b
-@@ -1 +1 @@
--merge in stable 2
-+merge in stable with conflict 2
-diff --git a/c b/c
-index 1c043c5..96d4816 100644
---- a/c
-+++ b/c
-@@ -1 +1 @@
--merge in stable 2
-+merge in stable with conflict 2
index af58820..f8fe3ed 100644 (file)
@@ -35,6 +35,7 @@ test_expect_success 'merge in stable' '
        git commit -a -m "move topic1" &&
        git push origin topic1 &&
        old_commit_hash=$(git rev-parse HEAD) &&
+       old_commit_abbrev=$(git rev-parse --short HEAD) &&
 
        # Move stable
        git checkout stable &&
@@ -58,8 +59,9 @@ test_expect_success 'merge in stable' '
 
        new_commit_hash=$(git rev-parse HEAD) &&
        new_commit_date=$(git log -n 1 --pretty=format:%cd HEAD) &&
+       new_commit_abbrev=$(git rev-parse --short HEAD) &&
 
-       interpolate ../t2203-1.txt 1.txt old_commit_hash new_commit_hash new_commit_date first_stable_hash second_stable_hash &&
+       interpolate ../t2203-1.txt 1.txt old_commit_hash old_commit_abbrev new_commit_hash new_commit_abbrev new_commit_date first_stable_hash second_stable_hash &&
        test_cmp 1.txt server/.git/refs.heads.topic1.out
 '
 
@@ -69,6 +71,7 @@ test_expect_success 'merge in stable with conflict' '
        git commit -a -m "move topic1" &&
        git push origin topic1 &&
        old_commit_hash=$(git rev-parse HEAD) &&
+       old_commit_abbrev=$(git rev-parse --short HEAD) &&
 
        # Move stable
        git checkout stable &&
@@ -95,8 +98,9 @@ test_expect_success 'merge in stable with conflict' '
 
        new_commit_hash=$(git rev-parse HEAD) &&
        new_commit_date=$(git log -n 1 --pretty=format:%cd HEAD) &&
+       new_commit_abbrev=$(git rev-parse --short HEAD) &&
 
-       interpolate ../t2203-2.txt 2.txt old_commit_hash new_commit_hash new_commit_date first_stable_hash second_stable_hash &&
+       interpolate ../t2203-2.txt 2.txt old_commit_hash old_commit_abbrev new_commit_hash new_commit_abbrev new_commit_date first_stable_hash second_stable_hash &&
        test_cmp 2.txt server/.git/refs.heads.topic1.out
 '