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

Re: [PATCHv2 2/2] submodule update: allow '.' for branch value

From
Junio C Hamano <gitster@pobox.com>
Date
Jul 28, 2016, 19:10 UTC
Message-ID
<xmqq7fc5shnl.fsf@gitster.mtv.corp.google.com>
In-Reply-To
<20160728182132.25088-1-sbeller@google.com>
Stefan Beller <sbeller@google.com> writes:
Show 10 quoted lines
> 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?

Show 7 quoted lines
> 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.

Show 24 quoted lines
> 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?

Show 18 quoted lines
> +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.
Show 18 quoted lines
> +	 ) &&
>  	 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.
Show 10 quoted lines
> +	 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 &&
Previous: Stefan BellerNext: Stefan Beller
Message 9 of 11 in “submodule update: allow '.' for branch value”
  1. 0/2 submodule update: allow '.' for branch valueStefan Beller, Jul 28, 2016
  2. 1/2 t7406: correct depth test in shallow testStefan Beller, Jul 28, 2016
  3. Junio C HamanoJul 28, 2016
  4. Stefan BellerJul 28, 2016
  5. Stefan BellerJul 28, 2016
  6. Junio C HamanoJul 28, 2016
  7. 2/2 submodule update: allow '.' for branch valueStefan Beller, Jul 28, 2016
  8. 2/2 submodule update: allow '.' for branch valueStefan Beller, Jul 28, 2016
  9. Junio C HamanoJul 28, 2016
  10. Stefan BellerJul 28, 2016
  11. Junio C HamanoJul 28, 2016

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.