Add 'Parent $x' options to diff for merge commits

Add 'Parent $x' options to the diff base drop down for merge commits.
This way users are able to see changes brought by merge commit in
addition to the merge conflicts resolution.

Two main challenges of this change are:
* server: enable commenting on a Parent-N of a merge commit
* client: pass around the diff-base info which for merge commits can be:
  Auto-Merge, Parent-1, Parent-2, ... , Parent-N

Currently the patch_comments.side field uses two values:
1 = REVISION
0 = PARENT

For non-merge commits, side == 0 means comment of the Base (the parent)
of this patch-set.  For a merge commit, side == 0 means comment on the
Auto-Merge of this (merge) patch-set.

This change uses side == -N to store comment on the Parent-N of this (merge)
patch-set. For Parent-1 the side is -1, for Parent-2 the side is -2, etc..
This avoids need for a schema migration.

In NoteDb the parent number is stored in a new field: "Parent-number: 1".

CommentInfo was extended with the new "parent" field which is 1-based
parent number.  Some REST API endpoints expose a new --parent option to
enable referencing a specific parent of a merge commit.

On the client side we typically pass around two PatchSet.Id's: base and
revision to represent the state of the UI. The base had two meanings:
* when it was non-null it was representing another patch-set
* when it was null it represented the parent for a non-merge commit and
  the auto-merge for a merge commit.

For a merge commit we need to also pass around Parent-N as (diff) base for a
merge commit. To keep the number of changes minimal this change proposes
(re)using the base patch-set for that where its patch-set number is negative.
Therefore, when base is not null but its patch-set number is negative (-N) it
represents Parent-N of the patch-set represented by the revision patch-set.
This is also expressed in the client URL token which uses negative numbers
for parent(s) of a merge commit. For example: -1..2 represents comparison
of the second patch-set against its first parent. -2..2 would represent
comparison of the patch-set 2 against its second parent.

I experimented with introducing a DiffBase class which would be a combination
of a base patch-set plus a parent number:

  class DiffBase {
    PatchSet.Id base;
    int parent;
  }

which would avoid the ugliness of using a base with negative patch-set number.
However, this produced neither a smaller nor a more elegant change. The number
of changed files actually increased and, still, all places where base is used
had to handle the case where base is null and parent is greater than zero.

Bug: Issue 106
Change-Id: If0d7b13fad9051ec2943f6d51c99e84f7d2af708
Also-by: Dariusz Luksza <dariusz@luksza.org>
Also-by: Saša Živkov <zivkov@gmail.com>
42 files changed
tree: 1298aac2b865b9f7b9435fa5aa5b9444b44ee951
  1. .settings/
  2. bucklets/
  3. contrib/
  4. Documentation/
  5. gerrit-acceptance-framework/
  6. gerrit-acceptance-tests/
  7. gerrit-antlr/
  8. gerrit-cache-h2/
  9. gerrit-common/
  10. gerrit-extension-api/
  11. gerrit-gpg/
  12. gerrit-gwtdebug/
  13. gerrit-gwtexpui/
  14. gerrit-gwtui/
  15. gerrit-gwtui-common/
  16. gerrit-httpd/
  17. gerrit-launcher/
  18. gerrit-lucene/
  19. gerrit-main/
  20. gerrit-oauth/
  21. gerrit-openid/
  22. gerrit-patch-commonsnet/
  23. gerrit-patch-jgit/
  24. gerrit-pgm/
  25. gerrit-plugin-api/
  26. gerrit-plugin-archetype/
  27. gerrit-plugin-gwt-archetype/
  28. gerrit-plugin-gwtui/
  29. gerrit-plugin-js-archetype/
  30. gerrit-prettify/
  31. gerrit-reviewdb/
  32. gerrit-server/
  33. gerrit-sshd/
  34. gerrit-util-cli/
  35. gerrit-util-http/
  36. gerrit-util-ssl/
  37. gerrit-war/
  38. lib/
  39. plugins/
  40. polygerrit-ui/
  41. ReleaseNotes/
  42. tools/
  43. website/
  44. .bazelrc
  45. .buckconfig
  46. .buckversion
  47. .editorconfig
  48. .gitignore
  49. .gitmodules
  50. .mailmap
  51. .pydevproject
  52. .watchmanconfig
  53. BUCK
  54. COPYING
  55. INSTALL
  56. README.md
  57. SUBMITTING_PATCHES
  58. VERSION
  59. WORKSPACE
README.md

Gerrit Code Review

Gerrit is a code review and project management tool for Git based projects.

Objective

Gerrit makes reviews easier by showing changes in a side-by-side display, and allowing inline comments to be added by any reviewer.

Gerrit simplifies Git based project maintainership by permitting any authorized user to submit changes to the master Git repository, rather than requiring all approved changes to be merged in by hand by the project maintainer.

Documentation

For information about how to install and use Gerrit, refer to the documentation.

Source

Our canonical Git repository is located on googlesource.com. There is a mirror of the repository on Github.

Reporting bugs

Please report bugs on the issue tracker.

Contribute

Gerrit is the work of hundreds of contributors. We appreciate your help!

Please read the contribution guidelines.

Note that we do not accept Pull Requests via the Github mirror.

Getting in contact

The IRC channel on freenode is #gerrit. An archive is available at: echelog.com.

The Developer Mailing list is repo-discuss on Google Groups.

License

Gerrit is provided under the Apache License 2.0.

Build

Install Buck and run the following:

    git clone --recursive https://gerrit.googlesource.com/gerrit
    cd gerrit && buck build release

Install binary packages (Deb/Rpm)

The instruction how to configure GerritForge/BinTray repositories is here

On Debian/Ubuntu run:

    apt-get update & apt-get install gerrit=<version>-<release>

NOTE: release is a counter that starts with 1 and indicates the number of packages that have been released with the same version of the software.

On CentOS/RedHat run:

    yum clean all && yum install gerrit-<version>[-<release>]

NOTE: release is optional. Last released package of the version is installed if the release number is omitted.