Include copied votes into change message when voting on outdated patch set

Since change I4d9b71616 votes that are applied on outdated patch sets
are copied to follow-up patch sets if possible (follow-up patch sets are
all patch sets that are newer than the outdated patch set on which the
vote was applied). When votes are copied to follow-up patch sets they
are applied in NoteDb, but users are not informed about them. This means
if a vote is applied on an outdated patch set and is then copied forward
to follow-up patch sets, including the current patch set, users can see
the copied vote on the change, but they can't find out how it appeared
there.

With this change we are now informing in the change message that is
posted when a vote is applied on an outdated patch set about the
follow-up patch sets to which the vote is copied forward. In other words
we are extending the existing change message that informs about the user
vote on the outdated patch set with information about the copied votes
on the follow-up patch sets that have been updated as result of the user
voting on the outdated patch set.

Informing the user about the follow-up patch sets that have been updated
as result of the user voting on the outdated patch set via the change
message is consistent with how we inform users about copied votes when a
new patch set is created (also in this case we post this information as
a change message).

When the user votes on an outdated patch sets there are 3 possibilities
how copied votes on follow-up patch sets are updated:

1. a copied approval is added on a follow-up patch set (no copied
   approval existing on this patch set yet)
2. an existing copied approval is updated on a follow-up patch set (e.g.
   if Code-Review-2 on PS1 was sticky and got copied to PS2, but now the
   vote on PS1 is changed to Code-Review+2 which is also sticky the
   copied vote on PS2 gets updated from Code-Review-2 to Code-Review+2)
3. an existing copied approval is removed from a follow-up patch set
   (example 1: if Code-Review-2 on PS1 was sticky and got copied to PS2,
   but now the vote on PS1 is changed to Code-Review-1 which is not
   sticky the existing copied vote on PS2 gets removed; example 2: if
   Code-Review-2 on PS1 was sticky and got copied to PS2, but now the
   vote on PS1 is removed the existing copied vote on PS2 gets removed)

Note: The approval copying that is done when a user votes on an outdated
patch set only affects copied approvals on follow-up patch sets, but
never non-copied approvals nor explicit approval deletions.

The existing change message already informs about the user action (which
vote was applied on which patch sets), e.g. "Patch Set 1:
Code-Review+2". In addition we include now information about the updates
on the follow-up patch sets.

If label votes have been copied to follow-up patch sets (case 1.) the
additional information in the change message is:

  * <label-vote> has been copied to patch sets: 3, 4 (copy condition:
    "<copy-condition>").

If existing copied votes on follow-up patch sets have been updated
(case 2.), the old copied votes are included into the message:

  * <label-vote> has been copied to patch sets:
    3 (was <old-label-vote>), 4 (was <old-label-vote>) (copy condition:
    "<copy-condition>").

If existing copied votes on follow-up patch sets have been removed
(e.g. because the new vote is not copyable) (case 3.) the message is:

  * Copied <label> vote has been removed from patch set 3 (was
    <old-label-vote>), 4 (was <old-label-vote>) (copy condition:
    "<copy-condition>").

If copied votes have been both added/updated and removed, 2 messages are
included:

  * <label-vote> has been copied to patch sets:
    3 (was <old-label-vote>), 4 (was <old-label-vote>) (copy condition:
    "<copy-condition>").
  * Copied <label> vote has been removed from patch set 5 (was
    <old-label-vote>) (copy condition: "<copy-condition>").

Passing atoms in copy conditions are not highlighted. This is because
the passing atoms can be different for different follow-up patch sets
(e.g. 'changekind:TRIVIAL_REBASE OR changekind:NO_CODE_CHANGE' can have
'changekind:TRIVIAL_REBASE' passing for one follow-up patch set and
'changekind:NO_CODE_CHANGE' passing for another follow-up patch set).
Including the copy condition once per follow-up patch set with
differently highlighted passing atoms would make the message unreadable.
Hence we don't highlight passing atoms here.

Signed-off-by: Edwin Kempin <ekempin@google.com>
Change-Id: I7ca035f668ce5dadc8403ebe9195a3aac27e354d
Bug: Google b/235818646
Release-Notes: Votes that are copied to follow-up patch sets when a vote on an outdated patch set is applied are now posted as a change message.
3 files changed
tree: eacccfaeb7a75a2059ac531cf8e92e616d5f5a1b
  1. .settings/
  2. .ts-out/
  3. antlr3/
  4. contrib/
  5. Documentation/
  6. e2e-tests/
  7. java/
  8. javatests/
  9. lib/
  10. modules/
  11. plugins/
  12. polygerrit-ui/
  13. prolog/
  14. prologtests/
  15. proto/
  16. resources/
  17. tools/
  18. webapp/
  19. .bazelignore
  20. .bazelproject
  21. .bazelrc
  22. .bazelversion
  23. .editorconfig
  24. .git-blame-ignore-revs
  25. .gitignore
  26. .gitmodules
  27. .gitreview
  28. .mailmap
  29. .pydevproject
  30. .zuul.yaml
  31. BUILD
  32. COPYING
  33. INSTALL
  34. Jenkinsfile
  35. package.json
  36. README.md
  37. SUBMITTING_PATCHES
  38. version.bzl
  39. web-dev-server.config.mjs
  40. WORKSPACE
  41. yarn.lock
README.md

Gerrit Code Review

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

Build Status Maven Central

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 Developer Mailing list is repo-discuss on Google Groups.

License

Gerrit is provided under the Apache License 2.0.

Build

Install Bazel and run the following:

    git clone --recurse-submodules https://gerrit.googlesource.com/gerrit
    cd gerrit && bazel 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>]

On Fedora run:

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

Use pre-built Gerrit images on Docker

Docker images of Gerrit are available on DockerHub

To run a CentOS 8 based Gerrit image:

    docker run -p 8080:8080 gerritcodereview/gerrit[:version]-centos8

To run a Ubuntu 20.04 based Gerrit image:

    docker run -p 8080:8080 gerritcodereview/gerrit[:version]-ubuntu20

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