From: Mathias Nyman <m.nyman@iki.fi>
To: Eric Sunshine <sunshine@sunshineco.com>
Cc: Git List <git@vger.kernel.org>,
Junio C Hamano <gitster@pobox.com>,
Nicola Paolucci <npaolucci@atlassian.com>
Subject: Re: [PATCH] contrib/subtree: add repo url to commit messages
Date: Fri, 26 Feb 2016 10:28:28 +0200 [thread overview]
Message-ID: <20160226082828.GA5960@iki.fi> (raw)
In-Reply-To: <CAPig+cSwQmbvZYbk3T-XYDfMYaMdJ=bFbDwEUtaR121pBrYJOQ@mail.gmail.com>
On 2016-02-25 17:23-0500, Eric Sunshine wrote:
>On Tue, Feb 23, 2016 at 5:25 AM, Mathias Nyman <mathias.nyman@iki.fi> wrote:
>> For recalling where a subtree came from; git-subtree operations 'add'
>> and 'pull', when called with the <repository> parameter add this to the
>> commit message:
>> git-subtree-repo: <repo_url>
>>
>> Other operations that don't have the <repository> information, like
>> 'merge' and 'add' without <repository>, are unchanged. Users with such a
>> workflow will continue to be on their own with the --message parameter,
>> if they'd like to record where the subtree came from.
>
>I'm not a subtree user, so review comments below are superficial...
>
Thank you for reviewing; will send PATCH v2 shortly.
>> Signed-off-by: Mathias Nyman <mathias.nyman@iki.fi>
>> Based-on-patch-by: Nicola Paolucci <npaolucci@atlassian.com>
>> ---
>> diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
>> @@ -335,18 +335,21 @@ add_msg()
>> dir="$1"
>> latest_old="$2"
>> latest_new="$3"
>> + repo="$4" # optional
>> if [ -n "$message" ]; then
>> commit_message="$message"
>> else
>> commit_message="Add '$dir/' from commit '$latest_new'"
>> fi
>> - cat <<-EOF
>> - $commit_message
>> -
>> - git-subtree-dir: $dir
>> - git-subtree-mainline: $latest_old
>> - git-subtree-split: $latest_new
>> - EOF
>> + echo $commit_message
>> + echo
>> + echo git-subtree-dir: $dir
>> + echo git-subtree-mainline: $latest_old
>> + echo git-subtree-split: $latest_new
>
>It's not clear why this code was changed to use a series of echo's in
>place of the single cat. Although the net result is the same, this
>appears to be mere code churn. If your intention was to make it
>similar to how squash_msg() uses a series of echo's, then that might
>make sense, however, rejoin_msg() uses the same single 'cat' as
>add_msg(), so inconsistency remains. Thus, it's not clear what the
>intention is.
>
Using a mixutre of heredoc and echo felt messy. But I'll change it
back to heredoc here, and through out the commit aim for near-zero
refactoring.
>> + if [ -n "$repo" ]; then
>> + repo_url=$(get_repository_url "$repo")
>> + echo "git-subtree-repo: $repo_url"
>> + fi
>> }
>>
>> add_squashed_msg()
>> @@ -382,8 +385,9 @@ squash_msg()
>> dir="$1"
>> oldsub="$2"
>> newsub="$3"
>> + repo="$4" # optional
>> newsub_short=$(git rev-parse --short "$newsub")
>> -
>> +
>
>Okay, this change is removing an unnecessary tab. Perhaps the commit
>message can say that the patch fixes a few whitespace inconsistencies
>while touching nearby code.
>
>More below...
>
Will undo the whitespace fixing.
>> if [ -n "$oldsub" ]; then
>> oldsub_short=$(git rev-parse --short "$oldsub")
>> echo "Squashed '$dir/' changes from $oldsub_short..$newsub_short"
>> @@ -397,6 +401,10 @@ squash_msg()
>> echo
>> echo "git-subtree-dir: $dir"
>> echo "git-subtree-split: $newsub"
>> + if [ -n "$repo" ]; then
>> + repo_url=$(get_repository_url "$repo")
>> + echo "git-subtree-repo: $repo_url"
>> + fi
>> }
>>
>> toptree_for_commit()
>> @@ -440,12 +448,13 @@ new_squash_commit()
>> old="$1"
>> oldsub="$2"
>> newsub="$3"
>> + repo="$4" # optional
>> tree=$(toptree_for_commit $newsub) || exit $?
>> if [ -n "$old" ]; then
>> - squash_msg "$dir" "$oldsub" "$newsub" |
>> + squash_msg "$dir" "$oldsub" "$newsub" "$repo" |
>> git commit-tree "$tree" -p "$old" || exit $?
>> else
>> - squash_msg "$dir" "" "$newsub" |
>> + squash_msg "$dir" "" "$newsub" "$repo" |
>> git commit-tree "$tree" || exit $?
>> fi
>> }
>> @@ -517,6 +526,16 @@ ensure_valid_ref_format()
>> die "'$1' does not look like a ref"
>> }
>>
>> +get_repository_url()
>> +{
>> + repo=$1
>> + repo_url=$(git config --get remote.$repo.url)
>> + if [ -z "$repo_url" ]; then
>> + repo_url=$repo
>> + fi
>> + echo $repo_url
>> +}
>> +
>> cmd_add()
>> {
>> if [ -e "$dir" ]; then
>> @@ -548,19 +567,18 @@ cmd_add()
>> cmd_add_repository()
>> {
>> echo "git fetch" "$@"
>> - repository=$1
>> + repo=$1
>
>Hmm, so 'repository' was present already but unused in this function,
>and now you're using it. I suppose you renamed it 'repo' for
>consistency with other 'repo' variable the patch introduces elsewhere.
>
Yes.
>> refspec=$2
>> git fetch "$@" || exit $?
>> revs=FETCH_HEAD
>> - set -- $revs
>> + set -- $revs $repo
>> cmd_add_commit "$@"
>
>The original code intentionally allowed passing a set of revs to
>cmd_add_commit(), however, you've repurposed it (below) so that it
>accepts one rev and an (optional) repo. Therefore, there doesn't seem
>to be much value anymore to using "set --" when you could just do:
>
> cmd_add_commit $revs $repo
>
>Or am I missing something obvious?
>
>(Of course, the original code unconditionally used "set --" even while
>setting 'revs' to hardcoded FETCH_HEAD, so I suppose this isn't any
>worse, but still...)
>
Will leave this as is; your suggestion would mean refactoring the 'set
--' quirks, which I tried not to do.
>> }
>>
>> cmd_add_commit()
>> {
>> - revs=$(git rev-parse $default --revs-only "$@") || exit $?
>> - set -- $revs
>> - rev="$1"
>> + rev=$(git rev-parse $default --revs-only "$1") || exit $?
>
>An audit of call callers of cmd_add_commit() shows that it was only
>ever invoked with a single rev, so this change to make it accept a
>single rev plus an optional repo seems safe. However, I wonder if it
>would make sense to keep the more flexible interface (in case future
>callers might need the functionality) by passing repo in as the first
>argument (using an empty string, for instance, for the optional bit)
>and then taking all subsequent arguments as revs, but perhaps that's
>overkill since it doesn't seem to care about revs other than the first
>one.
>
I think it makes sense to refactor the general 'set --' dance in
git-subtree.sh all together.
>cmd_merge() still goes through the "set --" dance which you've removed
>here, even though an audit of all its callers pass in only a single
>rev, so that seems inconsistent...
>
I'll readd this 'set --' dance here for consistency.
>> + repo="$2" # optional
>>
>> debug "Adding $dir as '$rev'..."
>> git read-tree --prefix="$dir" $rev || exit $?
>> @@ -575,12 +593,12 @@ cmd_add_commit()
>> fi
>>
>> if [ -n "$squash" ]; then
>> - rev=$(new_squash_commit "" "" "$rev") || exit $?
>> + rev=$(new_squash_commit "" "" "$rev" "$repo") || exit $?
>> commit=$(add_squashed_msg "$rev" "$dir" |
>> git commit-tree $tree $headp -p "$rev") || exit $?
>> else
>> revp=$(peel_committish "$rev") &&
>> - commit=$(add_msg "$dir" "$headrev" "$rev" |
>> + commit=$(add_msg "$dir" "$headrev" "$rev" "$repo" |
>> git commit-tree $tree $headp -p "$revp") || exit $?
>> fi
>> git reset "$commit" || exit $?
>> @@ -609,7 +627,8 @@ cmd_split()
>> else
>> unrevs="$(find_existing_splits "$dir" "$revs")"
>> fi
>> -
>> +e
>
>So, you're replacing a line containing a single tab with a line
>containing a single 'e'. Seems fishy.
>
Great typo find!
>> + rev="$1"
>> # We can't restrict rev-list to only $dir here, because some of our
>> # parents have the $dir contents the root, and those won't match.
>> # (and rev-list --follow doesn't seem to solve this)
>> @@ -683,15 +702,20 @@ cmd_split()
>>
>> cmd_merge()
>> {
>> - revs=$(git rev-parse $default --revs-only "$@") || exit $?
>> + revs=$(git rev-parse $default --revs-only "$1") || exit $?
>
>Why is this variable still named 'revs' (plural) since you're only
>passing in $1 now rather than $@?
>
Because technically the result can still be more then one rev I guess.
Consider 'git rev-parse HEAD~1..HEAD', which would return two hashes.
>> ensure_clean
>> -
>> set -- $revs
>
>Do you still need this "set --" or am I missing something?
>
>> if [ $# -ne 1 ]; then
>> die "You must provide exactly one revision. Got: '$revs'"
>> fi
>
>Ditto with the conditional, considering that you only ever look at $1
>now rather than $@.
>
This will handle the case where 'git rev-parse' caught more than one
hash earlier.
>> + do_merge "$@"
>> +}
>> +
>> +do_merge()
>> +{
>> rev="$1"
>> -
>> + repo="$2" # optional
>> +
>> if [ -n "$squash" ]; then
>> first_split="$(find_latest_squash "$dir")"
>> if [ -z "$first_split" ]; then
>> @@ -704,7 +728,7 @@ cmd_merge()
>> say "Subtree is already at commit $rev."
>> exit 0
>> fi
>> - new=$(new_squash_commit "$old" "$sub" "$rev") || exit $?
>> + new=$(new_squash_commit "$old" "$sub" "$rev" "$repo") || exit $?
>> debug "New squash commit: $new"
>> rev="$new"
>> fi
>> @@ -730,12 +754,13 @@ cmd_pull()
>> if [ $# -ne 2 ]; then
>> die "You must provide <repository> <ref>"
>> fi
>> + repo=$1
>> ensure_clean
>> ensure_valid_ref_format "$2"
>> git fetch "$@" || exit $?
>> revs=FETCH_HEAD
>> - set -- $revs
>> - cmd_merge "$@"
>> + set -- $revs $repo
>> + do_merge "$@"
>
>Same question as above. Is "set --" still buying you anything over just:
>
> do_merge $revs $repo
>
>?
>
No. But I will not deviate from the function parameter passing method
('set --') used throughout git-subtree.sh in this commit. I do think
parameter passing in git-subtree.sh deserves a separate
no-functional-changes refactoring commit though.
>> }
>>
>> cmd_push()
>> --
>> 2.7.1
next prev parent reply other threads:[~2016-02-26 8:28 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-23 10:25 [PATCH] contrib/subtree: add repo url to commit messages Mathias Nyman
2016-02-25 22:23 ` Eric Sunshine
2016-02-26 8:28 ` Mathias Nyman [this message]
2016-02-26 19:49 ` Eric Sunshine
2016-03-03 11:42 ` Mathias Nyman
2016-05-21 22:52 ` David A. Greene
2016-05-31 12:19 ` Mathias Nyman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160226082828.GA5960@iki.fi \
--to=m.nyman@iki.fi \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=npaolucci@atlassian.com \
--cc=sunshine@sunshineco.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).