blob: 3d14437add45aa5e5e117387dcad4297a2965601 [file] [log] [blame]
Gerrit Code Review - Superprojects subscribed to submodules updates
===================================================================
Description
-----------
Gerrit supports a custom git superproject feature for tracking submodules.
This feature is useful for automatic updates on superprojects whenever
a change is merged on tracked submodules. To take advantage of this
feature, one should add submodule(s) to a local working copy of a
superproject, edit the created .gitmodules configuration file to
have a branch field on each submodule section with the value of the
submodule branch it is subscribing to, commit the changes, push and
merge the commit.
When a commit is merged to a project, the commit content is scanned
to identify if it registers git submodules (if the commit registers
any gitlinks and .gitmodules file with required info) and if so,
a new submodule subscription is registered.
When a new commit of a registered submodule is merged, gerrit
automatically updates the subscribers to the submodule with a new
commit having the updated gitlinks.
Git Submodules Overview
-----------------------
It is a git feature that allows an external repository to be
attached inside a repository at a specific path. The objective here
is to provide a brief overview, further details can be found
in the official git submodule command documentation.
Imagine a repository called 'super' and another one called 'a'.
Also consider 'a' available in a running gerrit instance on "server".
With this feature, one could attach 'a' inside of 'super' repository
at path 'a' by executing the following command when being inside
'super':
=====
git submodule add ssh://server/a a
====
Still considering the above example, after its execution notice that
inside the local repository 'super' the 'a' folder is considered a
gitlink to the external repository 'a'. Also notice a file called
.gitmodules is created (it is a config file containing the
subscription of 'a'). To provide the sha-1 each gitlink points to in
the external repository, one should use the command:
====
git submodule status
====
In the example provided, if 'a' is updated and 'super' is supposed
to see the latest sha-1 (considering here 'a' has only the master
branch), one should then commit the modified gitlink for 'a' in
the 'super' project. Actually it would not even need to be an
external update, one could move to 'a' folder (insider 'super'),
modify its content, commit, then move back to 'super' and
commit the modified gitlink for 'a'.
Creating a New Subscription
---------------------------
Defining the Submodule Branch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This is required because Submodule subscription is actually the
subscription of a submodule project and one of its branches for
a branch of a super project.
Since it manages subscriptions in the branch scope, we could have
a scenario having a project called 'super' having a branch 'integration'
subscribed to a project called 'a' in branch 'integration', and also
having the same 'super' project but in branch 'dev' subscribed to the 'a'
project in a branch called 'local-dev'.
After adding the git submodule to a super project, one should edit
the .gitmodules file to add a branch field to each submodule
section which is supposed to be subscribed.
The branch field is not filled by the git submodule command. Its value
should indicate the branch of a submodule project that when updated
will trigger automatic update of its registered gitlink.
The branch value could be '.' if the submodule project branch
has the same name as the destination branch of the commit having
gitlinks/.gitmodules file.
The branch field of a submodule section is a custom git submodule
feature for gerrit use. One should always be sure to fill it in
editing .gitmodules file after adding submodules to a super project,
if it is the intention to make use of the gerrit feature introduced here.
Any git submodules which are added and not have the branch field
available in the .gitmodules file will not be subscribed by gerrit
to automatically update the superproject.
Detecting and Subscribing Submodules
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Whenever a commit is merged to a project, its content is scanned
to identify if it registers any submodules (if the commit contains new
gitlinks and a .gitmodules file with all required info) and if so,
a new submodule subscription is registered.
Automatic Update of Superprojects
---------------------------------
After a superproject is subscribed to a submodule, it is not
required to push/merge commits to this superproject to update the
gitlink to the submodule.
Whenever a commit is merged in a submodule, its subscribed superproject
is updated.
Imagine a superproject called 'super' having a branch called 'dev'
having subscribed to a submodule 'a' on a branch 'dev-of-a'. When a commit
is merged in branch 'dev-of-a' of 'a' project, gerrit automatically
creates a new commit on branch 'dev' of 'super' updating the gitlink
to point to the just merged commit.
Canonical Web Url
~~~~~~~~~~~~~~~~~
Gerrit will automatically update only the superprojects that added
the submodules of urls of the running server (the one described in
the canonical web url value in gerrit configuration file).
The Gerrit instance administrator group should always certify to
provide the canonical web url value in its configuration file. Users
should certify to use the url value of the running gerrit instance to
add/subscribe submodules.
Removing Subscriptions
----------------------
If one has added a submodule subscription and drops it, it is
required to merge a commit updating the subscribed super
project/branch to remove the gitlink and the submodule section
of the .gitmodules file.
GERRIT
------
Part of link:index.html[Gerrit Code Review]