xref: /aosp_15_r20/external/skia/experimental/documentation/gerrit.md (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard WorkerUsing Gerrit without git-cl
2*c8dee2aaSAndroid Build Coastguard Worker===========================
3*c8dee2aaSAndroid Build Coastguard Worker
4*c8dee2aaSAndroid Build Coastguard WorkerSetup
5*c8dee2aaSAndroid Build Coastguard Worker-----
6*c8dee2aaSAndroid Build Coastguard Worker
7*c8dee2aaSAndroid Build Coastguard WorkerThe following must be executed within the Skia source repository.
8*c8dee2aaSAndroid Build Coastguard Worker
9*c8dee2aaSAndroid Build Coastguard WorkerThis command sets up a Git commit-message hook to add a unique Change-Id to
10*c8dee2aaSAndroid Build Coastguard Workereach commit.  Gerrit only accepts changes with a Change-Id and uses it to
11*c8dee2aaSAndroid Build Coastguard Workeridentify which review a change applies to.
12*c8dee2aaSAndroid Build Coastguard Worker
13*c8dee2aaSAndroid Build Coastguard Worker    experimental/tools/set-change-id-hook
14*c8dee2aaSAndroid Build Coastguard Worker
15*c8dee2aaSAndroid Build Coastguard WorkerIf you acquired Skia from a mirror (such as GitHub), you need to change the
16*c8dee2aaSAndroid Build Coastguard Worker`origin` remote to point to point to googlesource.  Advanced uses will note
17*c8dee2aaSAndroid Build Coastguard Workerthat there is nothing special about the string `origin` and that you could call
18*c8dee2aaSAndroid Build Coastguard Workerthis remote anything you want, as long as you use that name for `get push`.
19*c8dee2aaSAndroid Build Coastguard Worker
20*c8dee2aaSAndroid Build Coastguard Worker    git remote set-url origin 'https://skia.googlesource.com/skia.git'
21*c8dee2aaSAndroid Build Coastguard Worker
22*c8dee2aaSAndroid Build Coastguard Worker
23*c8dee2aaSAndroid Build Coastguard WorkerAuthentication
24*c8dee2aaSAndroid Build Coastguard Worker--------------
25*c8dee2aaSAndroid Build Coastguard Worker
26*c8dee2aaSAndroid Build Coastguard WorkerGo to [skia.googlesource.com/new-password](https://skia.googlesource.com/new-password)
27*c8dee2aaSAndroid Build Coastguard Workerand follow the instructions.
28*c8dee2aaSAndroid Build Coastguard Worker
29*c8dee2aaSAndroid Build Coastguard Worker
30*c8dee2aaSAndroid Build Coastguard WorkerCreating a Change
31*c8dee2aaSAndroid Build Coastguard Worker-----------------
32*c8dee2aaSAndroid Build Coastguard Worker
33*c8dee2aaSAndroid Build Coastguard Worker1.  Create a topic branch
34*c8dee2aaSAndroid Build Coastguard Worker
35*c8dee2aaSAndroid Build Coastguard Worker        git checkout -b TOPIC
36*c8dee2aaSAndroid Build Coastguard Worker
37*c8dee2aaSAndroid Build Coastguard Worker    You may want to set a tracking branch at this time with:
38*c8dee2aaSAndroid Build Coastguard Worker
39*c8dee2aaSAndroid Build Coastguard Worker        git checkout -b TOPIC -t origin/main
40*c8dee2aaSAndroid Build Coastguard Worker
41*c8dee2aaSAndroid Build Coastguard Worker2.  Make a commit.
42*c8dee2aaSAndroid Build Coastguard Worker
43*c8dee2aaSAndroid Build Coastguard Worker        echo FOO >> whitespace.txt
44*c8dee2aaSAndroid Build Coastguard Worker        git commit --all --message 'Change Foo'
45*c8dee2aaSAndroid Build Coastguard Worker        git log -1
46*c8dee2aaSAndroid Build Coastguard Worker
47*c8dee2aaSAndroid Build Coastguard Worker    `git log` should show that a Change-Id line has been added you your commit
48*c8dee2aaSAndroid Build Coastguard Worker    message.
49*c8dee2aaSAndroid Build Coastguard Worker
50*c8dee2aaSAndroid Build Coastguard Worker
51*c8dee2aaSAndroid Build Coastguard Worker3.  If You have multiple commits in your branch, Gerrit will think you want
52*c8dee2aaSAndroid Build Coastguard Worker    multiple changes that depend on each other.  If this is not what you want,
53*c8dee2aaSAndroid Build Coastguard Worker    you need to squash the commits.
54*c8dee2aaSAndroid Build Coastguard Worker
55*c8dee2aaSAndroid Build Coastguard Worker4.  Push to Gerrit
56*c8dee2aaSAndroid Build Coastguard Worker
57*c8dee2aaSAndroid Build Coastguard Worker        git push origin @:refs/for/main
58*c8dee2aaSAndroid Build Coastguard Worker
59*c8dee2aaSAndroid Build Coastguard Worker    `@` is shorthand for `HEAD`, introduced in git v1.8.5.
60*c8dee2aaSAndroid Build Coastguard Worker
61*c8dee2aaSAndroid Build Coastguard Worker    If you want to target a branch other than `main`, that can be specified
62*c8dee2aaSAndroid Build Coastguard Worker    here, too.  For example:
63*c8dee2aaSAndroid Build Coastguard Worker
64*c8dee2aaSAndroid Build Coastguard Worker        git push origin @:refs/for/chrome/m57
65*c8dee2aaSAndroid Build Coastguard Worker
66*c8dee2aaSAndroid Build Coastguard Worker    [Gerrit Upload Documentation](https://gerrit-review.googlesource.com/Documentation/user-upload.html)
67*c8dee2aaSAndroid Build Coastguard Worker
68*c8dee2aaSAndroid Build Coastguard Worker5.  Open in web browser:
69*c8dee2aaSAndroid Build Coastguard Worker
70*c8dee2aaSAndroid Build Coastguard Worker        bin/sysopen https://skia-review.googlesource.com/c/skia/+/$(bin/gerrit-number @)
71*c8dee2aaSAndroid Build Coastguard Worker
72*c8dee2aaSAndroid Build Coastguard WorkerUpdating a Change
73*c8dee2aaSAndroid Build Coastguard Worker-----------------
74*c8dee2aaSAndroid Build Coastguard Worker
75*c8dee2aaSAndroid Build Coastguard Worker
76*c8dee2aaSAndroid Build Coastguard Worker1.  Edit your commits more.
77*c8dee2aaSAndroid Build Coastguard Worker
78*c8dee2aaSAndroid Build Coastguard Worker        echo BAR >> whitespace.txt
79*c8dee2aaSAndroid Build Coastguard Worker        git commit --all --amend
80*c8dee2aaSAndroid Build Coastguard Worker
81*c8dee2aaSAndroid Build Coastguard Worker    Changes to the commit message will be sent with the push as well.
82*c8dee2aaSAndroid Build Coastguard Worker
83*c8dee2aaSAndroid Build Coastguard Worker
84*c8dee2aaSAndroid Build Coastguard Worker2.  Re-squash if needed.  (Not needed if you only amended your original commit.)
85*c8dee2aaSAndroid Build Coastguard Worker
86*c8dee2aaSAndroid Build Coastguard Worker
87*c8dee2aaSAndroid Build Coastguard Worker3.  Push to Gerrit.
88*c8dee2aaSAndroid Build Coastguard Worker
89*c8dee2aaSAndroid Build Coastguard Worker        git push origin @:refs/for/main
90*c8dee2aaSAndroid Build Coastguard Worker
91*c8dee2aaSAndroid Build Coastguard Worker    If you want to set a comment message for this patch set, do this instead:
92*c8dee2aaSAndroid Build Coastguard Worker
93*c8dee2aaSAndroid Build Coastguard Worker        M=$(experimental/tools/gerrit_percent_encode 'This is the patch set comment message!')
94*c8dee2aaSAndroid Build Coastguard Worker        git push origin @:refs/for/main%m=$M
95*c8dee2aaSAndroid Build Coastguard Worker
96*c8dee2aaSAndroid Build Coastguard Worker    The title of this patch set will be "This is the patch set comment message!".
97*c8dee2aaSAndroid Build Coastguard Worker
98*c8dee2aaSAndroid Build Coastguard Worker
99*c8dee2aaSAndroid Build Coastguard WorkerTriggering Commit-Queue Dry Run when you upload a patch
100*c8dee2aaSAndroid Build Coastguard Worker-------------------------------------------------------
101*c8dee2aaSAndroid Build Coastguard Worker
102*c8dee2aaSAndroid Build Coastguard Worker    M=$(experimental/tools/gerrit_percent_encode 'This is the patch set comment message!')
103*c8dee2aaSAndroid Build Coastguard Worker    git push origin @:refs/for/main%l=Commit-Queue+1,m=$M
104*c8dee2aaSAndroid Build Coastguard Worker
105*c8dee2aaSAndroid Build Coastguard Worker
106*c8dee2aaSAndroid Build Coastguard WorkerUsing `git cl try`
107*c8dee2aaSAndroid Build Coastguard Worker------------------
108*c8dee2aaSAndroid Build Coastguard Worker
109*c8dee2aaSAndroid Build Coastguard WorkerOn your current branch, after uploading to gerrit:
110*c8dee2aaSAndroid Build Coastguard Worker
111*c8dee2aaSAndroid Build Coastguard Worker    git cl issue $(bin/gerrit-number @)
112*c8dee2aaSAndroid Build Coastguard Worker
113*c8dee2aaSAndroid Build Coastguard WorkerNow `git cl try` and `bin/try` will work correctly.
114*c8dee2aaSAndroid Build Coastguard Worker
115*c8dee2aaSAndroid Build Coastguard Worker
116*c8dee2aaSAndroid Build Coastguard WorkerScripting
117*c8dee2aaSAndroid Build Coastguard Worker---------
118*c8dee2aaSAndroid Build Coastguard Worker
119*c8dee2aaSAndroid Build Coastguard WorkerYou may want to make git aliases for common tasks:
120*c8dee2aaSAndroid Build Coastguard Worker
121*c8dee2aaSAndroid Build Coastguard Worker    git config alias.gerrit-push 'push origin @:refs/for/main'
122*c8dee2aaSAndroid Build Coastguard Worker
123*c8dee2aaSAndroid Build Coastguard WorkerThe following alias amends the head without editing the commit message:
124*c8dee2aaSAndroid Build Coastguard Worker
125*c8dee2aaSAndroid Build Coastguard Worker    git config alias.amend-head 'commit --all --amend --reuse-message=@'
126*c8dee2aaSAndroid Build Coastguard Worker
127*c8dee2aaSAndroid Build Coastguard WorkerSet the CL issue numnber:
128*c8dee2aaSAndroid Build Coastguard Worker
129*c8dee2aaSAndroid Build Coastguard Worker    git config alias.setcl '!git-cl issue $(bin/gerrit-number @)'
130*c8dee2aaSAndroid Build Coastguard Worker
131*c8dee2aaSAndroid Build Coastguard WorkerThe following shell script will squash all commits on the current branch,
132*c8dee2aaSAndroid Build Coastguard Workerassuming that the branch has an upstream topic branch.
133*c8dee2aaSAndroid Build Coastguard Worker
134*c8dee2aaSAndroid Build Coastguard Worker    squash_git_branch() {
135*c8dee2aaSAndroid Build Coastguard Worker        local MESSAGE="$(git log --format=%B ^@{upstream} @)"
136*c8dee2aaSAndroid Build Coastguard Worker        git reset --soft $(git merge-base @ @{upstream})
137*c8dee2aaSAndroid Build Coastguard Worker        git commit -m "$MESSAGE" -e
138*c8dee2aaSAndroid Build Coastguard Worker    }
139*c8dee2aaSAndroid Build Coastguard Worker
140*c8dee2aaSAndroid Build Coastguard WorkerThis shell script pushes to gerrit and adds a message to a patchset:
141*c8dee2aaSAndroid Build Coastguard Worker
142*c8dee2aaSAndroid Build Coastguard Worker    gerrit_push_with_message() {
143*c8dee2aaSAndroid Build Coastguard Worker        local REMOTE='origin'
144*c8dee2aaSAndroid Build Coastguard Worker        local REMOTE_BRANCH='main'
145*c8dee2aaSAndroid Build Coastguard Worker        local MESSAGE="$(echo $*|sed 's/[^A-Za-z0-9]/_/g')"
146*c8dee2aaSAndroid Build Coastguard Worker        git push "$REMOTE" "@:refs/for/${REMOTE_BRANCH}%m=${MESSAGE}"
147*c8dee2aaSAndroid Build Coastguard Worker    }
148*c8dee2aaSAndroid Build Coastguard Worker
149*c8dee2aaSAndroid Build Coastguard WorkerThese shell scripts can be turned into Git aliases with a little hack:
150*c8dee2aaSAndroid Build Coastguard Worker
151*c8dee2aaSAndroid Build Coastguard Worker    git config alias.squash-branch '!M="$(git log --format=%B ^@{u} @)";git reset --soft $(git merge-base @ @{u});git commit -m "$M" -e'
152*c8dee2aaSAndroid Build Coastguard Worker
153*c8dee2aaSAndroid Build Coastguard Worker    git config alias.gerrit-push-message '!f(){ git push origin @:refs/for/main%m=$(echo $*|sed "s/[^A-Za-z0-9]/_/g");};f'
154*c8dee2aaSAndroid Build Coastguard Worker
155*c8dee2aaSAndroid Build Coastguard WorkerIf your branch's upstream branch (set with `git branch --set-upstream-to=...`)
156*c8dee2aaSAndroid Build Coastguard Workeris set, you can use that to automatically push to that branch:
157*c8dee2aaSAndroid Build Coastguard Worker
158*c8dee2aaSAndroid Build Coastguard Worker    gerrit_push_upstream() {
159*c8dee2aaSAndroid Build Coastguard Worker        local UPSTREAM_FULL="$(git rev-parse --symbolic-full-name @{upstream})"
160*c8dee2aaSAndroid Build Coastguard Worker        case "$UPSTREAM_FULL" in
161*c8dee2aaSAndroid Build Coastguard Worker            (refs/remotes/*);;
162*c8dee2aaSAndroid Build Coastguard Worker            (*) echo "Set your remote upstream branch."; return 2;;
163*c8dee2aaSAndroid Build Coastguard Worker        esac
164*c8dee2aaSAndroid Build Coastguard Worker        local UPSTREAM="${UPSTREAM_FULL#refs/remotes/}"
165*c8dee2aaSAndroid Build Coastguard Worker        local REMOTE="${UPSTREAM%%/*}"
166*c8dee2aaSAndroid Build Coastguard Worker        local REMOTE_BRANCH="${UPSTREAM#*/}"
167*c8dee2aaSAndroid Build Coastguard Worker        local MESSAGE="$(echo $*|sed 's/[^A-Za-z0-9]/_/g')"
168*c8dee2aaSAndroid Build Coastguard Worker        echo git push $REMOTE @:refs/for/${REMOTE_BRANCH}%m=${MESSAGE}
169*c8dee2aaSAndroid Build Coastguard Worker        git push "$REMOTE" "@:refs/for/${REMOTE_BRANCH}%m=${MESSAGE}"
170*c8dee2aaSAndroid Build Coastguard Worker    }
171*c8dee2aaSAndroid Build Coastguard Worker
172*c8dee2aaSAndroid Build Coastguard WorkerAs a Git alias:
173*c8dee2aaSAndroid Build Coastguard Worker
174*c8dee2aaSAndroid Build Coastguard Worker    git config alias.gerrit-push '!f()(F="$(git rev-parse --symbolic-full-name @{u})";case "$F" in (refs/remotes/*);;(*)echo "Set your remote upstream branch.";return 2;;esac;U="${F#refs/remotes/}";R="${U%%/*}";B="${U#*/}";M="$(echo $*|sed 's/[^A-Za-z0-9]/_/g')";echo git push $R @:refs/for/${B}%m=$M;git push "$R" "@:refs/for/${B}%m=$M");f'
175*c8dee2aaSAndroid Build Coastguard Worker
176