Breeze: Add Save All & Save a Copy icons
[LibreOffice.git] / logerrit
blob44236b07749a7c2f5dc6a8b470e48a846a2494c5
1 #!/bin/bash
3 #GERRITHOST=gerrit.libreoffice.org
4 GERRITHOST=logerrit
5 GERRITURL="ssh://$GERRITHOST/core"
7 get_SHA_for_change() {
8 SHA=$(ssh "${GERRITHOST?}" gerrit query --all-approvals change:"$1" | grep ref | tail -1 | cut -d: -f2 | sed 's/^ *//')
11 submit() {
12 BRANCH=$1
13 TYPE=${2:-''}
14 if test -z "$BRANCH"
15 then
16 BRANCH=$(git symbolic-ref HEAD 2> /dev/null)
17 BRANCH="${BRANCH##refs/heads/}"
18 if test -z "$BRANCH"
19 then
20 echo "no branch specified, and could not guess the current branch"
21 exit 1
23 echo "no branch specified, guessing current branch $BRANCH"
26 if [ "$BRANCH" = "master" ]; then
27 WEEKOLDDATE=$(date --date="7 days ago" +%s 2> /dev/null)
28 if [ "$WEEKOLDDATE" = "" ]; then
29 WEEKOLDDATE=$(date -v7d +%s) # BSD equivalent
31 PARENTDATE=$(git show -s --format=%ct HEAD~1)
32 if [[ $PARENTDATE -lt $WEEKOLDDATE ]]; then
33 echo "Your branch is older than a week, do './g pull -r' and retry"
34 exit 1
37 git push "$GERRITURL" "HEAD:refs/for/$BRANCH$TYPE"
40 logerrit() {
41 echo "Host logerrit gerrit.libreoffice.org"
42 if test -n "${2-}" && test -f "$HOME/.ssh/id_$2"; then
43 echo " IdentityFile ~/.ssh/id_$2"
45 echo " User $1"
46 echo " Port 29418"
47 echo " HostName gerrit.libreoffice.org"
50 case "$1" in
51 help|--help|"")
52 echo "Usage: ./logerrit subcommand [options]"
53 echo "simple and basic tool to interact with LibreOffice gerrit"
54 echo "see https://wiki.documentfoundation.org/Development/gerrit for details."
55 echo
56 echo "subcommands:"
57 echo " setup walking you though your gerrit setup"
58 echo " test test your gerrit setup"
59 echo
60 echo " --- for submitters:"
61 echo " submit [BRANCH] submit your change for review"
62 echo " submit-private [BRANCH] submit your change as private"
63 echo " submit-wip [BRANCH] submit your change as work-in-progress"
64 echo " nextchange [BRANCH] reset branch to the remote to start with the next change"
65 echo " testfeature [BRANCH] [CHANGEID]"
66 echo " trigger a test of a feature branch on gerrit"
67 echo
68 echo "Note: private changes are only visibly to yourself and those that you explicitly add as reviewers."
69 echo "For full documentation, see https://gerrit.libreoffice.org/Documentation/intro-user.html#private-changes"
70 echo
71 echo " --- for reviewers:"
72 echo " checkout CHANGEID checkout the changes for review"
73 echo " pull CHANGEID pull (and merge) the changes on current branch"
74 echo " cherry-pick CHANGEID cherry-pick the change on current branch"
75 echo " patch CHANGEID show the change as a patch"
76 echo " query ... query for changes for review on project core"
77 echo " <any other gerrit command>"
78 echo
79 echo "advanced users should consider using git review instead:"
80 echo "https://wiki.documentfoundation.org/Development/GitReview"
81 exit
83 setup)
84 script_canonical_file=$(readlink -f "$0")
85 script_canonical_dir=$(dirname "$script_canonical_file")
86 if ! cd "$script_canonical_dir"; then
87 echo "Can't cd to $script_canonical_dir"
88 exit 1
90 ssh_home="$HOME/.ssh";
91 ssh_key=
92 created_ssh=
93 if ! test -d "$ssh_home"; then
94 echo "It appears that you have no ssh setup, running ssh-keygen to create that:"
95 mkdir -m0700 "$ssh_home"
96 created_ssh=TRUE
97 echo
98 echo "Hit enter to generate an ssh key - you will need to enter a pass-phrase"
99 echo
100 read -r
101 ssh-keygen -t rsa -f "$ssh_home/id_rsa" # default type as of OpenSSH 8.1
103 if test -d "$ssh_home"; then
104 # order algos based on the PubkeyAcceptedKeyTypes option from OpenSSH 8.1
105 for ssh_key_type in ecdsa ed25519 rsa; do
106 pk="$ssh_home/id_${ssh_key_type}.pub"
107 ssh_key=""
108 if test -f "$pk" && ssh_key="$(< "$pk")" && test -n "$ssh_key"; then
109 break
111 done
113 echo "Please go to https://gerrit.libreoffice.org/ and click the \"Sign in\" link"
114 echo "at the top right of the page. You'll be sent to our Single Sign-On portal"
115 echo "for authentication (create an account if needs be), and automatically"
116 echo "redirected back to gerrit afterwards."
117 echo
118 echo "Visit https://gerrit.libreoffice.org/settings/#SSHKeys and paste the public"
119 if test -z "$ssh_key"; then
120 echo "part of your SSH key in the 'New SSH key' form."
121 else
122 echo "key below in the 'New SSH key' form."
123 echo
124 printf '%s\n' "$ssh_key"
125 echo
127 echo
128 echo "Note that you need to register additional email addresses, if you want to"
129 echo "commit from them. Each additional email address must be confirmed by"
130 echo "following the verification link sent to it."
131 echo
132 read -r -p 'Which user name did you choose? ' GERRITUSER
133 if test -z "$created_ssh"; then
134 echo
135 echo "Please now add the following to your ~/.ssh/config, creating the file if needed:"
136 echo
137 logerrit "$GERRITUSER" ${ssh_key:+"$ssh_key_type"}
138 echo
139 else
140 echo "Automatically creating your ssh config"
141 logerrit "$GERRITUSER" ${ssh_key:+"$ssh_key_type"} >"$ssh_home/config"
143 # setup the remote properly ...
144 git config remote.origin.pushurl ssh://logerrit/core
145 echo "To see if your setup was successful, run './logerrit test' then."
146 # a good place to make sure the hooks are set up
147 ./g -z
149 test)
150 if test -n "$(ssh "$GERRITHOST" 2>&1|grep "Welcome to Gerrit Code Review")"
151 then
152 echo "Your gerrit setup was successful!"
153 else
154 echo "There seems to be trouble. Please have the output of:"
155 echo "ssh -vvvv $GERRITHOST"
156 echo "at hand when looking for help."
159 submit)
160 submit "$2"
162 submit-private)
163 submit "$2" '%private'
165 submit-wip)
166 submit "$2" '%wip'
168 submit-draft)
169 echo "Please use submit-private instead of submit-draft."
170 exit 1
172 nextchange)
173 if test -n "$(git status -s -uno)"
174 then
175 echo "You have uncommitted changes. Please commit or stash these:"
176 git status
177 exit 1
179 CHANGEID=$(git log --format=format:%b -1 HEAD|grep Change-Id|cut -d: -f2|tr -d \ )
180 if test -z "$CHANGEID"
181 then
182 CHANGEID="NOCHANGEID"
184 BACKUPBRANCH=backup/$CHANGEID-$(date +%F-%H%M%S)
185 git branch "$BACKUPBRANCH"
186 echo "current state backed up as $BACKUPBRANCH"
187 BRANCH=$2
188 if test -z "$BRANCH"
189 then
190 BRANCH=$(git symbolic-ref HEAD 2> /dev/null)
191 BRANCH="${BRANCH##refs/heads/}"
192 if test -z "$BRANCH"
193 then
194 echo "no branch specified, and could not guess the current branch"
195 exit 1
197 echo "no branch specified, guessing current branch $BRANCH"
199 git reset --hard "remotes/origin/$BRANCH"
201 checkout)
202 get_SHA_for_change "$2"
203 git fetch "$GERRITURL" "$SHA" && git checkout FETCH_HEAD
205 review)
206 echo "'./logerrit review' has been removed as obsolete."
207 echo "Please use either:"
208 echo " - git-review: https://wiki.documentfoundation.org/Development/GitReview"
209 echo " - or the web-UI directly: https://gerrit.libreoffice.org/"
210 echo "Both provide a better experience."
211 exit 1;
213 pull)
214 get_SHA_for_change "$2"
215 git pull "$GERRITURL" "$SHA"
217 cherry-pick)
218 get_SHA_for_change "$2"
219 git fetch "$GERRITURL" "$SHA" && git cherry-pick FETCH_HEAD
221 patch)
222 get_SHA_for_change "$2"
223 git fetch "$GERRITURL" "$SHA" && git format-patch -1 --stdout FETCH_HEAD
225 query)
226 shift
227 ssh "${GERRITHOST?}" gerrit query project:core "${@@Q}"
229 testfeature)
230 CHANGEID=${3#I}
231 if test -n "$3" -a \( ${#3} -ne 41 -o -n "${CHANGEID//[0-9a-f]/}" \)
232 then
233 echo "${3} is not a valid Gerrit change id"
234 exit 1
236 CHANGEID=$3
238 BRANCH=$2
239 if test -z "$BRANCH"
240 then
241 BRANCH=$(git symbolic-ref HEAD 2> /dev/null)
242 BRANCH="${BRANCH##refs/heads/}"
243 if test -z "$BRANCH"
244 then
245 echo "no branch specified, and could not guess the current branch"
246 exit 1
248 echo "no branch specified, guessing current branch $BRANCH"
250 BRANCH="${BRANCH##feature/}"
251 WORKDIR=$(mktemp -d)
252 if test -z "$WORKDIR"
253 then
254 echo "could not create work directory."
255 exit 1
257 echo "workdir at $WORKDIR"
258 git clone -s "$(dirname "$0")" "$WORKDIR/core"
260 pushd "$WORKDIR/core" || { echo "Changing directory failed."; exit 1; }
261 echo "noop commit: trigger test build for branch feature/$BRANCH" > ../commitmsg
262 echo >> ../commitmsg
263 echo "branch is at:" >> ../commitmsg
264 echo >> ../commitmsg
265 git log -1|sed -e "s/Change-Id:/XXXXXX:/" >> ../commitmsg
266 if test -n "$CHANGEID"
267 then
268 echo >> ../commitmsg
269 echo "Change-Id: $CHANGEID" >> ../commitmsg
271 git fetch https://git.libreoffice.org/core "feature/$BRANCH" && \
272 git checkout -b featuretst FETCH_HEAD && \
273 cp -a .git-hooks/* .git/hooks && \
274 git commit --allow-empty -F ../commitmsg && \
275 git push "$GERRITURL" "HEAD:refs/for/feature/$BRANCH"
276 popd || { echo "Changing directory failed."; exit 1; }
278 rm -rf "$WORKDIR/core"
279 rm -f "$WORKDIR/commitmsg"
280 rmdir "$WORKDIR"
283 ssh "${GERRITHOST?}" gerrit "${@@Q}"
285 esac
287 # vim: set noet sw=4 ts=4: