From: Junio C Hamano <gitster@pobox.com>
To: Stefan Beller <sbeller@google.com>
Cc: git@vger.kernel.org, Jens.Lehmann@web.de, jrnieder@gmail.com,
Avery Pennarun <apenwarr@gmail.com>
Subject: Re: [PATCHv2 2/2] submodule update: allow '.' for branch value
Date: Thu, 28 Jul 2016 12:10:22 -0700 [thread overview]
Message-ID: <xmqq7fc5shnl.fsf@gitster.mtv.corp.google.com> (raw)
In-Reply-To: <20160728182132.25088-1-sbeller@google.com> (Stefan Beller's message of "Thu, 28 Jul 2016 11:21:32 -0700")
Stefan Beller <sbeller@google.com> writes:
> Gerrit has a "superproject subscription" feature[1], that triggers a
> commit in a superproject that is subscribed to its submodules.
> Conceptually this Gerrit feature can be done on the client side with
> Git via:
>
> git -C <superproject> submodule update --remote --force
> git -C <superproject> commit -a -m "Update submodules"
> git -C <superproject> push
>
> for each branch in the superproject.
Which I imagine would be useful if you only have one submodule. If
you work on submodules A and B and then want to give the updated
superproject that binds the latest in both A and B as an atomic
update, the three lines above would not quite work, no?
> To ease the configuration in Gerrit
> a special value of "." has been introduced for the submodule.<name>.branch
> to mean the same branch as the superproject[2], such that you can create a
> new branch on both superproject and the submodule and this feature
> continues to work on that new branch.
>
> Now we have find projects in the wild with such a .gitmodules file.
That's annoying.
> To have Git working well with these, we imitate the behavior and
> look up the superprojects branch name if the submodules branch is
> configured to ".". In projects that do not use Gerrit, this value
> whould be never configured as "." is not a valid branch name.
I find that the last sentence is somewhat misleading. I agree it is
justifiable that using "." as the name to trigger a new (to us)
feature is safe, because such a setting wouldn't have meant anything
useful without this change, but I initially misread it and thought
you added "are we using Gerrit? Error out if we are not" logic,
which is not the case here.
> diff --git a/git-submodule.sh b/git-submodule.sh
> index 4ec7546..1eb33ad 100755
> --- a/git-submodule.sh
> +++ b/git-submodule.sh
> @@ -590,7 +590,6 @@ cmd_update()
>
> name=$(git submodule--helper name "$sm_path") || exit
> url=$(git config submodule."$name".url)
> - branch=$(get_submodule_config "$name" branch master)
> if ! test -z "$update"
> then
> update_module=$update
> @@ -616,6 +615,14 @@ cmd_update()
>
> if test -n "$remote"
> then
> + branch=$(get_submodule_config "$name" branch master)
> + if test "$branch" = "."
> + then
> + if ! branch=$(git symbolic-ref --short -q HEAD)
> + then
> + die "$(eval_gettext "submodule branch configured to inherit branch from superproject, but it's not on any branch")"
> + fi
> + fi
I see that you narrowed the scope of "$branch" (which is only used
when $remote exists), but it is a bit annoying to see that change
mixed with "now a dot means something different" change.
I wonder if the above 8-line block wants to be encapsulated to
become a part of "git submodule--helper" interface, though. IOW,
branch=$(git submodule--helper branch "$name") or something?
> +test_expect_success 'submodule update --remote should fetch upstream changes with .' '
> + (cd super &&
> + git config -f .gitmodules submodule."submodule".branch "." &&
> + git add .gitmodules &&
> + git commit -m "submodules: update from the respective superproject branch"
> + ) &&
> (cd submodule &&
> + echo line4a >> file &&
> + git add file &&
> + test_tick &&
> + git commit -m "upstream line4a" &&
> + git checkout -b test-branch &&
> + test_commit on-test-branch
> + ) &&
> + (cd super &&
> + git submodule update --remote --force submodule &&
> + (cd submodule &&
> + test "$(git log -1 --oneline)" = "$(GIT_DIR=../../submodule/.git git log -1 --oneline master)"
A few issues:
* A crash in "git log" would not be noticed with this. Perhaps
git log -1 --oneline $one_way_to_invoke >expect &&
git log -1 --oneline $the_other_way >actual &&
test_cmp expect actual
would be better?
* What exactly is this testing? The current branch (in submodule)
pointing at the same commit as the tip of 'master'? Or the
current branch _is_ 'master'?
* What exactly is the reason why one has GIT_DIR=... and the other
does not? I do not think this a place to test that "gitdir: "
in .git points at the right place, so it must be testing
something else, but I cannot guess.
> + ) &&
> git checkout -b test-branch &&
> + git submodule update --remote --force submodule &&
> + (cd submodule &&
> + test "$(git log -1 --oneline)" = "$(GIT_DIR=../../submodule/.git git log -1 --oneline test-branch)"
> + ) &&
> + git checkout master &&
> + git branch -d test-branch
> + )
> +'
> +
> +test_expect_success 'branch = . does not confuse the rest of update' '
> + (cd super &&
> + git checkout --detach &&
> + # update is not confused by branch="." even if the the superproject
> + # is not on any branch currently
> + git submodule update &&
> + git revert HEAD &&
"revert" is rather unusual thing to see in the test. Also I am not
sure why cmd_update that now has an explicit check to die when
branch is set to "." and the head is detached is expected "not" to
be confused. Perhaps I misread the main part of the patch?
Puzzled.
> + git checkout master
> + )
> +'
> +
> +test_expect_success 'local config should override .gitmodules branch' '
> + (cd submodule &&
> + git checkout test-branch &&
> echo line5 >> file &&
> git add file &&
> test_tick &&
next prev parent reply other threads:[~2016-07-28 19:10 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-28 17:26 [PATCH 0/2] submodule update: allow '.' for branch value Stefan Beller
2016-07-28 17:26 ` [PATCH 1/2] t7406: correct depth test in shallow test Stefan Beller
2016-07-28 18:39 ` Junio C Hamano
2016-07-28 18:47 ` Stefan Beller
2016-07-28 19:24 ` Stefan Beller
2016-07-28 19:52 ` Junio C Hamano
2016-07-28 17:26 ` [PATCH 2/2] submodule update: allow '.' for branch value Stefan Beller
2016-07-28 18:21 ` [PATCHv2 " Stefan Beller
2016-07-28 19:10 ` Junio C Hamano [this message]
2016-07-28 19:44 ` Stefan Beller
2016-07-28 20:02 ` Junio C Hamano
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
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqq7fc5shnl.fsf@gitster.mtv.corp.google.com \
--to=gitster@pobox.com \
--cc=Jens.Lehmann@web.de \
--cc=apenwarr@gmail.com \
--cc=git@vger.kernel.org \
--cc=jrnieder@gmail.com \
--cc=sbeller@google.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.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
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 read-only IMAP folder(s) and NNTP newsgroup(s).