From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS31976 209.132.176.0/21 X-Spam-Status: No, score=-3.5 required=3.0 tests=AWL,BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MSGID_FROM_MTA_HEADER,RP_MATCHES_RCVD shortcircuit=no autolearn=ham autolearn_force=no version=3.4.0 From: Junio C Hamano Subject: [PATCH] git-merge: make it usable as the first class UI Date: Mon, 20 Nov 2006 02:17:46 -0800 Message-ID: <7vu00u4e2d.fsf@assigned-by-dhcp.cox.net> References: <7vy7q67tf2.fsf@assigned-by-dhcp.cox.net> <20061120024308.18620.qmail@science.horizon.com> <7v8xi67qhq.fsf@assigned-by-dhcp.cox.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii NNTP-Posting-Date: Mon, 20 Nov 2006 10:18:02 +0000 (UTC) Cc: linux@horizon.com Return-path: Envelope-to: gcvg-git@gmane.org User-Agent: Gnus/5.110006 (No Gnus v0.6) Emacs/21.4 (gnu/linux) Precedence: bulk X-Mailing-List: git@vger.kernel.org Archived-At: Received: from vger.kernel.org ([209.132.176.167]) by ciao.gmane.org with esmtp (Exim 4.43) id 1Gm6Dn-00066h-M7 for gcvg-git@gmane.org; Mon, 20 Nov 2006 11:17:52 +0100 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965591AbWKTKRs (ORCPT ); Mon, 20 Nov 2006 05:17:48 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S965613AbWKTKRs (ORCPT ); Mon, 20 Nov 2006 05:17:48 -0500 Received: from fed1rmmtao12.cox.net ([68.230.241.27]:28819 "EHLO fed1rmmtao12.cox.net") by vger.kernel.org with ESMTP id S965591AbWKTKRr (ORCPT ); Mon, 20 Nov 2006 05:17:47 -0500 Received: from fed1rmimpo01.cox.net ([70.169.32.71]) by fed1rmmtao12.cox.net (InterMail vM.6.01.06.03 201-2131-130-104-20060516) with ESMTP id <20061120101747.RSUC21630.fed1rmmtao12.cox.net@fed1rmimpo01.cox.net>; Mon, 20 Nov 2006 05:17:47 -0500 Received: from assigned-by-dhcp.cox.net ([68.5.247.80]) by fed1rmimpo01.cox.net with bizsmtp id oyHJ1V00F1kojtg0000000; Mon, 20 Nov 2006 05:17:19 -0500 To: git@vger.kernel.org Sender: git-owner@vger.kernel.org Junio C Hamano writes: > So if we rename the current "git merge" to "git-merge--record" > (or any name "git pull" uses internally to record the merge > commit), and make "git merge" a synonym to "git pull .", and > give a command line option -m to "git pull" to _affect_ the > resulting merge message, I would think everybody would become > quite happy. It means: > > - People can say "git merge this-branch" (which is internally > translated to "git pull . this-branch"); > > - People can say "git pull -m 'I am doing this merge for such > and such reason' $URL $branch" to _include_ that message in > the resulting merge commit; > > - The same can be said about "git merge -m 'comment' $branch". > > I said _affect_ and _include_ in the above because I suspect > that most of the time you do not want to _replace_ the > autogenerated part ("Merge branch of repo", and if you are > pulling from your subordinate trees the merge summary message as > well). I did a moral equivalent of the above without renaming the command "git merge" and will be pushing the result out in "pu" shortly. The following is for commenting only -- it depends on an earlier patch in "pu". -- >8 -- [PATCH] git-merge: make it usable as the first class UI This teaches the oft-requested syntax git merge $commit to implement merging the named commit to the current branch. This hopefully would make "git merge" usable as the first class UI instead of being a mere backend for "git pull". Most notably, $commit above can be any committish, so you can say for example: git merge js/shortlog~2 to merge early part of a topic branch without merging the rest of it. A custom merge message can be given with the new --message= parameter. The message is prepended in front of the usual "Merge ..." message autogenerated with fmt-merge-message. Signed-off-by: Junio C Hamano --- Documentation/git-merge.txt | 18 +++++++++--- git-merge.sh | 61 ++++++++++++++++++++++++++++++++++++++----- 2 files changed, 67 insertions(+), 12 deletions(-) diff --git a/Documentation/git-merge.txt b/Documentation/git-merge.txt index bebf30a..e2954aa 100644 --- a/Documentation/git-merge.txt +++ b/Documentation/git-merge.txt @@ -8,12 +8,14 @@ git-merge - Grand Unified Merge Driver SYNOPSIS -------- -'git-merge' [-n] [--no-commit] [-s ]... ... - +[verse] +'git-merge' [-n] [--no-commit] [--squash] [-s ]... + [--reflog-action=] + -m= ... DESCRIPTION ----------- -This is the top-level user interface to the merge machinery +This is the top-level interface to the merge machinery which drives multiple merge strategy scripts. @@ -27,13 +29,19 @@ include::merge-options.txt[] to give a good default for automated `git-merge` invocations. :: - our branch head commit. + Our branch head commit. This has to be `HEAD`, so new + syntax does not require it :: - other branch head merged into our branch. You need at + Other branch head merged into our branch. You need at least one . Specifying more than one obviously means you are trying an Octopus. +--reflog-action=:: + This is used internally when `git-pull` calls this command + to record that the merge was created by `pull` command + in the `ref-log` entry that results from the merge. + include::merge-strategies.txt[] diff --git a/git-merge.sh b/git-merge.sh index 84c3acf..25deb1e 100755 --- a/git-merge.sh +++ b/git-merge.sh @@ -3,7 +3,8 @@ # Copyright (c) 2005 Junio C Hamano # -USAGE='[-n] [--no-commit] [--squash] [-s ]... +' +USAGE='[-n] [--no-commit] [--squash] [-s ] [--reflog-action=] [-m=] +' + . git-sh-setup LF=' @@ -92,7 +93,7 @@ finish () { case "$#" in 0) usage ;; esac -rloga= +rloga= have_message= while case "$#" in 0) break ;; esac do case "$1" in @@ -125,17 +126,63 @@ do --reflog-action=*) rloga=`expr "z$1" : 'z-[^=]*=\(.*\)'` ;; + -m=*|--m=*|--me=*|--mes=*|--mess=*|--messa=*|--messag=*|--message=*) + merge_msg=`expr "z$1" : 'z-[^=]*=\(.*\)'` + have_message=t + ;; + -m|--m|--me|--mes|--mess|--messa|--messag|--message) + shift + case "$#" in + 1) usage ;; + esac + merge_msg="$1" + have_message=t + ;; -*) usage ;; *) break ;; esac shift done -merge_msg="$1" -shift -head_arg="$1" -head=$(git-rev-parse --verify "$1"^0) || usage -shift +# This could be traditional "merge HEAD ..." and the +# way we can tell it is to see if the second token is HEAD, but some +# people might have misused the interface and used a committish that +# is the same as HEAD there instead. Traditional format never would +# have "-m" so it is an additional safety measure to check for it. + +if test -z "$have_message" && + second_token=$(git-rev-parse --verify "$2^0" 2>/dev/null) && + head_commit=$(git-rev-parse --verify "HEAD" 2>/dev/null) && + test "$second_token" = "$head_commit" +then + merge_msg="$1" + shift + head_arg="$1" + shift +else + # We are invoked directly as the first-class UI. + head_arg=HEAD + + # All the rest are the commits being merged; prepare + # the standard merge summary message to be appended to + # the given message. If remote is invalid we will die + # later in the common codepath so we discard the error + # in this loop. + merge_name=$(for remote + do + rh=$(git-rev-parse --verify "$remote"^0 2>/dev/null) + if git show-ref -q --verify "refs/heads/$remote" + then + what=branch + else + what=commit + fi + echo "$rh $what '$remote'" + done | git-fmt-merge-msg + ) + merge_msg="${merge_msg:+$merge_msg$LF$LF}$merge_name" +fi +head=$(git-rev-parse --verify "$head_arg"^0) || usage # All the rest are remote heads test "$#" = 0 && usage ;# we need at least one remote head. -- 1.4.4.gbacc