git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] Omit patches that have already been merged from format-patch output.

From
Junio C Hamano <junkio@cox.net>
Date
Sep 11, 2005, 20:32 UTC
Message-ID
<7voe6zqr9y.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<46a038f905091101529e045af@mail.gmail.com>

This switches the logic to pick which commits to include in the output from git-rev-list to git-cherry; as a side effect, 'format-patch ^up mine' would stop working, although up..mine would continue to work.

Signed-off-by: Junio C Hamano <junkio@cox.net>
---
 Martin Langhoff <martin.langhoff@gmail.com> writes:
 > When I run git-format-patch, it insists on outputting merges that have
 > already been merged upstream, regardless of the fact that
 > git-merge-base knows better.
 >
 > Is there a way to get it to skip merged-in patches that git already
 > has detected as merged upstream?
 >
 > cheers,
 >
 > martin
 This is what the format-patch should have been from the beginning,
 although for hysterical raisins it was not the case (it predates
 git-cherry).  One thing I am reluctant about this is it breaks the
 exact example Johannes just posted.
 git-format-patch.sh |   38 +++++++++++++++++++++++++++-----------
 1 files changed, 27 insertions(+), 11 deletions(-)
9798f6dad84c9c3e39ed05c91d8e97fe4abc9222
diff --git a/git-format-patch.sh b/git-format-patch.sh
--- a/git-format-patch.sh
+++ b/git-format-patch.sh
@@ -27,8 +27,6 @@ with applymbox.
 }
 
 diff_opts=
-IFS='
-'
 LF='
 '
 
@@ -61,7 +59,10 @@ do
     --output-directo|--output-director|--output-directory)
     case "$#" in 1) usage ;; esac; shift
     outdir="$1" ;;
-    -*)	diff_opts="$diff_opts$LF$1" ;;
+    -*' '* | -*"$LF"* | -*'	'*)
+	# Ignore diff option that has whitespace for now.
+	;;
+    -*)	diff_opts="$diff_opts$1 " ;;
     *) break ;;
     esac
     shift
@@ -72,16 +73,20 @@ tt)
 	die '--keep-subject and --numbered are incompatible.' ;;
 esac
 
-revpair=
+rev1= rev2=
 case "$#" in
 2)
-    revpair="$1..$2" ;;
+    rev1="$1" rev2="$2" ;;
 1)
     case "$1" in
     *..*)
-    	revpair="$1";;
+	rev1=`expr "$1" : '\(.*\)\.\.'`
+	rev2=`expr "$1" : '.*\.\.\(.*\)'`
+	;;
     *)
-	revpair="$1..HEAD";;
+        rev1="$1"
+	rev2="HEAD"
+	;;
     esac ;;
 *)
     usage ;;
@@ -127,10 +132,21 @@ _x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0
 _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
 stripCommitHead='/^'"$_x40"' (from '"$_x40"')$/d'
 
-git-rev-list --no-merges --merge-order \
-	$(git-rev-parse --revs-only "$revpair") >$series
+git-cherry -v "$rev1" "$rev2" |
+while read sign rev comment
+do
+	case "$sign" in
+	'-')
+		echo >&2 "Merged already: $comment"
+		;;
+	*)
+		echo $rev
+		;;
+	esac
+done >$series
+
 total=`wc -l <$series | tr -dc "[0-9]"`
-i=$total
+i=1
 while read commit
 do
     git-cat-file commit "$commit" | git-stripspace >$commsg
@@ -145,7 +161,7 @@ do
     esac
 
     file=`printf '%04d-%stxt' $i "$title"`
-    i=`expr "$i" - 1`
+    i=`expr "$i" + 1`
     echo "* $file"
     {
 	mailScript='
Previous: Johannes SchindelinNext: Martin Langhoff
Message 3 of 9 in “git-rev-list and git-format-patch script oddness”
  1. Martin LanghoffSep 11, 2005
  2. Johannes SchindelinSep 11, 2005
  3. Omit patches that have already been merged from format-patch output.Junio C Hamano, Sep 11, 2005
  4. Martin LanghoffSep 11, 2005
  5. Martin LanghoffSep 11, 2005
  6. Martin LanghoffSep 12, 2005
  7. Martin LanghoffSep 12, 2005
  8. Junio C HamanoSep 12, 2005
  9. Martin LanghoffSep 12, 2005

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.