gerrit-rust 0.1.14

Rust client to gerrit
Documentation

# 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`
*   gerrit server with installed download-plugin

# Design

Some design considarations here.

*   [ ] semver at version 1.0.0. Before this version no semver!
*   remove external depency to host
    [ ] git binary
    [ ] gerrit with download plugin
*   [x] **0.1.5** Use of curl-rs as http client
*   [x] **0.1.0** Use a config file `.ggr.config` in TOML format

    *   `api`: base url with schema (http)
    *   [x] **0.1.3** User authentication (**deprecated since 0.1.9**)
        *   `username`: username for login
        *   `password`: password for login
        [x] **0.1.9** only `.netrc` settings are respected for username and
            password. u/p in config file are ignored
    *   `root`: true if this is the uppermost project of all repositories
        underneath
    *   [x] Authentication (e.g.: digest, basic)
        *   [x] `digest` and `basic` are supported. Current implementation
            calls both. First on is `basic` and second one is `digest`.

    *   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

    *   [x] **0.1.9** Use `$HOME/.netrc` file to get username and password.

*   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.
        [x] **0.1.9** Add tracking information via `--track <branch>` option.

    *   [ ] `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.

    *   [ ] `ggr topic verify [<TOPICNAME>] <LABEL> [<MESSAGE>]`
        Verify all commits of a topic TOPICNAME with a label LABEL
        (-2|-1|0|+1|+2|=) and a optional message. Be aware the messages is
        appended as note on ALL commits in this topic.
        *   [ ] Label `=` means not changing the current review label value,
            only a append a message

*   Other Ideas

    *   [x] **0.1.9** 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 containing of settings,
repositories and ssh-keys.

```text
docker run --rm -it \
           -h localhost
           -p 8080:8080 -p 29418:29418 \
           -v /development/projects/DOCKER-FOR-GERRIT:/var/gerrit/review_site \
           --name gerrit \
           openfrontier/gerrit:latest
```


## 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

*   Mozilla Public License 2.0 ([LICENSE-MPL-2.0]LICENSE-MPL-2.0 or https://www.mozilla.org/media/MPL/2.0/index.txt)