# Introduction
`gerrit-rust` is a console client for gerrit written in rust. This is a **rust
learner** project. Have patience with me :-)
I'm happy about every PR, but I will ask questions about changes to learn from
your knowledge.
# Dependency
* A installed `git` binary in `$PATH`
# Design
Some design considarations here.
* [ ] semver at version 1.0.0. Before this version no semver!
* [x] **0.1.5** Use of curl-rs as http client
* [x] **0.1.0** Use a config file `.ggr.config` in TOML format
* `baseurl`: base url with schema (http)
* `port`: used port
* `appendix`: for gerrit server under a subpath (not tested)
* [x] **0.1.3** User authentication, without `username` and/or `password`
we use the anonymous backend of gerrit
* `username`: username for login
* `password`: password for login
* `root`: true if this is the uppermost project of all repositories
underneath
* [ ] Authentication (e.g.: digest, basic)
* [x] only `digest` hardcoded supported
* Consider to configure via config file or put all settings into
as entries in `.git/config`.
The values are same for config file and git-config approach. For the
git-config we use `ggr-` as a prefix.
* provide a configuration frontend
* [ ] `ggr config set baseurl 'http://localhost'`: set new `baseurl`
* [ ] `ggr config unset -C project1 root`: remove `root` in project1
repository
* [ ] `ggr config set root`: set root for current repository
* [x] **0.1.0** `ggr config list`: list all options
* [ ] ... with origin of setting
* [ ] `ggr config generate --base <...> ...`: generates
a `.ggr.config` file
* manage of topics over more than one repository (git submodules like)
* [x] **0.1.0** `ggr topic create <BRANCHNAME> [-r sub:rev]`
Create branch at main folder and specified subfolders. If a branch with
same name exists it isn't touched. `rev` is the reference where branch
should created Defaults to `orign/master`. For base folder use `-r .`.
* [ ] execute in subfolders: create branch in this repo and in
baserepo.
* [ ] Add `-R` option to create branch on base and all
subrepositories.
* [x] **0.1.0** `ggr topic forget <BRANCHNAME> [-R]`
Delete a branch at mainfolder and and with `-R` in all subfolders.
* [ ] Add option `-s` in conjunction with `-R` to remove all branches
recursive which have no commit and the repositories are clean. Warn
unclean repositories/branches.
* [ ] `ggr topic list -s`
List all development branches and the repositories. With `-s` it
includes the commits in the branch like `git submodule summary`.
* [x] **0.1.8** `ggr topic checkout <BRANCHNAME>`
Checkout a branch on all repositories.
* [x] **0.1.8** first check base folder if checkout happened sync all
submodules than checkout changes for topic on subfolders
* [ ] `ggr topic push [-b] [<BRANCHNAME>]`
Push changes to gerrit. Without `-b` its pushed to gerrit. With option
`-b` its pushed to a build server. Without branchname the current
branch is pushed.
* [x] **0.1.7** <s>`ggr topic pull ...`</s>
same as `ggr topic fetch`. This sub function is renamed because `fetch`
is more in line with git speak than `pull`.
* [x] **0.1.8** `ggr topic fetch [-f] [-b branchname] <topicname>`
fetch latest version of commits for a topic. Create for all
changes a branch with the patch identifier as name, or with `-b` with
a given branchname.
* [ ] `ggr topic reviewer [<BRANCHNAME>] [-r <MAIL>] [-c <MAIL>] [-t <MAIL>]`
Add reviewer (`-r`), CC: (`-c`) or TO: (`-t`) at topic push time. The
information is put to branch config like `config.BRANCHNAME.ggr-re
MAIL`. Config lineentries start with ggr-\[cc/to/re\]. Without any
options the current reviewer/to/cc showed for current branch. Without
BRANCHNAME te current branch is taken.
* Other Ideas
* [ ] implement a log mechanism to get debugging information via loglevel
switch
* [x] **0.1.0** `ggr changes query <QUERY>`
query a searchstring to gerrit server. Use as `QUERY` the same syntax
as in gerrit web frontend. eg
* [x] **0.1.7** Add `--regexp-selector` to show only keys selected by
regular expression.
This remove the --fields selector introduced in 0.1.4.
* [x] **0.1.6** Add a `--human` option to print it in human readable
format.
* [ ] Add `--header` to get a header line with field names
* [x] **0.1.4** Add `--field-list` to get all selectable fields,
usable for `--fields` option on a second call.
* [x] **0.1.4** Add `--raw` for json in raw format. Usable for pretty
printer over pipe
* [x] **0.1.4** Option `-o`/`--ofields` to get additional information
of changes back (like REVISION etc ...)
Examples:
* `ggr changes query status:open is:watched n:2`: query open changes
which `watched` flag.
* [ ] create a helper script for setup of development environment
* [x] docker based gerrit server
found docker image `docker pull docker.io/fabric8/gerrit:latest`
* [ ] setup password and username for gerrit
* [ ] autogenerate git repositrories and submodules
* [ ] setup gerrit for this repositories
* [ ] auto push master branches to gerrit
* [ ] `ggr stat [-F <date>] [-T <data>]`
some statistics like opened and closed review since a week or between
a timespan. via iso-8601 like `date -Is`.
Examples:
* `ggr stat -F 1w`: last week to now
* `ggr stat -F 2015-12-31 -T 2016-02-01`: from 01.01.2016T00:00 till 01.02.2016T23:59:59
* `ggr stat -F 2016-01-01`: from 02.01.2016T00:00 till now
* `ggr stat -T 2016-02-01`: from begin of gerrit usage till 01.02.2016T23:59:59
* reviewer per commit
* reviewer per repository
* status of branches
shows status of a branch (remote and local like `git remote show ...`
* `ggr status [<BRANCHNAME>]`
* Support for `.repo` folder
* Consider to use https://github.com/gsingh93/trace
* Consider to use https://github.com/ticki/termion
* Document `gerritlib::call` module
* [x] **0.1.5** Add .travis.yml
# gerrit demo server local on your host via docker
This creates a dockercontainer which is connectable via http://localhost:8080.
The server is setup for development and all accounts can do all things.
It generate or use a `DOCKER-FOR-GERRIT` folder with all settings, repositories
and ssh-keys.
```text
docker run --rm -it -p 0.0.0.0:8080:8080 -p 127.0.0.1:29418:29418 \
-e AUTH_TYPE='OpenID' \
-e GERRIT_PUBLIC_KEYS_PATH='/home/gerrit/ssh-keys' \
-v ${PWD}/DOCKER-FOR-GERRIT/ssh-keys:/home/gerrit/ssh-keys \
-v ${PWD}/DOCKER-FOR-GERRIT/site:/home/gerrit/site \
--name gerrit docker.io/fabric8/gerrit:latest
```
# Workflow
* work on a new branch: `ggr topic create testfeature -F p1:origin/master -F p2`
* hack hack hack
* hmm `p3` needs changes too
* `cd p3 ; ggr topic create testfeature`
* hack hack hack
* needs buildserver for integration test `ggr topic push -b testfeature`
* ssh and do build things
* push changes to gerrit `ggr topic push testfeature`
# Random Notes
## curl
With this we can handle the rest api ...
```text
curl -x GET 'http://localhost:8080/projects/?&b=master'
```
## useful links
* gerrit api documentation: <https://gerrit-review.googlesource.com/Documentation/rest-api.html>
* request, response design from: <https://github.com/gefolderstsentry/sentry-cli>
# License
Licensed under either of
* Mozilla Public License 2.0 ([LICENSE-MPL-2.0](LICENSE-MPL-2.0) or https://www.mozilla.org/media/MPL/2.0/index.txt)
at your option.