aboutsummaryrefslogtreecommitdiffstats
path: root/docs/6_How_To_Contribute/6_Gerrit_Recommended_Practices.md
blob: 671c68586f1768419b784d05e0c705ad5892751d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
---
title: Gerrit Recommended Practices
---

This document presents some best practices to help you use Gerrit more
effectively. The intent is to show how content can be submitted easily. Use the
recommended practices to reduce your troubleshooting time and improve
participation in the community.

## Commit Messages

Gerrit follows the Git commit message format. Ensure the headers are at the
bottom and don't contain blank lines between one another. The following example
shows the format and content expected in a commit message:

Brief (no more than 50 chars) one line description.

Elaborate summary of the changes made referencing why (motivation), what was
changed and how it was tested. Note also any changes to documentation made to
remain consistent with the code changes, wrapping text at 72 chars/line.

```sh
Bug-AGL: SPEC-<JIRA-ID>

Change-Id: LONGHEXHASH
Signed-off-by: Your Name your.email\@example.org
```

The Gerrit server provides a precommit hook to autogenerate the Change-Id which
is one time use.

**Recommended reading:** [How to Write a Git Commit
Message](http://chris.beams.io/posts/git-commit/).

## Avoid Pushing Untested Work to a Gerrit Server

To avoid pushing untested work to Gerrit.

Check your work at least three times before pushing your change to Gerrit. Be
mindful of what information you are publishing.

## Keeping Track of Changes

-  Set Gerrit to send you emails:

-  Gerrit will add you to the email distribution list for a change if a
   developer adds you as a reviewer, or if you comment on a specific Patch Set.

-  Opening a change in Gerrit's review interface is a quick way to follow that
   change.

-  Watch projects in the Gerrit projects section at ``Gerrit``, select at least
   *New Changes, New Patch Sets, All Comments* and *Submitted Changes*.

Always track the projects you are working on; also see the feedback/comments
[mailing list](https://lists.automotivelinux.org/g/agl-dev-community) to learn
and help others ramp up.

## Topic branches

Topic branches are temporary branches that you push to commit a set of
logically-grouped dependent commits:

To push changes from ``REMOTE/master`` tree to Gerrit for being reviewed as a
topic in **TopicName** use the following command as an example:

```sh
$ git push REMOTE HEAD:refs/for/master/TopicName
```

The topic will show up in the review ``UI`` and in the ``Open Changes List``.
Topic branches will disappear from the master tree when its content is merged.

## Finding Available Topics

```sh
$ ssh -p 29418 <LFID>@gerrit.automotivelinux.org gerrit query \ status:open branch:master| grep topic: | sort -u
```

-  [gerrit.automotivelinux.org](https://gerrit.automotivelinux.org) is the
   current URL where the project is hosted.
-  *status* : Indicates the topic's current status: open , merged, abandoned,
   draft, merge conflict.
-  *project* : Refers to the current name of the project, in this case fabric.
-  *branch* : The topic is searched at this branch.
-  *topic* : The name of an specific topic, leave it blank to include them all.
-  *sort* : Sorts the found topics, in this case by update (-u).

## Downloading or Checking Out a Change

In the review UI, on the top right corner, the **Download** link provides a list
of commands and hyperlinks to checkout or download diffs or files.

We recommend the use of the *git review* plugin. The steps to install git review
are beyond the scope of this document. Refer to the [git review
documentation](https://wiki.openstack.org/wiki/Documentation/HowTo/FirstTimers)
for the installation process.

To check out a specific change using Git, the following command usually works:

```sh
$ git review -d CHANGEID
```

If you don't have Git-review installed, the following commands will do the same
thing:

```sh
$ git fetch REMOTE refs/changes/NN/CHANGEIDNN/VERSION \ && git checkout FETCH_HEAD
```

For example, for the 4th version of change 2464, NN is the first two digits
(24):

```sh
$ git fetch REMOTE refs/changes/24/2464/4 \ && git checkout FETCH_HEAD
```

## Using Sandbox Branches

You can create your own branches to develop features. The branches are pushed to
the ``refs/heads/sandbox/USERNAME/BRANCHNAME`` location.

These commands ensure the branch is created in Gerrit's server.

```sh
$ git checkout -b sandbox/USERNAME/BRANCHNAME
$ git push --set-upstream REMOTE HEAD:refs/heads/sandbox/USERNAME/BRANCHNAME
```

Usually, the process to create content is:

-  develop the code,
-  break the information into small commits,
-  submit changes,
-  apply feedback,
-  rebase.

The next command pushes forcibly without review:

```sh
$ git push REMOTE sandbox/USERNAME/BRANCHNAME
```

You can also push forcibly with review:

```sh
$ git push REMOTE HEAD:ref/for/sandbox/USERNAME/BRANCHNAME
```

## Updating the Version of a Change

During the review process, you might be asked to update your change. It is
possible to submit multiple versions of the same change. Each version of the
change is called a patch set.

Always maintain the **Change-Id** that was assigned. For example, there is a
list of commits, **c0...c7**, which were submitted as a topic branch:

```sh

$ git log REMOTE/master..master

  c0
  ...
  c7

$ git push REMOTE HEAD:refs/for/master/SOMETOPIC
```

After you get reviewers' feedback, there are changes in **c3** and **c4** that
must be fixed. If the fix requires rebasing, rebasing changes the commit Ids,
see the [rebasing](http://git-scm.com/book/en/v2/Git-Branching-Rebasing) section
for more information. However, you must keep the same Change-Id and push the
changes again:

```sh
$ git push REMOTE HEAD:refs/for/master/SOMETOPIC
```

This new push creates a patches revision, your local history is then cleared.
However you can still access the history of your changes in Gerrit on the
``review UI`` section, for each change.

It is also permitted to add more commits when pushing new versions.

### Rebasing

Rebasing is usually the last step before pushing changes to Gerrit; this allows
you to make the necessary *Change-Ids*. The *Change-Ids* must be kept the same.

-  **squash:** mixes two or more commits into a single one.
-  **reword:** changes the commit message.
-  **edit:** changes the commit content.
-  **reorder:** allows you to interchange the order of the commits.
-  **rebase:** stacks the commits on top of the master.

## Rebasing During a Pull

Before pushing a rebase to your master, ensure that the history has a
consecutive order.

For example, your ``REMOTE/master`` has the list of commits from **a0** to
**a4**; Then, your changes **c0...c7** are on top of **a4**; thus:

```sh
$ git log --oneline REMOTE/master..master

  a0
  a1
  a2
  a3
  a4
  c0
  c1
  ...
  c7
```

If ``REMOTE/master`` receives commits **a5**, **a6** and **a7**. Pull with a
rebase as follows:

```sh
$ git pull --rebase REMOTE master
```

This pulls **a5-a7** and re-apply **c0-c7** on top of them:

```sh
$ git log --oneline REMOTE/master..master
a0
...
a7
c0
c1
...
c7
```

## Getting Better Logs from Git

Use these commands to change the configuration of Git in order to produce better
logs:

```sh
$ git config log.abbrevCommit true
```

The command above sets the log to abbreviate the commits' hash.

```sh
$ git config log.abbrev 5
```

The command above sets the abbreviation length to the last 5 characters of the
hash.

```sh
$ git config format.pretty oneline
```

The command above avoids the insertion of an unnecessary line before the Author
line.