xref: /aosp_15_r20/external/openscreen/docs/advanced_gerrit.md (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard# Advanced Gerrit Usage
2*3f982cf4SFabien Sanglard
3*3f982cf4SFabien SanglardThis file gives some examples of Gerrit workflows.  This includes uploading
4*3f982cf4SFabien Sanglardpatches with Gerrit, using Gerrit dependency chains, and managing local git
5*3f982cf4SFabien Sanglardhistory.
6*3f982cf4SFabien Sanglard
7*3f982cf4SFabien Sanglard## Managing patches with Gerrit
8*3f982cf4SFabien Sanglard
9*3f982cf4SFabien SanglardThe instructions in [README.md](README.md) using `git cl upload` are preferred
10*3f982cf4SFabien Sanglardfor patch management.  However, you can interact manually with the Gerrit code
11*3f982cf4SFabien Sanglardreview system via `git` if you prefer as follows.
12*3f982cf4SFabien Sanglard
13*3f982cf4SFabien Sanglard### Preliminaries
14*3f982cf4SFabien Sanglard
15*3f982cf4SFabien SanglardYou should install the
16*3f982cf4SFabien Sanglard[Change-Id commit-msg hook](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14.7/cmd-hook-commit-msg.html).
17*3f982cf4SFabien SanglardThis adds a `Change-Id` line to each commit message locally, which Gerrit uses
18*3f982cf4SFabien Sanglardto track changes.  Once installed, this can be toggled with `git config
19*3f982cf4SFabien Sanglardgerrit.createChangeId <true|false>`.
20*3f982cf4SFabien Sanglard
21*3f982cf4SFabien SanglardTo download the commit-msg hook for the Open Screen repository, use the
22*3f982cf4SFabien Sanglardfollowing command:
23*3f982cf4SFabien Sanglard
24*3f982cf4SFabien Sanglard```bash
25*3f982cf4SFabien Sanglard  curl -Lo .git/hooks/commit-msg https://chromium-review.googlesource.com/tools/hooks/commit-msg
26*3f982cf4SFabien Sanglard  chmod a+x .git/hooks/commit-msg
27*3f982cf4SFabien Sanglard```
28*3f982cf4SFabien Sanglard
29*3f982cf4SFabien Sanglard### Uploading a new patch for review
30*3f982cf4SFabien Sanglard
31*3f982cf4SFabien SanglardYou should run `git cl presubmit --upload` in the root of the repository before pushing for
32*3f982cf4SFabien Sanglardreview (which primarily checks formatting).
33*3f982cf4SFabien Sanglard
34*3f982cf4SFabien SanglardAfter verifying that presubmission works correctly, you can then execute:
35*3f982cf4SFabien Sanglard`git cl upload`, which will prompt you to verify the commit message and check
36*3f982cf4SFabien Sanglardfor owners.
37*3f982cf4SFabien Sanglard
38*3f982cf4SFabien SanglardThe first time you upload an issue, the issue number is associated with the
39*3f982cf4SFabien Sanglardcurrent branch. If you upload again, it uploads on the same issue (which is tied
40*3f982cf4SFabien Sanglardto the branch, not the commit). See the [git-cl](https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/HEAD/README.git-cl.md) documentation for more information.
41*3f982cf4SFabien Sanglard
42*3f982cf4SFabien Sanglard## Uploading a new dependent change
43*3f982cf4SFabien Sanglard
44*3f982cf4SFabien SanglardIf you wish to work on multiple related changes without waiting for them to
45*3f982cf4SFabien Sanglardland, you can do so in Gerrit using dependent changes.  There doesn't appear to
46*3f982cf4SFabien Sanglardbe any official documentation for this, but the rule seems to be: if the parent
47*3f982cf4SFabien Sanglardof the commit you are pushing has a Change-Id line, that change will also be the
48*3f982cf4SFabien Sanglardcurrent change's parent.  This is useful so you can look at only the relative
49*3f982cf4SFabien Sanglarddiff between changes instead of looking at all of them relative to master.
50*3f982cf4SFabien Sanglard
51*3f982cf4SFabien SanglardTo put this into an example, let's say you have a commit for feature A with
52*3f982cf4SFabien SanglardChange-Id: aaa and this is in the process of being reviewed on Gerrit.  Now
53*3f982cf4SFabien Sanglardlet's say you want to start more work based on it before it lands on master.
54*3f982cf4SFabien Sanglard
55*3f982cf4SFabien Sanglard``` bash
56*3f982cf4SFabien Sanglard  git checkout featureA
57*3f982cf4SFabien Sanglard  git checkout -b featureB
58*3f982cf4SFabien Sanglard  git branch --set-upstream-to featureA
59*3f982cf4SFabien Sanglard  # ... edit some files
60*3f982cf4SFabien Sanglard  # ... git add ...
61*3f982cf4SFabien Sanglard  git commit
62*3f982cf4SFabien Sanglard```
63*3f982cf4SFabien Sanglard
64*3f982cf4SFabien SanglardThe git history then looks something like this:
65*3f982cf4SFabien Sanglard
66*3f982cf4SFabien Sanglard```
67*3f982cf4SFabien Sanglard  ... ----  master
68*3f982cf4SFabien Sanglard          \
69*3f982cf4SFabien Sanglard           A
70*3f982cf4SFabien Sanglard            \
71*3f982cf4SFabien Sanglard             B <- HEAD
72*3f982cf4SFabien Sanglard```
73*3f982cf4SFabien Sanglard
74*3f982cf4SFabien Sanglardand `git log` might show:
75*3f982cf4SFabien Sanglard
76*3f982cf4SFabien Sanglard```
77*3f982cf4SFabien Sanglardcommit 47525d663586ba09f40e29fb5da1d23e496e0798 (HEAD -> featureB)
78*3f982cf4SFabien SanglardAuthor: btolsch <[email protected]>
79*3f982cf4SFabien SanglardDate:   Fri Mar 23 10:18:01 2018 -0700
80*3f982cf4SFabien Sanglard
81*3f982cf4SFabien Sanglard    Add some better things
82*3f982cf4SFabien Sanglard
83*3f982cf4SFabien Sanglardcommit 167a541e0a2bd3de4710965193213aa1d912f050 (featureA)
84*3f982cf4SFabien SanglardAuthor: btolsch <[email protected]>
85*3f982cf4SFabien SanglardDate:   Thu Mar 22 13:18:09 2018 -0700
86*3f982cf4SFabien Sanglard
87*3f982cf4SFabien Sanglard    Add some good things
88*3f982cf4SFabien Sanglard
89*3f982cf4SFabien Sanglard    Change-Id: aaa
90*3f982cf4SFabien Sanglard```
91*3f982cf4SFabien Sanglard
92*3f982cf4SFabien SanglardNow you can push B to create a new change for it in Gerrit:
93*3f982cf4SFabien Sanglard
94*3f982cf4SFabien Sanglard``` bash
95*3f982cf4SFabien Sanglardgit push origin HEAD:refs/for/master
96*3f982cf4SFabien Sanglard```
97*3f982cf4SFabien Sanglard
98*3f982cf4SFabien SanglardIn Gerrit, there would then be a "relation chain" shown where the feature A
99*3f982cf4SFabien Sanglardchange is the parent of the feature B change.  If A introduces a new file which
100*3f982cf4SFabien SanglardB changes, the review for B will only show the diff from A.
101*3f982cf4SFabien Sanglard
102*3f982cf4SFabien Sanglard## Examples for maintaining local git history
103*3f982cf4SFabien Sanglard
104*3f982cf4SFabien Sanglard```
105*3f982cf4SFabien Sanglard                  D-E --- feature B
106*3f982cf4SFabien Sanglard                 /  ^N
107*3f982cf4SFabien Sanglard            A-B-C-F-G-H --- feature A
108*3f982cf4SFabien Sanglard           /    ^M  ^O
109*3f982cf4SFabien Sanglard          /
110*3f982cf4SFabien Sanglard  ... ----  master
111*3f982cf4SFabien Sanglard        /|
112*3f982cf4SFabien Sanglard       M O
113*3f982cf4SFabien Sanglard       |
114*3f982cf4SFabien Sanglard       N
115*3f982cf4SFabien Sanglard```
116*3f982cf4SFabien Sanglard
117*3f982cf4SFabien SanglardConsider a local repo with a master branch and two feature branches.  Commits M,
118*3f982cf4SFabien SanglardN, and O are squash commits that were pushed to Gerrit.  The arrow/caret (`^`)
119*3f982cf4SFabien Sanglardindicates whence those were created.  M, N, and O should all have Change-Id
120*3f982cf4SFabien Sanglardlines in them (this can be done with the [commit-msg
121*3f982cf4SFabien Sanglardhook](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14.7/cmd-hook-commit-msg.html)).
122*3f982cf4SFabien SanglardM and O are separate patchsets in one review (M containing A, B, C and O
123*3f982cf4SFabien Sanglardcontaining A, B, C, F, G) and N is the first patchset in a new review that is
124*3f982cf4SFabien Sanglarddependent on the first patchset of the first review.
125*3f982cf4SFabien Sanglard
126*3f982cf4SFabien SanglardStarting without M, N, or O, the commands to create them are as follows:
127*3f982cf4SFabien Sanglard
128*3f982cf4SFabien Sanglard``` bash
129*3f982cf4SFabien Sanglardgit checkout C
130*3f982cf4SFabien Sanglardgit checkout -b M
131*3f982cf4SFabien Sanglardgit rebase -i origin/master # squash commits
132*3f982cf4SFabien Sanglard# Note: make sure a Change-Id line exists on M at this point since N will need
133*3f982cf4SFabien Sanglard# it.  You can git commit --amend with the commit-msg hook active or add it via
134*3f982cf4SFabien Sanglard# git commit --amend after pushing.  Don't git commit --amend after creating N
135*3f982cf4SFabien Sanglard# though.
136*3f982cf4SFabien Sanglardgit push origin HEAD:refs/for/master
137*3f982cf4SFabien Sanglardgit checkout E
138*3f982cf4SFabien Sanglardgit checkout -b N
139*3f982cf4SFabien Sanglardgit rebase -i C --onto M # squash commits
140*3f982cf4SFabien Sanglardgit push origin HEAD:refs/for/master
141*3f982cf4SFabien Sanglardgit checkout G
142*3f982cf4SFabien Sanglardgit checkout -b O
143*3f982cf4SFabien Sanglardgit rebase -i origin/master # squash commits and copy the Change-Id line from M
144*3f982cf4SFabien Sanglardgit push origin HEAD:refs/for/master
145*3f982cf4SFabien Sanglard```
146*3f982cf4SFabien Sanglard
147*3f982cf4SFabien Sanglard```
148*3f982cf4SFabien Sanglard                        D-E --- feature B
149*3f982cf4SFabien Sanglard                       /  ^Q
150*3f982cf4SFabien Sanglard            A-B-C-F-G-H --- feature A
151*3f982cf4SFabien Sanglard           /          ^P
152*3f982cf4SFabien Sanglard          /
153*3f982cf4SFabien Sanglard  ... ----  master
154*3f982cf4SFabien Sanglard         /|\
155*3f982cf4SFabien Sanglard        M O P
156*3f982cf4SFabien Sanglard        |   |
157*3f982cf4SFabien Sanglard        N   Q
158*3f982cf4SFabien Sanglard```
159*3f982cf4SFabien Sanglard
160*3f982cf4SFabien SanglardThe next example shows an additional patchset being uploaded for feature A
161*3f982cf4SFabien Sanglard(commit P) and feature B being rebased onto A, then uploaded to Gerrit as commit
162*3f982cf4SFabien SanglardQ.
163*3f982cf4SFabien Sanglard
164*3f982cf4SFabien SanglardStarting from the endpoint of the previous commands, this point can be reached
165*3f982cf4SFabien Sanglardas follows:
166*3f982cf4SFabien Sanglard
167*3f982cf4SFabien Sanglard``` bash
168*3f982cf4SFabien Sanglardgit checkout H
169*3f982cf4SFabien Sanglardgit checkout -b P
170*3f982cf4SFabien Sanglardgit rebase -i origin/master # squash commits, same note as M about Change-Id
171*3f982cf4SFabien Sanglardgit push origin HEAD:refs/for/master
172*3f982cf4SFabien Sanglardgit checkout featureB # E
173*3f982cf4SFabien Sanglardgit rebase # assume featureA is set as featureB's upstream branch
174*3f982cf4SFabien Sanglardgit checkout -b Q
175*3f982cf4SFabien Sanglardgit rebase -i H --onto P
176*3f982cf4SFabien Sanglardgit push origin HEAD:refs/for/master
177*3f982cf4SFabien Sanglard```
178