|  | = Gerrit Code Review - Superproject subscription 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 | 
|  |  | 
|  | Submodules are 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 configuration 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 Gerrit 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. | 
|  |  | 
|  | As the branch field is a Gerrit specific field it will not be filled | 
|  | automatically by the git submodule command, so one needs to edit it | 
|  | manually. 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. | 
|  |  | 
|  | If the intention is to make use of the Gerrit feature described | 
|  | here, one should always be sure to update the .gitmodules file after | 
|  | adding submodules to a super project. | 
|  |  | 
|  | If a git submodule is added but the branch field is not added to the | 
|  | .gitmodules file, Gerrit will not create a subscription for the | 
|  | submodule and there will be no automatic updates to 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. | 
|  |  | 
|  | === Subscription Limitations | 
|  |  | 
|  | Gerrit will only automatically update superprojects where the | 
|  | submodules are hosted on the same Gerrit instance as the | 
|  | superproject. Gerrit determines this by checking the hostname of the | 
|  | submodule specified in the .gitmodules file and comparing it to the | 
|  | hostname from the canonical web URL. | 
|  |  | 
|  | It is currently not possible to use the submodule subscription feature | 
|  | with a canonical web URL hostname that differs from the hostname of | 
|  | the submodule. Instead relative submodules should be used. | 
|  |  | 
|  | 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 correct hostname of the running Gerrit | 
|  | instance to add/subscribe submodules. | 
|  |  | 
|  | === Relative submodules | 
|  |  | 
|  | To enable easier usage of Gerrit mirrors and/or distribution over | 
|  | several protocols, such as plain git and HTTP(S) as well as SSH, one | 
|  | can use relative submodules. This means that instead of providing the | 
|  | entire URL to the submodule a relative path is stated in the | 
|  | .gitmodules file. | 
|  |  | 
|  | Gerrit will try to match the entire project name of the submodule | 
|  | including directories. Therefore it is important to supply the full | 
|  | path name of the Gerrit project, not only relative to the super | 
|  | repository. See the following example: | 
|  |  | 
|  | We have a super repository placed under a sub directory. | 
|  |  | 
|  | product/super_repository.git | 
|  |  | 
|  | To this repository we wish add a submodule "deeper" into the directory | 
|  | structure. | 
|  |  | 
|  | product/framework/subcomponent.git | 
|  |  | 
|  | Now we need to edit the .gitmodules to include the complete path to | 
|  | the Gerrit project. Observe that we need to use two "../" to include | 
|  | the complete Gerrit project path. | 
|  |  | 
|  | path = subcomponent.git | 
|  | url = ../../product/framework/subcomponent.git | 
|  | branch = master | 
|  |  | 
|  | In contrast the following will not setup proper submodule | 
|  | subscription, even if the submodule will be successfully cloned by git | 
|  | from Gerrit. | 
|  |  | 
|  | path = subcomponent.git | 
|  | url = ../framework/subcomponent.git | 
|  | branch = master | 
|  |  | 
|  | == 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] | 
|  |  | 
|  | SEARCHBOX | 
|  | --------- |