Merge "Reject CREATE ReceiveCommands if the ref already exists"
diff --git a/Documentation/config-labels.txt b/Documentation/config-labels.txt
index 3a0dde8..f6d52e8 100644
--- a/Documentation/config-labels.txt
+++ b/Documentation/config-labels.txt
@@ -97,7 +97,7 @@
value = -1 Fails
value = 0 No score
value = +1 Verified
- copyAllScoresIfNoCodeChange = true
+ copyCondition = changekind:NO_CODE_CHANGE
----
The range of values is:
@@ -270,6 +270,9 @@
[[label_copyAnyScore]]
=== `label.Label-Name.copyAnyScore`
+*DEPRECATED: use `is:ANY` predicate in
+link:config-labels.html#label_copyCondition[copyCondition] instead*
+
If true, any score for the label is copied forward when a new patch
set is uploaded. Defaults to false.
@@ -328,6 +331,9 @@
[[label_copyMinScore]]
=== `label.Label-Name.copyMinScore`
+*DEPRECATED: use `is:MIN` predicate in
+link:config-labels.html#label_copyCondition[copyCondition] instead*
+
If true, the lowest possible negative value for the label is copied
forward when a new patch set is uploaded. Defaults to false, except
for All-Projects which has it true by default.
@@ -335,6 +341,9 @@
[[label_copyMaxScore]]
=== `label.Label-Name.copyMaxScore`
+*DEPRECATED: use `is:MAX` predicate in
+link:config-labels.html#label_copyCondition[copyCondition] instead*
+
If true, the highest possible positive value for the label is copied
forward when a new patch set is uploaded. This can be used to enable
sticky approvals, reducing turn-around for trivial cleanups prior to
@@ -343,6 +352,9 @@
[[label_copyAllScoresIfListOfFilesDidNotChange]]
=== `label.Label-Name.copyAllScoresIfListOfFilesDidNotChange`
+*DEPRECATED: use `is:ANY AND has:unchanged-files` predicates in
+link:config-labels.html#label_copyCondition[copyCondition] instead*
+
This policy is useful if you don't want to trigger CI or human
verification again if the list of files didn't change.
@@ -359,6 +371,9 @@
[[label_copyAllScoresOnMergeFirstParentUpdate]]
=== `label.Label-Name.copyAllScoresOnMergeFirstParentUpdate`
+*DEPRECATED: use `is:ANY AND changekind:MERGE_FIRST_PARENT_UPDATE` predicates
+in link:config-labels.html#label_copyCondition[copyCondition] instead*
+
This policy is useful if you don't want to trigger CI or human
verification again if your target branch moved on but the feature
branch being merged into the target branch did not change. It only
@@ -376,6 +391,9 @@
[[label_copyAllScoresOnTrivialRebase]]
=== `label.Label-Name.copyAllScoresOnTrivialRebase`
+*DEPRECATED: use `is:ANY AND changekind:TRIVIAL_REBASE` predicates
+in link:config-labels.html#label_copyCondition[copyCondition] instead*
+
If true, all scores for the label are copied forward when a new patch set is
uploaded that is a trivial rebase. A new patch set is considered to be trivial
rebase if the commit message is the same as in the previous patch set and if it
@@ -393,6 +411,9 @@
[[label_copyAllScoresIfNoCodeChange]]
=== `label.Label-Name.copyAllScoresIfNoCodeChange`
+*DEPRECATED: use `is:ANY AND changekind:NO_CODE_CHANGE` predicates in
+link:config-labels.html#label_copyCondition[copyCondition] instead*
+
If true, all scores for the label are copied forward when a new patch set is
uploaded that has the same parent tree as the previous patch set and the same
code diff (including context lines) as the previous patch set. This means only
@@ -407,6 +428,9 @@
[[label_copyAllScoresIfNoChange]]
=== `label.Label-Name.copyAllScoresIfNoChange`
+*DEPRECATED: use `is:ANY AND changekind:NO_CHANGE` predicates in
+link:config-labels.html#label_copyCondition[copyCondition] instead*
+
If true, all scores for the label are copied forward when a new patch
set is uploaded that has the same parent tree, code delta, and commit
message as the previous patch set. This means that only the patch
diff --git a/Documentation/dev-bazel.txt b/Documentation/dev-bazel.txt
index 9792d8e..c5c2dc0 100644
--- a/Documentation/dev-bazel.txt
+++ b/Documentation/dev-bazel.txt
@@ -18,7 +18,7 @@
To build Gerrit from source, you need:
* A Linux or macOS system (Windows is not supported at this time)
-* A JDK for Java 8|11|...
+* A JDK for Java 11|...
* Python 3
* link:https://github.com/nodesource/distributions/blob/master/README.md[Node.js (including npm),role=external,window=_blank]
* Bower (`npm install -g bower`)
@@ -48,16 +48,6 @@
`java -version`
-[[java-8]]
-==== Java 8 support (deprecated)
-
-Java 8 is a legacy Java release and support for Java 8 will be discontinued
-in future gerrit releases. To build Gerrit with Java 8 language level, run:
-
-```
- $ bazel build --java_toolchain //tools:error_prone_warnings_toolchain :release
-```
-
[[java-11]]
==== Java 11 support
@@ -369,6 +359,7 @@
* git-protocol-v2
* git-upload-archive
* notedb
+* no_rbe
* pgm
* rest
* server
diff --git a/Documentation/dev-eclipse.txt b/Documentation/dev-eclipse.txt
index e18d7b0..dce5eb0 100644
--- a/Documentation/dev-eclipse.txt
+++ b/Documentation/dev-eclipse.txt
@@ -31,9 +31,6 @@
----
First, generate the Eclipse project by running the `tools/eclipse/project.py` script.
-If running Eclipse on Java 8, add the extra parameter
-`-e='--java_toolchain=//tools:error_prone_warnings_toolchain'`
-for generating a compatible project.
Then, in Eclipse, choose 'Import existing project' and select the `gerrit` project
from the current working directory.
diff --git a/Documentation/rest-api-projects.txt b/Documentation/rest-api-projects.txt
index e52a87d..0b01660 100644
--- a/Documentation/rest-api-projects.txt
+++ b/Documentation/rest-api-projects.txt
@@ -4008,30 +4008,32 @@
Whether this label can be link:config-labels.html#label_canOverride[overridden]
by child projects.
|`copy_any_score`|`false` if not set|
-Whether link:config-labels.html#label_copyAnyScore[copyAnyScore] is set on the
-label.
+*DEPRECATED* Whether link:config-labels.html#label_copyAnyScore[copyAnyScore]
+is set on the label.
|`copy_condition`|optional|
See link:config-labels.html#label_copyCondition[copyCondition].
|`copy_min_score`|`false` if not set|
-Whether link:config-labels.html#label_copyMinScore[copyMinScore] is set on the
-label.
+*DEPRECATED* Whether link:config-labels.html#label_copyMinScore[copyMinScore]
+is set on the label.
|`copy_max_score`|`false` if not set|
-Whether link:config-labels.html#label_copyMaxScore[copyMaxScore] is set on the
-label.
+*DEPRECATED* Whether link:config-labels.html#label_copyMaxScore[copyMaxScore]
+is set on the label.
|`copy_all_scores_if_no_change`|`false` if not set|
-Whether link:config-labels.html#label_copyAllScoresIfNoChange[
+*DEPRECATED* Whether link:config-labels.html#label_copyAllScoresIfNoChange[
copyAllScoresIfNoChange] is set on the label.
|`copy_all_scores_if_no_code_change`|`false` if not set|
-Whether link:config-labels.html#label_copyAllScoresIfNoCodeChange[
+*DEPRECATED* Whether link:config-labels.html#label_copyAllScoresIfNoCodeChange[
copyAllScoresIfNoCodeChange] is set on the label.
|`copy_all_scores_on_trivial_rebase`|`false` if not set|
-Whether link:config-labels.html#label_copyAllScoresOnTrivialRebase[
+*DEPRECATED* Whether link:config-labels.html#label_copyAllScoresOnTrivialRebase[
copyAllScoresOnTrivialRebase] is set on the label.
|`copy_all_scores_if_list_of_files_did_not_change`|`false` if not set|
-Whether link:config-labels.html#label_copyAllScoresIfListOfFilesDidNotChange[
+*DEPRECATED* Whether
+link:config-labels.html#label_copyAllScoresIfListOfFilesDidNotChange[
copyAllScoresIfListOfFilesDidNotChange] is set on the label.
|`copy_all_scores_on_merge_first_parent_update`|`false` if not set|
-Whether link:config-labels.html#label_copyAllScoresOnMergeFirstParentUpdate[
+*DEPRECATED* Whether
+link:config-labels.html#label_copyAllScoresOnMergeFirstParentUpdate[
copyAllScoresOnMergeFirstParentUpdate] is set on the label.
|`copy_values` |optional|
List of values that should be copied forward when a new patch set is uploaded.
diff --git a/Documentation/user-search.txt b/Documentation/user-search.txt
index 694e5d8..a24d80d 100644
--- a/Documentation/user-search.txt
+++ b/Documentation/user-search.txt
@@ -264,6 +264,11 @@
often combined with 'branch:' and 'project:' operators to select
all related changes in a series.
+[[prefixtopic]]
+prefixtopic:'TOPIC'::
++
+Changes whose designated topic start with 'TOPIC'.
+
[[inhashtag]]
inhashtag:'HASHTAG'::
+
@@ -280,6 +285,12 @@
Changes whose link:intro-user.html#hashtags[hashtag] matches 'HASHTAG'.
The match is case-insensitive.
+[[prefixhashtag]]
+prefixhashtag:'HASHTAG'::
++
+Changes whose link:intro-user.html#hashtags[hashtag] start with 'HASHTAG'.
+The match is case-insensitive.
+
[[cherrypickof]]
cherrypickof:'CHANGE[,PATCHSET]'::
+
diff --git a/java/com/google/gerrit/acceptance/AbstractDaemonTest.java b/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
index b5835c9..eb77677 100644
--- a/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
+++ b/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
@@ -1646,6 +1646,13 @@
}
}
+ protected void clearSubmitRequirements(Project.NameKey project) throws Exception {
+ try (ProjectConfigUpdate u = updateProject(project)) {
+ u.getConfig().clearSubmitRequirements();
+ u.save();
+ }
+ }
+
protected void configLabel(String label, LabelFunction func) throws Exception {
configLabel(label, func, ImmutableList.of());
}
diff --git a/java/com/google/gerrit/acceptance/AcceptanceTestRequestScope.java b/java/com/google/gerrit/acceptance/AcceptanceTestRequestScope.java
index 50536d8..c4bf20c 100644
--- a/java/com/google/gerrit/acceptance/AcceptanceTestRequestScope.java
+++ b/java/com/google/gerrit/acceptance/AcceptanceTestRequestScope.java
@@ -162,7 +162,7 @@
new Scope() {
@Override
public <T> Provider<T> scope(Key<T> key, Provider<T> creator) {
- return new Provider<T>() {
+ return new Provider<>() {
@Override
public T get() {
return requireContext().get(key, creator);
diff --git a/java/com/google/gerrit/acceptance/InProcessProtocol.java b/java/com/google/gerrit/acceptance/InProcessProtocol.java
index 83c63f9..15be85c 100644
--- a/java/com/google/gerrit/acceptance/InProcessProtocol.java
+++ b/java/com/google/gerrit/acceptance/InProcessProtocol.java
@@ -100,7 +100,7 @@
new Scope() {
@Override
public <T> Provider<T> scope(Key<T> key, Provider<T> creator) {
- return new Provider<T>() {
+ return new Provider<>() {
@Override
public T get() {
Context ctx = current.get();
diff --git a/java/com/google/gerrit/acceptance/rest/PluginResource.java b/java/com/google/gerrit/acceptance/rest/PluginResource.java
index 745d4fa..56710b9 100644
--- a/java/com/google/gerrit/acceptance/rest/PluginResource.java
+++ b/java/com/google/gerrit/acceptance/rest/PluginResource.java
@@ -20,6 +20,5 @@
public class PluginResource extends ConfigResource {
- static final TypeLiteral<RestView<PluginResource>> PLUGIN_KIND =
- new TypeLiteral<RestView<PluginResource>>() {};
+ static final TypeLiteral<RestView<PluginResource>> PLUGIN_KIND = new TypeLiteral<>() {};
}
diff --git a/java/com/google/gerrit/acceptance/testsuite/change/ChangeOperationsImpl.java b/java/com/google/gerrit/acceptance/testsuite/change/ChangeOperationsImpl.java
index 3b15b57..580f10f 100644
--- a/java/com/google/gerrit/acceptance/testsuite/change/ChangeOperationsImpl.java
+++ b/java/com/google/gerrit/acceptance/testsuite/change/ChangeOperationsImpl.java
@@ -48,8 +48,8 @@
import com.google.inject.Inject;
import java.io.IOException;
import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Arrays;
-import java.util.Date;
import java.util.Objects;
import java.util.Optional;
import org.eclipse.jgit.errors.ConfigInvalidException;
@@ -138,7 +138,7 @@
try (Repository repository = repositoryManager.openRepository(project);
ObjectInserter objectInserter = repository.newObjectInserter();
RevWalk revWalk = new RevWalk(objectInserter.newReader())) {
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
IdentifiedUser changeOwner = getChangeOwner(changeCreation);
PersonIdent authorAndCommitter =
changeOwner.newCommitterIdent(now, serverIdent.getTimeZone());
@@ -431,7 +431,7 @@
try (Repository repository = repositoryManager.openRepository(project);
ObjectInserter objectInserter = repository.newObjectInserter();
RevWalk revWalk = new RevWalk(objectInserter.newReader())) {
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
ObjectId newPatchsetCommit =
createPatchsetCommit(
repository, revWalk, objectInserter, changeNotes, patchsetCreation, now);
@@ -457,7 +457,7 @@
ObjectInserter objectInserter,
ChangeNotes changeNotes,
TestPatchsetCreation patchsetCreation,
- Timestamp now)
+ Instant now)
throws IOException, BadRequestException {
ObjectId oldPatchsetCommitId = changeNotes.getCurrentPatchSet().commitId();
RevCommit oldPatchsetCommit = repository.parseCommit(oldPatchsetCommitId);
@@ -494,10 +494,13 @@
return Optional.ofNullable(oldPatchsetCommit.getAuthorIdent()).orElse(serverIdent);
}
- private PersonIdent getCommitter(RevCommit oldPatchsetCommit, Timestamp now) {
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
+ private PersonIdent getCommitter(RevCommit oldPatchsetCommit, Instant now) {
PersonIdent oldPatchsetCommitter =
Optional.ofNullable(oldPatchsetCommit.getCommitterIdent()).orElse(serverIdent);
- if (asSeconds(now) == asSeconds(oldPatchsetCommitter.getWhen())) {
+ if (asSeconds(now) == asSeconds(oldPatchsetCommitter.getWhen().toInstant())) {
/* We need to ensure that the resulting commit SHA-1 is different from the old patchset.
* In real situations, this automatically happens as two patchsets won't have exactly the
* same commit timestamp even when the tree and commit message are the same. In tests,
@@ -505,13 +508,13 @@
* We could of course require that tests must use TestTimeUtil#setClockStep but
* that would be an unnecessary nuisance for test writers. Hence, go with a simple solution
* here and simply add a second. */
- now = Timestamp.from(now.toInstant().plusSeconds(1));
+ now = now.plusSeconds(1);
}
- return new PersonIdent(oldPatchsetCommitter, now);
+ return new PersonIdent(oldPatchsetCommitter, Timestamp.from(now));
}
- private long asSeconds(Date date) {
- return date.getTime() / 1000;
+ private long asSeconds(Instant date) {
+ return date.getEpochSecond();
}
private ImmutableList<ObjectId> getParents(
diff --git a/java/com/google/gerrit/acceptance/testsuite/change/PerPatchsetOperationsImpl.java b/java/com/google/gerrit/acceptance/testsuite/change/PerPatchsetOperationsImpl.java
index eda6c7e..9b393ef 100644
--- a/java/com/google/gerrit/acceptance/testsuite/change/PerPatchsetOperationsImpl.java
+++ b/java/com/google/gerrit/acceptance/testsuite/change/PerPatchsetOperationsImpl.java
@@ -38,7 +38,7 @@
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import org.eclipse.jgit.lib.ObjectInserter;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevWalk;
@@ -106,7 +106,7 @@
try (Repository repository = repositoryManager.openRepository(project);
ObjectInserter objectInserter = repository.newObjectInserter();
RevWalk revWalk = new RevWalk(objectInserter.newReader())) {
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
IdentifiedUser author = getAuthor(commentCreation);
CommentAdditionOp commentAdditionOp = new CommentAdditionOp(commentCreation);
@@ -165,8 +165,7 @@
short side = commentCreation.side().orElse(CommentSide.PATCHSET_COMMIT).getNumericSide();
Boolean unresolved = commentCreation.unresolved().orElse(null);
String parentUuid = commentCreation.parentUuid().orElse(null);
- Timestamp createdOn =
- commentCreation.createdOn().map(Timestamp::from).orElse(context.getWhen());
+ Instant createdOn = commentCreation.createdOn().orElse(context.getWhen());
HumanComment newComment =
commentsUtil.newHumanComment(
context.getNotes(),
@@ -202,7 +201,7 @@
try (Repository repository = repositoryManager.openRepository(project);
ObjectInserter objectInserter = repository.newObjectInserter();
RevWalk revWalk = new RevWalk(objectInserter.newReader())) {
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
IdentifiedUser author = getAuthor(robotCommentCreation);
RobotCommentAdditionOp robotCommentAdditionOp =
diff --git a/java/com/google/gerrit/acceptance/testsuite/group/TestGroup.java b/java/com/google/gerrit/acceptance/testsuite/group/TestGroup.java
index c885353..0b21e2c 100644
--- a/java/com/google/gerrit/acceptance/testsuite/group/TestGroup.java
+++ b/java/com/google/gerrit/acceptance/testsuite/group/TestGroup.java
@@ -18,7 +18,7 @@
import com.google.common.collect.ImmutableSet;
import com.google.gerrit.entities.Account;
import com.google.gerrit.entities.AccountGroup;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Optional;
@AutoValue
@@ -40,7 +40,7 @@
public abstract boolean visibleToAll();
- public abstract Timestamp createdOn();
+ public abstract Instant createdOn();
public abstract ImmutableSet<Account.Id> members();
@@ -67,7 +67,7 @@
public abstract Builder visibleToAll(boolean visibleToAll);
- public abstract Builder createdOn(Timestamp createdOn);
+ public abstract Builder createdOn(Instant createdOn);
public abstract Builder members(ImmutableSet<Account.Id> members);
diff --git a/java/com/google/gerrit/entities/Account.java b/java/com/google/gerrit/entities/Account.java
index 18fcef3..303e79f 100644
--- a/java/com/google/gerrit/entities/Account.java
+++ b/java/com/google/gerrit/entities/Account.java
@@ -22,7 +22,7 @@
import com.google.common.primitives.Ints;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.extensions.client.DiffPreferencesInfo;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Optional;
/**
@@ -123,7 +123,7 @@
public abstract Id id();
/** Date and time the user registered with the review server. */
- public abstract Timestamp registeredOn();
+ public abstract Instant registeredOn();
/** Full name of the user ("Given-name Surname" style). */
@Nullable
@@ -157,7 +157,7 @@
* @param newId unique id, see {@link com.google.gerrit.server.notedb.Sequences#nextAccountId()}.
* @param registeredOn when the account was registered.
*/
- public static Account.Builder builder(Account.Id newId, Timestamp registeredOn) {
+ public static Account.Builder builder(Account.Id newId, Instant registeredOn) {
return new AutoValue_Account.Builder()
.setInactive(false)
.setId(newId)
@@ -230,9 +230,9 @@
abstract Builder setId(Id id);
- public abstract Timestamp registeredOn();
+ public abstract Instant registeredOn();
- abstract Builder setRegisteredOn(Timestamp registeredOn);
+ abstract Builder setRegisteredOn(Instant registeredOn);
@Nullable
public abstract String fullName();
diff --git a/java/com/google/gerrit/entities/AccountGroupByIdAudit.java b/java/com/google/gerrit/entities/AccountGroupByIdAudit.java
index 17ddf51..0ef51e5 100644
--- a/java/com/google/gerrit/entities/AccountGroupByIdAudit.java
+++ b/java/com/google/gerrit/entities/AccountGroupByIdAudit.java
@@ -15,7 +15,7 @@
package com.google.gerrit.entities;
import com.google.auto.value.AutoValue;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Optional;
/** Inclusion of an {@link AccountGroup} in another {@link AccountGroup}. */
@@ -33,13 +33,13 @@
public abstract Builder addedBy(Account.Id addedBy);
- public abstract Builder addedOn(Timestamp addedOn);
+ public abstract Builder addedOn(Instant addedOn);
abstract Builder removedBy(Account.Id removedBy);
- abstract Builder removedOn(Timestamp removedOn);
+ abstract Builder removedOn(Instant removedOn);
- public Builder removed(Account.Id removedBy, Timestamp removedOn) {
+ public Builder removed(Account.Id removedBy, Instant removedOn) {
return removedBy(removedBy).removedOn(removedOn);
}
@@ -52,11 +52,11 @@
public abstract Account.Id addedBy();
- public abstract Timestamp addedOn();
+ public abstract Instant addedOn();
public abstract Optional<Account.Id> removedBy();
- public abstract Optional<Timestamp> removedOn();
+ public abstract Optional<Instant> removedOn();
public abstract Builder toBuilder();
diff --git a/java/com/google/gerrit/entities/AccountGroupMemberAudit.java b/java/com/google/gerrit/entities/AccountGroupMemberAudit.java
index 4d191b8..913956e 100644
--- a/java/com/google/gerrit/entities/AccountGroupMemberAudit.java
+++ b/java/com/google/gerrit/entities/AccountGroupMemberAudit.java
@@ -15,7 +15,7 @@
package com.google.gerrit.entities;
import com.google.auto.value.AutoValue;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Optional;
/** Membership of an {@link Account} in an {@link AccountGroup}. */
@@ -35,15 +35,15 @@
abstract Account.Id addedBy();
- public abstract Builder addedOn(Timestamp addedOn);
+ public abstract Builder addedOn(Instant addedOn);
- abstract Timestamp addedOn();
+ abstract Instant addedOn();
abstract Builder removedBy(Account.Id removedBy);
- abstract Builder removedOn(Timestamp removedOn);
+ abstract Builder removedOn(Instant removedOn);
- public Builder removed(Account.Id removedBy, Timestamp removedOn) {
+ public Builder removed(Account.Id removedBy, Instant removedOn) {
return removedBy(removedBy).removedOn(removedOn);
}
@@ -60,11 +60,11 @@
public abstract Account.Id addedBy();
- public abstract Timestamp addedOn();
+ public abstract Instant addedOn();
public abstract Optional<Account.Id> removedBy();
- public abstract Optional<Timestamp> removedOn();
+ public abstract Optional<Instant> removedOn();
public abstract Builder toBuilder();
diff --git a/java/com/google/gerrit/entities/Change.java b/java/com/google/gerrit/entities/Change.java
index 71684d3..7ca235d 100644
--- a/java/com/google/gerrit/entities/Change.java
+++ b/java/com/google/gerrit/entities/Change.java
@@ -24,7 +24,7 @@
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.annotations.SerializedName;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Arrays;
import java.util.Optional;
@@ -444,14 +444,14 @@
private Key changeKey;
/** When this change was first introduced into the database. */
- private Timestamp createdOn;
+ private Instant createdOn;
/**
* When was a meaningful modification last made to this record's data
*
* <p>Note, this update timestamp includes its children.
*/
- private Timestamp lastUpdatedOn;
+ private Instant lastUpdatedOn;
private Account.Id owner;
@@ -505,11 +505,7 @@
Change() {}
public Change(
- Change.Key newKey,
- Change.Id newId,
- Account.Id ownedBy,
- BranchNameKey forBranch,
- Timestamp ts) {
+ Change.Key newKey, Change.Id newId, Account.Id ownedBy, BranchNameKey forBranch, Instant ts) {
changeKey = newKey;
changeId = newId;
createdOn = ts;
@@ -567,19 +563,19 @@
assignee = a;
}
- public Timestamp getCreatedOn() {
+ public Instant getCreatedOn() {
return createdOn;
}
- public void setCreatedOn(Timestamp ts) {
+ public void setCreatedOn(Instant ts) {
createdOn = ts;
}
- public Timestamp getLastUpdatedOn() {
+ public Instant getLastUpdatedOn() {
return lastUpdatedOn;
}
- public void setLastUpdatedOn(Timestamp now) {
+ public void setLastUpdatedOn(Instant now) {
lastUpdatedOn = now;
}
diff --git a/java/com/google/gerrit/entities/ChangeMessage.java b/java/com/google/gerrit/entities/ChangeMessage.java
index cab3290..609b54c 100644
--- a/java/com/google/gerrit/entities/ChangeMessage.java
+++ b/java/com/google/gerrit/entities/ChangeMessage.java
@@ -16,7 +16,7 @@
import com.google.auto.value.AutoValue;
import com.google.gerrit.common.Nullable;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Objects;
/**
@@ -46,7 +46,7 @@
@Nullable private Account.Id author;
/** When this comment was drafted. */
- private Timestamp writtenOn;
+ private Instant writtenOn;
/**
* The text left by the user or Gerrit system in template form, that is free of Gerrit User
@@ -66,14 +66,14 @@
private ChangeMessage() {}
public static ChangeMessage create(
- final ChangeMessage.Key k, @Nullable Account.Id a, Timestamp wo, @Nullable PatchSet.Id psid) {
+ final ChangeMessage.Key k, @Nullable Account.Id a, Instant wo, @Nullable PatchSet.Id psid) {
return create(k, a, wo, psid, /*messageTemplate=*/ null, /*realAuthor=*/ null, /*tag=*/ null);
}
public static ChangeMessage create(
final ChangeMessage.Key k,
@Nullable Account.Id a,
- Timestamp wo,
+ Instant wo,
@Nullable PatchSet.Id psid,
@Nullable String messageTemplate,
@Nullable Account.Id realAuthor,
@@ -103,7 +103,7 @@
return realAuthor != null ? realAuthor : getAuthor();
}
- public Timestamp getWrittenOn() {
+ public Instant getWrittenOn() {
return writtenOn;
}
diff --git a/java/com/google/gerrit/entities/Comment.java b/java/com/google/gerrit/entities/Comment.java
index 92bcaf6..65a1559 100644
--- a/java/com/google/gerrit/entities/Comment.java
+++ b/java/com/google/gerrit/entities/Comment.java
@@ -18,6 +18,7 @@
import com.google.common.base.MoreObjects.ToStringHelper;
import com.google.gerrit.common.Nullable;
import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Comparator;
import java.util.Objects;
import org.eclipse.jgit.lib.AnyObjectId;
@@ -215,7 +216,10 @@
public Identity author;
protected Identity realAuthor;
+
+ // TODO(issue-15525): Migrate this field from Timestamp to Instant
public Timestamp writtenOn;
+
public short side;
public String message;
public String parentUuid;
@@ -233,13 +237,7 @@
public String serverId;
public Comment(Comment c) {
- this(
- new Key(c.key),
- c.author.getId(),
- new Timestamp(c.writtenOn.getTime()),
- c.side,
- c.message,
- c.serverId);
+ this(new Key(c.key), c.author.getId(), c.writtenOn.toInstant(), c.side, c.message, c.serverId);
this.lineNbr = c.lineNbr;
this.realAuthor = c.realAuthor;
this.parentUuid = c.parentUuid;
@@ -249,21 +247,20 @@
}
public Comment(
- Key key,
- Account.Id author,
- Timestamp writtenOn,
- short side,
- String message,
- String serverId) {
+ Key key, Account.Id author, Instant writtenOn, short side, String message, String serverId) {
this.key = key;
this.author = new Comment.Identity(author);
this.realAuthor = this.author;
- this.writtenOn = writtenOn;
+ this.writtenOn = Timestamp.from(writtenOn);
this.side = side;
this.message = message;
this.serverId = serverId;
}
+ public void setWrittenOn(Instant writtenOn) {
+ this.writtenOn = Timestamp.from(writtenOn);
+ }
+
public void setLineNbrAndRange(
Integer lineNbr, com.google.gerrit.extensions.client.Comment.Range range) {
this.lineNbr = lineNbr != null ? lineNbr : range != null ? range.endLine : 0;
diff --git a/java/com/google/gerrit/entities/EmailHeader.java b/java/com/google/gerrit/entities/EmailHeader.java
index d2be65e..e43b6a3 100644
--- a/java/com/google/gerrit/entities/EmailHeader.java
+++ b/java/com/google/gerrit/entities/EmailHeader.java
@@ -19,7 +19,9 @@
import com.google.common.base.MoreObjects;
import java.io.IOException;
import java.io.Writer;
-import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -127,13 +129,13 @@
}
public static class Date extends EmailHeader {
- private final java.util.Date value;
+ private final Instant value;
- public Date(java.util.Date v) {
+ public Date(Instant v) {
value = v;
}
- public java.util.Date getDate() {
+ public Instant getDate() {
return value;
}
@@ -144,10 +146,12 @@
@Override
public void write(Writer w) throws IOException {
- final SimpleDateFormat fmt;
- // Mon, 1 Jun 2009 10:49:44 -0700
- fmt = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.US);
- w.write(fmt.format(value));
+ // Mon, 1 Jun 2009 10:49:44 +0000
+ w.write(
+ DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z")
+ .withLocale(Locale.US)
+ .withZone(ZoneId.of("UTC"))
+ .format(value));
}
@Override
@@ -157,7 +161,7 @@
@Override
public boolean equals(Object o) {
- return (o instanceof Date) && value.getTime() == ((Date) o).value.getTime();
+ return (o instanceof Date) && Objects.equals(value, ((Date) o).value);
}
@Override
diff --git a/java/com/google/gerrit/entities/GroupDescription.java b/java/com/google/gerrit/entities/GroupDescription.java
index 7054bed..666e8f6 100644
--- a/java/com/google/gerrit/entities/GroupDescription.java
+++ b/java/com/google/gerrit/entities/GroupDescription.java
@@ -15,7 +15,7 @@
package com.google.gerrit.entities;
import com.google.gerrit.common.Nullable;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Set;
/** Group methods exposed by the GroupBackend. */
@@ -55,7 +55,7 @@
boolean isVisibleToAll();
- Timestamp getCreatedOn();
+ Instant getCreatedOn();
Set<Account.Id> getMembers();
diff --git a/java/com/google/gerrit/entities/HumanComment.java b/java/com/google/gerrit/entities/HumanComment.java
index 50bee8d..d287fa0 100644
--- a/java/com/google/gerrit/entities/HumanComment.java
+++ b/java/com/google/gerrit/entities/HumanComment.java
@@ -14,7 +14,7 @@
package com.google.gerrit.entities;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Objects;
/**
@@ -33,7 +33,7 @@
public HumanComment(
Key key,
Account.Id author,
- Timestamp writtenOn,
+ Instant writtenOn,
short side,
String message,
String serverId,
diff --git a/java/com/google/gerrit/entities/InternalGroup.java b/java/com/google/gerrit/entities/InternalGroup.java
index ebfa36a..43c3af3 100644
--- a/java/com/google/gerrit/entities/InternalGroup.java
+++ b/java/com/google/gerrit/entities/InternalGroup.java
@@ -18,7 +18,7 @@
import com.google.common.collect.ImmutableSet;
import com.google.gerrit.common.Nullable;
import java.io.Serializable;
-import java.sql.Timestamp;
+import java.time.Instant;
import org.eclipse.jgit.lib.ObjectId;
@AutoValue
@@ -42,7 +42,7 @@
public abstract AccountGroup.UUID getGroupUUID();
- public abstract Timestamp getCreatedOn();
+ public abstract Instant getCreatedOn();
public abstract ImmutableSet<Account.Id> getMembers();
@@ -71,7 +71,7 @@
public abstract Builder setGroupUUID(AccountGroup.UUID groupUuid);
- public abstract Builder setCreatedOn(Timestamp createdOn);
+ public abstract Builder setCreatedOn(Instant createdOn);
public abstract Builder setMembers(ImmutableSet<Account.Id> members);
diff --git a/java/com/google/gerrit/entities/LabelTypes.java b/java/com/google/gerrit/entities/LabelTypes.java
index 55a9976..a2f2e0b 100644
--- a/java/com/google/gerrit/entities/LabelTypes.java
+++ b/java/com/google/gerrit/entities/LabelTypes.java
@@ -69,7 +69,7 @@
public Comparator<String> nameComparator() {
final Map<String, Integer> positions = positions();
- return new Comparator<String>() {
+ return new Comparator<>() {
@Override
public int compare(String left, String right) {
int lp = position(left);
diff --git a/java/com/google/gerrit/entities/PatchSet.java b/java/com/google/gerrit/entities/PatchSet.java
index acbf697d..6c52368 100644
--- a/java/com/google/gerrit/entities/PatchSet.java
+++ b/java/com/google/gerrit/entities/PatchSet.java
@@ -23,7 +23,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.primitives.Ints;
import com.google.errorprone.annotations.InlineMe;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.List;
import java.util.Optional;
import org.eclipse.jgit.lib.ObjectId;
@@ -163,7 +163,7 @@
public abstract Builder uploader(Account.Id uploader);
- public abstract Builder createdOn(Timestamp createdOn);
+ public abstract Builder createdOn(Instant createdOn);
public abstract Builder groups(Iterable<String> groups);
@@ -210,7 +210,7 @@
* Gerrit, and the old data erroneously did not include a {@code createdOn}, then this method will
* return a timestamp of 0.
*/
- public abstract Timestamp createdOn();
+ public abstract Instant createdOn();
/**
* Opaque group identifier, usually assigned during creation.
diff --git a/java/com/google/gerrit/entities/PatchSetApproval.java b/java/com/google/gerrit/entities/PatchSetApproval.java
index 607f5c8..608cf0d 100644
--- a/java/com/google/gerrit/entities/PatchSetApproval.java
+++ b/java/com/google/gerrit/entities/PatchSetApproval.java
@@ -16,8 +16,7 @@
import com.google.auto.value.AutoValue;
import com.google.common.primitives.Shorts;
-import java.sql.Timestamp;
-import java.util.Date;
+import java.time.Instant;
import java.util.Optional;
/** An approval (or negative approval) on a patch set. */
@@ -97,11 +96,7 @@
return value(Shorts.checkedCast(value));
}
- public abstract Builder granted(Timestamp granted);
-
- public Builder granted(Date granted) {
- return granted(new Timestamp(granted.getTime()));
- }
+ public abstract Builder granted(Instant granted);
public abstract Builder tag(String tag);
@@ -147,7 +142,7 @@
*/
public abstract short value();
- public abstract Timestamp granted();
+ public abstract Instant granted();
public abstract Optional<String> tag();
diff --git a/java/com/google/gerrit/entities/RobotComment.java b/java/com/google/gerrit/entities/RobotComment.java
index e2e4114..1d46d3b 100644
--- a/java/com/google/gerrit/entities/RobotComment.java
+++ b/java/com/google/gerrit/entities/RobotComment.java
@@ -14,7 +14,7 @@
package com.google.gerrit.entities;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -29,7 +29,7 @@
public RobotComment(
Key key,
Account.Id author,
- Timestamp writtenOn,
+ Instant writtenOn,
short side,
String message,
String serverId,
diff --git a/java/com/google/gerrit/entities/UserIdentity.java b/java/com/google/gerrit/entities/UserIdentity.java
index ca092c1..8334157 100644
--- a/java/com/google/gerrit/entities/UserIdentity.java
+++ b/java/com/google/gerrit/entities/UserIdentity.java
@@ -14,7 +14,7 @@
package com.google.gerrit.entities;
-import java.sql.Timestamp;
+import java.time.Instant;
public final class UserIdentity {
/** Full name of the user. */
@@ -27,7 +27,7 @@
private String username;
/** Time (in UTC) when the identity was constructed. */
- private Timestamp when;
+ private Instant when;
/** Offset from UTC */
private int tz;
@@ -55,11 +55,11 @@
return username;
}
- public Timestamp getDate() {
+ public Instant getDate() {
return when;
}
- public void setDate(Timestamp d) {
+ public void setDate(Instant d) {
when = d;
}
diff --git a/java/com/google/gerrit/entities/converter/ChangeMessageProtoConverter.java b/java/com/google/gerrit/entities/converter/ChangeMessageProtoConverter.java
index eb2a381..edf921e 100644
--- a/java/com/google/gerrit/entities/converter/ChangeMessageProtoConverter.java
+++ b/java/com/google/gerrit/entities/converter/ChangeMessageProtoConverter.java
@@ -20,7 +20,7 @@
import com.google.gerrit.entities.PatchSet;
import com.google.gerrit.proto.Entities;
import com.google.protobuf.Parser;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Objects;
@Immutable
@@ -44,9 +44,9 @@
if (author != null) {
builder.setAuthorId(accountIdConverter.toProto(author));
}
- Timestamp writtenOn = changeMessage.getWrittenOn();
+ Instant writtenOn = changeMessage.getWrittenOn();
if (writtenOn != null) {
- builder.setWrittenOn(writtenOn.getTime());
+ builder.setWrittenOn(writtenOn.toEpochMilli());
}
// Build proto with template representation of the message. Templates are parsed when message is
// extracted from cache.
@@ -78,7 +78,7 @@
proto.hasKey() ? changeMessageKeyConverter.fromProto(proto.getKey()) : null;
Account.Id author =
proto.hasAuthorId() ? accountIdConverter.fromProto(proto.getAuthorId()) : null;
- Timestamp writtenOn = proto.hasWrittenOn() ? new Timestamp(proto.getWrittenOn()) : null;
+ Instant writtenOn = proto.hasWrittenOn() ? Instant.ofEpochMilli(proto.getWrittenOn()) : null;
PatchSet.Id patchSetId =
proto.hasPatchset() ? patchSetIdConverter.fromProto(proto.getPatchset()) : null;
// Only template representation of the message is stored in entity. Templates should be replaced
diff --git a/java/com/google/gerrit/entities/converter/ChangeProtoConverter.java b/java/com/google/gerrit/entities/converter/ChangeProtoConverter.java
index 689b4aa..4903364 100644
--- a/java/com/google/gerrit/entities/converter/ChangeProtoConverter.java
+++ b/java/com/google/gerrit/entities/converter/ChangeProtoConverter.java
@@ -21,7 +21,7 @@
import com.google.gerrit.entities.PatchSet;
import com.google.gerrit.proto.Entities;
import com.google.protobuf.Parser;
-import java.sql.Timestamp;
+import java.time.Instant;
@Immutable
public enum ChangeProtoConverter implements ProtoConverter<Entities.Change, Change> {
@@ -44,8 +44,8 @@
Entities.Change.newBuilder()
.setChangeId(changeIdConverter.toProto(change.getId()))
.setChangeKey(changeKeyConverter.toProto(change.getKey()))
- .setCreatedOn(change.getCreatedOn().getTime())
- .setLastUpdatedOn(change.getLastUpdatedOn().getTime())
+ .setCreatedOn(change.getCreatedOn().toEpochMilli())
+ .setLastUpdatedOn(change.getLastUpdatedOn().toEpochMilli())
.setOwnerAccountId(accountIdConverter.toProto(change.getOwner()))
.setDest(branchNameConverter.toProto(change.getDest()))
.setStatus(change.getStatus().getCode())
@@ -96,9 +96,9 @@
BranchNameKey destination =
proto.hasDest() ? branchNameConverter.fromProto(proto.getDest()) : null;
Change change =
- new Change(key, changeId, owner, destination, new Timestamp(proto.getCreatedOn()));
+ new Change(key, changeId, owner, destination, Instant.ofEpochMilli(proto.getCreatedOn()));
if (proto.hasLastUpdatedOn()) {
- change.setLastUpdatedOn(new Timestamp(proto.getLastUpdatedOn()));
+ change.setLastUpdatedOn(Instant.ofEpochMilli(proto.getLastUpdatedOn()));
}
Change.Status status = Change.Status.forCode((char) proto.getStatus());
if (status != null) {
diff --git a/java/com/google/gerrit/entities/converter/PatchSetApprovalProtoConverter.java b/java/com/google/gerrit/entities/converter/PatchSetApprovalProtoConverter.java
index 134e25f..e8ef346 100644
--- a/java/com/google/gerrit/entities/converter/PatchSetApprovalProtoConverter.java
+++ b/java/com/google/gerrit/entities/converter/PatchSetApprovalProtoConverter.java
@@ -19,7 +19,7 @@
import com.google.gerrit.entities.PatchSetApproval;
import com.google.gerrit.proto.Entities;
import com.google.protobuf.Parser;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Objects;
@Immutable
@@ -38,7 +38,7 @@
Entities.PatchSetApproval.newBuilder()
.setKey(patchSetApprovalKeyProtoConverter.toProto(patchSetApproval.key()))
.setValue(patchSetApproval.value())
- .setGranted(patchSetApproval.granted().getTime())
+ .setGranted(patchSetApproval.granted().toEpochMilli())
.setPostSubmit(patchSetApproval.postSubmit())
.setCopied(patchSetApproval.copied());
@@ -62,7 +62,7 @@
PatchSetApproval.builder()
.key(patchSetApprovalKeyProtoConverter.fromProto(proto.getKey()))
.value(proto.getValue())
- .granted(new Timestamp(proto.getGranted()))
+ .granted(Instant.ofEpochMilli(proto.getGranted()))
.postSubmit(proto.getPostSubmit())
.copied(proto.getCopied());
if (proto.hasUuid()) {
diff --git a/java/com/google/gerrit/entities/converter/PatchSetProtoConverter.java b/java/com/google/gerrit/entities/converter/PatchSetProtoConverter.java
index 13a6e71..210972d 100644
--- a/java/com/google/gerrit/entities/converter/PatchSetProtoConverter.java
+++ b/java/com/google/gerrit/entities/converter/PatchSetProtoConverter.java
@@ -20,7 +20,7 @@
import com.google.gerrit.entities.PatchSet;
import com.google.gerrit.proto.Entities;
import com.google.protobuf.Parser;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.List;
import org.eclipse.jgit.lib.ObjectId;
@@ -42,7 +42,7 @@
.setId(patchSetIdConverter.toProto(patchSet.id()))
.setCommitId(objectIdConverter.toProto(patchSet.commitId()))
.setUploaderAccountId(accountIdConverter.toProto(patchSet.uploader()))
- .setCreatedOn(patchSet.createdOn().getTime());
+ .setCreatedOn(patchSet.createdOn().toEpochMilli());
List<String> groups = patchSet.groups();
if (!groups.isEmpty()) {
builder.setGroups(PatchSet.joinGroups(groups));
@@ -84,7 +84,8 @@
proto.hasUploaderAccountId()
? accountIdConverter.fromProto(proto.getUploaderAccountId())
: Account.id(0))
- .createdOn(proto.hasCreatedOn() ? new Timestamp(proto.getCreatedOn()) : new Timestamp(0));
+ .createdOn(
+ proto.hasCreatedOn() ? Instant.ofEpochMilli(proto.getCreatedOn()) : Instant.EPOCH);
return builder.build();
}
diff --git a/java/com/google/gerrit/exceptions/InternalServerWithUserMessageException.java b/java/com/google/gerrit/exceptions/MergeUpdateException.java
similarity index 64%
rename from java/com/google/gerrit/exceptions/InternalServerWithUserMessageException.java
rename to java/com/google/gerrit/exceptions/MergeUpdateException.java
index 452192c..b60ca57 100644
--- a/java/com/google/gerrit/exceptions/InternalServerWithUserMessageException.java
+++ b/java/com/google/gerrit/exceptions/MergeUpdateException.java
@@ -14,10 +14,15 @@
package com.google.gerrit.exceptions;
-public class InternalServerWithUserMessageException extends RuntimeException {
+/**
+ * An exception used for changes that fail to merge. This exception has a user visible message
+ * unlike other {@link RuntimeException}s, because this is our way to improve the UX when
+ * submission/merges fail.
+ */
+public class MergeUpdateException extends RuntimeException {
private static final long serialVersionUID = 1L;
- public InternalServerWithUserMessageException(String msg, Throwable cause) {
- super(msg, cause);
+ public MergeUpdateException(String userVisibleMessage, Throwable cause) {
+ super(userVisibleMessage, cause);
}
}
diff --git a/java/com/google/gerrit/extensions/api/projects/TagInfo.java b/java/com/google/gerrit/extensions/api/projects/TagInfo.java
index a6269fe..61ea518 100644
--- a/java/com/google/gerrit/extensions/api/projects/TagInfo.java
+++ b/java/com/google/gerrit/extensions/api/projects/TagInfo.java
@@ -14,16 +14,22 @@
package com.google.gerrit.extensions.api.projects;
+import com.google.gerrit.common.Nullable;
import com.google.gerrit.extensions.common.GitPerson;
import com.google.gerrit.extensions.common.WebLinkInfo;
import java.sql.Timestamp;
+import java.time.Instant;
import java.util.List;
public class TagInfo extends RefInfo {
public String object;
public String message;
public GitPerson tagger;
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
public Timestamp created;
+
public List<WebLinkInfo> webLinks;
public TagInfo(
@@ -39,8 +45,22 @@
this.created = created;
}
+ @SuppressWarnings("JdkObsolete")
+ public TagInfo(
+ String ref,
+ String revision,
+ Boolean canDelete,
+ List<WebLinkInfo> webLinks,
+ @Nullable Instant created) {
+ this.ref = ref;
+ this.revision = revision;
+ this.canDelete = canDelete;
+ this.webLinks = webLinks;
+ this.created = created != null ? Timestamp.from(created) : null;
+ }
+
public TagInfo(String ref, String revision, Boolean canDelete, List<WebLinkInfo> webLinks) {
- this(ref, revision, canDelete, webLinks, null);
+ this(ref, revision, canDelete, webLinks, (Instant) null);
}
public TagInfo(
@@ -66,8 +86,24 @@
String message,
GitPerson tagger,
Boolean canDelete,
+ List<WebLinkInfo> webLinks,
+ Instant created) {
+ this(ref, revision, canDelete, webLinks, created);
+ this.object = object;
+ this.message = message;
+ this.tagger = tagger;
+ this.webLinks = webLinks;
+ }
+
+ public TagInfo(
+ String ref,
+ String revision,
+ String object,
+ String message,
+ GitPerson tagger,
+ Boolean canDelete,
List<WebLinkInfo> webLinks) {
- this(ref, revision, object, message, tagger, canDelete, webLinks, null);
+ this(ref, revision, object, message, tagger, canDelete, webLinks, (Instant) null);
this.object = object;
this.message = message;
this.tagger = tagger;
diff --git a/java/com/google/gerrit/extensions/client/Comment.java b/java/com/google/gerrit/extensions/client/Comment.java
index faf14b1..b8843d3 100644
--- a/java/com/google/gerrit/extensions/client/Comment.java
+++ b/java/com/google/gerrit/extensions/client/Comment.java
@@ -15,6 +15,7 @@
package com.google.gerrit.extensions.client;
import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Comparator;
import java.util.Objects;
@@ -35,7 +36,11 @@
public Range range;
public String inReplyTo;
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
public Timestamp updated;
+
public String message;
/**
@@ -44,6 +49,20 @@
*/
public String commitId;
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
+ public Instant getUpdated() {
+ return updated.toInstant();
+ }
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
+ public void setUpdated(Instant when) {
+ updated = Timestamp.from(when);
+ }
+
public static class Range implements Comparable<Range> {
private static final Comparator<Range> RANGE_COMPARATOR =
Comparator.<Range>comparingInt(range -> range.startLine)
diff --git a/java/com/google/gerrit/extensions/common/AccountDetailInfo.java b/java/com/google/gerrit/extensions/common/AccountDetailInfo.java
index a2aeab2..a76a7f9 100644
--- a/java/com/google/gerrit/extensions/common/AccountDetailInfo.java
+++ b/java/com/google/gerrit/extensions/common/AccountDetailInfo.java
@@ -15,6 +15,7 @@
package com.google.gerrit.extensions.common;
import java.sql.Timestamp;
+import java.time.Instant;
/**
* Representation of a (detailed) account in the REST API.
@@ -27,9 +28,18 @@
*/
public class AccountDetailInfo extends AccountInfo {
/** The timestamp of when the account was registered. */
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
public Timestamp registeredOn;
public AccountDetailInfo(Integer id) {
super(id);
}
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
+ public void setRegisteredOn(Instant registeredOn) {
+ this.registeredOn = Timestamp.from(registeredOn);
+ }
}
diff --git a/java/com/google/gerrit/extensions/common/ApprovalInfo.java b/java/com/google/gerrit/extensions/common/ApprovalInfo.java
index a4e0baa..4519add 100644
--- a/java/com/google/gerrit/extensions/common/ApprovalInfo.java
+++ b/java/com/google/gerrit/extensions/common/ApprovalInfo.java
@@ -16,6 +16,7 @@
import com.google.gerrit.common.Nullable;
import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Objects;
/**
@@ -43,6 +44,8 @@
public Integer value;
/** The time and date describing when the approval was made. */
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
public Timestamp date;
/** Whether this vote was made after the change was submitted. */
@@ -62,10 +65,10 @@
public ApprovalInfo(
Integer id,
- Integer value,
+ @Nullable Integer value,
@Nullable VotingRangeInfo permittedVotingRange,
@Nullable String tag,
- Timestamp date) {
+ @Nullable Timestamp date) {
super(id);
this.value = value;
this.permittedVotingRange = permittedVotingRange;
@@ -73,6 +76,28 @@
this.tag = tag;
}
+ public ApprovalInfo(
+ Integer id,
+ @Nullable Integer value,
+ @Nullable VotingRangeInfo permittedVotingRange,
+ @Nullable String tag,
+ @Nullable Instant date) {
+ super(id);
+ this.value = value;
+ this.permittedVotingRange = permittedVotingRange;
+ this.tag = tag;
+ if (date != null) {
+ setDate(date);
+ }
+ }
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
+ public void setDate(Instant date) {
+ this.date = Timestamp.from(date);
+ }
+
@Override
public boolean equals(Object o) {
if (o instanceof ApprovalInfo) {
diff --git a/java/com/google/gerrit/extensions/common/AttentionSetInfo.java b/java/com/google/gerrit/extensions/common/AttentionSetInfo.java
index d34ba6d..81dbc88 100644
--- a/java/com/google/gerrit/extensions/common/AttentionSetInfo.java
+++ b/java/com/google/gerrit/extensions/common/AttentionSetInfo.java
@@ -16,6 +16,7 @@
import com.google.gerrit.common.Nullable;
import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Objects;
/**
@@ -28,8 +29,12 @@
public class AttentionSetInfo {
/** The user included in the attention set. */
public AccountInfo account;
+
/** The timestamp of the last update. */
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
public Timestamp lastUpdate;
+
/** The human readable reason why the user was added. */
public String reason;
@@ -51,6 +56,17 @@
this.reasonAccount = reasonAccount;
}
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
+ public AttentionSetInfo(
+ AccountInfo account, Instant lastUpdate, String reason, @Nullable AccountInfo reasonAccount) {
+ this.account = account;
+ this.lastUpdate = Timestamp.from(lastUpdate);
+ this.reason = reason;
+ this.reasonAccount = reasonAccount;
+ }
+
protected AttentionSetInfo() {}
@Override
diff --git a/java/com/google/gerrit/extensions/common/ChangeInfo.java b/java/com/google/gerrit/extensions/common/ChangeInfo.java
index 55e4670..40ae2ec 100644
--- a/java/com/google/gerrit/extensions/common/ChangeInfo.java
+++ b/java/com/google/gerrit/extensions/common/ChangeInfo.java
@@ -20,6 +20,7 @@
import com.google.gerrit.extensions.client.ReviewerState;
import com.google.gerrit.extensions.client.SubmitType;
import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -53,9 +54,13 @@
public String changeId;
public String subject;
public ChangeStatus status;
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
public Timestamp created;
public Timestamp updated;
public Timestamp submitted;
+
public AccountInfo submitter;
public Boolean starred;
public Collection<String> stars;
@@ -126,4 +131,47 @@
public ChangeInfo(Map<String, RevisionInfo> revisions) {
this.revisions = ImmutableMap.copyOf(revisions);
}
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
+ public Instant getCreated() {
+ return created.toInstant();
+ }
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
+ public void setCreated(Instant when) {
+ created = Timestamp.from(when);
+ }
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
+ public Instant getUpdated() {
+ return updated.toInstant();
+ }
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
+ public void setUpdated(Instant when) {
+ updated = Timestamp.from(when);
+ }
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
+ public Instant getSubmitted() {
+ return submitted.toInstant();
+ }
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
+ public void setSubmitted(Instant when, AccountInfo who) {
+ submitted = Timestamp.from(when);
+ submitter = who;
+ }
}
diff --git a/java/com/google/gerrit/extensions/common/ChangeMessageInfo.java b/java/com/google/gerrit/extensions/common/ChangeMessageInfo.java
index e7e46c1..51fe57c 100644
--- a/java/com/google/gerrit/extensions/common/ChangeMessageInfo.java
+++ b/java/com/google/gerrit/extensions/common/ChangeMessageInfo.java
@@ -16,6 +16,7 @@
import com.google.common.collect.Iterables;
import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Collection;
import java.util.Objects;
@@ -25,7 +26,11 @@
public String tag;
public AccountInfo author;
public AccountInfo realAuthor;
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
public Timestamp date;
+
public String message;
public Collection<AccountInfo> accountsInMessage;
public Integer _revisionNumber;
@@ -36,6 +41,13 @@
this.message = message;
}
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
+ public void setDate(Instant when) {
+ date = Timestamp.from(when);
+ }
+
@Override
public boolean equals(Object o) {
if (o instanceof ChangeMessageInfo) {
diff --git a/java/com/google/gerrit/extensions/common/GitPerson.java b/java/com/google/gerrit/extensions/common/GitPerson.java
index 8ed919e..df3e488 100644
--- a/java/com/google/gerrit/extensions/common/GitPerson.java
+++ b/java/com/google/gerrit/extensions/common/GitPerson.java
@@ -15,14 +15,26 @@
package com.google.gerrit.extensions.common;
import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Objects;
public class GitPerson {
public String name;
public String email;
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
public Timestamp date;
+
public int tz;
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
+ public void setDate(Instant when) {
+ date = Timestamp.from(when);
+ }
+
@Override
public boolean equals(Object o) {
if (!(o instanceof GitPerson)) {
diff --git a/java/com/google/gerrit/extensions/common/GroupAuditEventInfo.java b/java/com/google/gerrit/extensions/common/GroupAuditEventInfo.java
index 711337a..9a13713 100644
--- a/java/com/google/gerrit/extensions/common/GroupAuditEventInfo.java
+++ b/java/com/google/gerrit/extensions/common/GroupAuditEventInfo.java
@@ -14,7 +14,9 @@
package com.google.gerrit.extensions.common;
+import com.google.gerrit.common.Nullable;
import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Optional;
public abstract class GroupAuditEventInfo {
@@ -27,25 +29,62 @@
public Type type;
public AccountInfo user;
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
public Timestamp date;
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
public static UserMemberAuditEventInfo createAddUserEvent(
AccountInfo user, Timestamp date, AccountInfo member) {
- return new UserMemberAuditEventInfo(Type.ADD_USER, user, Optional.of(date), member);
+ return new UserMemberAuditEventInfo(Type.ADD_USER, user, date.toInstant(), member);
+ }
+
+ public static UserMemberAuditEventInfo createAddUserEvent(
+ AccountInfo user, Instant date, AccountInfo member) {
+ return new UserMemberAuditEventInfo(Type.ADD_USER, user, date, member);
+ }
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
+ public static UserMemberAuditEventInfo createRemoveUserEvent(
+ AccountInfo user, Optional<Timestamp> date, AccountInfo member) {
+ return new UserMemberAuditEventInfo(
+ Type.REMOVE_USER, user, date.map(Timestamp::toInstant).orElse(null), member);
}
public static UserMemberAuditEventInfo createRemoveUserEvent(
- AccountInfo user, Optional<Timestamp> date, AccountInfo member) {
+ AccountInfo user, @Nullable Instant date, AccountInfo member) {
return new UserMemberAuditEventInfo(Type.REMOVE_USER, user, date, member);
}
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
public static GroupMemberAuditEventInfo createAddGroupEvent(
AccountInfo user, Timestamp date, GroupInfo member) {
- return new GroupMemberAuditEventInfo(Type.ADD_GROUP, user, Optional.of(date), member);
+ return new GroupMemberAuditEventInfo(Type.ADD_GROUP, user, date.toInstant(), member);
+ }
+
+ public static GroupMemberAuditEventInfo createAddGroupEvent(
+ AccountInfo user, Instant date, GroupInfo member) {
+ return new GroupMemberAuditEventInfo(Type.ADD_GROUP, user, date, member);
+ }
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
+ public static GroupMemberAuditEventInfo createRemoveGroupEvent(
+ AccountInfo user, Optional<Timestamp> date, GroupInfo member) {
+ return new GroupMemberAuditEventInfo(
+ Type.REMOVE_GROUP, user, date.map(Timestamp::toInstant).orElse(null), member);
}
public static GroupMemberAuditEventInfo createRemoveGroupEvent(
- AccountInfo user, Optional<Timestamp> date, GroupInfo member) {
+ AccountInfo user, @Nullable Instant date, GroupInfo member) {
return new GroupMemberAuditEventInfo(Type.REMOVE_GROUP, user, date, member);
}
@@ -55,11 +94,20 @@
this.date = date.orElse(null);
}
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
+ protected GroupAuditEventInfo(Type type, AccountInfo user, @Nullable Instant date) {
+ this.type = type;
+ this.user = user;
+ this.date = date != null ? Timestamp.from(date) : null;
+ }
+
public static class UserMemberAuditEventInfo extends GroupAuditEventInfo {
public AccountInfo member;
private UserMemberAuditEventInfo(
- Type type, AccountInfo user, Optional<Timestamp> date, AccountInfo member) {
+ Type type, AccountInfo user, @Nullable Instant date, AccountInfo member) {
super(type, user, date);
this.member = member;
}
@@ -69,7 +117,7 @@
public GroupInfo member;
private GroupMemberAuditEventInfo(
- Type type, AccountInfo user, Optional<Timestamp> date, GroupInfo member) {
+ Type type, AccountInfo user, @Nullable Instant date, GroupInfo member) {
super(type, user, date);
this.member = member;
}
diff --git a/java/com/google/gerrit/extensions/common/GroupInfo.java b/java/com/google/gerrit/extensions/common/GroupInfo.java
index b21475c..edbaa01 100644
--- a/java/com/google/gerrit/extensions/common/GroupInfo.java
+++ b/java/com/google/gerrit/extensions/common/GroupInfo.java
@@ -15,6 +15,7 @@
package com.google.gerrit.extensions.common;
import java.sql.Timestamp;
+import java.time.Instant;
import java.util.List;
public class GroupInfo extends GroupBaseInfo {
@@ -26,10 +27,28 @@
public Integer groupId;
public String owner;
public String ownerId;
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
public Timestamp createdOn;
+
public Boolean _moreGroups;
// These fields are only supplied for internal groups, and only if requested.
public List<AccountInfo> members;
public List<GroupInfo> includes;
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
+ public Instant getCreatedOn() {
+ return createdOn.toInstant();
+ }
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
+ public void setCreatedOn(Instant when) {
+ createdOn = Timestamp.from(when);
+ }
}
diff --git a/java/com/google/gerrit/extensions/common/ReviewerUpdateInfo.java b/java/com/google/gerrit/extensions/common/ReviewerUpdateInfo.java
index 37e1ceb..36682f6 100644
--- a/java/com/google/gerrit/extensions/common/ReviewerUpdateInfo.java
+++ b/java/com/google/gerrit/extensions/common/ReviewerUpdateInfo.java
@@ -16,14 +16,31 @@
import com.google.gerrit.extensions.client.ReviewerState;
import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Objects;
public class ReviewerUpdateInfo {
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
public Timestamp updated;
+
public AccountInfo updatedBy;
public AccountInfo reviewer;
public ReviewerState state;
+ public ReviewerUpdateInfo() {}
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
+ public ReviewerUpdateInfo(
+ Instant updated, AccountInfo updatedBy, AccountInfo reviewer, ReviewerState state) {
+ this.updated = Timestamp.from(updated);
+ this.updatedBy = updatedBy;
+ this.reviewer = reviewer;
+ this.state = state;
+ }
+
@Override
public boolean equals(Object o) {
if (o instanceof ReviewerUpdateInfo) {
diff --git a/java/com/google/gerrit/extensions/common/RevisionInfo.java b/java/com/google/gerrit/extensions/common/RevisionInfo.java
index f710ab7..7c52c8c 100644
--- a/java/com/google/gerrit/extensions/common/RevisionInfo.java
+++ b/java/com/google/gerrit/extensions/common/RevisionInfo.java
@@ -16,6 +16,7 @@
import com.google.gerrit.extensions.client.ChangeKind;
import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Map;
import java.util.Objects;
@@ -25,7 +26,11 @@
public transient boolean isCurrent;
public ChangeKind kind;
public int _number;
+
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
public Timestamp created;
+
public AccountInfo uploader;
public String ref;
public Map<String, FetchInfo> fetch;
@@ -51,6 +56,13 @@
this.uploader = uploader;
}
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
+ public void setCreated(Instant date) {
+ this.created = Timestamp.from(date);
+ }
+
@Override
public boolean equals(Object o) {
if (o instanceof RevisionInfo) {
diff --git a/java/com/google/gerrit/extensions/common/testing/GitPersonSubject.java b/java/com/google/gerrit/extensions/common/testing/GitPersonSubject.java
index 0f6af21..cb9d855 100644
--- a/java/com/google/gerrit/extensions/common/testing/GitPersonSubject.java
+++ b/java/com/google/gerrit/extensions/common/testing/GitPersonSubject.java
@@ -70,6 +70,11 @@
tz().isEqualTo(other.tz);
}
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
public void matches(PersonIdent ident) {
isNotNull();
name().isEqualTo(ident.getName());
diff --git a/java/com/google/gerrit/extensions/events/ChangeEvent.java b/java/com/google/gerrit/extensions/events/ChangeEvent.java
index def75b7..6542d8e 100644
--- a/java/com/google/gerrit/extensions/events/ChangeEvent.java
+++ b/java/com/google/gerrit/extensions/events/ChangeEvent.java
@@ -16,7 +16,7 @@
import com.google.gerrit.extensions.common.AccountInfo;
import com.google.gerrit.extensions.common.ChangeInfo;
-import java.sql.Timestamp;
+import java.time.Instant;
/** Interface to be extended by Events with a Change. */
public interface ChangeEvent extends GerritEvent {
@@ -29,5 +29,5 @@
AccountInfo getWho();
- Timestamp getWhen();
+ Instant getWhen();
}
diff --git a/java/com/google/gerrit/extensions/registration/DynamicMap.java b/java/com/google/gerrit/extensions/registration/DynamicMap.java
index 85c9c90..6fd2c03 100644
--- a/java/com/google/gerrit/extensions/registration/DynamicMap.java
+++ b/java/com/google/gerrit/extensions/registration/DynamicMap.java
@@ -146,7 +146,7 @@
@Override
public Iterator<Extension<T>> iterator() {
final Iterator<Map.Entry<NamePair, Provider<T>>> i = items.entrySet().iterator();
- return new Iterator<Extension<T>>() {
+ return new Iterator<>() {
@Override
public boolean hasNext() {
return i.hasNext();
diff --git a/java/com/google/gerrit/extensions/registration/DynamicSet.java b/java/com/google/gerrit/extensions/registration/DynamicSet.java
index b2e871e..a0b2c6a 100644
--- a/java/com/google/gerrit/extensions/registration/DynamicSet.java
+++ b/java/com/google/gerrit/extensions/registration/DynamicSet.java
@@ -153,7 +153,7 @@
@Override
public Iterator<T> iterator() {
Iterator<Extension<T>> entryIterator = entries().iterator();
- return new Iterator<T>() {
+ return new Iterator<>() {
@Override
public boolean hasNext() {
return entryIterator.hasNext();
@@ -170,7 +170,7 @@
public Iterable<Extension<T>> entries() {
final Iterator<AtomicReference<Extension<T>>> itr = items.iterator();
return () ->
- new Iterator<Extension<T>>() {
+ new Iterator<>() {
private Extension<T> next;
@Override
diff --git a/java/com/google/gerrit/gpg/server/DeleteGpgKey.java b/java/com/google/gerrit/gpg/server/DeleteGpgKey.java
index e0c921d..bcc8631 100644
--- a/java/com/google/gerrit/gpg/server/DeleteGpgKey.java
+++ b/java/com/google/gerrit/gpg/server/DeleteGpgKey.java
@@ -95,7 +95,7 @@
CommitBuilder cb = new CommitBuilder();
PersonIdent committer = serverIdent.get();
- cb.setAuthor(rsrc.getUser().newCommitterIdent(committer.getWhen(), committer.getTimeZone()));
+ cb.setAuthor(rsrc.getUser().newCommitterIdent(committer));
cb.setCommitter(committer);
cb.setMessage("Delete public key " + keyIdToString(key.getKeyID()));
diff --git a/java/com/google/gerrit/gpg/server/GpgKey.java b/java/com/google/gerrit/gpg/server/GpgKey.java
index aa6b6f4..fbe97ad 100644
--- a/java/com/google/gerrit/gpg/server/GpgKey.java
+++ b/java/com/google/gerrit/gpg/server/GpgKey.java
@@ -21,8 +21,7 @@
import org.bouncycastle.openpgp.PGPPublicKeyRing;
public class GpgKey extends AccountResource {
- public static final TypeLiteral<RestView<GpgKey>> GPG_KEY_KIND =
- new TypeLiteral<RestView<GpgKey>>() {};
+ public static final TypeLiteral<RestView<GpgKey>> GPG_KEY_KIND = new TypeLiteral<>() {};
private final PGPPublicKeyRing keyRing;
diff --git a/java/com/google/gerrit/gpg/server/PostGpgKeys.java b/java/com/google/gerrit/gpg/server/PostGpgKeys.java
index 5dc6d01..3341806 100644
--- a/java/com/google/gerrit/gpg/server/PostGpgKeys.java
+++ b/java/com/google/gerrit/gpg/server/PostGpgKeys.java
@@ -250,7 +250,7 @@
}
CommitBuilder cb = new CommitBuilder();
PersonIdent committer = serverIdent.get();
- cb.setAuthor(user.newCommitterIdent(committer.getWhen(), committer.getTimeZone()));
+ cb.setAuthor(user.newCommitterIdent(committer));
cb.setCommitter(committer);
RefUpdate.Result saveResult = store.save(cb);
diff --git a/java/com/google/gerrit/index/testing/AbstractFakeIndex.java b/java/com/google/gerrit/index/testing/AbstractFakeIndex.java
index 6ece45a..36e9e52 100644
--- a/java/com/google/gerrit/index/testing/AbstractFakeIndex.java
+++ b/java/com/google/gerrit/index/testing/AbstractFakeIndex.java
@@ -47,7 +47,7 @@
import com.google.gerrit.server.query.change.ChangeData;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
@@ -121,7 +121,7 @@
.limit(opts.limit())
.collect(toImmutableList());
}
- return new DataSource<V>() {
+ return new DataSource<>() {
@Override
public int getCardinality() {
return results.size();
@@ -205,7 +205,7 @@
Comparator<ChangeData> lastUpdated =
Comparator.comparing(cd -> cd.change().getLastUpdatedOn());
Comparator<ChangeData> merged =
- Comparator.comparing(cd -> cd.getMergedOn().orElse(new Timestamp(0)));
+ Comparator.comparing(cd -> cd.getMergedOn().orElse(Instant.EPOCH));
Comparator<ChangeData> id = Comparator.comparing(cd -> cd.getId().get());
return lastUpdated.thenComparing(merged).thenComparing(id).reversed();
}
diff --git a/java/com/google/gerrit/lucene/LuceneChangeIndex.java b/java/com/google/gerrit/lucene/LuceneChangeIndex.java
index e7d47d0..9ea9d2e 100644
--- a/java/com/google/gerrit/lucene/LuceneChangeIndex.java
+++ b/java/com/google/gerrit/lucene/LuceneChangeIndex.java
@@ -384,7 +384,7 @@
}
ImmutableList<FieldBundle> fieldBundles =
documents.stream().map(rawDocumentMapper).collect(toImmutableList());
- return new ResultSet<FieldBundle>() {
+ return new ResultSet<>() {
@Override
public Iterator<FieldBundle> iterator() {
return fieldBundles.iterator();
diff --git a/java/com/google/gerrit/metrics/DisabledMetricMaker.java b/java/com/google/gerrit/metrics/DisabledMetricMaker.java
index 1fb8c57..5b340fb 100644
--- a/java/com/google/gerrit/metrics/DisabledMetricMaker.java
+++ b/java/com/google/gerrit/metrics/DisabledMetricMaker.java
@@ -33,7 +33,7 @@
@Override
public <F1> Counter1<F1> newCounter(String name, Description desc, Field<F1> field1) {
- return new Counter1<F1>() {
+ return new Counter1<>() {
@Override
public void incrementBy(F1 field1, long value) {}
@@ -45,7 +45,7 @@
@Override
public <F1, F2> Counter2<F1, F2> newCounter(
String name, Description desc, Field<F1> field1, Field<F2> field2) {
- return new Counter2<F1, F2>() {
+ return new Counter2<>() {
@Override
public void incrementBy(F1 field1, F2 field2, long value) {}
@@ -57,7 +57,7 @@
@Override
public <F1, F2, F3> Counter3<F1, F2, F3> newCounter(
String name, Description desc, Field<F1> field1, Field<F2> field2, Field<F3> field3) {
- return new Counter3<F1, F2, F3>() {
+ return new Counter3<>() {
@Override
public void incrementBy(F1 field1, F2 field2, F3 field3, long value) {}
@@ -125,7 +125,7 @@
@Override
public <F1> Histogram1<F1> newHistogram(String name, Description desc, Field<F1> field1) {
- return new Histogram1<F1>() {
+ return new Histogram1<>() {
@Override
public void record(F1 field1, long value) {}
@@ -137,7 +137,7 @@
@Override
public <F1, F2> Histogram2<F1, F2> newHistogram(
String name, Description desc, Field<F1> field1, Field<F2> field2) {
- return new Histogram2<F1, F2>() {
+ return new Histogram2<>() {
@Override
public void record(F1 field1, F2 field2, long value) {}
@@ -149,7 +149,7 @@
@Override
public <F1, F2, F3> Histogram3<F1, F2, F3> newHistogram(
String name, Description desc, Field<F1> field1, Field<F2> field2, Field<F3> field3) {
- return new Histogram3<F1, F2, F3>() {
+ return new Histogram3<>() {
@Override
public void record(F1 field1, F2 field2, F3 field3, long value) {}
@@ -161,7 +161,7 @@
@Override
public <V> CallbackMetric0<V> newCallbackMetric(
String name, Class<V> valueClass, Description desc) {
- return new CallbackMetric0<V>() {
+ return new CallbackMetric0<>() {
@Override
public void set(V value) {}
@@ -173,7 +173,7 @@
@Override
public <F1, V> CallbackMetric1<F1, V> newCallbackMetric(
String name, Class<V> valueClass, Description desc, Field<F1> field1) {
- return new CallbackMetric1<F1, V>() {
+ return new CallbackMetric1<>() {
@Override
public void set(F1 field1, V value) {}
diff --git a/java/com/google/gerrit/metrics/dropwizard/CounterImpl1.java b/java/com/google/gerrit/metrics/dropwizard/CounterImpl1.java
index 0e554a8..92aeb4c 100644
--- a/java/com/google/gerrit/metrics/dropwizard/CounterImpl1.java
+++ b/java/com/google/gerrit/metrics/dropwizard/CounterImpl1.java
@@ -26,7 +26,7 @@
}
Counter1<F1> counter() {
- return new Counter1<F1>() {
+ return new Counter1<>() {
@Override
public void incrementBy(F1 field1, long value) {
total.incrementBy(value);
diff --git a/java/com/google/gerrit/metrics/dropwizard/CounterImplN.java b/java/com/google/gerrit/metrics/dropwizard/CounterImplN.java
index 07afc2a..e9199d9 100644
--- a/java/com/google/gerrit/metrics/dropwizard/CounterImplN.java
+++ b/java/com/google/gerrit/metrics/dropwizard/CounterImplN.java
@@ -29,7 +29,7 @@
}
<F1, F2> Counter2<F1, F2> counter2() {
- return new Counter2<F1, F2>() {
+ return new Counter2<>() {
@Override
public void incrementBy(F1 field1, F2 field2, long value) {
total.incrementBy(value);
@@ -44,7 +44,7 @@
}
<F1, F2, F3> Counter3<F1, F2, F3> counter3() {
- return new Counter3<F1, F2, F3>() {
+ return new Counter3<>() {
@Override
public void incrementBy(F1 field1, F2 field2, F3 field3, long value) {
total.incrementBy(value);
diff --git a/java/com/google/gerrit/metrics/dropwizard/HistogramImpl1.java b/java/com/google/gerrit/metrics/dropwizard/HistogramImpl1.java
index 4578db1..91e36b9 100644
--- a/java/com/google/gerrit/metrics/dropwizard/HistogramImpl1.java
+++ b/java/com/google/gerrit/metrics/dropwizard/HistogramImpl1.java
@@ -26,7 +26,7 @@
}
Histogram1<F1> histogram1() {
- return new Histogram1<F1>() {
+ return new Histogram1<>() {
@Override
public void record(F1 field1, long value) {
total.record(value);
diff --git a/java/com/google/gerrit/metrics/dropwizard/HistogramImplN.java b/java/com/google/gerrit/metrics/dropwizard/HistogramImplN.java
index 446590c..2caa4c5 100644
--- a/java/com/google/gerrit/metrics/dropwizard/HistogramImplN.java
+++ b/java/com/google/gerrit/metrics/dropwizard/HistogramImplN.java
@@ -29,7 +29,7 @@
}
<F1, F2> Histogram2<F1, F2> histogram2() {
- return new Histogram2<F1, F2>() {
+ return new Histogram2<>() {
@Override
public void record(F1 field1, F2 field2, long value) {
total.record(value);
@@ -44,7 +44,7 @@
}
<F1, F2, F3> Histogram3<F1, F2, F3> histogram3() {
- return new Histogram3<F1, F2, F3>() {
+ return new Histogram3<>() {
@Override
public void record(F1 field1, F2 field2, F3 field3, long value) {
total.record(value);
diff --git a/java/com/google/gerrit/metrics/dropwizard/MetricResource.java b/java/com/google/gerrit/metrics/dropwizard/MetricResource.java
index 226edc7..8a6db67 100644
--- a/java/com/google/gerrit/metrics/dropwizard/MetricResource.java
+++ b/java/com/google/gerrit/metrics/dropwizard/MetricResource.java
@@ -20,8 +20,7 @@
import com.google.inject.TypeLiteral;
class MetricResource extends ConfigResource {
- static final TypeLiteral<RestView<MetricResource>> METRIC_KIND =
- new TypeLiteral<RestView<MetricResource>>() {};
+ static final TypeLiteral<RestView<MetricResource>> METRIC_KIND = new TypeLiteral<>() {};
private final String name;
private final Metric metric;
diff --git a/java/com/google/gerrit/pgm/init/AccountsOnInit.java b/java/com/google/gerrit/pgm/init/AccountsOnInit.java
index d9e3a6a..cbfd714 100644
--- a/java/com/google/gerrit/pgm/init/AccountsOnInit.java
+++ b/java/com/google/gerrit/pgm/init/AccountsOnInit.java
@@ -30,6 +30,7 @@
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
+import java.util.Date;
import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.dircache.DirCacheEditor;
import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
@@ -60,12 +61,16 @@
this.allUsers = allUsers.get();
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
public Account insert(Account.Builder account) throws IOException {
File path = getPath();
try (Repository repo = new FileRepository(path);
ObjectInserter oi = repo.newObjectInserter()) {
PersonIdent ident =
- new PersonIdent(new GerritPersonIdentProvider(flags.cfg).get(), account.registeredOn());
+ new PersonIdent(
+ new GerritPersonIdentProvider(flags.cfg).get(), Date.from(account.registeredOn()));
Config accountConfig = new Config();
AccountProperties.writeToAccountConfig(
diff --git a/java/com/google/gerrit/pgm/init/GroupsOnInit.java b/java/com/google/gerrit/pgm/init/GroupsOnInit.java
index 2f12abb..020705e 100644
--- a/java/com/google/gerrit/pgm/init/GroupsOnInit.java
+++ b/java/com/google/gerrit/pgm/init/GroupsOnInit.java
@@ -41,6 +41,7 @@
import java.io.IOException;
import java.nio.file.Path;
import java.sql.Timestamp;
+import java.time.Instant;
import java.util.stream.Stream;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.internal.storage.file.FileRepository;
@@ -165,10 +166,14 @@
return AuditLogFormatter.createBackedBy(ImmutableSet.of(account), ImmutableSet.of(), serverId);
}
- private void commit(Repository repository, GroupConfig groupConfig, Timestamp groupCreatedOn)
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
+ private void commit(Repository repository, GroupConfig groupConfig, Instant groupCreatedOn)
throws IOException {
PersonIdent personIdent =
- new PersonIdent(new GerritPersonIdentProvider(flags.cfg).get(), groupCreatedOn);
+ new PersonIdent(
+ new GerritPersonIdentProvider(flags.cfg).get(), Timestamp.from(groupCreatedOn));
try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate(repository, personIdent)) {
groupConfig.commit(metaDataUpdate);
}
diff --git a/java/com/google/gerrit/pgm/init/InitAdminUser.java b/java/com/google/gerrit/pgm/init/InitAdminUser.java
index d6a0133..4e854b5 100644
--- a/java/com/google/gerrit/pgm/init/InitAdminUser.java
+++ b/java/com/google/gerrit/pgm/init/InitAdminUser.java
@@ -120,7 +120,7 @@
Account persistedAccount =
accounts.insert(
- Account.builder(id, TimeUtil.nowTs()).setFullName(name).setPreferredEmail(email));
+ Account.builder(id, TimeUtil.now()).setFullName(name).setPreferredEmail(email));
// Only two groups should exist at this point in time and hence iterating over all of them
// is cheap.
Optional<GroupReference> adminGroupReference =
diff --git a/java/com/google/gerrit/server/AssigneeStatusUpdate.java b/java/com/google/gerrit/server/AssigneeStatusUpdate.java
index 3d6242b..812aad1 100644
--- a/java/com/google/gerrit/server/AssigneeStatusUpdate.java
+++ b/java/com/google/gerrit/server/AssigneeStatusUpdate.java
@@ -16,18 +16,18 @@
import com.google.auto.value.AutoValue;
import com.google.gerrit.entities.Account;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Optional;
/** Change to an assignee's status. */
@AutoValue
public abstract class AssigneeStatusUpdate {
public static AssigneeStatusUpdate create(
- Timestamp ts, Account.Id updatedBy, Optional<Account.Id> currentAssignee) {
+ Instant ts, Account.Id updatedBy, Optional<Account.Id> currentAssignee) {
return new AutoValue_AssigneeStatusUpdate(ts, updatedBy, currentAssignee);
}
- public abstract Timestamp date();
+ public abstract Instant date();
public abstract Account.Id updatedBy();
diff --git a/java/com/google/gerrit/server/ChangeMessagesUtil.java b/java/com/google/gerrit/server/ChangeMessagesUtil.java
index 8366b09..81cff6e 100644
--- a/java/com/google/gerrit/server/ChangeMessagesUtil.java
+++ b/java/com/google/gerrit/server/ChangeMessagesUtil.java
@@ -145,7 +145,7 @@
ChangeMessageInfo cmi = new ChangeMessageInfo();
cmi.id = message.getKey().uuid();
cmi.author = accountLoader.get(message.getAuthor());
- cmi.date = message.getWrittenOn();
+ cmi.setDate(message.getWrittenOn());
cmi.message = message.getMessage();
cmi.tag = message.getTag();
cmi._revisionNumber = patchNum != null ? patchNum.get() : null;
diff --git a/java/com/google/gerrit/server/CmdLineParserModule.java b/java/com/google/gerrit/server/CmdLineParserModule.java
index d943889..be6b4cd8 100644
--- a/java/com/google/gerrit/server/CmdLineParserModule.java
+++ b/java/com/google/gerrit/server/CmdLineParserModule.java
@@ -23,17 +23,17 @@
import com.google.gerrit.server.args4j.AccountGroupUUIDHandler;
import com.google.gerrit.server.args4j.AccountIdHandler;
import com.google.gerrit.server.args4j.ChangeIdHandler;
+import com.google.gerrit.server.args4j.InstantHandler;
import com.google.gerrit.server.args4j.ObjectIdHandler;
import com.google.gerrit.server.args4j.PatchSetIdHandler;
import com.google.gerrit.server.args4j.ProjectHandler;
import com.google.gerrit.server.args4j.SocketAddressHandler;
-import com.google.gerrit.server.args4j.TimestampHandler;
import com.google.gerrit.server.project.ProjectState;
import com.google.gerrit.util.cli.CmdLineParser;
import com.google.gerrit.util.cli.OptionHandlerUtil;
import com.google.gerrit.util.cli.OptionHandlers;
import java.net.SocketAddress;
-import java.sql.Timestamp;
+import java.time.Instant;
import org.eclipse.jgit.lib.ObjectId;
import org.kohsuke.args4j.spi.OptionHandler;
@@ -49,11 +49,11 @@
registerOptionHandler(AccountGroup.Id.class, AccountGroupIdHandler.class);
registerOptionHandler(AccountGroup.UUID.class, AccountGroupUUIDHandler.class);
registerOptionHandler(Change.Id.class, ChangeIdHandler.class);
+ registerOptionHandler(Instant.class, InstantHandler.class);
registerOptionHandler(ObjectId.class, ObjectIdHandler.class);
registerOptionHandler(PatchSet.Id.class, PatchSetIdHandler.class);
registerOptionHandler(ProjectState.class, ProjectHandler.class);
registerOptionHandler(SocketAddress.class, SocketAddressHandler.class);
- registerOptionHandler(Timestamp.class, TimestampHandler.class);
}
private <T> void registerOptionHandler(Class<T> type, Class<? extends OptionHandler<T>> impl) {
diff --git a/java/com/google/gerrit/server/CommentsUtil.java b/java/com/google/gerrit/server/CommentsUtil.java
index 605047a..8198ce4 100644
--- a/java/com/google/gerrit/server/CommentsUtil.java
+++ b/java/com/google/gerrit/server/CommentsUtil.java
@@ -50,7 +50,7 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
@@ -67,7 +67,7 @@
@Singleton
public class CommentsUtil {
public static final Ordering<Comment> COMMENT_ORDER =
- new Ordering<Comment>() {
+ new Ordering<>() {
@Override
public int compare(Comment c1, Comment c2) {
return ComparisonChain.start()
@@ -81,7 +81,7 @@
};
public static final Ordering<CommentInfo> COMMENT_INFO_ORDER =
- new Ordering<CommentInfo>() {
+ new Ordering<>() {
@Override
public int compare(CommentInfo a, CommentInfo b) {
return ComparisonChain.start()
@@ -133,7 +133,7 @@
public HumanComment newHumanComment(
ChangeNotes changeNotes,
CurrentUser currentUser,
- Timestamp when,
+ Instant when,
String path,
PatchSet.Id psId,
short side,
@@ -305,7 +305,7 @@
}
private static boolean isAfter(CommentInfo c, ChangeMessage cm) {
- return c.updated.after(cm.getWrittenOn());
+ return c.getUpdated().isAfter(cm.getWrittenOn());
}
/**
diff --git a/java/com/google/gerrit/server/CommonConverters.java b/java/com/google/gerrit/server/CommonConverters.java
index 2b48169..e7fd1c5 100644
--- a/java/com/google/gerrit/server/CommonConverters.java
+++ b/java/com/google/gerrit/server/CommonConverters.java
@@ -15,7 +15,6 @@
package com.google.gerrit.server;
import com.google.gerrit.extensions.common.GitPerson;
-import java.sql.Timestamp;
import org.eclipse.jgit.lib.PersonIdent;
/**
@@ -26,11 +25,14 @@
* static utility methods.
*/
public class CommonConverters {
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
public static GitPerson toGitPerson(PersonIdent ident) {
GitPerson result = new GitPerson();
result.name = ident.getName();
result.email = ident.getEmailAddress();
- result.date = new Timestamp(ident.getWhen().getTime());
+ result.setDate(ident.getWhen().toInstant());
result.tz = ident.getTimeZoneOffset();
return result;
}
diff --git a/java/com/google/gerrit/server/ExceptionHookImpl.java b/java/com/google/gerrit/server/ExceptionHookImpl.java
index 3986842..781f196 100644
--- a/java/com/google/gerrit/server/ExceptionHookImpl.java
+++ b/java/com/google/gerrit/server/ExceptionHookImpl.java
@@ -18,7 +18,7 @@
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableList;
import com.google.gerrit.common.Nullable;
-import com.google.gerrit.exceptions.InternalServerWithUserMessageException;
+import com.google.gerrit.exceptions.MergeUpdateException;
import com.google.gerrit.git.LockFailureException;
import com.google.gerrit.server.project.ProjectConfig;
import java.util.Optional;
@@ -74,7 +74,7 @@
+ "\n"
+ CONTACT_PROJECT_OWNER_USER_MESSAGE);
}
- if (throwable instanceof InternalServerWithUserMessageException) {
+ if (throwable instanceof MergeUpdateException) {
return ImmutableList.of(throwable.getMessage());
}
return ImmutableList.of();
diff --git a/java/com/google/gerrit/server/IdentifiedUser.java b/java/com/google/gerrit/server/IdentifiedUser.java
index eb3e324..122e18d 100644
--- a/java/com/google/gerrit/server/IdentifiedUser.java
+++ b/java/com/google/gerrit/server/IdentifiedUser.java
@@ -49,7 +49,7 @@
import java.net.MalformedURLException;
import java.net.SocketAddress;
import java.net.URL;
-import java.util.Date;
+import java.time.Instant;
import java.util.Optional;
import java.util.Set;
import java.util.TimeZone;
@@ -427,10 +427,10 @@
}
public PersonIdent newRefLogIdent() {
- return newRefLogIdent(new Date(), TimeZone.getDefault());
+ return newRefLogIdent(Instant.now(), TimeZone.getDefault());
}
- public PersonIdent newRefLogIdent(Date when, TimeZone tz) {
+ public PersonIdent newRefLogIdent(Instant when, TimeZone tz) {
final Account ua = getAccount();
String name = ua.fullName();
@@ -450,14 +450,22 @@
? constructMailAddress(ua, "unknown")
: ua.preferredEmail();
}
- return new PersonIdent(name, user, when, tz);
+
+ return newPersonIdent(name, user, when, tz);
}
private String constructMailAddress(Account ua, String host) {
return getUserName().orElse("") + "|account-" + ua.id().toString() + "@" + host;
}
- public PersonIdent newCommitterIdent(Date when, TimeZone tz) {
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
+ public PersonIdent newCommitterIdent(PersonIdent ident) {
+ return newCommitterIdent(ident.getWhen().toInstant(), ident.getTimeZone());
+ }
+
+ public PersonIdent newCommitterIdent(Instant when, TimeZone tz) {
final Account ua = getAccount();
String name = ua.fullName();
String email = ua.preferredEmail();
@@ -492,7 +500,7 @@
}
}
- return new PersonIdent(name, email, when, tz);
+ return newPersonIdent(name, email, when, tz);
}
@Override
@@ -560,4 +568,19 @@
}
return host;
}
+
+ /**
+ * Create a {@link PersonIdent} from an {@code Instant} and a {@link TimeZone}.
+ *
+ * <p>We use the {@link PersonIdent#PersonIdent(String, String, long, int)} constructor to avoid
+ * doing a conversion to {@code java.util.Date} here. For the {@code int aTZ} argument, which is
+ * the time zone, we do the same computation as in {@link PersonIdent#PersonIdent(String, String,
+ * java.util.Date, TimeZone)} (just instead of getting the epoch millis from {@code
+ * java.util.Date} we get them from {@link Instant}).
+ */
+ // TODO(issue-15517): Drop this method once JGit's PersonIdent class supports Instants
+ private static PersonIdent newPersonIdent(String name, String email, Instant when, TimeZone tz) {
+ return new PersonIdent(
+ name, email, when.toEpochMilli(), tz.getOffset(when.toEpochMilli()) / (60 * 1000));
+ }
}
diff --git a/java/com/google/gerrit/server/PatchSetUtil.java b/java/com/google/gerrit/server/PatchSetUtil.java
index 326ddf4..3d449b7 100644
--- a/java/com/google/gerrit/server/PatchSetUtil.java
+++ b/java/com/google/gerrit/server/PatchSetUtil.java
@@ -39,7 +39,6 @@
import com.google.inject.Provider;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
import java.util.List;
import java.util.Optional;
import java.util.Set;
@@ -106,7 +105,7 @@
.id(psId)
.commitId(commit)
.uploader(update.getAccountId())
- .createdOn(new Timestamp(update.getWhen().getTime()))
+ .createdOn(update.getWhen())
.groups(groups)
.pushCertificate(Optional.ofNullable(pushCertificate))
.description(Optional.ofNullable(description))
diff --git a/java/com/google/gerrit/server/PublishCommentUtil.java b/java/com/google/gerrit/server/PublishCommentUtil.java
index 4d19dd0..de5f023 100644
--- a/java/com/google/gerrit/server/PublishCommentUtil.java
+++ b/java/com/google/gerrit/server/PublishCommentUtil.java
@@ -32,6 +32,7 @@
import com.google.gerrit.server.update.ChangeContext;
import com.google.inject.Inject;
import com.google.inject.Singleton;
+import java.sql.Timestamp;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
@@ -90,7 +91,7 @@
draftComment, psIdOfDraftComment, notes.getProjectName());
continue;
}
- draftComment.writtenOn = ctx.getWhen();
+ draftComment.writtenOn = Timestamp.from(ctx.getWhen());
draftComment.tag = tag;
// Draft may have been created by a different real user; copy the current real user. (Only
// applies to X-Gerrit-RunAs, since modifying drafts via on_behalf_of is not allowed.)
diff --git a/java/com/google/gerrit/server/ReviewerByEmailSet.java b/java/com/google/gerrit/server/ReviewerByEmailSet.java
index 4a317c3..c6ba7b5 100644
--- a/java/com/google/gerrit/server/ReviewerByEmailSet.java
+++ b/java/com/google/gerrit/server/ReviewerByEmailSet.java
@@ -19,7 +19,7 @@
import com.google.common.collect.Table;
import com.google.gerrit.entities.Address;
import com.google.gerrit.server.notedb.ReviewerStateInternal;
-import java.sql.Timestamp;
+import java.time.Instant;
/**
* Set of reviewers on a change that do not have a Gerrit account and were added by email instead.
@@ -30,8 +30,7 @@
public class ReviewerByEmailSet {
private static final ReviewerByEmailSet EMPTY = new ReviewerByEmailSet(ImmutableTable.of());
- public static ReviewerByEmailSet fromTable(
- Table<ReviewerStateInternal, Address, Timestamp> table) {
+ public static ReviewerByEmailSet fromTable(Table<ReviewerStateInternal, Address, Instant> table) {
return new ReviewerByEmailSet(table);
}
@@ -39,10 +38,10 @@
return EMPTY;
}
- private final ImmutableTable<ReviewerStateInternal, Address, Timestamp> table;
+ private final ImmutableTable<ReviewerStateInternal, Address, Instant> table;
private ImmutableSet<Address> users;
- private ReviewerByEmailSet(Table<ReviewerStateInternal, Address, Timestamp> table) {
+ private ReviewerByEmailSet(Table<ReviewerStateInternal, Address, Instant> table) {
this.table = ImmutableTable.copyOf(table);
}
@@ -58,7 +57,7 @@
return table.row(state).keySet();
}
- public ImmutableTable<ReviewerStateInternal, Address, Timestamp> asTable() {
+ public ImmutableTable<ReviewerStateInternal, Address, Instant> asTable() {
return table;
}
diff --git a/java/com/google/gerrit/server/ReviewerSet.java b/java/com/google/gerrit/server/ReviewerSet.java
index 0f6bf29..0ff68e0 100644
--- a/java/com/google/gerrit/server/ReviewerSet.java
+++ b/java/com/google/gerrit/server/ReviewerSet.java
@@ -25,7 +25,7 @@
import com.google.gerrit.entities.Account;
import com.google.gerrit.entities.PatchSetApproval;
import com.google.gerrit.server.notedb.ReviewerStateInternal;
-import java.sql.Timestamp;
+import java.time.Instant;
/**
* Set of reviewers on a change.
@@ -38,7 +38,7 @@
public static ReviewerSet fromApprovals(Iterable<PatchSetApproval> approvals) {
PatchSetApproval first = null;
- Table<ReviewerStateInternal, Account.Id, Timestamp> reviewers = HashBasedTable.create();
+ Table<ReviewerStateInternal, Account.Id, Instant> reviewers = HashBasedTable.create();
for (PatchSetApproval psa : approvals) {
if (first == null) {
first = psa;
@@ -58,7 +58,7 @@
return new ReviewerSet(reviewers);
}
- public static ReviewerSet fromTable(Table<ReviewerStateInternal, Account.Id, Timestamp> table) {
+ public static ReviewerSet fromTable(Table<ReviewerStateInternal, Account.Id, Instant> table) {
return new ReviewerSet(table);
}
@@ -66,10 +66,10 @@
return EMPTY;
}
- private final ImmutableTable<ReviewerStateInternal, Account.Id, Timestamp> table;
+ private final ImmutableTable<ReviewerStateInternal, Account.Id, Instant> table;
private ImmutableSet<Account.Id> accounts;
- private ReviewerSet(Table<ReviewerStateInternal, Account.Id, Timestamp> table) {
+ private ReviewerSet(Table<ReviewerStateInternal, Account.Id, Instant> table) {
this.table = ImmutableTable.copyOf(table);
}
@@ -85,7 +85,7 @@
return table.row(state).keySet();
}
- public ImmutableTable<ReviewerStateInternal, Account.Id, Timestamp> asTable() {
+ public ImmutableTable<ReviewerStateInternal, Account.Id, Instant> asTable() {
return table;
}
diff --git a/java/com/google/gerrit/server/ReviewerStatusUpdate.java b/java/com/google/gerrit/server/ReviewerStatusUpdate.java
index 938d985..1e0aa43 100644
--- a/java/com/google/gerrit/server/ReviewerStatusUpdate.java
+++ b/java/com/google/gerrit/server/ReviewerStatusUpdate.java
@@ -17,17 +17,17 @@
import com.google.auto.value.AutoValue;
import com.google.gerrit.entities.Account;
import com.google.gerrit.server.notedb.ReviewerStateInternal;
-import java.sql.Timestamp;
+import java.time.Instant;
/** Change to a reviewer's status. */
@AutoValue
public abstract class ReviewerStatusUpdate {
public static ReviewerStatusUpdate create(
- Timestamp ts, Account.Id updatedBy, Account.Id reviewer, ReviewerStateInternal state) {
+ Instant ts, Account.Id updatedBy, Account.Id reviewer, ReviewerStateInternal state) {
return new AutoValue_ReviewerStatusUpdate(ts, updatedBy, reviewer, state);
}
- public abstract Timestamp date();
+ public abstract Instant date();
public abstract Account.Id updatedBy();
diff --git a/java/com/google/gerrit/server/account/AccountCacheImpl.java b/java/com/google/gerrit/server/account/AccountCacheImpl.java
index 093af68..1d9150d 100644
--- a/java/com/google/gerrit/server/account/AccountCacheImpl.java
+++ b/java/com/google/gerrit/server/account/AccountCacheImpl.java
@@ -153,7 +153,7 @@
}
private AccountState missing(Account.Id accountId) {
- Account.Builder account = Account.builder(accountId, TimeUtil.nowTs());
+ Account.Builder account = Account.builder(accountId, TimeUtil.now());
account.setActive(false);
return AccountState.forAccount(account.build());
}
diff --git a/java/com/google/gerrit/server/account/AccountConfig.java b/java/com/google/gerrit/server/account/AccountConfig.java
index 45f1f35..28e881e1 100644
--- a/java/com/google/gerrit/server/account/AccountConfig.java
+++ b/java/com/google/gerrit/server/account/AccountConfig.java
@@ -34,8 +34,9 @@
import com.google.gerrit.server.git.meta.VersionedMetaData;
import com.google.gerrit.server.util.time.TimeUtil;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.ArrayList;
+import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -177,7 +178,7 @@
* @throws DuplicateKeyException if the user branch already exists
*/
public Account getNewAccount() throws DuplicateKeyException {
- return getNewAccount(TimeUtil.nowTs());
+ return getNewAccount(TimeUtil.now());
}
/**
@@ -186,7 +187,7 @@
* @return the new account
* @throws DuplicateKeyException if the user branch already exists
*/
- Account getNewAccount(Timestamp registeredOn) throws DuplicateKeyException {
+ Account getNewAccount(Instant registeredOn) throws DuplicateKeyException {
checkLoaded();
if (revision != null) {
throw new DuplicateKeyException(String.format("account %s already exists", accountId));
@@ -216,7 +217,7 @@
rw.reset();
rw.markStart(revision);
rw.sort(RevSort.REVERSE);
- Timestamp registeredOn = new Timestamp(rw.next().getCommitTime() * 1000L);
+ Instant registeredOn = Instant.ofEpochMilli(rw.next().getCommitTime() * 1000L);
Config accountConfig = readConfig(AccountProperties.ACCOUNT_CONFIG);
loadedAccountProperties =
@@ -257,6 +258,9 @@
return c;
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
@Override
protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
checkLoaded();
@@ -274,9 +278,9 @@
commit.setMessage("Create account\n");
}
- Timestamp registeredOn = loadedAccountProperties.get().getRegisteredOn();
- commit.setAuthor(new PersonIdent(commit.getAuthor(), registeredOn));
- commit.setCommitter(new PersonIdent(commit.getCommitter(), registeredOn));
+ Instant registeredOn = loadedAccountProperties.get().getRegisteredOn();
+ commit.setAuthor(new PersonIdent(commit.getAuthor(), Date.from(registeredOn)));
+ commit.setCommitter(new PersonIdent(commit.getCommitter(), Date.from(registeredOn)));
}
saveAccount();
diff --git a/java/com/google/gerrit/server/account/AccountProperties.java b/java/com/google/gerrit/server/account/AccountProperties.java
index 9b7ca81..928d851 100644
--- a/java/com/google/gerrit/server/account/AccountProperties.java
+++ b/java/com/google/gerrit/server/account/AccountProperties.java
@@ -17,7 +17,7 @@
import com.google.common.base.Strings;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.entities.Account;
-import java.sql.Timestamp;
+import java.time.Instant;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.ObjectId;
@@ -57,16 +57,13 @@
public static final String KEY_STATUS = "status";
private final Account.Id accountId;
- private final Timestamp registeredOn;
+ private final Instant registeredOn;
private final Config accountConfig;
private @Nullable ObjectId metaId;
private Account account;
AccountProperties(
- Account.Id accountId,
- Timestamp registeredOn,
- Config accountConfig,
- @Nullable ObjectId metaId) {
+ Account.Id accountId, Instant registeredOn, Config accountConfig, @Nullable ObjectId metaId) {
this.accountId = accountId;
this.registeredOn = registeredOn;
this.accountConfig = accountConfig;
@@ -80,7 +77,7 @@
return account;
}
- public Timestamp getRegisteredOn() {
+ public Instant getRegisteredOn() {
return registeredOn;
}
diff --git a/java/com/google/gerrit/server/account/AccountResource.java b/java/com/google/gerrit/server/account/AccountResource.java
index 4fb69bd..9629809 100644
--- a/java/com/google/gerrit/server/account/AccountResource.java
+++ b/java/com/google/gerrit/server/account/AccountResource.java
@@ -23,20 +23,16 @@
import java.util.Set;
public class AccountResource implements RestResource {
- public static final TypeLiteral<RestView<AccountResource>> ACCOUNT_KIND =
- new TypeLiteral<RestView<AccountResource>>() {};
+ public static final TypeLiteral<RestView<AccountResource>> ACCOUNT_KIND = new TypeLiteral<>() {};
- public static final TypeLiteral<RestView<Capability>> CAPABILITY_KIND =
- new TypeLiteral<RestView<Capability>>() {};
+ public static final TypeLiteral<RestView<Capability>> CAPABILITY_KIND = new TypeLiteral<>() {};
- public static final TypeLiteral<RestView<Email>> EMAIL_KIND =
- new TypeLiteral<RestView<Email>>() {};
+ public static final TypeLiteral<RestView<Email>> EMAIL_KIND = new TypeLiteral<>() {};
- public static final TypeLiteral<RestView<SshKey>> SSH_KEY_KIND =
- new TypeLiteral<RestView<SshKey>>() {};
+ public static final TypeLiteral<RestView<SshKey>> SSH_KEY_KIND = new TypeLiteral<>() {};
public static final TypeLiteral<RestView<StarredChange>> STARRED_CHANGE_KIND =
- new TypeLiteral<RestView<StarredChange>>() {};
+ new TypeLiteral<>() {};
private final IdentifiedUser user;
@@ -106,8 +102,7 @@
}
public static class Star implements RestResource {
- public static final TypeLiteral<RestView<Star>> STAR_KIND =
- new TypeLiteral<RestView<Star>>() {};
+ public static final TypeLiteral<RestView<Star>> STAR_KIND = new TypeLiteral<>() {};
private final IdentifiedUser user;
private final ChangeResource change;
diff --git a/java/com/google/gerrit/server/account/AccountsUpdate.java b/java/com/google/gerrit/server/account/AccountsUpdate.java
index 3706304..0e643f8 100644
--- a/java/com/google/gerrit/server/account/AccountsUpdate.java
+++ b/java/com/google/gerrit/server/account/AccountsUpdate.java
@@ -49,7 +49,6 @@
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject;
import java.io.IOException;
-import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@@ -295,9 +294,7 @@
private static PersonIdent createPersonIdent(
PersonIdent serverIdent, Optional<IdentifiedUser> user) {
- return user.isPresent()
- ? user.get().newCommitterIdent(serverIdent.getWhen(), serverIdent.getTimeZone())
- : serverIdent;
+ return user.isPresent() ? user.get().newCommitterIdent(serverIdent) : serverIdent;
}
/**
@@ -322,6 +319,9 @@
* @throws IOException if creating the user branch fails due to an IO error
* @throws ConfigInvalidException if any of the account fields has an invalid value
*/
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
public AccountState insert(String message, Account.Id accountId, ConfigureDeltaFromState init)
throws IOException, ConfigInvalidException {
return execute(
@@ -329,8 +329,7 @@
repo -> {
AccountConfig accountConfig = read(repo, accountId);
Account account =
- accountConfig.getNewAccount(
- new Timestamp(committerIdent.getWhen().getTime()));
+ accountConfig.getNewAccount(committerIdent.getWhen().toInstant());
AccountState accountState = AccountState.forAccount(account);
AccountDelta.Builder deltaBuilder = AccountDelta.builder();
init.configure(accountState, deltaBuilder);
diff --git a/java/com/google/gerrit/server/account/CachedAccountDetails.java b/java/com/google/gerrit/server/account/CachedAccountDetails.java
index f23a766..2ab6174 100644
--- a/java/com/google/gerrit/server/account/CachedAccountDetails.java
+++ b/java/com/google/gerrit/server/account/CachedAccountDetails.java
@@ -30,7 +30,6 @@
import com.google.gerrit.server.cache.serialize.CacheSerializer;
import com.google.gerrit.server.cache.serialize.ObjectIdConverter;
import com.google.gerrit.server.config.CachedPreferences;
-import java.sql.Timestamp;
import java.time.Instant;
import java.util.Map;
import org.eclipse.jgit.lib.ObjectId;
@@ -107,7 +106,7 @@
Cache.AccountProto.Builder accountProto =
Cache.AccountProto.newBuilder()
.setId(account.id().get())
- .setRegisteredOn(account.registeredOn().toInstant().toEpochMilli())
+ .setRegisteredOn(account.registeredOn().toEpochMilli())
.setInactive(account.inactive())
.setFullName(Strings.nullToEmpty(account.fullName()))
.setDisplayName(Strings.nullToEmpty(account.displayName()))
@@ -143,7 +142,7 @@
Account account =
Account.builder(
Account.id(proto.getAccount().getId()),
- Timestamp.from(Instant.ofEpochMilli(proto.getAccount().getRegisteredOn())))
+ Instant.ofEpochMilli(proto.getAccount().getRegisteredOn()))
.setFullName(Strings.emptyToNull(proto.getAccount().getFullName()))
.setDisplayName(Strings.emptyToNull(proto.getAccount().getDisplayName()))
.setPreferredEmail(Strings.emptyToNull(proto.getAccount().getPreferredEmail()))
diff --git a/java/com/google/gerrit/server/account/Emails.java b/java/com/google/gerrit/server/account/Emails.java
index 98d0d50..45f0844 100644
--- a/java/com/google/gerrit/server/account/Emails.java
+++ b/java/com/google/gerrit/server/account/Emails.java
@@ -29,7 +29,6 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
@@ -114,11 +113,14 @@
return externalIds.byEmail(email).stream().map(ExternalId::accountId).collect(toImmutableSet());
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
public UserIdentity toUserIdentity(PersonIdent who) throws IOException {
UserIdentity u = new UserIdentity();
u.setName(who.getName());
u.setEmail(who.getEmailAddress());
- u.setDate(new Timestamp(who.getWhen().getTime()));
+ u.setDate(who.getWhen().toInstant());
u.setTimeZone(who.getTimeZoneOffset());
// If only one account has access to this email address, select it
diff --git a/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java b/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java
index 9521759..5baed86 100644
--- a/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java
+++ b/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java
@@ -507,7 +507,7 @@
@Override
public ListRefsRequest<BranchInfo> branches() {
- return new ListRefsRequest<BranchInfo>() {
+ return new ListRefsRequest<>() {
@Override
public List<BranchInfo> get() throws RestApiException {
try {
@@ -521,7 +521,7 @@
@Override
public ListRefsRequest<TagInfo> tags() {
- return new ListRefsRequest<TagInfo>() {
+ return new ListRefsRequest<>() {
@Override
public List<TagInfo> get() throws RestApiException {
try {
diff --git a/java/com/google/gerrit/server/approval/ApprovalsUtil.java b/java/com/google/gerrit/server/approval/ApprovalsUtil.java
index c3921f8..8d227f7 100644
--- a/java/com/google/gerrit/server/approval/ApprovalsUtil.java
+++ b/java/com/google/gerrit/server/approval/ApprovalsUtil.java
@@ -53,10 +53,10 @@
import com.google.gerrit.server.util.LabelVote;
import com.google.inject.Inject;
import com.google.inject.Singleton;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
-import java.util.Date;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
@@ -80,7 +80,7 @@
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
public static PatchSetApproval.Builder newApproval(
- PatchSet.Id psId, CurrentUser user, LabelId labelId, int value, Date when) {
+ PatchSet.Id psId, CurrentUser user, LabelId labelId, int value, Instant when) {
PatchSetApproval.Builder b =
PatchSetApproval.builder()
.key(PatchSetApproval.key(psId, user.getAccountId(), labelId))
@@ -297,7 +297,7 @@
}
checkApprovals(approvals, permissionBackend.user(user).change(update.getNotes()));
List<PatchSetApproval> cells = new ArrayList<>(approvals.size());
- Date ts = update.getWhen();
+ Instant ts = update.getWhen();
for (Map.Entry<String, Short> vote : approvals.entrySet()) {
Optional<LabelType> lt = labelTypes.byLabel(vote.getKey());
if (!lt.isPresent()) {
diff --git a/java/com/google/gerrit/server/approval/PatchSetApprovalUuidGenerator.java b/java/com/google/gerrit/server/approval/PatchSetApprovalUuidGenerator.java
index f5110c3..e752ec5 100644
--- a/java/com/google/gerrit/server/approval/PatchSetApprovalUuidGenerator.java
+++ b/java/com/google/gerrit/server/approval/PatchSetApprovalUuidGenerator.java
@@ -19,7 +19,7 @@
import com.google.gerrit.entities.PatchSetApproval;
import com.google.gerrit.entities.PatchSetApproval.UUID;
import com.google.inject.ImplementedBy;
-import java.util.Date;
+import java.time.Instant;
/**
* Generator for {@link PatchSetApproval.UUID}.
@@ -34,5 +34,6 @@
* Generates {@link PatchSetApproval.UUID} based on the properties of {@link PatchSetApproval}
* that is being granted.
*/
- UUID get(PatchSet.Id patchSetId, Account.Id accountId, String label, short value, Date granted);
+ UUID get(
+ PatchSet.Id patchSetId, Account.Id accountId, String label, short value, Instant granted);
}
diff --git a/java/com/google/gerrit/server/approval/PatchSetApprovalUuidGeneratorImpl.java b/java/com/google/gerrit/server/approval/PatchSetApprovalUuidGeneratorImpl.java
index 32aaf5ac..afa0384 100644
--- a/java/com/google/gerrit/server/approval/PatchSetApprovalUuidGeneratorImpl.java
+++ b/java/com/google/gerrit/server/approval/PatchSetApprovalUuidGeneratorImpl.java
@@ -20,7 +20,7 @@
import com.google.gerrit.entities.PatchSetApproval.UUID;
import com.google.inject.Singleton;
import java.security.MessageDigest;
-import java.util.Date;
+import java.time.Instant;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
@@ -32,14 +32,14 @@
public class PatchSetApprovalUuidGeneratorImpl implements PatchSetApprovalUuidGenerator {
@Override
public UUID get(
- PatchSet.Id patchSetId, Account.Id accountId, String label, short value, Date granted) {
+ PatchSet.Id patchSetId, Account.Id accountId, String label, short value, Instant granted) {
MessageDigest md = Constants.newMessageDigest();
md.update(
Constants.encode("patchSetId " + patchSetId.getCommaSeparatedChangeAndPatchSetId() + "\n"));
md.update(Constants.encode("accountId " + accountId + "\n"));
md.update(Constants.encode("label " + label + "\n"));
md.update(Constants.encode("value " + value + "\n"));
- md.update(Constants.encode("granted " + granted.getTime() + "\n"));
+ md.update(Constants.encode("granted " + granted.toEpochMilli() + "\n"));
md.update(Constants.encode(String.valueOf(Math.random())));
return PatchSetApproval.uuid(ObjectId.fromRaw(md.digest()).name());
}
diff --git a/java/com/google/gerrit/server/approval/testing/TestPatchSetApprovalUuidGenerator.java b/java/com/google/gerrit/server/approval/testing/TestPatchSetApprovalUuidGenerator.java
index b67f8ee..f6527d2 100644
--- a/java/com/google/gerrit/server/approval/testing/TestPatchSetApprovalUuidGenerator.java
+++ b/java/com/google/gerrit/server/approval/testing/TestPatchSetApprovalUuidGenerator.java
@@ -5,7 +5,7 @@
import com.google.gerrit.entities.PatchSetApproval;
import com.google.gerrit.entities.PatchSetApproval.UUID;
import com.google.gerrit.server.approval.PatchSetApprovalUuidGenerator;
-import java.util.Date;
+import java.time.Instant;
import javax.inject.Singleton;
/**
@@ -18,7 +18,7 @@
@Override
public UUID get(
- PatchSet.Id patchSetId, Account.Id accountId, String label, short value, Date granted) {
+ PatchSet.Id patchSetId, Account.Id accountId, String label, short value, Instant granted) {
invocationCount++;
return PatchSetApproval.uuid(
String.format(
diff --git a/java/com/google/gerrit/server/args4j/TimestampHandler.java b/java/com/google/gerrit/server/args4j/InstantHandler.java
similarity index 73%
rename from java/com/google/gerrit/server/args4j/TimestampHandler.java
rename to java/com/google/gerrit/server/args4j/InstantHandler.java
index eddfbcd..bfca0f6 100644
--- a/java/com/google/gerrit/server/args4j/TimestampHandler.java
+++ b/java/com/google/gerrit/server/args4j/InstantHandler.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2014 The Android Open Source Project
+// Copyright (C) 2021 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -16,11 +16,10 @@
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
-import java.sql.Timestamp;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.TimeZone;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.OptionDef;
@@ -28,14 +27,14 @@
import org.kohsuke.args4j.spi.Parameters;
import org.kohsuke.args4j.spi.Setter;
-public class TimestampHandler extends OptionHandler<Timestamp> {
+public class InstantHandler extends OptionHandler<Instant> {
public static final String TIMESTAMP_FORMAT = "yyyyMMdd_HHmm";
@Inject
- public TimestampHandler(
+ public InstantHandler(
@Assisted CmdLineParser parser,
@Assisted OptionDef option,
- @Assisted Setter<Timestamp> setter) {
+ @Assisted Setter<Instant> setter) {
super(parser, option, setter);
}
@@ -43,11 +42,12 @@
public int parseArguments(Parameters params) throws CmdLineException {
String timestamp = params.getParameter(0);
try {
- DateFormat fmt = new SimpleDateFormat(TIMESTAMP_FORMAT);
- fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
- setter.addValue(new Timestamp(fmt.parse(timestamp).getTime()));
+ setter.addValue(
+ DateTimeFormatter.ofPattern(TIMESTAMP_FORMAT)
+ .withZone(ZoneId.of("UTC"))
+ .parse(timestamp, Instant::from));
return 1;
- } catch (ParseException e) {
+ } catch (DateTimeParseException e) {
throw new CmdLineException(
owner,
String.format("Invalid timestamp: %s; expected format: %s", timestamp, TIMESTAMP_FORMAT),
diff --git a/java/com/google/gerrit/server/audit/AuditService.java b/java/com/google/gerrit/server/audit/AuditService.java
index 2a5d868..695c32a 100644
--- a/java/com/google/gerrit/server/audit/AuditService.java
+++ b/java/com/google/gerrit/server/audit/AuditService.java
@@ -25,7 +25,7 @@
import com.google.gerrit.server.plugincontext.PluginSetContext;
import com.google.inject.Inject;
import com.google.inject.Singleton;
-import java.sql.Timestamp;
+import java.time.Instant;
@Singleton
public class AuditService implements GroupAuditService {
@@ -50,7 +50,7 @@
Account.Id actor,
AccountGroup.UUID updatedGroup,
ImmutableSet<Account.Id> addedMembers,
- Timestamp addedOn) {
+ Instant addedOn) {
GroupMemberAuditEvent event =
GroupMemberAuditEvent.create(actor, updatedGroup, addedMembers, addedOn);
groupAuditListeners.runEach(l -> l.onAddMembers(event));
@@ -61,7 +61,7 @@
Account.Id actor,
AccountGroup.UUID updatedGroup,
ImmutableSet<Account.Id> deletedMembers,
- Timestamp deletedOn) {
+ Instant deletedOn) {
GroupMemberAuditEvent event =
GroupMemberAuditEvent.create(actor, updatedGroup, deletedMembers, deletedOn);
groupAuditListeners.runEach(l -> l.onDeleteMembers(event));
@@ -72,7 +72,7 @@
Account.Id actor,
AccountGroup.UUID updatedGroup,
ImmutableSet<AccountGroup.UUID> addedSubgroups,
- Timestamp addedOn) {
+ Instant addedOn) {
GroupSubgroupAuditEvent event =
GroupSubgroupAuditEvent.create(actor, updatedGroup, addedSubgroups, addedOn);
groupAuditListeners.runEach(l -> l.onAddSubgroups(event));
@@ -83,7 +83,7 @@
Account.Id actor,
AccountGroup.UUID updatedGroup,
ImmutableSet<AccountGroup.UUID> deletedSubgroups,
- Timestamp deletedOn) {
+ Instant deletedOn) {
GroupSubgroupAuditEvent event =
GroupSubgroupAuditEvent.create(actor, updatedGroup, deletedSubgroups, deletedOn);
groupAuditListeners.runEach(l -> l.onDeleteSubgroups(event));
diff --git a/java/com/google/gerrit/server/audit/group/GroupAuditEvent.java b/java/com/google/gerrit/server/audit/group/GroupAuditEvent.java
index 252a1e2..c37c583 100644
--- a/java/com/google/gerrit/server/audit/group/GroupAuditEvent.java
+++ b/java/com/google/gerrit/server/audit/group/GroupAuditEvent.java
@@ -16,7 +16,7 @@
import com.google.gerrit.entities.Account;
import com.google.gerrit.entities.AccountGroup;
-import java.sql.Timestamp;
+import java.time.Instant;
/** An audit event for groups. */
public interface GroupAuditEvent {
@@ -35,9 +35,9 @@
AccountGroup.UUID getUpdatedGroup();
/**
- * Gets the {@link Timestamp} of the action.
+ * Gets the {@link Instant} of the action.
*
- * @return the {@link Timestamp} of the action.
+ * @return the {@link Instant} of the action.
*/
- Timestamp getTimestamp();
+ Instant getTimestamp();
}
diff --git a/java/com/google/gerrit/server/audit/group/GroupMemberAuditEvent.java b/java/com/google/gerrit/server/audit/group/GroupMemberAuditEvent.java
index eccfbf4..95a2dce 100644
--- a/java/com/google/gerrit/server/audit/group/GroupMemberAuditEvent.java
+++ b/java/com/google/gerrit/server/audit/group/GroupMemberAuditEvent.java
@@ -18,7 +18,7 @@
import com.google.common.collect.ImmutableSet;
import com.google.gerrit.entities.Account;
import com.google.gerrit.entities.AccountGroup;
-import java.sql.Timestamp;
+import java.time.Instant;
@AutoValue
public abstract class GroupMemberAuditEvent implements GroupAuditEvent {
@@ -26,7 +26,7 @@
Account.Id actor,
AccountGroup.UUID updatedGroup,
ImmutableSet<Account.Id> modifiedMembers,
- Timestamp timestamp) {
+ Instant timestamp) {
return new AutoValue_GroupMemberAuditEvent(actor, updatedGroup, modifiedMembers, timestamp);
}
@@ -40,5 +40,5 @@
public abstract ImmutableSet<Account.Id> getModifiedMembers();
@Override
- public abstract Timestamp getTimestamp();
+ public abstract Instant getTimestamp();
}
diff --git a/java/com/google/gerrit/server/audit/group/GroupSubgroupAuditEvent.java b/java/com/google/gerrit/server/audit/group/GroupSubgroupAuditEvent.java
index 0fe3962..ace8312 100644
--- a/java/com/google/gerrit/server/audit/group/GroupSubgroupAuditEvent.java
+++ b/java/com/google/gerrit/server/audit/group/GroupSubgroupAuditEvent.java
@@ -18,7 +18,7 @@
import com.google.common.collect.ImmutableSet;
import com.google.gerrit.entities.Account;
import com.google.gerrit.entities.AccountGroup;
-import java.sql.Timestamp;
+import java.time.Instant;
@AutoValue
public abstract class GroupSubgroupAuditEvent implements GroupAuditEvent {
@@ -26,7 +26,7 @@
Account.Id actor,
AccountGroup.UUID updatedGroup,
ImmutableSet<AccountGroup.UUID> modifiedSubgroups,
- Timestamp timestamp) {
+ Instant timestamp) {
return new AutoValue_GroupSubgroupAuditEvent(actor, updatedGroup, modifiedSubgroups, timestamp);
}
@@ -40,5 +40,5 @@
public abstract ImmutableSet<AccountGroup.UUID> getModifiedSubgroups();
@Override
- public abstract Timestamp getTimestamp();
+ public abstract Instant getTimestamp();
}
diff --git a/java/com/google/gerrit/server/cache/CacheModule.java b/java/com/google/gerrit/server/cache/CacheModule.java
index 2878624..d4e4509 100644
--- a/java/com/google/gerrit/server/cache/CacheModule.java
+++ b/java/com/google/gerrit/server/cache/CacheModule.java
@@ -35,7 +35,7 @@
public static final String MEMORY_MODULE = "cache-memory";
public static final String PERSISTENT_MODULE = "cache-persistent";
- private static final TypeLiteral<Cache<?, ?>> ANY_CACHE = new TypeLiteral<Cache<?, ?>>() {};
+ private static final TypeLiteral<Cache<?, ?>> ANY_CACHE = new TypeLiteral<>() {};
/**
* Declare a named in-memory cache.
diff --git a/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java b/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java
index 13b8b12..0403408 100644
--- a/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java
+++ b/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java
@@ -548,7 +548,7 @@
c.touch = c.conn.prepareStatement("UPDATE data SET accessed=? WHERE k=? AND version=?");
}
try {
- c.touch.setTimestamp(1, TimeUtil.nowTs());
+ c.touch.setTimestamp(1, new Timestamp(TimeUtil.nowMs()));
keyType.set(c.touch, 2, key);
c.touch.setInt(3, version);
c.touch.executeUpdate();
@@ -581,7 +581,7 @@
c.put.setBytes(2, valueSerializer.serialize(holder.value));
c.put.setInt(3, version);
c.put.setTimestamp(4, Timestamp.from(holder.created));
- c.put.setTimestamp(5, TimeUtil.nowTs());
+ c.put.setTimestamp(5, new Timestamp(TimeUtil.nowMs()));
c.put.executeUpdate();
holder.clean = true;
} finally {
diff --git a/java/com/google/gerrit/server/cache/h2/ObjectKeyTypeImpl.java b/java/com/google/gerrit/server/cache/h2/ObjectKeyTypeImpl.java
index 591883e..1812043 100644
--- a/java/com/google/gerrit/server/cache/h2/ObjectKeyTypeImpl.java
+++ b/java/com/google/gerrit/server/cache/h2/ObjectKeyTypeImpl.java
@@ -47,7 +47,7 @@
@Override
public Funnel<K> funnel() {
- return new Funnel<K>() {
+ return new Funnel<>() {
private static final long serialVersionUID = 1L;
@Override
diff --git a/java/com/google/gerrit/server/cache/serialize/CacheSerializer.java b/java/com/google/gerrit/server/cache/serialize/CacheSerializer.java
index 5377fc1..bb28a6d 100644
--- a/java/com/google/gerrit/server/cache/serialize/CacheSerializer.java
+++ b/java/com/google/gerrit/server/cache/serialize/CacheSerializer.java
@@ -31,7 +31,7 @@
* @return serializer of type {@code T}.
*/
static <T, D> CacheSerializer<T> convert(CacheSerializer<D> delegate, Converter<T, D> converter) {
- return new CacheSerializer<T>() {
+ return new CacheSerializer<>() {
@Override
public byte[] serialize(T object) {
return delegate.serialize(converter.convert(object));
diff --git a/java/com/google/gerrit/server/cache/serialize/entities/InternalGroupSerializer.java b/java/com/google/gerrit/server/cache/serialize/entities/InternalGroupSerializer.java
index 7449917..09f3543 100644
--- a/java/com/google/gerrit/server/cache/serialize/entities/InternalGroupSerializer.java
+++ b/java/com/google/gerrit/server/cache/serialize/entities/InternalGroupSerializer.java
@@ -21,7 +21,7 @@
import com.google.gerrit.entities.InternalGroup;
import com.google.gerrit.server.cache.proto.Cache;
import com.google.gerrit.server.cache.serialize.ObjectIdConverter;
-import java.sql.Timestamp;
+import java.time.Instant;
/** Helper to (de)serialize values for caches. */
public class InternalGroupSerializer {
@@ -33,7 +33,7 @@
.setOwnerGroupUUID(AccountGroup.uuid(proto.getOwnerGroupUuid()))
.setVisibleToAll(proto.getIsVisibleToAll())
.setGroupUUID(AccountGroup.uuid(proto.getGroupUuid()))
- .setCreatedOn(new Timestamp(proto.getCreatedOn()))
+ .setCreatedOn(Instant.ofEpochMilli(proto.getCreatedOn()))
.setMembers(
proto.getMembersIdsList().stream()
.map(a -> Account.id(a))
@@ -62,7 +62,7 @@
.setOwnerGroupUuid(autoValue.getOwnerGroupUUID().get())
.setIsVisibleToAll(autoValue.isVisibleToAll())
.setGroupUuid(autoValue.getGroupUUID().get())
- .setCreatedOn(autoValue.getCreatedOn().getTime());
+ .setCreatedOn(autoValue.getCreatedOn().toEpochMilli());
autoValue.getMembers().stream().forEach(m -> builder.addMembersIds(m.get()));
autoValue.getSubgroups().stream().forEach(s -> builder.addSubgroupUuids(s.get()));
diff --git a/java/com/google/gerrit/server/change/AttentionSetEntryResource.java b/java/com/google/gerrit/server/change/AttentionSetEntryResource.java
index 6c6c765..e27a1a7 100644
--- a/java/com/google/gerrit/server/change/AttentionSetEntryResource.java
+++ b/java/com/google/gerrit/server/change/AttentionSetEntryResource.java
@@ -22,7 +22,7 @@
/** REST resource that represents an entry in the attention set of a change. */
public class AttentionSetEntryResource implements RestResource {
public static final TypeLiteral<RestView<AttentionSetEntryResource>> ATTENTION_SET_ENTRY_KIND =
- new TypeLiteral<RestView<AttentionSetEntryResource>>() {};
+ new TypeLiteral<>() {};
public interface Factory {
AttentionSetEntryResource create(ChangeResource change, Account.Id id);
diff --git a/java/com/google/gerrit/server/change/BatchAbandon.java b/java/com/google/gerrit/server/change/BatchAbandon.java
index 65b6a2a..ad6d7fb 100644
--- a/java/com/google/gerrit/server/change/BatchAbandon.java
+++ b/java/com/google/gerrit/server/change/BatchAbandon.java
@@ -68,7 +68,7 @@
return;
}
AccountState accountState = user.isIdentifiedUser() ? user.asIdentifiedUser().state() : null;
- try (BatchUpdate u = updateFactory.create(project, user, TimeUtil.nowTs())) {
+ try (BatchUpdate u = updateFactory.create(project, user, TimeUtil.now())) {
u.setNotify(notify);
for (ChangeData change : changes) {
if (!project.equals(change.project())) {
diff --git a/java/com/google/gerrit/server/change/ChangeEditResource.java b/java/com/google/gerrit/server/change/ChangeEditResource.java
index 392709e..67edb56 100644
--- a/java/com/google/gerrit/server/change/ChangeEditResource.java
+++ b/java/com/google/gerrit/server/change/ChangeEditResource.java
@@ -31,7 +31,7 @@
*/
public class ChangeEditResource implements RestResource {
public static final TypeLiteral<RestView<ChangeEditResource>> CHANGE_EDIT_KIND =
- new TypeLiteral<RestView<ChangeEditResource>>() {};
+ new TypeLiteral<>() {};
private final ChangeResource change;
private final ChangeEdit edit;
diff --git a/java/com/google/gerrit/server/change/ChangeJson.java b/java/com/google/gerrit/server/change/ChangeJson.java
index 41723c8..674fc65 100644
--- a/java/com/google/gerrit/server/change/ChangeJson.java
+++ b/java/com/google/gerrit/server/change/ChangeJson.java
@@ -553,8 +553,8 @@
info.subject = c.getSubject();
info.status = c.getStatus().asChangeStatus();
info.owner = new AccountInfo(c.getOwner().get());
- info.created = c.getCreatedOn();
- info.updated = c.getLastUpdatedOn();
+ info.setCreated(c.getCreatedOn());
+ info.setUpdated(c.getLastUpdatedOn());
info._number = c.getId().get();
info.problems = result.problems();
info.isPrivate = c.isPrivate() ? true : null;
@@ -642,8 +642,8 @@
out.subject = in.getSubject();
out.status = in.getStatus().asChangeStatus();
out.owner = accountLoader.get(in.getOwner());
- out.created = in.getCreatedOn();
- out.updated = in.getLastUpdatedOn();
+ out.setCreated(in.getCreatedOn());
+ out.setUpdated(in.getLastUpdatedOn());
out._number = in.getId().get();
out.totalCommentCount = cd.totalCommentCount();
out.unresolvedCommentCount = cd.unresolvedCommentCount();
@@ -775,11 +775,12 @@
List<ReviewerStatusUpdate> reviewerUpdates = cd.reviewerUpdates();
List<ReviewerUpdateInfo> result = new ArrayList<>(reviewerUpdates.size());
for (ReviewerStatusUpdate c : reviewerUpdates) {
- ReviewerUpdateInfo change = new ReviewerUpdateInfo();
- change.updated = c.date();
- change.state = c.state().asReviewerState();
- change.updatedBy = accountLoader.get(c.updatedBy());
- change.reviewer = accountLoader.get(c.reviewer());
+ ReviewerUpdateInfo change =
+ new ReviewerUpdateInfo(
+ c.date(),
+ accountLoader.get(c.updatedBy()),
+ accountLoader.get(c.reviewer()),
+ c.state().asReviewerState());
result.add(change);
}
return result;
@@ -801,8 +802,7 @@
if (!s.isPresent()) {
return;
}
- out.submitted = s.get().granted();
- out.submitter = accountLoader.get(s.get().accountId());
+ out.setSubmitted(s.get().granted(), accountLoader.get(s.get().accountId()));
}
private ImmutableList<ChangeMessageInfo> messages(ChangeData cd) {
diff --git a/java/com/google/gerrit/server/change/ChangeMessageResource.java b/java/com/google/gerrit/server/change/ChangeMessageResource.java
index 25f952d..751faa0 100644
--- a/java/com/google/gerrit/server/change/ChangeMessageResource.java
+++ b/java/com/google/gerrit/server/change/ChangeMessageResource.java
@@ -23,7 +23,7 @@
/** A change message resource. */
public class ChangeMessageResource implements RestResource {
public static final TypeLiteral<RestView<ChangeMessageResource>> CHANGE_MESSAGE_KIND =
- new TypeLiteral<RestView<ChangeMessageResource>>() {};
+ new TypeLiteral<>() {};
private final ChangeResource changeResource;
private final ChangeMessageInfo changeMessage;
diff --git a/java/com/google/gerrit/server/change/ChangeResource.java b/java/com/google/gerrit/server/change/ChangeResource.java
index 970f1b5..919586e 100644
--- a/java/com/google/gerrit/server/change/ChangeResource.java
+++ b/java/com/google/gerrit/server/change/ChangeResource.java
@@ -62,8 +62,7 @@
*/
public static final int JSON_FORMAT_VERSION = 1;
- public static final TypeLiteral<RestView<ChangeResource>> CHANGE_KIND =
- new TypeLiteral<RestView<ChangeResource>>() {};
+ public static final TypeLiteral<RestView<ChangeResource>> CHANGE_KIND = new TypeLiteral<>() {};
public interface Factory {
ChangeResource create(ChangeNotes notes, CurrentUser user);
@@ -166,7 +165,7 @@
// unrelated to the UI.
public void prepareETag(Hasher h, CurrentUser user) {
h.putInt(JSON_FORMAT_VERSION)
- .putLong(getChange().getLastUpdatedOn().getTime())
+ .putLong(getChange().getLastUpdatedOn().toEpochMilli())
.putInt(user.isIdentifiedUser() ? user.getAccountId().get() : 0);
if (user.isIdentifiedUser()) {
diff --git a/java/com/google/gerrit/server/change/ConsistencyChecker.java b/java/com/google/gerrit/server/change/ConsistencyChecker.java
index 2b0d512..0775647 100644
--- a/java/com/google/gerrit/server/change/ConsistencyChecker.java
+++ b/java/com/google/gerrit/server/change/ConsistencyChecker.java
@@ -626,7 +626,7 @@
}
private BatchUpdate newBatchUpdate() {
- return updateFactory.create(change().getProject(), user.get(), TimeUtil.nowTs());
+ return updateFactory.create(change().getProject(), user.get(), TimeUtil.now());
}
private void fixPatchSetRef(ProblemInfo p, PatchSet ps) {
diff --git a/java/com/google/gerrit/server/change/DeleteReviewerOp.java b/java/com/google/gerrit/server/change/DeleteReviewerOp.java
index 415383a..0116b01 100644
--- a/java/com/google/gerrit/server/change/DeleteReviewerOp.java
+++ b/java/com/google/gerrit/server/change/DeleteReviewerOp.java
@@ -195,7 +195,12 @@
try {
if (notify.shouldNotify()) {
emailReviewers(
- ctx.getProject(), currChange, mailMessage, ctx.getWhen(), notify, ctx.getRepoView());
+ ctx.getProject(),
+ currChange,
+ mailMessage,
+ Timestamp.from(ctx.getWhen()),
+ notify,
+ ctx.getRepoView());
}
} catch (Exception err) {
logger.atSevere().withCause(err).log(
@@ -251,7 +256,7 @@
deleteReviewerSenderFactory.create(projectName, change.getId());
emailSender.setFrom(userId);
emailSender.addReviewers(Collections.singleton(reviewer.id()));
- emailSender.setChangeMessage(mailMessage, timestamp);
+ emailSender.setChangeMessage(mailMessage, timestamp.toInstant());
emailSender.setNotify(notify);
emailSender.setMessageId(
messageIdGenerator.fromChangeUpdate(repoView, change.currentPatchSetId()));
diff --git a/java/com/google/gerrit/server/change/DraftCommentResource.java b/java/com/google/gerrit/server/change/DraftCommentResource.java
index 19a495d..2e40f2c 100644
--- a/java/com/google/gerrit/server/change/DraftCommentResource.java
+++ b/java/com/google/gerrit/server/change/DraftCommentResource.java
@@ -25,7 +25,7 @@
public class DraftCommentResource implements RestResource {
public static final TypeLiteral<RestView<DraftCommentResource>> DRAFT_COMMENT_KIND =
- new TypeLiteral<RestView<DraftCommentResource>>() {};
+ new TypeLiteral<>() {};
private final RevisionResource rev;
private final HumanComment comment;
diff --git a/java/com/google/gerrit/server/change/EmailReviewComments.java b/java/com/google/gerrit/server/change/EmailReviewComments.java
index 3c7ea44..f94e592 100644
--- a/java/com/google/gerrit/server/change/EmailReviewComments.java
+++ b/java/com/google/gerrit/server/change/EmailReviewComments.java
@@ -33,7 +33,7 @@
import com.google.gerrit.server.util.ThreadLocalRequestContext;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
@@ -66,7 +66,7 @@
PatchSet patchSet,
IdentifiedUser user,
@Assisted("message") String message,
- Timestamp timestamp,
+ Instant timestamp,
List<? extends Comment> comments,
@Assisted("patchSetComment") String patchSetComment,
List<LabelVote> labels,
@@ -84,7 +84,7 @@
private final PatchSet patchSet;
private final IdentifiedUser user;
private final String message;
- private final Timestamp timestamp;
+ private final Instant timestamp;
private final List<? extends Comment> comments;
private final String patchSetComment;
private final List<LabelVote> labels;
@@ -102,7 +102,7 @@
@Assisted PatchSet patchSet,
@Assisted IdentifiedUser user,
@Assisted("message") String message,
- @Assisted Timestamp timestamp,
+ @Assisted Instant timestamp,
@Assisted List<? extends Comment> comments,
@Nullable @Assisted("patchSetComment") String patchSetComment,
@Assisted List<LabelVote> labels,
diff --git a/java/com/google/gerrit/server/change/FileResource.java b/java/com/google/gerrit/server/change/FileResource.java
index 5402338..22fe39c 100644
--- a/java/com/google/gerrit/server/change/FileResource.java
+++ b/java/com/google/gerrit/server/change/FileResource.java
@@ -21,8 +21,7 @@
import com.google.inject.TypeLiteral;
public class FileResource implements RestResource {
- public static final TypeLiteral<RestView<FileResource>> FILE_KIND =
- new TypeLiteral<RestView<FileResource>>() {};
+ public static final TypeLiteral<RestView<FileResource>> FILE_KIND = new TypeLiteral<>() {};
private final RevisionResource rev;
private final Patch.Key key;
diff --git a/java/com/google/gerrit/server/change/FixResource.java b/java/com/google/gerrit/server/change/FixResource.java
index b6b5894..0c5ee23 100644
--- a/java/com/google/gerrit/server/change/FixResource.java
+++ b/java/com/google/gerrit/server/change/FixResource.java
@@ -21,8 +21,7 @@
import java.util.List;
public class FixResource implements RestResource {
- public static final TypeLiteral<RestView<FixResource>> FIX_KIND =
- new TypeLiteral<RestView<FixResource>>() {};
+ public static final TypeLiteral<RestView<FixResource>> FIX_KIND = new TypeLiteral<>() {};
private final List<FixReplacement> fixReplacements;
private final RevisionResource revisionResource;
diff --git a/java/com/google/gerrit/server/change/HumanCommentResource.java b/java/com/google/gerrit/server/change/HumanCommentResource.java
index 1611aaa..93a0698 100644
--- a/java/com/google/gerrit/server/change/HumanCommentResource.java
+++ b/java/com/google/gerrit/server/change/HumanCommentResource.java
@@ -23,7 +23,7 @@
public class HumanCommentResource implements RestResource {
public static final TypeLiteral<RestView<HumanCommentResource>> COMMENT_KIND =
- new TypeLiteral<RestView<HumanCommentResource>>() {};
+ new TypeLiteral<>() {};
private final RevisionResource rev;
private final HumanComment comment;
diff --git a/java/com/google/gerrit/server/change/LabelsJson.java b/java/com/google/gerrit/server/change/LabelsJson.java
index 0bc0f64..325b20a 100644
--- a/java/com/google/gerrit/server/change/LabelsJson.java
+++ b/java/com/google/gerrit/server/change/LabelsJson.java
@@ -48,7 +48,7 @@
import com.google.gerrit.server.query.change.ChangeData;
import com.google.inject.Inject;
import com.google.inject.Singleton;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -199,10 +199,10 @@
private ApprovalInfo approvalInfo(
AccountLoader accountLoader,
Account.Id id,
- Integer value,
- VotingRangeInfo permittedVotingRange,
- String tag,
- Timestamp date) {
+ @Nullable Integer value,
+ @Nullable VotingRangeInfo permittedVotingRange,
+ @Nullable String tag,
+ @Nullable Instant date) {
ApprovalInfo ai = new ApprovalInfo(id.get(), value, permittedVotingRange, tag, date);
accountLoader.put(ai);
return ai;
@@ -309,7 +309,7 @@
if (info != null) {
info.value = Integer.valueOf(val);
info.permittedVotingRange = pvr.getOrDefault(type.get().getName(), null);
- info.date = psa.granted();
+ info.setDate(psa.granted());
info.tag = psa.tag().orElse(null);
if (psa.postSubmit()) {
info.postSubmit = true;
@@ -442,7 +442,7 @@
Integer value;
VotingRangeInfo permittedVotingRange = pvr.getOrDefault(lt.get().getName(), null);
String tag = null;
- Timestamp date = null;
+ Instant date = null;
PatchSetApproval psa = current.get(accountId, lt.get().getName());
if (psa != null) {
value = Integer.valueOf(psa.value());
diff --git a/java/com/google/gerrit/server/change/RebaseChangeOp.java b/java/com/google/gerrit/server/change/RebaseChangeOp.java
index 3e67cca..57f94ff 100644
--- a/java/com/google/gerrit/server/change/RebaseChangeOp.java
+++ b/java/com/google/gerrit/server/change/RebaseChangeOp.java
@@ -392,7 +392,7 @@
if (committerIdent != null) {
cb.setCommitter(committerIdent);
} else {
- cb.setCommitter(ctx.getIdentifiedUser().newCommitterIdent(ctx.getWhen(), ctx.getTimeZone()));
+ cb.setCommitter(ctx.newCommitterIdent());
}
if (matchAuthorToCommitterDate) {
cb.setAuthor(
diff --git a/java/com/google/gerrit/server/change/ReviewerResource.java b/java/com/google/gerrit/server/change/ReviewerResource.java
index 7a98f2b..e688a7b 100644
--- a/java/com/google/gerrit/server/change/ReviewerResource.java
+++ b/java/com/google/gerrit/server/change/ReviewerResource.java
@@ -29,7 +29,7 @@
public class ReviewerResource implements RestResource {
public static final TypeLiteral<RestView<ReviewerResource>> REVIEWER_KIND =
- new TypeLiteral<RestView<ReviewerResource>>() {};
+ new TypeLiteral<>() {};
public interface Factory {
ReviewerResource create(ChangeResource change, Account.Id id);
diff --git a/java/com/google/gerrit/server/change/RevisionJson.java b/java/com/google/gerrit/server/change/RevisionJson.java
index 33f3d4f..5a2a0eb 100644
--- a/java/com/google/gerrit/server/change/RevisionJson.java
+++ b/java/com/google/gerrit/server/change/RevisionJson.java
@@ -285,7 +285,7 @@
out.isCurrent = in.id().equals(c.currentPatchSetId());
out._number = in.id().get();
out.ref = in.refName();
- out.created = in.createdOn();
+ out.setCreated(in.createdOn());
out.uploader = accountLoader.get(in.uploader());
out.fetch = makeFetchMap(cd, in);
out.kind = changeKindCache.getChangeKind(rw, repo != null ? repo.getConfig() : null, cd, in);
diff --git a/java/com/google/gerrit/server/change/RevisionResource.java b/java/com/google/gerrit/server/change/RevisionResource.java
index 30fa593..e5a57b2 100644
--- a/java/com/google/gerrit/server/change/RevisionResource.java
+++ b/java/com/google/gerrit/server/change/RevisionResource.java
@@ -35,7 +35,7 @@
public class RevisionResource implements RestResource, HasETag {
public static final TypeLiteral<RestView<RevisionResource>> REVISION_KIND =
- new TypeLiteral<RestView<RevisionResource>>() {};
+ new TypeLiteral<>() {};
public static RevisionResource createNonCacheable(ChangeResource change, PatchSet ps) {
return new RevisionResource(change, ps, Optional.empty(), false);
diff --git a/java/com/google/gerrit/server/change/RobotCommentResource.java b/java/com/google/gerrit/server/change/RobotCommentResource.java
index b12727d..3662575 100644
--- a/java/com/google/gerrit/server/change/RobotCommentResource.java
+++ b/java/com/google/gerrit/server/change/RobotCommentResource.java
@@ -23,7 +23,7 @@
public class RobotCommentResource implements RestResource {
public static final TypeLiteral<RestView<RobotCommentResource>> ROBOT_COMMENT_KIND =
- new TypeLiteral<RestView<RobotCommentResource>>() {};
+ new TypeLiteral<>() {};
private final RevisionResource rev;
private final RobotComment comment;
diff --git a/java/com/google/gerrit/server/change/VoteResource.java b/java/com/google/gerrit/server/change/VoteResource.java
index 27b5bec..3f5ec4c 100644
--- a/java/com/google/gerrit/server/change/VoteResource.java
+++ b/java/com/google/gerrit/server/change/VoteResource.java
@@ -19,8 +19,7 @@
import com.google.inject.TypeLiteral;
public class VoteResource implements RestResource {
- public static final TypeLiteral<RestView<VoteResource>> VOTE_KIND =
- new TypeLiteral<RestView<VoteResource>>() {};
+ public static final TypeLiteral<RestView<VoteResource>> VOTE_KIND = new TypeLiteral<>() {};
private final ReviewerResource reviewer;
private final String label;
diff --git a/java/com/google/gerrit/server/config/CacheResource.java b/java/com/google/gerrit/server/config/CacheResource.java
index 7a835b1..b2f790c 100644
--- a/java/com/google/gerrit/server/config/CacheResource.java
+++ b/java/com/google/gerrit/server/config/CacheResource.java
@@ -21,8 +21,7 @@
import com.google.inject.TypeLiteral;
public class CacheResource extends ConfigResource {
- public static final TypeLiteral<RestView<CacheResource>> CACHE_KIND =
- new TypeLiteral<RestView<CacheResource>>() {};
+ public static final TypeLiteral<RestView<CacheResource>> CACHE_KIND = new TypeLiteral<>() {};
private final String name;
private final Provider<Cache<?, ?>> cacheProvider;
diff --git a/java/com/google/gerrit/server/config/CapabilityResource.java b/java/com/google/gerrit/server/config/CapabilityResource.java
index 7e3c87e..5a1977b 100644
--- a/java/com/google/gerrit/server/config/CapabilityResource.java
+++ b/java/com/google/gerrit/server/config/CapabilityResource.java
@@ -19,5 +19,5 @@
public class CapabilityResource extends ConfigResource {
public static final TypeLiteral<RestView<CapabilityResource>> CAPABILITY_KIND =
- new TypeLiteral<RestView<CapabilityResource>>() {};
+ new TypeLiteral<>() {};
}
diff --git a/java/com/google/gerrit/server/config/ConfigResource.java b/java/com/google/gerrit/server/config/ConfigResource.java
index f2b7c8e..93efd19 100644
--- a/java/com/google/gerrit/server/config/ConfigResource.java
+++ b/java/com/google/gerrit/server/config/ConfigResource.java
@@ -21,8 +21,7 @@
import java.util.concurrent.TimeUnit;
public class ConfigResource implements RestResource {
- public static final TypeLiteral<RestView<ConfigResource>> CONFIG_KIND =
- new TypeLiteral<RestView<ConfigResource>>() {};
+ public static final TypeLiteral<RestView<ConfigResource>> CONFIG_KIND = new TypeLiteral<>() {};
/**
* Default cache control that gets set on the 'Cache-Control' header for responses on this
diff --git a/java/com/google/gerrit/server/config/TaskResource.java b/java/com/google/gerrit/server/config/TaskResource.java
index 7b69533..dac455f 100644
--- a/java/com/google/gerrit/server/config/TaskResource.java
+++ b/java/com/google/gerrit/server/config/TaskResource.java
@@ -19,8 +19,7 @@
import com.google.inject.TypeLiteral;
public class TaskResource extends ConfigResource {
- public static final TypeLiteral<RestView<TaskResource>> TASK_KIND =
- new TypeLiteral<RestView<TaskResource>>() {};
+ public static final TypeLiteral<RestView<TaskResource>> TASK_KIND = new TypeLiteral<>() {};
private final Task<?> task;
diff --git a/java/com/google/gerrit/server/config/TopMenuResource.java b/java/com/google/gerrit/server/config/TopMenuResource.java
index bca6331..f5c71ed 100644
--- a/java/com/google/gerrit/server/config/TopMenuResource.java
+++ b/java/com/google/gerrit/server/config/TopMenuResource.java
@@ -18,6 +18,5 @@
import com.google.inject.TypeLiteral;
public class TopMenuResource extends ConfigResource {
- public static final TypeLiteral<RestView<TopMenuResource>> TOP_MENU_KIND =
- new TypeLiteral<RestView<TopMenuResource>>() {};
+ public static final TypeLiteral<RestView<TopMenuResource>> TOP_MENU_KIND = new TypeLiteral<>() {};
}
diff --git a/java/com/google/gerrit/server/edit/ChangeEditModifier.java b/java/com/google/gerrit/server/edit/ChangeEditModifier.java
index bc905c2..81f98e6 100644
--- a/java/com/google/gerrit/server/edit/ChangeEditModifier.java
+++ b/java/com/google/gerrit/server/edit/ChangeEditModifier.java
@@ -52,7 +52,7 @@
import com.google.inject.Provider;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@@ -139,7 +139,7 @@
PatchSet currentPatchSet = lookupCurrentPatchSet(notes);
ObjectId patchSetCommitId = currentPatchSet.commitId();
- noteDbEdits.createEdit(repository, notes, currentPatchSet, patchSetCommitId, TimeUtil.nowTs());
+ noteDbEdits.createEdit(repository, notes, currentPatchSet, patchSetCommitId, TimeUtil.now());
}
/**
@@ -187,7 +187,7 @@
RevTree basePatchSetTree = basePatchSetCommit.getTree();
ObjectId newTreeId = merge(repository, changeEdit, basePatchSetTree);
- Timestamp nowTimestamp = TimeUtil.nowTs();
+ Instant nowTimestamp = TimeUtil.now();
String commitMessage = currentEditCommit.getFullMessage();
ObjectId newEditCommitId =
createCommit(repository, basePatchSetCommit, newTreeId, commitMessage, nowTimestamp);
@@ -385,7 +385,7 @@
return unmodifiedEdit.get();
}
- Timestamp nowTimestamp = TimeUtil.nowTs();
+ Instant nowTimestamp = TimeUtil.now();
ObjectId newEditCommit =
createCommit(repository, basePatchsetCommit, newTreeId, newCommitMessage, nowTimestamp);
@@ -501,7 +501,7 @@
RevCommit basePatchsetCommit,
ObjectId tree,
String commitMessage,
- Timestamp timestamp)
+ Instant timestamp)
throws IOException {
try (ObjectInserter objectInserter = repository.newObjectInserter()) {
CommitBuilder builder = new CommitBuilder();
@@ -516,7 +516,7 @@
}
}
- private PersonIdent getCommitterIdent(Timestamp commitTimestamp) {
+ private PersonIdent getCommitterIdent(Instant commitTimestamp) {
IdentifiedUser user = currentUser.get().asIdentifiedUser();
return user.newCommitterIdent(commitTimestamp, tz);
}
@@ -547,7 +547,7 @@
ChangeNotes notes,
PatchSet basePatchSet,
ObjectId newEditCommitId,
- Timestamp timestamp)
+ Instant timestamp)
throws IOException;
}
@@ -647,7 +647,7 @@
ChangeNotes notes,
PatchSet basePatchSet,
ObjectId newEditCommitId,
- Timestamp timestamp)
+ Instant timestamp)
throws IOException {
return noteDbEdits.updateEdit(
notes.getProjectName(), repository, changeEdit, newEditCommitId, timestamp);
@@ -701,7 +701,7 @@
ChangeNotes notes,
PatchSet basePatchSet,
ObjectId newEditCommitId,
- Timestamp timestamp)
+ Instant timestamp)
throws IOException {
return noteDbEdits.createEdit(repository, notes, basePatchSet, newEditCommitId, timestamp);
}
@@ -723,7 +723,7 @@
ChangeNotes notes,
PatchSet basePatchset,
ObjectId newEditCommitId,
- Timestamp timestamp)
+ Instant timestamp)
throws IOException {
Change change = notes.getChange();
String editRefName = getEditRefName(change, basePatchset);
@@ -750,7 +750,7 @@
Repository repository,
ChangeEdit changeEdit,
ObjectId newEditCommitId,
- Timestamp timestamp)
+ Instant timestamp)
throws IOException {
String editRefName = changeEdit.getRefName();
RevCommit currentEditCommit = changeEdit.getEditCommit();
@@ -769,7 +769,7 @@
String refName,
ObjectId currentObjectId,
ObjectId targetObjectId,
- Timestamp timestamp)
+ Instant timestamp)
throws IOException {
RefUpdate ru = repository.updateRef(refName);
ru.setExpectedOldObjectId(currentObjectId);
@@ -795,7 +795,7 @@
PatchSet currentPatchSet,
ObjectId currentEditCommit,
ObjectId newEditCommitId,
- Timestamp nowTimestamp)
+ Instant nowTimestamp)
throws IOException {
String newEditRefName = getEditRefName(changeEdit.getChange(), currentPatchSet);
updateReferenceWithNameChange(
@@ -814,7 +814,7 @@
ObjectId currentObjectId,
String newRefName,
ObjectId targetObjectId,
- Timestamp timestamp)
+ Instant timestamp)
throws IOException {
BatchRefUpdate batchRefUpdate = repository.getRefDatabase().newBatchUpdate();
batchRefUpdate.addCommand(new ReceiveCommand(ObjectId.zeroId(), targetObjectId, newRefName));
@@ -838,7 +838,7 @@
}
}
- private PersonIdent getRefLogIdent(Timestamp timestamp) {
+ private PersonIdent getRefLogIdent(Instant timestamp) {
IdentifiedUser user = currentUser.get().asIdentifiedUser();
return user.newRefLogIdent(timestamp, tz);
}
diff --git a/java/com/google/gerrit/server/edit/ChangeEditUtil.java b/java/com/google/gerrit/server/edit/ChangeEditUtil.java
index 6b018ce..74834ab 100644
--- a/java/com/google/gerrit/server/edit/ChangeEditUtil.java
+++ b/java/com/google/gerrit/server/edit/ChangeEditUtil.java
@@ -185,7 +185,7 @@
message.append("Published edit on patch set ").append(basePatchSet.number()).append(".");
}
- try (BatchUpdate bu = updateFactory.create(change.getProject(), user, TimeUtil.nowTs())) {
+ try (BatchUpdate bu = updateFactory.create(change.getProject(), user, TimeUtil.now())) {
bu.setRepository(repo, rw, oi);
bu.setNotify(notify);
bu.addOp(change.getId(), inserter.setMessage(message.toString()));
diff --git a/java/com/google/gerrit/server/events/EventFactory.java b/java/com/google/gerrit/server/events/EventFactory.java
index 2a2bf73..2b402a6 100644
--- a/java/com/google/gerrit/server/events/EventFactory.java
+++ b/java/com/google/gerrit/server/events/EventFactory.java
@@ -139,7 +139,7 @@
a.owner = asAccountAttribute(change.getOwner());
a.assignee = asAccountAttribute(change.getAssignee());
a.status = change.getStatus();
- a.createdOn = change.getCreatedOn().getTime() / 1000L;
+ a.createdOn = change.getCreatedOn().getEpochSecond();
a.wip = change.isWorkInProgress() ? true : null;
a.isPrivate = change.isPrivate() ? true : null;
a.cherryPickOfChange =
@@ -175,7 +175,7 @@
/** Extend the existing {@link ChangeAttribute} with additional fields. */
public void extend(ChangeAttribute a, Change change) {
- a.lastUpdated = change.getLastUpdatedOn().getTime() / 1000L;
+ a.lastUpdated = change.getLastUpdatedOn().getEpochSecond();
a.open = change.isNew();
}
@@ -437,7 +437,7 @@
p.number = patchSet.number();
p.ref = patchSet.refName();
p.uploader = asAccountAttribute(patchSet.uploader());
- p.createdOn = patchSet.createdOn().getTime() / 1000L;
+ p.createdOn = patchSet.createdOn().getEpochSecond();
PatchSet.Id pId = patchSet.id();
try {
p.parents = new ArrayList<>();
@@ -534,7 +534,7 @@
a.type = approval.labelId().get();
a.value = Short.toString(approval.value());
a.by = asAccountAttribute(approval.accountId());
- a.grantedOn = approval.granted().getTime() / 1000L;
+ a.grantedOn = approval.granted().getEpochSecond();
a.oldValue = null;
Optional<LabelType> lt = labelTypes.byLabel(approval.labelId());
@@ -544,7 +544,7 @@
public MessageAttribute asMessageAttribute(ChangeMessage message) {
MessageAttribute a = new MessageAttribute();
- a.timestamp = message.getWrittenOn().getTime() / 1000L;
+ a.timestamp = message.getWrittenOn().getEpochSecond();
a.reviewer =
message.getAuthor() != null
? asAccountAttribute(message.getAuthor())
diff --git a/java/com/google/gerrit/server/extensions/events/AbstractChangeEvent.java b/java/com/google/gerrit/server/extensions/events/AbstractChangeEvent.java
index b7ee043..fde4088 100644
--- a/java/com/google/gerrit/server/extensions/events/AbstractChangeEvent.java
+++ b/java/com/google/gerrit/server/extensions/events/AbstractChangeEvent.java
@@ -18,17 +18,17 @@
import com.google.gerrit.extensions.common.AccountInfo;
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.events.ChangeEvent;
-import java.sql.Timestamp;
+import java.time.Instant;
/** Base class for all change events. */
public abstract class AbstractChangeEvent implements ChangeEvent {
private final ChangeInfo changeInfo;
private final AccountInfo who;
- private final Timestamp when;
+ private final Instant when;
private final NotifyHandling notify;
protected AbstractChangeEvent(
- ChangeInfo change, AccountInfo who, Timestamp when, NotifyHandling notify) {
+ ChangeInfo change, AccountInfo who, Instant when, NotifyHandling notify) {
this.changeInfo = change;
this.who = who;
this.when = when;
@@ -46,7 +46,7 @@
}
@Override
- public Timestamp getWhen() {
+ public Instant getWhen() {
return when;
}
diff --git a/java/com/google/gerrit/server/extensions/events/AbstractRevisionEvent.java b/java/com/google/gerrit/server/extensions/events/AbstractRevisionEvent.java
index 9d4d299..421a5ad 100644
--- a/java/com/google/gerrit/server/extensions/events/AbstractRevisionEvent.java
+++ b/java/com/google/gerrit/server/extensions/events/AbstractRevisionEvent.java
@@ -19,7 +19,7 @@
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.RevisionInfo;
import com.google.gerrit.extensions.events.RevisionEvent;
-import java.sql.Timestamp;
+import java.time.Instant;
/** Base class for all revision events. */
public abstract class AbstractRevisionEvent extends AbstractChangeEvent implements RevisionEvent {
@@ -30,7 +30,7 @@
ChangeInfo change,
RevisionInfo revision,
AccountInfo who,
- Timestamp when,
+ Instant when,
NotifyHandling notify) {
super(change, who, when, notify);
revisionInfo = revision;
diff --git a/java/com/google/gerrit/server/extensions/events/AssigneeChanged.java b/java/com/google/gerrit/server/extensions/events/AssigneeChanged.java
index e31a1b5..8e4d1e2 100644
--- a/java/com/google/gerrit/server/extensions/events/AssigneeChanged.java
+++ b/java/com/google/gerrit/server/extensions/events/AssigneeChanged.java
@@ -25,7 +25,7 @@
import com.google.gerrit.server.query.change.ChangeData;
import com.google.inject.Inject;
import com.google.inject.Singleton;
-import java.sql.Timestamp;
+import java.time.Instant;
/** Helper class to fire an event when a user has been set as assignee on a change. */
@Singleton
@@ -42,7 +42,7 @@
}
public void fire(
- ChangeData changeData, AccountState accountState, AccountState oldAssignee, Timestamp when) {
+ ChangeData changeData, AccountState accountState, AccountState oldAssignee, Instant when) {
if (listeners.isEmpty()) {
return;
}
@@ -63,7 +63,7 @@
private static class Event extends AbstractChangeEvent implements AssigneeChangedListener.Event {
private final AccountInfo oldAssignee;
- Event(ChangeInfo change, AccountInfo editor, AccountInfo oldAssignee, Timestamp when) {
+ Event(ChangeInfo change, AccountInfo editor, AccountInfo oldAssignee, Instant when) {
super(change, editor, when, NotifyHandling.ALL);
this.oldAssignee = oldAssignee;
}
diff --git a/java/com/google/gerrit/server/extensions/events/ChangeAbandoned.java b/java/com/google/gerrit/server/extensions/events/ChangeAbandoned.java
index cbe7c6b..ca1a742 100644
--- a/java/com/google/gerrit/server/extensions/events/ChangeAbandoned.java
+++ b/java/com/google/gerrit/server/extensions/events/ChangeAbandoned.java
@@ -32,7 +32,7 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
/** Helper class to fire an event when a change has been abandoned. */
@Singleton
@@ -53,7 +53,7 @@
PatchSet ps,
AccountState abandoner,
String reason,
- Timestamp when,
+ Instant when,
NotifyHandling notifyHandling) {
if (listeners.isEmpty()) {
return;
@@ -89,7 +89,7 @@
RevisionInfo revision,
AccountInfo abandoner,
String reason,
- Timestamp when,
+ Instant when,
NotifyHandling notifyHandling) {
super(change, revision, abandoner, when, notifyHandling);
this.reason = reason;
diff --git a/java/com/google/gerrit/server/extensions/events/ChangeDeleted.java b/java/com/google/gerrit/server/extensions/events/ChangeDeleted.java
index 23a4583..acca491 100644
--- a/java/com/google/gerrit/server/extensions/events/ChangeDeleted.java
+++ b/java/com/google/gerrit/server/extensions/events/ChangeDeleted.java
@@ -25,7 +25,7 @@
import com.google.gerrit.server.query.change.ChangeData;
import com.google.inject.Inject;
import com.google.inject.Singleton;
-import java.sql.Timestamp;
+import java.time.Instant;
/** Helper class to fire an event when a change has been deleted. */
@Singleton
@@ -41,7 +41,7 @@
this.util = util;
}
- public void fire(ChangeData changeData, AccountState deleter, Timestamp when) {
+ public void fire(ChangeData changeData, AccountState deleter, Instant when) {
if (listeners.isEmpty()) {
return;
}
@@ -55,7 +55,7 @@
/** Event to be fired when a change has been deleted. */
private static class Event extends AbstractChangeEvent implements ChangeDeletedListener.Event {
- Event(ChangeInfo change, AccountInfo deleter, Timestamp when) {
+ Event(ChangeInfo change, AccountInfo deleter, Instant when) {
super(change, deleter, when, NotifyHandling.ALL);
}
}
diff --git a/java/com/google/gerrit/server/extensions/events/ChangeMerged.java b/java/com/google/gerrit/server/extensions/events/ChangeMerged.java
index e4896df..870d850 100644
--- a/java/com/google/gerrit/server/extensions/events/ChangeMerged.java
+++ b/java/com/google/gerrit/server/extensions/events/ChangeMerged.java
@@ -32,7 +32,7 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
/** Helper class to fire an event when a change has been merged. */
@Singleton
@@ -49,11 +49,7 @@
}
public void fire(
- ChangeData changeData,
- PatchSet ps,
- AccountState merger,
- String newRevisionId,
- Timestamp when) {
+ ChangeData changeData, PatchSet ps, AccountState merger, String newRevisionId, Instant when) {
if (listeners.isEmpty()) {
return;
}
@@ -86,7 +82,7 @@
RevisionInfo revision,
AccountInfo merger,
String newRevisionId,
- Timestamp when) {
+ Instant when) {
super(change, revision, merger, when, NotifyHandling.ALL);
this.newRevisionId = newRevisionId;
}
diff --git a/java/com/google/gerrit/server/extensions/events/ChangeRestored.java b/java/com/google/gerrit/server/extensions/events/ChangeRestored.java
index 8bd222a..c71360b 100644
--- a/java/com/google/gerrit/server/extensions/events/ChangeRestored.java
+++ b/java/com/google/gerrit/server/extensions/events/ChangeRestored.java
@@ -32,7 +32,7 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
/** Helper class to fire an event when a change has been restored. */
@Singleton
@@ -49,7 +49,7 @@
}
public void fire(
- ChangeData changeData, PatchSet ps, AccountState restorer, String reason, Timestamp when) {
+ ChangeData changeData, PatchSet ps, AccountState restorer, String reason, Instant when) {
if (listeners.isEmpty()) {
return;
}
@@ -83,7 +83,7 @@
RevisionInfo revision,
AccountInfo restorer,
String reason,
- Timestamp when) {
+ Instant when) {
super(change, revision, restorer, when, NotifyHandling.ALL);
this.reason = reason;
}
diff --git a/java/com/google/gerrit/server/extensions/events/ChangeReverted.java b/java/com/google/gerrit/server/extensions/events/ChangeReverted.java
index 4a46eb0..1abbebb 100644
--- a/java/com/google/gerrit/server/extensions/events/ChangeReverted.java
+++ b/java/com/google/gerrit/server/extensions/events/ChangeReverted.java
@@ -23,7 +23,7 @@
import com.google.gerrit.server.query.change.ChangeData;
import com.google.inject.Inject;
import com.google.inject.Singleton;
-import java.sql.Timestamp;
+import java.time.Instant;
/** Helper class to fire an event when a change has been reverted. */
@Singleton
@@ -39,7 +39,7 @@
this.util = util;
}
- public void fire(ChangeData changeData, ChangeData revertChangeData, Timestamp when) {
+ public void fire(ChangeData changeData, ChangeData revertChangeData, Instant when) {
if (listeners.isEmpty()) {
return;
}
@@ -55,7 +55,7 @@
private static class Event extends AbstractChangeEvent implements ChangeRevertedListener.Event {
private final ChangeInfo revertChange;
- Event(ChangeInfo change, ChangeInfo revertChange, Timestamp when) {
+ Event(ChangeInfo change, ChangeInfo revertChange, Instant when) {
super(change, revertChange.owner, when, NotifyHandling.ALL);
this.revertChange = revertChange;
}
diff --git a/java/com/google/gerrit/server/extensions/events/CommentAdded.java b/java/com/google/gerrit/server/extensions/events/CommentAdded.java
index 20c54cf..79544f2 100644
--- a/java/com/google/gerrit/server/extensions/events/CommentAdded.java
+++ b/java/com/google/gerrit/server/extensions/events/CommentAdded.java
@@ -33,7 +33,7 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Map;
/** Helper class to fire an event when a comment or vote has been added to a change. */
@@ -57,7 +57,7 @@
String comment,
Map<String, Short> approvals,
Map<String, Short> oldApprovals,
- Timestamp when) {
+ Instant when) {
if (listeners.isEmpty()) {
return;
}
@@ -97,7 +97,7 @@
String comment,
Map<String, ApprovalInfo> approvals,
Map<String, ApprovalInfo> oldApprovals,
- Timestamp when) {
+ Instant when) {
super(change, revision, author, when, NotifyHandling.ALL);
this.comment = comment;
this.approvals = approvals;
diff --git a/java/com/google/gerrit/server/extensions/events/EventUtil.java b/java/com/google/gerrit/server/extensions/events/EventUtil.java
index f0d038a..45f7ecb 100644
--- a/java/com/google/gerrit/server/extensions/events/EventUtil.java
+++ b/java/com/google/gerrit/server/extensions/events/EventUtil.java
@@ -36,7 +36,7 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
@@ -111,7 +111,7 @@
}
public Map<String, ApprovalInfo> approvals(
- AccountState accountState, Map<String, Short> approvals, Timestamp ts) {
+ AccountState accountState, Map<String, Short> approvals, Instant ts) {
Map<String, ApprovalInfo> result = new HashMap<>();
for (Map.Entry<String, Short> e : approvals.entrySet()) {
Integer value = e.getValue() != null ? Integer.valueOf(e.getValue()) : null;
diff --git a/java/com/google/gerrit/server/extensions/events/HashtagsEdited.java b/java/com/google/gerrit/server/extensions/events/HashtagsEdited.java
index 846257c..e7903a2 100644
--- a/java/com/google/gerrit/server/extensions/events/HashtagsEdited.java
+++ b/java/com/google/gerrit/server/extensions/events/HashtagsEdited.java
@@ -26,7 +26,7 @@
import com.google.gerrit.server.query.change.ChangeData;
import com.google.inject.Inject;
import com.google.inject.Singleton;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Collection;
import java.util.Set;
@@ -50,7 +50,7 @@
ImmutableSortedSet<String> hashtags,
Set<String> added,
Set<String> removed,
- Timestamp when) {
+ Instant when) {
if (listeners.isEmpty()) {
return;
}
@@ -82,7 +82,7 @@
Collection<String> updated,
Collection<String> added,
Collection<String> removed,
- Timestamp when) {
+ Instant when) {
super(change, editor, when, NotifyHandling.ALL);
this.updatedHashtags = updated;
this.addedHashtags = added;
diff --git a/java/com/google/gerrit/server/extensions/events/PrivateStateChanged.java b/java/com/google/gerrit/server/extensions/events/PrivateStateChanged.java
index d81068c..c6076fd 100644
--- a/java/com/google/gerrit/server/extensions/events/PrivateStateChanged.java
+++ b/java/com/google/gerrit/server/extensions/events/PrivateStateChanged.java
@@ -31,7 +31,7 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
/** Helper class to fire an event when the private flag of a change has been toggled. */
@Singleton
@@ -47,7 +47,7 @@
this.util = util;
}
- public void fire(ChangeData changeData, PatchSet patchSet, AccountState account, Timestamp when) {
+ public void fire(ChangeData changeData, PatchSet patchSet, AccountState account, Instant when) {
if (listeners.isEmpty()) {
return;
}
@@ -72,7 +72,7 @@
private static class Event extends AbstractRevisionEvent
implements PrivateStateChangedListener.Event {
- protected Event(ChangeInfo change, RevisionInfo revision, AccountInfo who, Timestamp when) {
+ protected Event(ChangeInfo change, RevisionInfo revision, AccountInfo who, Instant when) {
super(change, revision, who, when, NotifyHandling.ALL);
}
}
diff --git a/java/com/google/gerrit/server/extensions/events/ReviewerAdded.java b/java/com/google/gerrit/server/extensions/events/ReviewerAdded.java
index ba73ca1..147e372 100644
--- a/java/com/google/gerrit/server/extensions/events/ReviewerAdded.java
+++ b/java/com/google/gerrit/server/extensions/events/ReviewerAdded.java
@@ -33,7 +33,7 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.List;
/** Helper class to fire an event when reviewers have been added to a change. */
@@ -55,7 +55,7 @@
PatchSet patchSet,
List<AccountState> reviewers,
AccountState adder,
- Timestamp when) {
+ Instant when) {
if (listeners.isEmpty() || reviewers.isEmpty()) {
return;
}
@@ -89,7 +89,7 @@
RevisionInfo revision,
List<AccountInfo> reviewers,
AccountInfo adder,
- Timestamp when) {
+ Instant when) {
super(change, revision, adder, when, NotifyHandling.ALL);
this.reviewers = reviewers;
}
diff --git a/java/com/google/gerrit/server/extensions/events/ReviewerDeleted.java b/java/com/google/gerrit/server/extensions/events/ReviewerDeleted.java
index 80037bc..5f9179a 100644
--- a/java/com/google/gerrit/server/extensions/events/ReviewerDeleted.java
+++ b/java/com/google/gerrit/server/extensions/events/ReviewerDeleted.java
@@ -33,7 +33,7 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Map;
/** Helper class to fire an event when a reviewer has been deleted from a change. */
@@ -59,7 +59,7 @@
Map<String, Short> newApprovals,
Map<String, Short> oldApprovals,
NotifyHandling notify,
- Timestamp when) {
+ Instant when) {
if (listeners.isEmpty()) {
return;
}
@@ -104,7 +104,7 @@
Map<String, ApprovalInfo> newApprovals,
Map<String, ApprovalInfo> oldApprovals,
NotifyHandling notify,
- Timestamp when) {
+ Instant when) {
super(change, revision, remover, when, notify);
this.reviewer = reviewer;
this.comment = comment;
diff --git a/java/com/google/gerrit/server/extensions/events/RevisionCreated.java b/java/com/google/gerrit/server/extensions/events/RevisionCreated.java
index 4c78216..a60d982 100644
--- a/java/com/google/gerrit/server/extensions/events/RevisionCreated.java
+++ b/java/com/google/gerrit/server/extensions/events/RevisionCreated.java
@@ -33,7 +33,7 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
/** Helper class to fire an event when a revision has been created for a change. */
@Singleton
@@ -47,7 +47,7 @@
ChangeData changeData,
PatchSet patchSet,
AccountState uploader,
- Timestamp when,
+ Instant when,
NotifyResolver.Result notify) {}
};
@@ -69,7 +69,7 @@
ChangeData changeData,
PatchSet patchSet,
AccountState uploader,
- Timestamp when,
+ Instant when,
NotifyResolver.Result notify) {
if (listeners.isEmpty()) {
return;
@@ -102,7 +102,7 @@
ChangeInfo change,
RevisionInfo revision,
AccountInfo uploader,
- Timestamp when,
+ Instant when,
NotifyHandling notify) {
super(change, revision, uploader, when, notify);
}
diff --git a/java/com/google/gerrit/server/extensions/events/TopicEdited.java b/java/com/google/gerrit/server/extensions/events/TopicEdited.java
index 08b47f1..008ead5 100644
--- a/java/com/google/gerrit/server/extensions/events/TopicEdited.java
+++ b/java/com/google/gerrit/server/extensions/events/TopicEdited.java
@@ -25,7 +25,7 @@
import com.google.gerrit.server.query.change.ChangeData;
import com.google.inject.Inject;
import com.google.inject.Singleton;
-import java.sql.Timestamp;
+import java.time.Instant;
/** Helper class to fire an event when the topic of a change has been edited. */
@Singleton
@@ -41,8 +41,7 @@
this.util = util;
}
- public void fire(
- ChangeData changeData, AccountState account, String oldTopicName, Timestamp when) {
+ public void fire(ChangeData changeData, AccountState account, String oldTopicName, Instant when) {
if (listeners.isEmpty()) {
return;
}
@@ -59,7 +58,7 @@
private static class Event extends AbstractChangeEvent implements TopicEditedListener.Event {
private final String oldTopic;
- Event(ChangeInfo change, AccountInfo editor, String oldTopic, Timestamp when) {
+ Event(ChangeInfo change, AccountInfo editor, String oldTopic, Instant when) {
super(change, editor, when, NotifyHandling.ALL);
this.oldTopic = oldTopic;
}
diff --git a/java/com/google/gerrit/server/extensions/events/VoteDeleted.java b/java/com/google/gerrit/server/extensions/events/VoteDeleted.java
index 244e46c..deaaff8 100644
--- a/java/com/google/gerrit/server/extensions/events/VoteDeleted.java
+++ b/java/com/google/gerrit/server/extensions/events/VoteDeleted.java
@@ -33,7 +33,7 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Map;
/** Helper class to fire an event when a vote has been deleted from a change. */
@@ -59,7 +59,7 @@
NotifyHandling notify,
String message,
AccountState remover,
- Timestamp when) {
+ Instant when) {
if (listeners.isEmpty()) {
return;
}
@@ -103,7 +103,7 @@
NotifyHandling notify,
String message,
AccountInfo remover,
- Timestamp when) {
+ Instant when) {
super(change, revision, remover, when, notify);
this.reviewer = reviewer;
this.approvals = approvals;
diff --git a/java/com/google/gerrit/server/extensions/events/WorkInProgressStateChanged.java b/java/com/google/gerrit/server/extensions/events/WorkInProgressStateChanged.java
index bfc068d..5e20c45 100644
--- a/java/com/google/gerrit/server/extensions/events/WorkInProgressStateChanged.java
+++ b/java/com/google/gerrit/server/extensions/events/WorkInProgressStateChanged.java
@@ -31,7 +31,7 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
/** Helper class to fire an event when the work-in-progress state of a change has been toggled. */
@Singleton
@@ -42,7 +42,7 @@
new WorkInProgressStateChanged() {
@Override
public void fire(
- ChangeData changeData, PatchSet patchSet, AccountState account, Timestamp when) {}
+ ChangeData changeData, PatchSet patchSet, AccountState account, Instant when) {}
};
private final PluginSetContext<WorkInProgressStateChangedListener> listeners;
@@ -60,7 +60,7 @@
this.util = null;
}
- public void fire(ChangeData changeData, PatchSet patchSet, AccountState account, Timestamp when) {
+ public void fire(ChangeData changeData, PatchSet patchSet, AccountState account, Instant when) {
if (listeners.isEmpty()) {
return;
}
@@ -85,7 +85,7 @@
private static class Event extends AbstractRevisionEvent
implements WorkInProgressStateChangedListener.Event {
- protected Event(ChangeInfo change, RevisionInfo revision, AccountInfo who, Timestamp when) {
+ protected Event(ChangeInfo change, RevisionInfo revision, AccountInfo who, Instant when) {
super(change, revision, who, when, NotifyHandling.ALL);
}
}
diff --git a/java/com/google/gerrit/server/git/BanCommit.java b/java/com/google/gerrit/server/git/BanCommit.java
index 242c11b..9cc754c 100644
--- a/java/com/google/gerrit/server/git/BanCommit.java
+++ b/java/com/google/gerrit/server/git/BanCommit.java
@@ -30,7 +30,7 @@
import com.google.inject.Provider;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.util.Date;
+import java.time.Instant;
import java.util.List;
import java.util.TimeZone;
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
@@ -155,8 +155,7 @@
}
private PersonIdent createPersonIdent() {
- Date now = new Date();
- return currentUser.get().newCommitterIdent(now, tz);
+ return currentUser.get().newCommitterIdent(Instant.now(), tz);
}
private static String buildCommitMessage(List<ObjectId> bannedCommits, String reason) {
diff --git a/java/com/google/gerrit/server/git/CommitUtil.java b/java/com/google/gerrit/server/git/CommitUtil.java
index 73378f6..e52c45f 100644
--- a/java/com/google/gerrit/server/git/CommitUtil.java
+++ b/java/com/google/gerrit/server/git/CommitUtil.java
@@ -53,8 +53,8 @@
import com.google.inject.Provider;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
import java.text.MessageFormat;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
@@ -146,7 +146,7 @@
* @return ObjectId that represents the newly created commit.
*/
public Change.Id createRevertChange(
- ChangeNotes notes, CurrentUser user, RevertInput input, Timestamp timestamp)
+ ChangeNotes notes, CurrentUser user, RevertInput input, Instant timestamp)
throws RestApiException, UpdateException, ConfigInvalidException, IOException {
String message = Strings.emptyToNull(input.message);
@@ -174,7 +174,7 @@
* @return ObjectId that represents the newly created commit.
*/
public ObjectId createRevertCommit(
- String message, ChangeNotes notes, CurrentUser user, Timestamp ts)
+ String message, ChangeNotes notes, CurrentUser user, Instant ts)
throws RestApiException, IOException {
try (Repository git = repoManager.openRepository(notes.getProjectName());
@@ -206,7 +206,7 @@
String message,
ChangeNotes notes,
CurrentUser user,
- Timestamp ts,
+ Instant ts,
ObjectInserter oi,
RevWalk revWalk,
@Nullable ObjectId generatedChangeId)
@@ -255,7 +255,7 @@
ChangeNotes notes,
CurrentUser user,
@Nullable ObjectId generatedChangeId,
- Timestamp ts,
+ Instant ts,
ObjectInserter oi,
RevWalk revWalk,
Repository git)
diff --git a/java/com/google/gerrit/server/git/DelegateRepository.java b/java/com/google/gerrit/server/git/DelegateRepository.java
index ddfc115..05c5f4c 100644
--- a/java/com/google/gerrit/server/git/DelegateRepository.java
+++ b/java/com/google/gerrit/server/git/DelegateRepository.java
@@ -210,12 +210,12 @@
}
@Override
- public Set<ObjectId> getAdditionalHaves() {
+ public Set<ObjectId> getAdditionalHaves() throws IOException {
return delegate.getAdditionalHaves();
}
@Override
- public Map<AnyObjectId, Set<Ref>> getAllRefsByPeeledObjectId() {
+ public Map<AnyObjectId, Set<Ref>> getAllRefsByPeeledObjectId() throws IOException {
return delegate.getAllRefsByPeeledObjectId();
}
diff --git a/java/com/google/gerrit/server/git/HookUtil.java b/java/com/google/gerrit/server/git/HookUtil.java
index fd29c8deb..cafa18e 100644
--- a/java/com/google/gerrit/server/git/HookUtil.java
+++ b/java/com/google/gerrit/server/git/HookUtil.java
@@ -43,12 +43,12 @@
refs =
rp.getRepository().getRefDatabase().getRefs().stream()
.collect(toMap(Ref::getName, r -> r));
+ rp.setAdvertisedRefs(refs, rp.getAdvertisedObjects());
} catch (ServiceMayNotContinueException e) {
throw e;
} catch (IOException e) {
throw new ServiceMayNotContinueException(e);
}
- rp.setAdvertisedRefs(refs, rp.getAdvertisedObjects());
return refs;
}
@@ -70,12 +70,12 @@
refs =
up.getRepository().getRefDatabase().getRefs().stream()
.collect(toMap(Ref::getName, r -> r));
+ up.setAdvertisedRefs(refs);
} catch (ServiceMayNotContinueException e) {
throw e;
} catch (IOException e) {
throw new ServiceMayNotContinueException(e);
}
- up.setAdvertisedRefs(refs);
return refs;
}
diff --git a/java/com/google/gerrit/server/git/MultiProgressMonitor.java b/java/com/google/gerrit/server/git/MultiProgressMonitor.java
index 09f08bd..a49260f 100644
--- a/java/com/google/gerrit/server/git/MultiProgressMonitor.java
+++ b/java/com/google/gerrit/server/git/MultiProgressMonitor.java
@@ -36,6 +36,8 @@
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ProgressMonitor;
@@ -154,6 +156,64 @@
return count;
}
}
+
+ public int getTotal() {
+ return total;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getTotalDisplay(int total) {
+ return String.valueOf(total);
+ }
+ }
+
+ /** Handle for a sub-task whose total work can be updated while the task is in progress. */
+ public class VolatileTask extends Task {
+ protected AtomicInteger volatileTotal;
+ protected AtomicBoolean isTotalFinalized = new AtomicBoolean(false);
+
+ public VolatileTask(String subTaskName) {
+ super(subTaskName, UNKNOWN);
+ volatileTotal = new AtomicInteger(UNKNOWN);
+ }
+
+ /**
+ * Update the total work for this sub-task.
+ *
+ * <p>Intended to be called from a worker thread.
+ *
+ * @param workUnits number of work units to be added to existing total work.
+ */
+ public void updateTotal(int workUnits) {
+ if (!isTotalFinalized.get()) {
+ volatileTotal.addAndGet(workUnits);
+ } else {
+ logger.atWarning().log(
+ "Total work has been finalized on sub-task " + getName() + " and cannot be updated");
+ }
+ }
+
+ /**
+ * Mark the total on this sub-task as unmodifiable.
+ *
+ * <p>Intended to be called from a worker thread.
+ */
+ public void finalizeTotal() {
+ isTotalFinalized.set(true);
+ }
+
+ @Override
+ public int getTotal() {
+ return volatileTotal.get();
+ }
+
+ @Override
+ public String getTotalDisplay(int total) {
+ return super.getTotalDisplay(total) + (isTotalFinalized.get() ? "" : "+");
+ }
}
public interface Factory {
@@ -249,6 +309,7 @@
* calls {@link #end()}, the future has an additional {@code maxInterval} to finish before it is
* forcefully cancelled and {@link ExecutionException} is thrown.
*
+ * @see #waitForNonFinalTask(Future, long, TimeUnit)
* @param workerFuture a future that returns when worker threads are finished.
* @param taskTimeoutTime overall timeout for the task; the future gets a cancellation signal
* after this timeout is exceeded; non-positive values indicate no timeout.
@@ -267,6 +328,60 @@
long cancellationTimeoutTime,
TimeUnit cancellationTimeoutUnit)
throws TimeoutException {
+ T t =
+ waitForNonFinalTask(
+ workerFuture,
+ taskTimeoutTime,
+ taskTimeoutUnit,
+ cancellationTimeoutTime,
+ cancellationTimeoutUnit);
+ synchronized (this) {
+ if (!done) {
+ // The worker may not have called end() explicitly, which is likely a
+ // programming error.
+ logger.atWarning().log("MultiProgressMonitor worker did not call end() before returning");
+ end();
+ }
+ }
+ sendDone();
+ return t;
+ }
+
+ /**
+ * Wait for a non-final task managed by a {@link Future}, with no timeout.
+ *
+ * @see #waitForNonFinalTask(Future, long, TimeUnit)
+ */
+ public <T> T waitForNonFinalTask(Future<T> workerFuture) {
+ try {
+ return waitForNonFinalTask(workerFuture, 0, null, 0, null);
+ } catch (TimeoutException e) {
+ throw new IllegalStateException("timout exception without setting a timeout", e);
+ }
+ }
+
+ /**
+ * Wait for a task managed by a {@link Future}. This call does not expect the worker thread to
+ * call {@link #end()}. It is intended to be used to track a non-final task.
+ *
+ * @param workerFuture a future that returns when worker threads are finished.
+ * @param taskTimeoutTime overall timeout for the task; the future is forcefully cancelled if the
+ * task exceeds the timeout. Non-positive values indicate no timeout.
+ * @param taskTimeoutUnit unit for overall task timeout.
+ * @param cancellationTimeoutTime timeout for the task to react to the cancellation signal; if the
+ * task doesn't terminate within this time it is forcefully cancelled; non-positive values
+ * indicate no timeout.
+ * @param cancellationTimeoutUnit unit for the cancellation timeout.
+ * @throws TimeoutException if this thread or a worker thread was interrupted, the worker was
+ * cancelled, or timed out waiting for a worker to call {@link #end()}.
+ */
+ public <T> T waitForNonFinalTask(
+ Future<T> workerFuture,
+ long taskTimeoutTime,
+ TimeUnit taskTimeoutUnit,
+ long cancellationTimeoutTime,
+ TimeUnit cancellationTimeoutUnit)
+ throws TimeoutException {
long overallStart = ticker.read();
long cancellationNanos =
cancellationTimeoutTime > 0
@@ -282,7 +397,7 @@
synchronized (this) {
long left = maxIntervalNanos;
- while (!done) {
+ while (!workerFuture.isDone() && !done) {
long start = ticker.read();
try {
// Conditions below gives better granularity for timeouts.
@@ -349,19 +464,11 @@
left = maxIntervalNanos;
}
sendUpdate();
- if (!done && workerFuture.isDone()) {
- // The worker may not have called end() explicitly, which is likely a
- // programming error.
- logger.atWarning().log(
- "MultiProgressMonitor worker did not call end() before returning (task=%s(%s))",
- taskKind, taskName);
- end();
- }
}
if (deadlineExceeded && !forcefulTermination && taskKind == TaskKind.RECEIVE_COMMITS) {
cancellationMetrics.countGracefulReceiveTimeout();
}
- sendDone();
+ wakeUp();
}
// The loop exits as soon as the worker calls end(), but we give it another
@@ -398,6 +505,18 @@
}
/**
+ * Begin a sub-task whose total work can be updated.
+ *
+ * @param subTask sub-task name.
+ * @return sub-task handle.
+ */
+ public VolatileTask beginVolatileSubTask(String subTask) {
+ VolatileTask task = new VolatileTask(subTask);
+ tasks.add(task);
+ return task;
+ }
+
+ /**
* End the overall task.
*
* <p>Must be called from a worker thread.
@@ -440,6 +559,7 @@
boolean first = true;
for (Task t : tasks) {
int count = t.getCount();
+ int total = t.getTotal();
if (count == 0) {
continue;
}
@@ -454,10 +574,11 @@
if (!Strings.isNullOrEmpty(t.name)) {
s.append(t.name).append(": ");
}
- if (t.total == UNKNOWN) {
+ if (total == UNKNOWN) {
s.append(count);
} else {
- s.append(String.format("%d%% (%d/%d)", count * 100 / t.total, count, t.total));
+ s.append(
+ String.format("%d%% (%d/%s)", count * 100 / total, count, t.getTotalDisplay(total)));
}
}
}
diff --git a/java/com/google/gerrit/server/git/PerThreadRequestScope.java b/java/com/google/gerrit/server/git/PerThreadRequestScope.java
index b7db542..9b5a674 100644
--- a/java/com/google/gerrit/server/git/PerThreadRequestScope.java
+++ b/java/com/google/gerrit/server/git/PerThreadRequestScope.java
@@ -89,7 +89,7 @@
new Scope() {
@Override
public <T> Provider<T> scope(Key<T> key, Provider<T> creator) {
- return new Provider<T>() {
+ return new Provider<>() {
@Override
public T get() {
return requireContext().get(key, creator);
diff --git a/java/com/google/gerrit/server/git/meta/MetaDataUpdate.java b/java/com/google/gerrit/server/git/meta/MetaDataUpdate.java
index 27d5da9..befdb58 100644
--- a/java/com/google/gerrit/server/git/meta/MetaDataUpdate.java
+++ b/java/com/google/gerrit/server/git/meta/MetaDataUpdate.java
@@ -135,7 +135,7 @@
private PersonIdent createPersonIdent(IdentifiedUser user) {
PersonIdent serverIdent = serverIdentProvider.get();
- return user.newCommitterIdent(serverIdent.getWhen(), serverIdent.getTimeZone());
+ return user.newCommitterIdent(serverIdent);
}
}
@@ -215,11 +215,7 @@
public void setAuthor(IdentifiedUser author) {
this.author = author;
- getCommitBuilder()
- .setAuthor(
- author.newCommitterIdent(
- getCommitBuilder().getCommitter().getWhen(),
- getCommitBuilder().getCommitter().getTimeZone()));
+ getCommitBuilder().setAuthor(author.newCommitterIdent(getCommitBuilder().getCommitter()));
}
public void setAllowEmpty(boolean allowEmpty) {
diff --git a/java/com/google/gerrit/server/git/receive/HackPushNegotiateHook.java b/java/com/google/gerrit/server/git/receive/HackPushNegotiateHook.java
index 72483af..12666f9 100644
--- a/java/com/google/gerrit/server/git/receive/HackPushNegotiateHook.java
+++ b/java/com/google/gerrit/server/git/receive/HackPushNegotiateHook.java
@@ -80,13 +80,13 @@
r =
rp.getRepository().getRefDatabase().getRefs().stream()
.collect(toMap(Ref::getName, x -> x));
+ rp.setAdvertisedRefs(r, history(r.values(), rp));
} catch (ServiceMayNotContinueException e) {
throw e;
} catch (IOException e) {
throw new ServiceMayNotContinueException(e);
}
}
- rp.setAdvertisedRefs(r, history(r.values(), rp));
}
private Set<ObjectId> history(Collection<Ref> refs, ReceivePack rp) {
diff --git a/java/com/google/gerrit/server/git/receive/ReceiveCommits.java b/java/com/google/gerrit/server/git/receive/ReceiveCommits.java
index 82b4b0b..4e22933 100644
--- a/java/com/google/gerrit/server/git/receive/ReceiveCommits.java
+++ b/java/com/google/gerrit/server/git/receive/ReceiveCommits.java
@@ -840,7 +840,7 @@
Map<BranchNameKey, ReceiveCommand> branches;
try (BatchUpdate bu =
batchUpdateFactory.create(
- project.getNameKey(), user.materializedCopy(), TimeUtil.nowTs());
+ project.getNameKey(), user.materializedCopy(), TimeUtil.now());
ObjectInserter ins = repo.newObjectInserter();
ObjectReader reader = ins.newReader();
RevWalk rw = new RevWalk(reader);
@@ -862,7 +862,7 @@
submissionExecutor.execute(ImmutableList.of(bu));
- orm.setContext(TimeUtil.nowTs(), user, NotifyResolver.Result.none());
+ orm.setContext(TimeUtil.now(), user, NotifyResolver.Result.none());
submissionExecutor.afterExecutions(orm);
branches = bu.getSuccessfullyUpdatedBranches(false);
@@ -1026,7 +1026,7 @@
try (BatchUpdate bu =
batchUpdateFactory.create(
- project.getNameKey(), user.materializedCopy(), TimeUtil.nowTs());
+ project.getNameKey(), user.materializedCopy(), TimeUtil.now());
ObjectInserter ins = repo.newObjectInserter();
ObjectReader reader = ins.newReader();
RevWalk rw = new RevWalk(reader)) {
@@ -3462,7 +3462,7 @@
"autoCloseChanges",
updateFactory -> {
try (BatchUpdate bu =
- updateFactory.create(projectState.getNameKey(), user, TimeUtil.nowTs());
+ updateFactory.create(projectState.getNameKey(), user, TimeUtil.now());
ObjectInserter ins = repo.newObjectInserter();
ObjectReader reader = ins.newReader();
RevWalk rw = new RevWalk(reader)) {
diff --git a/java/com/google/gerrit/server/git/receive/ReceiveCommitsAdvertiseRefsHook.java b/java/com/google/gerrit/server/git/receive/ReceiveCommitsAdvertiseRefsHook.java
index cc203ad..e545c70 100644
--- a/java/com/google/gerrit/server/git/receive/ReceiveCommitsAdvertiseRefsHook.java
+++ b/java/com/google/gerrit/server/git/receive/ReceiveCommitsAdvertiseRefsHook.java
@@ -91,7 +91,11 @@
.filter(ReceiveCommitsAdvertiseRefsHook::skip)
.collect(toImmutableList())
.forEach(r -> advertisedRefs.remove(r));
- rp.setAdvertisedRefs(advertisedRefs, advertiseOpenChanges(rp.getRepository()));
+ try {
+ rp.setAdvertisedRefs(advertisedRefs, advertiseOpenChanges(rp.getRepository()));
+ } catch (IOException e) {
+ throw new ServiceMayNotContinueException(e);
+ }
}
private Set<ObjectId> advertiseOpenChanges(Repository repo)
diff --git a/java/com/google/gerrit/server/group/GroupAuditService.java b/java/com/google/gerrit/server/group/GroupAuditService.java
index 30e5d3c..21959ec 100644
--- a/java/com/google/gerrit/server/group/GroupAuditService.java
+++ b/java/com/google/gerrit/server/group/GroupAuditService.java
@@ -18,7 +18,7 @@
import com.google.gerrit.entities.Account;
import com.google.gerrit.entities.AccountGroup;
import com.google.gerrit.server.AuditEvent;
-import java.sql.Timestamp;
+import java.time.Instant;
public interface GroupAuditService {
void dispatch(AuditEvent action);
@@ -27,23 +27,23 @@
Account.Id actor,
AccountGroup.UUID updatedGroup,
ImmutableSet<Account.Id> addedMembers,
- Timestamp addedOn);
+ Instant addedOn);
void dispatchDeleteMembers(
Account.Id actor,
AccountGroup.UUID updatedGroup,
ImmutableSet<Account.Id> deletedMembers,
- Timestamp deletedOn);
+ Instant deletedOn);
void dispatchAddSubgroups(
Account.Id actor,
AccountGroup.UUID updatedGroup,
ImmutableSet<AccountGroup.UUID> addedSubgroups,
- Timestamp addedOn);
+ Instant addedOn);
void dispatchDeleteSubgroups(
Account.Id actor,
AccountGroup.UUID updatedGroup,
ImmutableSet<AccountGroup.UUID> deletedSubgroups,
- Timestamp deletedOn);
+ Instant deletedOn);
}
diff --git a/java/com/google/gerrit/server/group/GroupResource.java b/java/com/google/gerrit/server/group/GroupResource.java
index b0e81ec..dfcdbd7 100644
--- a/java/com/google/gerrit/server/group/GroupResource.java
+++ b/java/com/google/gerrit/server/group/GroupResource.java
@@ -22,8 +22,7 @@
import java.util.Optional;
public class GroupResource implements RestResource {
- public static final TypeLiteral<RestView<GroupResource>> GROUP_KIND =
- new TypeLiteral<RestView<GroupResource>>() {};
+ public static final TypeLiteral<RestView<GroupResource>> GROUP_KIND = new TypeLiteral<>() {};
private final GroupControl control;
diff --git a/java/com/google/gerrit/server/group/InternalGroupDescription.java b/java/com/google/gerrit/server/group/InternalGroupDescription.java
index 62ebcfe..984daea 100644
--- a/java/com/google/gerrit/server/group/InternalGroupDescription.java
+++ b/java/com/google/gerrit/server/group/InternalGroupDescription.java
@@ -23,7 +23,7 @@
import com.google.gerrit.entities.AccountGroup;
import com.google.gerrit.entities.GroupDescription;
import com.google.gerrit.entities.InternalGroup;
-import java.sql.Timestamp;
+import java.time.Instant;
public class InternalGroupDescription implements GroupDescription.Internal {
@@ -77,7 +77,7 @@
}
@Override
- public Timestamp getCreatedOn() {
+ public Instant getCreatedOn() {
return internalGroup.getCreatedOn();
}
diff --git a/java/com/google/gerrit/server/group/MemberResource.java b/java/com/google/gerrit/server/group/MemberResource.java
index b12cadd..de8cc02 100644
--- a/java/com/google/gerrit/server/group/MemberResource.java
+++ b/java/com/google/gerrit/server/group/MemberResource.java
@@ -19,8 +19,7 @@
import com.google.inject.TypeLiteral;
public class MemberResource extends GroupResource {
- public static final TypeLiteral<RestView<MemberResource>> MEMBER_KIND =
- new TypeLiteral<RestView<MemberResource>>() {};
+ public static final TypeLiteral<RestView<MemberResource>> MEMBER_KIND = new TypeLiteral<>() {};
private final IdentifiedUser user;
diff --git a/java/com/google/gerrit/server/group/SubgroupResource.java b/java/com/google/gerrit/server/group/SubgroupResource.java
index 21356be..7d917a7 100644
--- a/java/com/google/gerrit/server/group/SubgroupResource.java
+++ b/java/com/google/gerrit/server/group/SubgroupResource.java
@@ -21,7 +21,7 @@
public class SubgroupResource extends GroupResource {
public static final TypeLiteral<RestView<SubgroupResource>> SUBGROUP_KIND =
- new TypeLiteral<RestView<SubgroupResource>>() {};
+ new TypeLiteral<>() {};
private final GroupDescription.Basic member;
diff --git a/java/com/google/gerrit/server/group/db/AuditLogReader.java b/java/com/google/gerrit/server/group/db/AuditLogReader.java
index d8f0a0f..3f7ef2c 100644
--- a/java/com/google/gerrit/server/group/db/AuditLogReader.java
+++ b/java/com/google/gerrit/server/group/db/AuditLogReader.java
@@ -31,7 +31,7 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@@ -139,6 +139,9 @@
return result.stream().map(AccountGroupByIdAudit.Builder::build).collect(toImmutableList());
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
private Optional<ParsedCommit> parse(AccountGroup.UUID uuid, RevCommit c) {
Optional<Account.Id> authorId = NoteDbUtil.parseIdent(c.getAuthorIdent());
if (!authorId.isPresent()) {
@@ -166,7 +169,7 @@
return Optional.of(
new AutoValue_AuditLogReader_ParsedCommit(
authorId.get(),
- new Timestamp(c.getAuthorIdent().getWhen().getTime()),
+ c.getAuthorIdent().getWhen().toInstant(),
ImmutableList.copyOf(addedMembers),
ImmutableList.copyOf(removedMembers),
ImmutableList.copyOf(addedSubgroups),
@@ -257,7 +260,7 @@
abstract static class ParsedCommit {
abstract Account.Id authorId();
- abstract Timestamp when();
+ abstract Instant when();
abstract ImmutableList<Account.Id> addedMembers();
diff --git a/java/com/google/gerrit/server/group/db/GroupConfig.java b/java/com/google/gerrit/server/group/db/GroupConfig.java
index c187186..71cc08c 100644
--- a/java/com/google/gerrit/server/group/db/GroupConfig.java
+++ b/java/com/google/gerrit/server/group/db/GroupConfig.java
@@ -35,8 +35,9 @@
import com.google.gerrit.server.git.meta.VersionedMetaData;
import com.google.gerrit.server.util.time.TimeUtil;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Arrays;
+import java.util.Date;
import java.util.Optional;
import java.util.function.Function;
import java.util.regex.Pattern;
@@ -279,7 +280,7 @@
rw.markStart(revision);
rw.sort(RevSort.REVERSE);
RevCommit earliestCommit = rw.next();
- Timestamp createdOn = new Timestamp(earliestCommit.getCommitTime() * 1000L);
+ Instant createdOn = Instant.ofEpochSecond(earliestCommit.getCommitTime());
Config config = readConfig(GROUP_CONFIG_FILE);
ImmutableSet<Account.Id> members = readMembers();
@@ -299,6 +300,9 @@
return c;
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
@Override
protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
checkLoaded();
@@ -314,11 +318,11 @@
// Commit timestamps are internally truncated to seconds. To return the correct 'createdOn' time
// for new groups, we explicitly need to truncate the timestamp here.
- Timestamp commitTimestamp =
+ Instant commitTimestamp =
TimeUtil.truncateToSecond(
- groupDelta.flatMap(GroupDelta::getUpdatedOn).orElseGet(TimeUtil::nowTs));
- commit.setAuthor(new PersonIdent(commit.getAuthor(), commitTimestamp));
- commit.setCommitter(new PersonIdent(commit.getCommitter(), commitTimestamp));
+ groupDelta.flatMap(GroupDelta::getUpdatedOn).orElseGet(TimeUtil::now));
+ commit.setAuthor(new PersonIdent(commit.getAuthor(), Date.from(commitTimestamp)));
+ commit.setCommitter(new PersonIdent(commit.getCommitter(), Date.from(commitTimestamp)));
InternalGroup updatedGroup = updateGroup(commitTimestamp);
@@ -346,7 +350,7 @@
return Optional.empty();
}
- private InternalGroup updateGroup(Timestamp commitTimestamp)
+ private InternalGroup updateGroup(Instant commitTimestamp)
throws IOException, ConfigInvalidException {
Config config = updateGroupProperties();
@@ -358,7 +362,7 @@
loadedGroup.map(InternalGroup::getSubgroups).orElseGet(ImmutableSet::of);
Optional<ImmutableSet<AccountGroup.UUID>> updatedSubgroups = updateSubgroups(originalSubgroups);
- Timestamp createdOn = loadedGroup.map(InternalGroup::getCreatedOn).orElse(commitTimestamp);
+ Instant createdOn = loadedGroup.map(InternalGroup::getCreatedOn).orElse(commitTimestamp);
return createFrom(
groupUuid,
@@ -453,7 +457,7 @@
Config config,
ImmutableSet<Account.Id> members,
ImmutableSet<AccountGroup.UUID> subgroups,
- Timestamp createdOn,
+ Instant createdOn,
ObjectId refState)
throws ConfigInvalidException {
InternalGroup.Builder group = InternalGroup.builder();
diff --git a/java/com/google/gerrit/server/group/db/GroupDelta.java b/java/com/google/gerrit/server/group/db/GroupDelta.java
index 69cb936..ad9c8bd 100644
--- a/java/com/google/gerrit/server/group/db/GroupDelta.java
+++ b/java/com/google/gerrit/server/group/db/GroupDelta.java
@@ -18,7 +18,7 @@
import com.google.common.collect.ImmutableSet;
import com.google.gerrit.entities.Account;
import com.google.gerrit.entities.AccountGroup;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Optional;
import java.util.Set;
@@ -107,7 +107,7 @@
* in the audit log. For this reason, specifying this field will have an effect on the resulting
* audit log.
*/
- public abstract Optional<Timestamp> getUpdatedOn();
+ public abstract Optional<Instant> getUpdatedOn();
public abstract Builder toBuilder();
@@ -184,12 +184,12 @@
public abstract SubgroupModification getSubgroupModification();
/**
- * Defines the {@code Timestamp} to be used for the NoteDb commits of the update. If not
- * specified, the current {@code Timestamp} when creating the commit will be used.
+ * Defines the {@code Instant} to be used for the NoteDb commits of the update. If not
+ * specified, the current {@code Instant} when creating the commit will be used.
*
* <p>See {@link #getUpdatedOn()}
*/
- public abstract Builder setUpdatedOn(Timestamp timestamp);
+ public abstract Builder setUpdatedOn(Instant timestamp);
public abstract GroupDelta build();
}
diff --git a/java/com/google/gerrit/server/group/db/GroupsUpdate.java b/java/com/google/gerrit/server/group/db/GroupsUpdate.java
index 9aa5cfd..c0c934b 100644
--- a/java/com/google/gerrit/server/group/db/GroupsUpdate.java
+++ b/java/com/google/gerrit/server/group/db/GroupsUpdate.java
@@ -50,7 +50,7 @@
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
@@ -248,7 +248,7 @@
}
private static PersonIdent createPersonIdent(PersonIdent ident, IdentifiedUser user) {
- return user.newCommitterIdent(ident.getWhen(), ident.getTimeZone());
+ return user.newCommitterIdent(ident);
}
/**
@@ -292,9 +292,9 @@
try (TraceTimer ignored =
TraceContext.newTimer(
"Updating group", Metadata.builder().groupUuid(groupUuid.get()).build())) {
- Optional<Timestamp> updatedOn = groupDelta.getUpdatedOn();
+ Optional<Instant> updatedOn = groupDelta.getUpdatedOn();
if (!updatedOn.isPresent()) {
- updatedOn = Optional.of(TimeUtil.nowTs());
+ updatedOn = Optional.of(TimeUtil.now());
groupDelta = groupDelta.toBuilder().setUpdatedOn(updatedOn.get()).build();
}
@@ -505,7 +505,7 @@
}
}
- private void dispatchAuditEventsOnGroupUpdate(UpdateResult result, Timestamp updatedOn) {
+ private void dispatchAuditEventsOnGroupUpdate(UpdateResult result, Instant updatedOn) {
if (!currentUser.isPresent()) {
return;
}
diff --git a/java/com/google/gerrit/server/group/testing/InternalGroupSubject.java b/java/com/google/gerrit/server/group/testing/InternalGroupSubject.java
index 8a1221e..f422f6a 100644
--- a/java/com/google/gerrit/server/group/testing/InternalGroupSubject.java
+++ b/java/com/google/gerrit/server/group/testing/InternalGroupSubject.java
@@ -24,7 +24,7 @@
import com.google.common.truth.Subject;
import com.google.gerrit.entities.AccountGroup;
import com.google.gerrit.entities.InternalGroup;
-import java.sql.Timestamp;
+import java.time.Instant;
import org.eclipse.jgit.lib.ObjectId;
public class InternalGroupSubject extends Subject {
@@ -79,7 +79,7 @@
return check("isVisibleToAll()").that(group.isVisibleToAll());
}
- public ComparableSubject<Timestamp> createdOn() {
+ public ComparableSubject<Instant> createdOn() {
isNotNull();
return check("getCreatedOn()").that(group.getCreatedOn());
}
diff --git a/java/com/google/gerrit/server/index/account/AccountField.java b/java/com/google/gerrit/server/index/account/AccountField.java
index 0dd22ce..416b175 100644
--- a/java/com/google/gerrit/server/index/account/AccountField.java
+++ b/java/com/google/gerrit/server/index/account/AccountField.java
@@ -116,8 +116,9 @@
public static final FieldDef<AccountState, String> PREFERRED_EMAIL_EXACT =
exact("preferredemail_exact").build(a -> a.account().preferredEmail());
+ // TODO(issue-15518): Migrate type for timestamp index fields from Timestamp to Instant
public static final FieldDef<AccountState, Timestamp> REGISTERED =
- timestamp("registered").build(a -> a.account().registeredOn());
+ timestamp("registered").build(a -> Timestamp.from(a.account().registeredOn()));
public static final FieldDef<AccountState, String> USERNAME =
exact("username").build(a -> a.userName().map(String::toLowerCase).orElse(""));
diff --git a/java/com/google/gerrit/server/index/change/AllChangesIndexer.java b/java/com/google/gerrit/server/index/change/AllChangesIndexer.java
index 3f71d39..9f14926 100644
--- a/java/com/google/gerrit/server/index/change/AllChangesIndexer.java
+++ b/java/com/google/gerrit/server/index/change/AllChangesIndexer.java
@@ -14,7 +14,6 @@
package com.google.gerrit.server.index.change;
-import static com.google.common.base.Preconditions.checkState;
import static com.google.common.util.concurrent.Futures.successfulAsList;
import static com.google.common.util.concurrent.Futures.transform;
import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
@@ -22,9 +21,8 @@
import com.google.auto.value.AutoValue;
import com.google.common.base.Stopwatch;
-import com.google.common.collect.Sets;
+import com.google.common.collect.ImmutableSortedSet;
import com.google.common.flogger.FluentLogger;
-import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.UncheckedExecutionException;
@@ -35,6 +33,7 @@
import com.google.gerrit.server.git.MultiProgressMonitor;
import com.google.gerrit.server.git.MultiProgressMonitor.Task;
import com.google.gerrit.server.git.MultiProgressMonitor.TaskKind;
+import com.google.gerrit.server.git.MultiProgressMonitor.VolatileTask;
import com.google.gerrit.server.index.IndexExecutor;
import com.google.gerrit.server.index.OnlineReindexMode;
import com.google.gerrit.server.notedb.ChangeNotes;
@@ -45,18 +44,13 @@
import com.google.inject.Inject;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
-import java.util.Set;
import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.Collectors;
import org.eclipse.jgit.lib.ProgressMonitor;
import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.TextProgressMonitor;
/**
* Implementation that can index all changes on a host or within a project. Used by Gerrit's
@@ -65,6 +59,9 @@
*/
public class AllChangesIndexer extends SiteIndexer<Change.Id, ChangeData, ChangeIndex> {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+ private MultiProgressMonitor mpm;
+ private VolatileTask doneTask;
+ private Task failedTask;
private static final int PROJECT_SLICE_MAX_REFS = 1000;
private final MultiProgressMonitor.Factory multiProgressMonitorFactory;
@@ -135,56 +132,18 @@
// in 2020.
Stopwatch sw = Stopwatch.createStarted();
- List<ProjectSlice> projectSlices;
+ AtomicBoolean ok = new AtomicBoolean(true);
+ mpm = multiProgressMonitorFactory.create(progressOut, TaskKind.INDEXING, "Reindexing changes");
+ doneTask = mpm.beginVolatileSubTask("changes");
+ failedTask = mpm.beginSubTask("failed", MultiProgressMonitor.UNKNOWN);
+ List<ListenableFuture<?>> futures;
try {
- projectSlices = new SliceCreator().create();
- } catch (ProjectsCollectionFailure | InterruptedException | ExecutionException e) {
+ futures = new SliceScheduler(index, ok).schedule();
+ } catch (ProjectsCollectionFailure e) {
logger.atSevere().log(e.getMessage());
return Result.create(sw, false, 0, 0);
}
- // Since project slices are created in parallel, they are somewhat shuffled already. However,
- // the number of threads used to create the project slices doesn't guarantee good randomization.
- // If the slices are not shuffled well, then multiple threads would typically work concurrently
- // on different slices of the same project. While this is not a big issue, shuffling the list
- // beforehand helps with ungrouping the project slices, so different slices are less likely to
- // be worked on concurrently.
- // This shuffling gave a 6% runtime reduction for Wikimedia's Gerrit in 2020.
- Collections.shuffle(projectSlices);
- return indexAll(index, projectSlices);
- }
-
- private SiteIndexer.Result indexAll(ChangeIndex index, List<ProjectSlice> projectSlices) {
- Stopwatch sw = Stopwatch.createStarted();
- MultiProgressMonitor mpm =
- multiProgressMonitorFactory.create(progressOut, TaskKind.INDEXING, "Reindexing changes");
- Task projTask = mpm.beginSubTask("project-slices", projectSlices.size());
- checkState(totalWork >= 0);
- Task doneTask = mpm.beginSubTask(null, totalWork);
- Task failedTask = mpm.beginSubTask("failed", MultiProgressMonitor.UNKNOWN);
-
- List<ListenableFuture<?>> futures = new ArrayList<>();
- AtomicBoolean ok = new AtomicBoolean(true);
-
- for (ProjectSlice projectSlice : projectSlices) {
- Project.NameKey name = projectSlice.name();
- int slice = projectSlice.slice();
- int slices = projectSlice.slices();
- ListenableFuture<?> future =
- executor.submit(
- reindexProject(
- indexerFactory.create(executor, index),
- name,
- slice,
- slices,
- projectSlice.scanResult(),
- doneTask,
- failedTask));
- String description = "project " + name + " (" + slice + "/" + slices + ")";
- addErrorListener(future, description, projTask, ok);
- futures.add(future);
- }
-
try {
mpm.waitFor(
transform(
@@ -316,30 +275,53 @@
}
}
- private class SliceCreator {
- final Set<ProjectSlice> projectSlices = Sets.newConcurrentHashSet();
+ private class SliceScheduler {
+ final ChangeIndex index;
+ final AtomicBoolean ok;
final AtomicInteger changeCount = new AtomicInteger(0);
final AtomicInteger projectsFailed = new AtomicInteger(0);
- final ProgressMonitor pm = new TextProgressMonitor();
+ final List<ListenableFuture<?>> sliceIndexerFutures = new ArrayList<>();
+ final List<ListenableFuture<?>> sliceCreationFutures = new ArrayList<>();
+ VolatileTask projTask = mpm.beginVolatileSubTask("project-slices");
+ Task slicingProjects;
- private List<ProjectSlice> create()
- throws ProjectsCollectionFailure, InterruptedException, ExecutionException {
- List<ListenableFuture<?>> futures = new ArrayList<>();
- pm.beginTask("Collecting projects", ProgressMonitor.UNKNOWN);
- for (Project.NameKey name : projectCache.all()) {
- futures.add(executor.submit(new ProjectSliceCreator(name)));
+ public SliceScheduler(ChangeIndex index, AtomicBoolean ok) {
+ this.index = index;
+ this.ok = ok;
+ }
+
+ private List<ListenableFuture<?>> schedule() throws ProjectsCollectionFailure {
+ ImmutableSortedSet<Project.NameKey> projects = projectCache.all();
+ int projectCount = projects.size();
+ slicingProjects = mpm.beginSubTask("Slicing projects", projectCount);
+ for (Project.NameKey name : projects) {
+ sliceCreationFutures.add(executor.submit(new ProjectSliceCreator(name)));
}
- Futures.allAsList(futures).get();
+ try {
+ mpm.waitForNonFinalTask(
+ transform(
+ successfulAsList(sliceCreationFutures),
+ x -> {
+ projTask.finalizeTotal();
+ doneTask.finalizeTotal();
+ return null;
+ },
+ directExecutor()));
+ } catch (UncheckedExecutionException e) {
+ logger.atSevere().withCause(e).log("Error project slice creation");
+ ok.set(false);
+ }
- if (projectsFailed.get() > projectCache.all().size() / 2) {
+ if (projectsFailed.get() > projectCount / 2) {
throw new ProjectsCollectionFailure(
"Over 50%% of the projects could not be collected: aborted");
}
- pm.endTask();
+ slicingProjects.endTask();
setTotalWork(changeCount.get());
- return projectSlices.stream().collect(Collectors.toList());
+
+ return sliceIndexerFutures;
}
private class ProjectSliceCreator implements Callable<Void> {
@@ -361,15 +343,32 @@
verboseWriter.println(
"Submitting " + name + " for indexing in " + slices + " slices");
}
+
+ doneTask.updateTotal(size);
+ projTask.updateTotal(slices);
+
for (int slice = 0; slice < slices; slice++) {
- projectSlices.add(ProjectSlice.create(name, slice, slices, sr));
+ ProjectSlice projectSlice = ProjectSlice.create(name, slice, slices, sr);
+ ListenableFuture<?> future =
+ executor.submit(
+ reindexProject(
+ indexerFactory.create(executor, index),
+ name,
+ slice,
+ slices,
+ projectSlice.scanResult(),
+ doneTask,
+ failedTask));
+ String description = "project " + name + " (" + slice + "/" + slices + ")";
+ addErrorListener(future, description, projTask, ok);
+ sliceIndexerFutures.add(future);
}
}
} catch (IOException e) {
logger.atSevere().withCause(e).log("Error collecting project %s", name);
projectsFailed.incrementAndGet();
}
- pm.update(1);
+ slicingProjects.update(1);
return null;
}
}
diff --git a/java/com/google/gerrit/server/index/change/ChangeField.java b/java/com/google/gerrit/server/index/change/ChangeField.java
index 6c8e3fb..3d5dca8 100644
--- a/java/com/google/gerrit/server/index/change/ChangeField.java
+++ b/java/com/google/gerrit/server/index/change/ChangeField.java
@@ -152,19 +152,29 @@
public static final FieldDef<ChangeData, String> FUZZY_TOPIC =
fullText("topic5").build(ChangeField::getTopic);
+ /** Topic, a short annotation on the branch. */
+ public static final FieldDef<ChangeData, String> PREFIX_TOPIC =
+ prefix("topic6").build(ChangeField::getTopic);
+
/** Submission id assigned by MergeOp. */
public static final FieldDef<ChangeData, String> SUBMISSIONID =
exact(ChangeQueryBuilder.FIELD_SUBMISSIONID).build(changeGetter(Change::getSubmissionId));
/** Last update time since January 1, 1970. */
+ // TODO(issue-15518): Migrate type for timestamp index fields from Timestamp to Instant
public static final FieldDef<ChangeData, Timestamp> UPDATED =
- timestamp("updated2").stored().build(changeGetter(Change::getLastUpdatedOn));
+ timestamp("updated2")
+ .stored()
+ .build(changeGetter(change -> Timestamp.from(change.getLastUpdatedOn())));
/** When this change was merged, time since January 1, 1970. */
+ // TODO(issue-15518): Migrate type for timestamp index fields from Timestamp to Instant
public static final FieldDef<ChangeData, Timestamp> MERGED_ON =
timestamp(ChangeQueryBuilder.FIELD_MERGED_ON)
.stored()
- .build(cd -> cd.getMergedOn().orElse(null), (cd, field) -> cd.setMergedOn(field));
+ .build(
+ cd -> cd.getMergedOn().map(Timestamp::from).orElse(null),
+ (cd, field) -> cd.setMergedOn(field != null ? field.toInstant() : null));
/** List of full file paths modified in the current patch set. */
public static final FieldDef<ChangeData, Iterable<String>> PATH =
@@ -195,6 +205,11 @@
fullText("hashtag2")
.buildRepeatable(cd -> cd.hashtags().stream().map(String::toLowerCase).collect(toSet()));
+ /** Hashtags as prefix field for in-string search. */
+ public static final FieldDef<ChangeData, Iterable<String>> PREFIX_HASHTAG =
+ prefix("hashtag3")
+ .buildRepeatable(cd -> cd.hashtags().stream().map(String::toLowerCase).collect(toSet()));
+
/** Hashtags with original case. */
public static final FieldDef<ChangeData, Iterable<byte[]>> HASHTAG_CASE_AWARE =
storedOnly("_hashtag")
@@ -435,11 +450,10 @@
@VisibleForTesting
static List<String> getReviewerFieldValues(ReviewerSet reviewers) {
List<String> r = new ArrayList<>(reviewers.asTable().size() * 2);
- for (Table.Cell<ReviewerStateInternal, Account.Id, Timestamp> c :
- reviewers.asTable().cellSet()) {
+ for (Table.Cell<ReviewerStateInternal, Account.Id, Instant> c : reviewers.asTable().cellSet()) {
String v = getReviewerFieldValue(c.getRowKey(), c.getColumnKey());
r.add(v);
- r.add(v + ',' + c.getValue().getTime());
+ r.add(v + ',' + c.getValue().toEpochMilli());
}
return r;
}
@@ -451,7 +465,7 @@
@VisibleForTesting
static List<String> getReviewerByEmailFieldValues(ReviewerByEmailSet reviewersByEmail) {
List<String> r = new ArrayList<>(reviewersByEmail.asTable().size() * 2);
- for (Table.Cell<ReviewerStateInternal, Address, Timestamp> c :
+ for (Table.Cell<ReviewerStateInternal, Address, Instant> c :
reviewersByEmail.asTable().cellSet()) {
String v = getReviewerByEmailFieldValue(c.getRowKey(), c.getColumnKey());
r.add(v);
@@ -460,7 +474,7 @@
Address emailOnly = Address.create(c.getColumnKey().email());
r.add(getReviewerByEmailFieldValue(c.getRowKey(), emailOnly));
}
- r.add(v + ',' + c.getValue().getTime());
+ r.add(v + ',' + c.getValue().toEpochMilli());
}
return r;
}
@@ -470,8 +484,7 @@
}
public static ReviewerSet parseReviewerFieldValues(Change.Id changeId, Iterable<String> values) {
- ImmutableTable.Builder<ReviewerStateInternal, Account.Id, Timestamp> b =
- ImmutableTable.builder();
+ ImmutableTable.Builder<ReviewerStateInternal, Account.Id, Instant> b = ImmutableTable.builder();
for (String v : values) {
int i = v.indexOf(',');
@@ -513,7 +526,7 @@
"Failed to parse timestamp of reviewer field from change %s: %s", changeId.get(), v);
continue;
}
- Timestamp timestamp = new Timestamp(l);
+ Instant timestamp = Instant.ofEpochMilli(l);
b.put(reviewerState.get(), accountId.get(), timestamp);
}
@@ -522,7 +535,7 @@
public static ReviewerByEmailSet parseReviewerByEmailFieldValues(
Change.Id changeId, Iterable<String> values) {
- ImmutableTable.Builder<ReviewerStateInternal, Address, Timestamp> b = ImmutableTable.builder();
+ ImmutableTable.Builder<ReviewerStateInternal, Address, Instant> b = ImmutableTable.builder();
for (String v : values) {
int i = v.indexOf(',');
if (i < 0) {
@@ -566,7 +579,7 @@
changeId.get(), v);
continue;
}
- Timestamp timestamp = new Timestamp(l);
+ Instant timestamp = Instant.ofEpochMilli(l);
b.put(reviewerState.get(), address, timestamp);
}
diff --git a/java/com/google/gerrit/server/index/change/ChangeSchemaDefinitions.java b/java/com/google/gerrit/server/index/change/ChangeSchemaDefinitions.java
index e1536cc..9ff806d 100644
--- a/java/com/google/gerrit/server/index/change/ChangeSchemaDefinitions.java
+++ b/java/com/google/gerrit/server/index/change/ChangeSchemaDefinitions.java
@@ -196,11 +196,23 @@
/** Added new "count=$count" argument to the {@link ChangeField#LABEL} operator. */
static final Schema<ChangeData> V73 = schema(V72, false);
+ @Deprecated
/** Added new field {@link ChangeField#IS_SUBMITTABLE} based on submit requirements. */
static final Schema<ChangeData> V74 =
new Schema.Builder<ChangeData>().add(V73).add(ChangeField.IS_SUBMITTABLE).build();
/**
+ * Added new field {@link ChangeField#PREFIX_HASHTAG} and {@link ChangeField#PREFIX_TOPIC} to
+ * allow easier search for topics.
+ */
+ static final Schema<ChangeData> V75 =
+ new Schema.Builder<ChangeData>()
+ .add(V74)
+ .add(ChangeField.PREFIX_HASHTAG)
+ .add(ChangeField.PREFIX_TOPIC)
+ .build();
+
+ /**
* Name of the change index to be used when contacting index backends or loading configurations.
*/
public static final String NAME = "changes";
diff --git a/java/com/google/gerrit/server/index/change/IndexedChangeQuery.java b/java/com/google/gerrit/server/index/change/IndexedChangeQuery.java
index 57a2091..b804c4c 100644
--- a/java/com/google/gerrit/server/index/change/IndexedChangeQuery.java
+++ b/java/com/google/gerrit/server/index/change/IndexedChangeQuery.java
@@ -84,7 +84,7 @@
final DataSource<ChangeData> currSource = source;
final ResultSet<ChangeData> rs = currSource.read();
- return new ResultSet<ChangeData>() {
+ return new ResultSet<>() {
@Override
public Iterator<ChangeData> iterator() {
return Iterables.transform(
diff --git a/java/com/google/gerrit/server/index/group/GroupField.java b/java/com/google/gerrit/server/index/group/GroupField.java
index df90c0d..af74514 100644
--- a/java/com/google/gerrit/server/index/group/GroupField.java
+++ b/java/com/google/gerrit/server/index/group/GroupField.java
@@ -47,8 +47,9 @@
exact("owner_uuid").build(g -> g.getOwnerGroupUUID().get());
/** Timestamp indicating when this group was created. */
+ // TODO(issue-15518): Migrate type for timestamp index fields from Timestamp to Instant
public static final FieldDef<InternalGroup, Timestamp> CREATED_ON =
- timestamp("created_on").build(InternalGroup::getCreatedOn);
+ timestamp("created_on").build(internalGroup -> Timestamp.from(internalGroup.getCreatedOn()));
/** Group name. */
public static final FieldDef<InternalGroup, String> NAME =
diff --git a/java/com/google/gerrit/server/logging/RequestId.java b/java/com/google/gerrit/server/logging/RequestId.java
index 543f0a2..3ae9598 100644
--- a/java/com/google/gerrit/server/logging/RequestId.java
+++ b/java/com/google/gerrit/server/logging/RequestId.java
@@ -61,7 +61,7 @@
h.putLong(Thread.currentThread().getId()).putUnencodedChars(MACHINE_ID);
str =
(resourceId != null ? resourceId + "-" : "")
- + TimeUtil.nowTs().getTime()
+ + TimeUtil.now().toEpochMilli()
+ "-"
+ h.hash().toString().substring(0, 8);
}
diff --git a/java/com/google/gerrit/server/mail/receive/MailProcessor.java b/java/com/google/gerrit/server/mail/receive/MailProcessor.java
index 6d20ae5..0fc89ba 100644
--- a/java/com/google/gerrit/server/mail/receive/MailProcessor.java
+++ b/java/com/google/gerrit/server/mail/receive/MailProcessor.java
@@ -313,7 +313,7 @@
}
Op o = new Op(PatchSet.id(cd.getId(), metadata.patchSet), parsedComments, message.id());
- BatchUpdate batchUpdate = buf.create(project, ctx.getUser(), TimeUtil.nowTs());
+ BatchUpdate batchUpdate = buf.create(project, ctx.getUser(), TimeUtil.now());
batchUpdate.addOp(cd.getId(), o);
batchUpdate.execute();
}
diff --git a/java/com/google/gerrit/server/mail/send/ChangeEmail.java b/java/com/google/gerrit/server/mail/send/ChangeEmail.java
index 9aec1f4..63b9c70 100644
--- a/java/com/google/gerrit/server/mail/send/ChangeEmail.java
+++ b/java/com/google/gerrit/server/mail/send/ChangeEmail.java
@@ -24,6 +24,7 @@
import com.google.common.flogger.FluentLogger;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.entities.Account;
+import com.google.gerrit.entities.AttentionSetUpdate;
import com.google.gerrit.entities.Change;
import com.google.gerrit.entities.NotifyConfig.NotifyType;
import com.google.gerrit.entities.Patch;
@@ -52,15 +53,15 @@
import com.google.gerrit.server.project.ProjectState;
import com.google.gerrit.server.query.change.ChangeData;
import java.io.IOException;
-import java.sql.Timestamp;
import java.text.MessageFormat;
+import java.time.Instant;
import java.util.Collection;
-import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
+import java.util.TreeMap;
import java.util.TreeSet;
import java.util.stream.Collectors;
import org.apache.james.mime4j.dom.field.FieldName;
@@ -87,7 +88,7 @@
protected PatchSet patchSet;
protected PatchSetInfo patchSetInfo;
protected String changeMessage;
- protected Timestamp timestamp;
+ protected Instant timestamp;
protected ProjectState projectState;
protected Set<Account.Id> authors;
@@ -97,17 +98,17 @@
protected ChangeEmail(EmailArguments args, String messageClass, ChangeData changeData) {
super(args, messageClass, changeData.change().getDest());
this.changeData = changeData;
- this.change = changeData.change();
- this.emailOnlyAuthors = false;
- this.emailOnlyAttentionSetIfEnabled = true;
- this.currentAttentionSet = getAttentionSet();
+ change = changeData.change();
+ emailOnlyAuthors = false;
+ emailOnlyAttentionSetIfEnabled = true;
+ currentAttentionSet = getAttentionSet();
}
@Override
public void setFrom(Account.Id id) {
super.setFrom(id);
- /** Is the from user in an email squelching group? */
+ // Is the from user in an email squelching group?
try {
args.permissionBackend.absentUser(id).check(GlobalPermission.EMAIL_REVIEWERS);
} catch (AuthException | PermissionBackendException e) {
@@ -124,7 +125,7 @@
patchSetInfo = psi;
}
- public void setChangeMessage(String cm, Timestamp t) {
+ public void setChangeMessage(String cm, Instant t) {
changeMessage = cm;
timestamp = t;
}
@@ -191,7 +192,7 @@
super.init();
if (timestamp != null) {
- setHeader(FieldName.DATE, new Date(timestamp.getTime()));
+ setHeader(FieldName.DATE, timestamp);
}
setChangeSubjectHeader();
setHeader(MailHeader.CHANGE_ID.fieldName(), "" + change.getKey().get());
@@ -241,11 +242,11 @@
public String getChangeMessageThreadId() {
return "<gerrit."
- + change.getCreatedOn().getTime()
+ + change.getCreatedOn().toEpochMilli()
+ "."
+ change.getKey().get()
+ "@"
- + this.getGerritHost()
+ + getGerritHost()
+ ">";
}
@@ -270,7 +271,8 @@
if (patchSet != null) {
detail.append("---\n");
- Map<String, FileDiffOutput> modifiedFiles = listModifiedFiles();
+ // Sort files by name.
+ TreeMap<String, FileDiffOutput> modifiedFiles = new TreeMap<>(listModifiedFiles());
for (FileDiffOutput fileDiff : modifiedFiles.values()) {
if (fileDiff.newPath().isPresent() && Patch.isMagic(fileDiff.newPath().get())) {
continue;
@@ -508,7 +510,7 @@
soyContext.put("patchSetInfo", patchSetInfoData);
footers.add(MailHeader.CHANGE_ID.withDelimiter() + change.getKey().get());
- footers.add(MailHeader.CHANGE_NUMBER.withDelimiter() + Integer.toString(change.getChangeId()));
+ footers.add(MailHeader.CHANGE_NUMBER.withDelimiter() + change.getChangeId());
footers.add(MailHeader.PATCH_SET.withDelimiter() + patchSet.number());
footers.add(MailHeader.OWNER.withDelimiter() + getNameEmailFor(change.getOwner()));
if (change.getAssignee() != null) {
@@ -560,7 +562,7 @@
try {
attentionSet =
additionsOnly(changeData.attentionSet()).stream()
- .map(a -> a.account())
+ .map(AttentionSetUpdate::account)
.collect(Collectors.toSet());
} catch (StorageException e) {
logger.atWarning().withCause(e).log("Cannot get change attention set");
@@ -627,7 +629,8 @@
* @param sourceDiff the unified diff that we're converting to the map.
* @return map of 'type' to a line's content.
*/
- protected ImmutableList<ImmutableMap<String, String>> getDiffTemplateData(String sourceDiff) {
+ protected static ImmutableList<ImmutableMap<String, String>> getDiffTemplateData(
+ String sourceDiff) {
ImmutableList.Builder<ImmutableMap<String, String>> result = ImmutableList.builder();
Splitter lineSplitter = Splitter.on(System.getProperty("line.separator"));
for (String diffLine : lineSplitter.split(sourceDiff)) {
diff --git a/java/com/google/gerrit/server/mail/send/CommentSender.java b/java/com/google/gerrit/server/mail/send/CommentSender.java
index 5a7352a..81e4f3e 100644
--- a/java/com/google/gerrit/server/mail/send/CommentSender.java
+++ b/java/com/google/gerrit/server/mail/send/CommentSender.java
@@ -555,6 +555,6 @@
private String getCommentTimestamp() {
// Grouping is currently done by timestamp.
return MailProcessingUtil.rfcDateformatter.format(
- ZonedDateTime.ofInstant(timestamp.toInstant(), ZoneId.of("UTC")));
+ ZonedDateTime.ofInstant(timestamp, ZoneId.of("UTC")));
}
}
diff --git a/java/com/google/gerrit/server/mail/send/OutgoingEmail.java b/java/com/google/gerrit/server/mail/send/OutgoingEmail.java
index d2e878f..32a8252 100644
--- a/java/com/google/gerrit/server/mail/send/OutgoingEmail.java
+++ b/java/com/google/gerrit/server/mail/send/OutgoingEmail.java
@@ -42,9 +42,9 @@
import com.google.template.soy.jbcsrc.api.SoySauce;
import java.net.MalformedURLException;
import java.net.URL;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -324,7 +324,7 @@
setupSoyContext();
smtpFromAddress = args.fromAddressGenerator.get().from(fromId);
- setHeader(FieldName.DATE, new Date());
+ setHeader(FieldName.DATE, Instant.now());
headers.put(FieldName.FROM, new EmailHeader.AddressList(smtpFromAddress));
headers.put(FieldName.TO, new EmailHeader.AddressList());
headers.put(FieldName.CC, new EmailHeader.AddressList());
@@ -398,7 +398,7 @@
headers.remove(name);
}
- protected void setHeader(String name, Date date) {
+ protected void setHeader(String name, Instant date) {
headers.put(name, new EmailHeader.Date(date));
}
diff --git a/java/com/google/gerrit/server/mail/send/SmtpEmailSender.java b/java/com/google/gerrit/server/mail/send/SmtpEmailSender.java
index d32e6fb..0a721cf 100644
--- a/java/com/google/gerrit/server/mail/send/SmtpEmailSender.java
+++ b/java/com/google/gerrit/server/mail/send/SmtpEmailSender.java
@@ -36,10 +36,11 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Writer;
-import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
import java.util.Collection;
import java.util.Collections;
-import java.util.Date;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -281,9 +282,11 @@
setMissingHeader(hdrs, "Importance", importance);
}
if (expiryDays > 0) {
- Date expiry = new Date(TimeUtil.nowMs() + expiryDays * 24 * 60 * 60 * 1000L);
- setMissingHeader(
- hdrs, "Expiry-Date", new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z").format(expiry));
+ Instant expiry = Instant.ofEpochMilli(TimeUtil.nowMs() + expiryDays * 24 * 60 * 60 * 1000L);
+ DateTimeFormatter fmt =
+ DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss Z")
+ .withZone(ZoneId.systemDefault());
+ setMissingHeader(hdrs, "Expiry-Date", fmt.format(expiry));
}
String encodedBody;
diff --git a/java/com/google/gerrit/server/notedb/AbstractChangeUpdate.java b/java/com/google/gerrit/server/notedb/AbstractChangeUpdate.java
index 6677490..7efda47 100644
--- a/java/com/google/gerrit/server/notedb/AbstractChangeUpdate.java
+++ b/java/com/google/gerrit/server/notedb/AbstractChangeUpdate.java
@@ -28,6 +28,7 @@
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.InternalUser;
import java.io.IOException;
+import java.time.Instant;
import java.util.Date;
import org.eclipse.jgit.lib.CommitBuilder;
import org.eclipse.jgit.lib.Constants;
@@ -45,7 +46,7 @@
protected final Account.Id accountId;
protected final Account.Id realAccountId;
protected final PersonIdent authorIdent;
- protected final Date when;
+ protected final Instant when;
@Nullable private final ChangeNotes notes;
private final Change change;
@@ -55,14 +56,17 @@
private ObjectId result;
boolean rootOnly;
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
AbstractChangeUpdate(
ChangeNotes notes,
CurrentUser user,
PersonIdent serverIdent,
ChangeNoteUtil noteUtil,
- Date when) {
+ Instant when) {
this.noteUtil = noteUtil;
- this.serverIdent = new PersonIdent(serverIdent, when);
+ this.serverIdent = new PersonIdent(serverIdent, Date.from(when));
this.notes = notes;
this.change = notes.getChange();
this.accountId = accountId(user);
@@ -72,6 +76,9 @@
this.when = when;
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
AbstractChangeUpdate(
ChangeNoteUtil noteUtil,
PersonIdent serverIdent,
@@ -80,12 +87,12 @@
Account.Id accountId,
Account.Id realAccountId,
PersonIdent authorIdent,
- Date when) {
+ Instant when) {
checkArgument(
(notes != null && change == null) || (notes == null && change != null),
"exactly one of notes or change required");
this.noteUtil = noteUtil;
- this.serverIdent = new PersonIdent(serverIdent, when);
+ this.serverIdent = new PersonIdent(serverIdent, Date.from(when));
this.notes = notes;
this.change = change != null ? change : notes.getChange();
this.accountId = accountId;
@@ -107,7 +114,7 @@
}
private static PersonIdent ident(
- ChangeNoteUtil noteUtil, PersonIdent serverIdent, CurrentUser u, Date when) {
+ ChangeNoteUtil noteUtil, PersonIdent serverIdent, CurrentUser u, Instant when) {
checkUserType(u);
if (u instanceof IdentifiedUser) {
return noteUtil.newAccountIdIdent(u.asIdentifiedUser().getAccount().id(), when, serverIdent);
@@ -137,7 +144,7 @@
return change;
}
- public Date getWhen() {
+ public Instant getWhen() {
return when;
}
@@ -206,6 +213,9 @@
* deleted.
* @throws IOException if a lower-level error occurred.
*/
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
final ObjectId apply(RevWalk rw, ObjectInserter ins, ObjectId curr) throws IOException {
if (isEmpty()) {
return null;
@@ -226,7 +236,7 @@
return null; // Impl is a no-op.
}
cb.setAuthor(authorIdent);
- cb.setCommitter(new PersonIdent(serverIdent, when));
+ cb.setCommitter(new PersonIdent(serverIdent, Date.from(when)));
setParentCommit(cb, curr);
if (cb.getTreeId() == null) {
if (curr.equals(z)) {
diff --git a/java/com/google/gerrit/server/notedb/ChangeDraftUpdate.java b/java/com/google/gerrit/server/notedb/ChangeDraftUpdate.java
index 57f6353..5d19205 100644
--- a/java/com/google/gerrit/server/notedb/ChangeDraftUpdate.java
+++ b/java/com/google/gerrit/server/notedb/ChangeDraftUpdate.java
@@ -31,9 +31,9 @@
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject;
import java.io.IOException;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -60,14 +60,14 @@
@Assisted("effective") Account.Id accountId,
@Assisted("real") Account.Id realAccountId,
PersonIdent authorIdent,
- Date when);
+ Instant when);
ChangeDraftUpdate create(
Change change,
@Assisted("effective") Account.Id accountId,
@Assisted("real") Account.Id realAccountId,
PersonIdent authorIdent,
- Date when);
+ Instant when);
}
@AutoValue
@@ -101,7 +101,7 @@
@Assisted("effective") Account.Id accountId,
@Assisted("real") Account.Id realAccountId,
@Assisted PersonIdent authorIdent,
- @Assisted Date when) {
+ @Assisted Instant when) {
super(noteUtil, serverIdent, notes, null, accountId, realAccountId, authorIdent, when);
this.draftsProject = allUsers;
}
@@ -115,7 +115,7 @@
@Assisted("effective") Account.Id accountId,
@Assisted("real") Account.Id realAccountId,
@Assisted PersonIdent authorIdent,
- @Assisted Date when) {
+ @Assisted Instant when) {
super(noteUtil, serverIdent, null, change, accountId, realAccountId, authorIdent, when);
this.draftsProject = allUsers;
}
diff --git a/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java b/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java
index 4f72f2e..e9d2f4c 100644
--- a/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java
+++ b/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java
@@ -100,11 +100,15 @@
* Returns a {@link PersonIdent} that contains the account ID, but not the user's name or email
* address.
*/
- public PersonIdent newAccountIdIdent(Account.Id accountId, Date when, PersonIdent serverIdent) {
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
+ public PersonIdent newAccountIdIdent(
+ Account.Id accountId, Instant when, PersonIdent serverIdent) {
return new PersonIdent(
getAccountIdAsUsername(accountId),
getAccountIdAsEmailAddress(accountId),
- when,
+ Date.from(when),
serverIdent.getTimeZone());
}
diff --git a/java/com/google/gerrit/server/notedb/ChangeNotes.java b/java/com/google/gerrit/server/notedb/ChangeNotes.java
index 3dae2b8..bec4b721f 100644
--- a/java/com/google/gerrit/server/notedb/ChangeNotes.java
+++ b/java/com/google/gerrit/server/notedb/ChangeNotes.java
@@ -66,7 +66,7 @@
import com.google.inject.Provider;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -487,11 +487,19 @@
/**
* Returns the evaluated submit requirements for the change. We only intend to store submit
- * requirements in NoteDb for closed changes, hence the result will be an empty list for active
- * changes, or a list of submit requirements results otherwise. For closed changes, the results
- * represent the state of evaluating submit requirements for this change when it was merged.
+ * requirements in NoteDb for closed changes. For closed changes, the results represent the state
+ * of evaluating submit requirements for this change when it was merged or abandoned.
+ *
+ * @throws UnsupportedOperationException if submit requirements are requested for an open change.
*/
public ImmutableList<SubmitRequirementResult> getSubmitRequirementsResult() {
+ if (state.columns().status().isOpen()) {
+ throw new UnsupportedOperationException(
+ String.format(
+ "Cannot request stored submit requirements"
+ + " for an open change: project = %s, change ID = %d",
+ getProjectName(), state.changeId().get()));
+ }
return state.submitRequirementsResult();
}
@@ -559,7 +567,7 @@
}
/** Returns {@link Optional} value of time when the change was merged. */
- public Optional<Timestamp> getMergedOn() {
+ public Optional<Instant> getMergedOn() {
return Optional.ofNullable(state.mergedOn());
}
diff --git a/java/com/google/gerrit/server/notedb/ChangeNotesParser.java b/java/com/google/gerrit/server/notedb/ChangeNotesParser.java
index ec98f6ea..8c876b4 100644
--- a/java/com/google/gerrit/server/notedb/ChangeNotesParser.java
+++ b/java/com/google/gerrit/server/notedb/ChangeNotesParser.java
@@ -125,8 +125,8 @@
// Private final but mutable members initialized in the constructor and filled
// in during the parsing process.
- private final Table<Account.Id, ReviewerStateInternal, Timestamp> reviewers;
- private final Table<Address, ReviewerStateInternal, Timestamp> reviewersByEmail;
+ private final Table<Account.Id, ReviewerStateInternal, Instant> reviewers;
+ private final Table<Address, ReviewerStateInternal, Instant> reviewersByEmail;
private final List<Account.Id> allPastReviewers;
private final List<ReviewerStatusUpdate> reviewerUpdates;
/** Holds only the most recent update per user. Older updates are discarded. */
@@ -151,8 +151,8 @@
private Change.Status status;
private String topic;
private Set<String> hashtags;
- private Timestamp createdOn;
- private Timestamp lastUpdatedOn;
+ private Instant createdOn;
+ private Instant lastUpdatedOn;
private Account.Id ownerId;
private String serverId;
private String changeId;
@@ -173,7 +173,7 @@
// We only set the value once, based on the latest update (the actual value or Optional.empty() if
// the latest record unsets the field).
private Optional<PatchSet.Id> cherryPickOf;
- private Timestamp mergedOn;
+ private Instant mergedOn;
ChangeNotesParser(
Change.Id changeId,
@@ -413,7 +413,7 @@
}
private void parse(ChangeNotesCommit commit) throws ConfigInvalidException {
- Timestamp commitTimestamp = getCommitTimestamp(commit);
+ Instant commitTimestamp = getCommitTimestamp(commit);
createdOn = commitTimestamp;
parseTag(commit);
@@ -467,7 +467,7 @@
parseSubmission(commit, commitTimestamp);
- if (lastUpdatedOn == null || commitTimestamp.after(lastUpdatedOn)) {
+ if (lastUpdatedOn == null || commitTimestamp.isAfter(lastUpdatedOn)) {
lastUpdatedOn = commitTimestamp;
}
@@ -529,7 +529,7 @@
}
}
- private void parseSubmission(ChangeNotesCommit commit, Timestamp commitTimestamp)
+ private void parseSubmission(ChangeNotesCommit commit, Instant commitTimestamp)
throws ConfigInvalidException {
// Only parse the most recent sumbit commit (there should be exactly one).
if (submissionId == null) {
@@ -612,7 +612,7 @@
}
}
- private void parsePatchSet(PatchSet.Id psId, ObjectId rev, Account.Id accountId, Timestamp ts)
+ private void parsePatchSet(PatchSet.Id psId, ObjectId rev, Account.Id accountId, Instant ts)
throws ConfigInvalidException {
if (accountId == null) {
throw parseException("patch set %s requires an identified user as uploader", psId.get());
@@ -707,7 +707,7 @@
}
}
- private void parseAssigneeUpdates(Timestamp ts, ChangeNotesCommit commit)
+ private void parseAssigneeUpdates(Instant ts, ChangeNotesCommit commit)
throws ConfigInvalidException {
String assigneeValue = parseOneFooter(commit, FOOTER_ASSIGNEE);
if (assigneeValue != null) {
@@ -817,7 +817,7 @@
Account.Id accountId,
Account.Id realAccountId,
ChangeNotesCommit commit,
- Timestamp ts) {
+ Instant ts) {
Optional<String> changeMsgString = getChangeMessageString(commit);
if (!changeMsgString.isPresent()) {
return false;
@@ -863,8 +863,28 @@
for (HumanComment c : e.getValue().getEntities()) {
humanComments.put(e.getKey(), c);
}
- for (SubmitRequirementResult sr : e.getValue().getSubmitRequirementsResult()) {
- submitRequirementResults.add(sr);
+ }
+
+ // Lookup submit requirement results from the revision notes of the last PS that has stored
+ // submit requirements. This is important for cases where the change was abandoned/un-abandoned
+ // multiple times. With each abandon, we store submit requirement results in NoteDb, so we can
+ // end up having stored SRs in many revision notes. We should only return SRs from the last
+ // PS of them.
+ for (PatchSet.Builder ps :
+ patchSets.values().stream()
+ .sorted(comparingInt((PatchSet.Builder p) -> p.id().get()).reversed())
+ .collect(Collectors.toList())) {
+ Optional<ObjectId> maybePsCommitId = ps.commitId();
+ if (!maybePsCommitId.isPresent()) {
+ continue;
+ }
+ ObjectId psCommitId = maybePsCommitId.get();
+ if (rns.containsKey(psCommitId)
+ && rns.get(psCommitId).getSubmitRequirementsResult() != null) {
+ rns.get(psCommitId)
+ .getSubmitRequirementsResult()
+ .forEach(sr -> submitRequirementResults.add(sr));
+ break;
}
}
@@ -882,7 +902,7 @@
}
/** Parses copied {@link PatchSetApproval}. */
- private void parseCopiedApproval(PatchSet.Id psId, Timestamp ts, String line)
+ private void parseCopiedApproval(PatchSet.Id psId, Instant ts, String line)
throws ConfigInvalidException {
ParsedPatchSetApproval parsedPatchSetApproval = ChangeNoteUtil.parseCopiedApproval(line);
checkFooter(
@@ -930,7 +950,7 @@
}
private void parseApproval(
- PatchSet.Id psId, Account.Id accountId, Account.Id realAccountId, Timestamp ts, String line)
+ PatchSet.Id psId, Account.Id accountId, Account.Id realAccountId, Instant ts, String line)
throws ConfigInvalidException {
if (accountId == null) {
throw parseException("patch set %s requires an identified user as uploader", psId.get());
@@ -950,7 +970,7 @@
PatchSet.Id psId,
Account.Id committerId,
Account.Id realAccountId,
- Timestamp ts,
+ Instant ts,
ParsedPatchSetApproval parsedPatchSetApproval)
throws ConfigInvalidException {
@@ -984,7 +1004,7 @@
PatchSet.Id psId,
Account.Id committerId,
Account.Id realAccountId,
- Timestamp ts,
+ Instant ts,
ParsedPatchSetApproval parsedPatchSetApproval)
throws ConfigInvalidException {
@@ -1098,7 +1118,7 @@
return parseIdent(a);
}
- private void parseReviewer(Timestamp ts, ReviewerStateInternal state, String line)
+ private void parseReviewer(Instant ts, ReviewerStateInternal state, String line)
throws ConfigInvalidException {
PersonIdent ident = RawParseUtils.parsePersonIdent(line);
if (ident == null) {
@@ -1111,7 +1131,7 @@
}
}
- private void parseReviewerByEmail(Timestamp ts, ReviewerStateInternal state, String line)
+ private void parseReviewerByEmail(Instant ts, ReviewerStateInternal state, String line)
throws ConfigInvalidException {
Address adr;
try {
@@ -1225,15 +1245,18 @@
* @param commit the commit to return commit time.
* @return the timestamp when the commit was applied.
*/
- private Timestamp getCommitTimestamp(ChangeNotesCommit commit) {
- return new Timestamp(commit.getCommitterIdent().getWhen().getTime());
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
+ private Instant getCommitTimestamp(ChangeNotesCommit commit) {
+ return commit.getCommitterIdent().getWhen().toInstant();
}
private void pruneReviewers() {
- Iterator<Table.Cell<Account.Id, ReviewerStateInternal, Timestamp>> rit =
+ Iterator<Table.Cell<Account.Id, ReviewerStateInternal, Instant>> rit =
reviewers.cellSet().iterator();
while (rit.hasNext()) {
- Table.Cell<Account.Id, ReviewerStateInternal, Timestamp> e = rit.next();
+ Table.Cell<Account.Id, ReviewerStateInternal, Instant> e = rit.next();
if (e.getColumnKey() == ReviewerStateInternal.REMOVED) {
rit.remove();
}
@@ -1241,10 +1264,10 @@
}
private void pruneReviewersByEmail() {
- Iterator<Table.Cell<Address, ReviewerStateInternal, Timestamp>> rit =
+ Iterator<Table.Cell<Address, ReviewerStateInternal, Instant>> rit =
reviewersByEmail.cellSet().iterator();
while (rit.hasNext()) {
- Table.Cell<Address, ReviewerStateInternal, Timestamp> e = rit.next();
+ Table.Cell<Address, ReviewerStateInternal, Instant> e = rit.next();
if (e.getColumnKey() == ReviewerStateInternal.REMOVED) {
rit.remove();
}
diff --git a/java/com/google/gerrit/server/notedb/ChangeNotesState.java b/java/com/google/gerrit/server/notedb/ChangeNotesState.java
index 4d6b9cf..b0079d7 100644
--- a/java/com/google/gerrit/server/notedb/ChangeNotesState.java
+++ b/java/com/google/gerrit/server/notedb/ChangeNotesState.java
@@ -65,7 +65,6 @@
import com.google.gerrit.server.cache.serialize.ObjectIdConverter;
import com.google.gerrit.server.index.change.ChangeField.StoredSubmitRecord;
import com.google.gson.Gson;
-import java.sql.Timestamp;
import java.time.Instant;
import java.util.List;
import java.util.Map;
@@ -103,8 +102,8 @@
ObjectId metaId,
Change.Id changeId,
Change.Key changeKey,
- Timestamp createdOn,
- Timestamp lastUpdatedOn,
+ Instant createdOn,
+ Instant lastUpdatedOn,
Account.Id owner,
String serverId,
String branch,
@@ -136,7 +135,7 @@
@Nullable Change.Id revertOf,
@Nullable PatchSet.Id cherryPickOf,
int updateCount,
- @Nullable Timestamp mergedOn) {
+ @Nullable Instant mergedOn) {
requireNonNull(
metaId,
() ->
@@ -203,9 +202,9 @@
abstract Change.Key changeKey();
- abstract Timestamp createdOn();
+ abstract Instant createdOn();
- abstract Timestamp lastUpdatedOn();
+ abstract Instant lastUpdatedOn();
abstract Account.Id owner();
@@ -249,9 +248,9 @@
abstract Builder changeKey(Change.Key changeKey);
- abstract Builder createdOn(Timestamp createdOn);
+ abstract Builder createdOn(Instant createdOn);
- abstract Builder lastUpdatedOn(Timestamp lastUpdatedOn);
+ abstract Builder lastUpdatedOn(Instant lastUpdatedOn);
abstract Builder owner(Account.Id owner);
@@ -334,7 +333,7 @@
abstract int updateCount();
@Nullable
- abstract Timestamp mergedOn();
+ abstract Instant mergedOn();
Change newChange(Project.NameKey project) {
ChangeColumns c = requireNonNull(columns(), "columns are required");
@@ -456,7 +455,7 @@
abstract Builder updateCount(int updateCount);
- abstract Builder mergedOn(Timestamp mergedOn);
+ abstract Builder mergedOn(Instant mergedOn);
abstract ChangeNotesState build();
}
@@ -536,7 +535,7 @@
SubmitRequirementProtoConverter.INSTANCE.toProto(sr)));
b.setUpdateCount(object.updateCount());
if (object.mergedOn() != null) {
- b.setMergedOnMillis(object.mergedOn().getTime());
+ b.setMergedOnMillis(object.mergedOn().toEpochMilli());
b.setHasMergedOn(true);
}
@@ -547,8 +546,8 @@
ChangeColumnsProto.Builder b =
ChangeColumnsProto.newBuilder()
.setChangeKey(cols.changeKey().get())
- .setCreatedOnMillis(cols.createdOn().getTime())
- .setLastUpdatedOnMillis(cols.lastUpdatedOn().getTime())
+ .setCreatedOnMillis(cols.createdOn().toEpochMilli())
+ .setLastUpdatedOnMillis(cols.lastUpdatedOn().toEpochMilli())
.setOwner(cols.owner().get())
.setBranch(cols.branch());
if (cols.currentPatchSetId() != null) {
@@ -581,26 +580,26 @@
}
private static ReviewerSetEntryProto toReviewerSetEntry(
- Table.Cell<ReviewerStateInternal, Account.Id, Timestamp> c) {
+ Table.Cell<ReviewerStateInternal, Account.Id, Instant> c) {
return ReviewerSetEntryProto.newBuilder()
.setState(REVIEWER_STATE_CONVERTER.reverse().convert(c.getRowKey()))
.setAccountId(c.getColumnKey().get())
- .setTimestampMillis(c.getValue().getTime())
+ .setTimestampMillis(c.getValue().toEpochMilli())
.build();
}
private static ReviewerByEmailSetEntryProto toReviewerByEmailSetEntry(
- Table.Cell<ReviewerStateInternal, Address, Timestamp> c) {
+ Table.Cell<ReviewerStateInternal, Address, Instant> c) {
return ReviewerByEmailSetEntryProto.newBuilder()
.setState(REVIEWER_STATE_CONVERTER.reverse().convert(c.getRowKey()))
.setAddress(c.getColumnKey().toHeaderString())
- .setTimestampMillis(c.getValue().getTime())
+ .setTimestampMillis(c.getValue().toEpochMilli())
.build();
}
private static ReviewerStatusUpdateProto toReviewerStatusUpdateProto(ReviewerStatusUpdate u) {
return ReviewerStatusUpdateProto.newBuilder()
- .setTimestampMillis(u.date().getTime())
+ .setTimestampMillis(u.date().toEpochMilli())
.setUpdatedBy(u.updatedBy().get())
.setReviewer(u.reviewer().get())
.setState(REVIEWER_STATE_CONVERTER.reverse().convert(u.state()))
@@ -620,7 +619,7 @@
private static AssigneeStatusUpdateProto toAssigneeStatusUpdateProto(AssigneeStatusUpdate u) {
AssigneeStatusUpdateProto.Builder builder =
AssigneeStatusUpdateProto.newBuilder()
- .setTimestampMillis(u.date().getTime())
+ .setTimestampMillis(u.date().toEpochMilli())
.setUpdatedBy(u.updatedBy().get())
.setHasCurrentAssignee(u.currentAssignee().isPresent());
@@ -678,7 +677,8 @@
.map(sr -> SubmitRequirementProtoConverter.INSTANCE.fromProto(sr))
.collect(toImmutableList()))
.updateCount(proto.getUpdateCount())
- .mergedOn(proto.getHasMergedOn() ? new Timestamp(proto.getMergedOnMillis()) : null);
+ .mergedOn(
+ proto.getHasMergedOn() ? Instant.ofEpochMilli(proto.getMergedOnMillis()) : null);
return b.build();
}
@@ -686,8 +686,8 @@
ChangeColumns.Builder b =
ChangeColumns.builder()
.changeKey(Change.key(proto.getChangeKey()))
- .createdOn(new Timestamp(proto.getCreatedOnMillis()))
- .lastUpdatedOn(new Timestamp(proto.getLastUpdatedOnMillis()))
+ .createdOn(Instant.ofEpochMilli(proto.getCreatedOnMillis()))
+ .lastUpdatedOn(Instant.ofEpochMilli(proto.getLastUpdatedOnMillis()))
.owner(Account.id(proto.getOwner()))
.branch(proto.getBranch());
if (proto.getHasCurrentPatchSetId()) {
@@ -719,26 +719,25 @@
}
private static ReviewerSet toReviewerSet(List<ReviewerSetEntryProto> protos) {
- ImmutableTable.Builder<ReviewerStateInternal, Account.Id, Timestamp> b =
+ ImmutableTable.Builder<ReviewerStateInternal, Account.Id, Instant> b =
ImmutableTable.builder();
for (ReviewerSetEntryProto e : protos) {
b.put(
REVIEWER_STATE_CONVERTER.convert(e.getState()),
Account.id(e.getAccountId()),
- new Timestamp(e.getTimestampMillis()));
+ Instant.ofEpochMilli(e.getTimestampMillis()));
}
return ReviewerSet.fromTable(b.build());
}
private static ReviewerByEmailSet toReviewerByEmailSet(
List<ReviewerByEmailSetEntryProto> protos) {
- ImmutableTable.Builder<ReviewerStateInternal, Address, Timestamp> b =
- ImmutableTable.builder();
+ ImmutableTable.Builder<ReviewerStateInternal, Address, Instant> b = ImmutableTable.builder();
for (ReviewerByEmailSetEntryProto e : protos) {
b.put(
REVIEWER_STATE_CONVERTER.convert(e.getState()),
Address.parse(e.getAddress()),
- new Timestamp(e.getTimestampMillis()));
+ Instant.ofEpochMilli(e.getTimestampMillis()));
}
return ReviewerByEmailSet.fromTable(b.build());
}
@@ -749,7 +748,7 @@
for (ReviewerStatusUpdateProto proto : protos) {
b.add(
ReviewerStatusUpdate.create(
- new Timestamp(proto.getTimestampMillis()),
+ Instant.ofEpochMilli(proto.getTimestampMillis()),
Account.id(proto.getUpdatedBy()),
Account.id(proto.getReviewer()),
REVIEWER_STATE_CONVERTER.convert(proto.getState())));
@@ -791,7 +790,7 @@
for (AssigneeStatusUpdateProto proto : protos) {
b.add(
AssigneeStatusUpdate.create(
- new Timestamp(proto.getTimestampMillis()),
+ Instant.ofEpochMilli(proto.getTimestampMillis()),
Account.id(proto.getUpdatedBy()),
proto.getHasCurrentAssignee()
? Optional.of(Account.id(proto.getCurrentAssignee()))
diff --git a/java/com/google/gerrit/server/notedb/ChangeRevisionNote.java b/java/com/google/gerrit/server/notedb/ChangeRevisionNote.java
index cb3a5ac..6d49fc8 100644
--- a/java/com/google/gerrit/server/notedb/ChangeRevisionNote.java
+++ b/java/com/google/gerrit/server/notedb/ChangeRevisionNote.java
@@ -17,6 +17,7 @@
import static java.nio.charset.StandardCharsets.UTF_8;
import com.google.common.collect.ImmutableList;
+import com.google.gerrit.common.Nullable;
import com.google.gerrit.entities.Comment;
import com.google.gerrit.entities.HumanComment;
import com.google.gerrit.entities.SubmitRequirementResult;
@@ -37,7 +38,12 @@
private final Comment.Status status;
private String pushCert;
- private ImmutableList<SubmitRequirementResult> submitRequirementsResult;
+ /**
+ * Submit requirement results stored in this revision note. If null, then no SRs were stored in
+ * the revision note . Otherwise, there were stored SRs in this revision note. The list could be
+ * empty, meaning that no SRs were configured for the project.
+ */
+ @Nullable private ImmutableList<SubmitRequirementResult> submitRequirementsResult;
ChangeRevisionNote(
ChangeNoteJson noteJson, ObjectReader reader, ObjectId noteId, Comment.Status status) {
@@ -46,6 +52,12 @@
this.status = status;
}
+ /**
+ * Returns null if no submit requirements were stored in the revision note. Otherwise, this method
+ * returns a list of submit requirements, which can probably be empty if there were no SRs
+ * configured for the project at the time when the SRs were stored.
+ */
+ @Nullable
public ImmutableList<SubmitRequirementResult> getSubmitRequirementsResult() {
checkParsed();
return submitRequirementsResult;
@@ -70,7 +82,7 @@
}
this.submitRequirementsResult =
data.submitRequirementResults == null
- ? ImmutableList.of()
+ ? null
: ImmutableList.copyOf(data.submitRequirementResults);
return data.comments;
}
diff --git a/java/com/google/gerrit/server/notedb/ChangeUpdate.java b/java/com/google/gerrit/server/notedb/ChangeUpdate.java
index 961a5ee..3d7ae10 100644
--- a/java/com/google/gerrit/server/notedb/ChangeUpdate.java
+++ b/java/com/google/gerrit/server/notedb/ChangeUpdate.java
@@ -52,6 +52,7 @@
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
import com.google.common.collect.Table;
import com.google.common.collect.Table.Cell;
import com.google.common.collect.TreeBasedTable;
@@ -83,10 +84,10 @@
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject;
import java.io.IOException;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
-import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
@@ -120,10 +121,10 @@
*/
public class ChangeUpdate extends AbstractChangeUpdate {
public interface Factory {
- ChangeUpdate create(ChangeNotes notes, CurrentUser user, Date when);
+ ChangeUpdate create(ChangeNotes notes, CurrentUser user, Instant when);
ChangeUpdate create(
- ChangeNotes notes, CurrentUser user, Date when, Comparator<String> labelNameComparator);
+ ChangeNotes notes, CurrentUser user, Instant when, Comparator<String> labelNameComparator);
}
private final NoteDbUpdateManager.Factory updateManagerFactory;
@@ -138,7 +139,6 @@
private final Map<Account.Id, ReviewerStateInternal> reviewers = new LinkedHashMap<>();
private final Map<Address, ReviewerStateInternal> reviewersByEmail = new LinkedHashMap<>();
private final List<HumanComment> comments = new ArrayList<>();
- private final List<SubmitRequirementResult> submitRequirementResults = new ArrayList<>();
private String commitSubject;
private String subject;
@@ -172,6 +172,7 @@
private RobotCommentUpdate robotCommentUpdate;
private DeleteCommentRewriter deleteCommentRewriter;
private DeleteChangeMessageRewriter deleteChangeMessageRewriter;
+ private List<SubmitRequirementResult> submitRequirementResults;
@AssistedInject
private ChangeUpdate(
@@ -185,7 +186,7 @@
PatchSetApprovalUuidGenerator patchSetApprovalUuidGenerator,
@Assisted ChangeNotes notes,
@Assisted CurrentUser user,
- @Assisted Date when,
+ @Assisted Instant when,
ChangeNoteUtil noteUtil) {
this(
serverIdent,
@@ -222,7 +223,7 @@
PatchSetApprovalUuidGenerator patchSetApprovalUuidGenerator,
@Assisted ChangeNotes notes,
@Assisted CurrentUser user,
- @Assisted Date when,
+ @Assisted Instant when,
@Assisted Comparator<String> labelNameComparator,
ChangeNoteUtil noteUtil) {
super(notes, user, serverIdent, noteUtil, when);
@@ -326,6 +327,9 @@
}
public void putSubmitRequirementResults(Collection<SubmitRequirementResult> rs) {
+ if (submitRequirementResults == null) {
+ submitRequirementResults = new ArrayList<>();
+ }
submitRequirementResults.addAll(rs);
}
@@ -515,7 +519,7 @@
/** Returns the tree id for the updated tree */
private ObjectId storeRevisionNotes(RevWalk rw, ObjectInserter inserter, ObjectId curr)
throws ConfigInvalidException, IOException {
- if (submitRequirementResults.isEmpty() && comments.isEmpty() && pushCert == null) {
+ if (submitRequirementResults == null && comments.isEmpty() && pushCert == null) {
return null;
}
RevisionNoteMap<ChangeRevisionNote> rnm = getRevisionNoteMap(rw, curr);
@@ -525,8 +529,16 @@
c.tag = tag;
cache.get(c.getCommitId()).putComment(c);
}
- for (SubmitRequirementResult sr : submitRequirementResults) {
- cache.get(sr.patchSetCommitId()).putSubmitRequirementResult(sr);
+ if (submitRequirementResults != null) {
+ if (submitRequirementResults.isEmpty()) {
+ ObjectId latestPsCommitId =
+ Iterables.getLast(getNotes().getPatchSets().values()).commitId();
+ cache.get(latestPsCommitId).createEmptySubmitRequirementResults();
+ } else {
+ for (SubmitRequirementResult sr : submitRequirementResults) {
+ cache.get(sr.patchSetCommitId()).putSubmitRequirementResult(sr);
+ }
+ }
}
if (pushCert != null) {
checkState(commit != null);
diff --git a/java/com/google/gerrit/server/notedb/CommitRewriter.java b/java/com/google/gerrit/server/notedb/CommitRewriter.java
index 74f7e13..24c4d6d 100644
--- a/java/com/google/gerrit/server/notedb/CommitRewriter.java
+++ b/java/com/google/gerrit/server/notedb/CommitRewriter.java
@@ -577,6 +577,9 @@
}
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
private boolean verifyPersonIdent(PersonIdent newIdent, PersonIdent originalIdent) {
return newIdent.getTimeZoneOffset() == originalIdent.getTimeZoneOffset()
&& newIdent.getWhen().getTime() == originalIdent.getWhen().getTime()
diff --git a/java/com/google/gerrit/server/notedb/NoteDbUpdateManager.java b/java/com/google/gerrit/server/notedb/NoteDbUpdateManager.java
index 9345d98..866535b 100644
--- a/java/com/google/gerrit/server/notedb/NoteDbUpdateManager.java
+++ b/java/com/google/gerrit/server/notedb/NoteDbUpdateManager.java
@@ -377,7 +377,7 @@
bru.setRefLogIdent(refLogIdent != null ? refLogIdent : serverIdent.get());
bru.setAtomic(true);
or.cmds.addTo(bru);
- bru.setAllowNonFastForwards(true);
+ bru.setAllowNonFastForwards(allowNonFastForwards(or.cmds));
for (BatchUpdateListener listener : batchUpdateListeners) {
bru = listener.beforeUpdateRefs(bru);
}
@@ -458,4 +458,26 @@
}
}
}
+
+ /**
+ * Returns true if we should allow non-fast-forwards while performing the batch ref update. Non-ff
+ * updates are necessary in some specific cases:
+ *
+ * <p>1. Draft ref updates are non fast-forward, since the ref always points to a single commit
+ * that has no parents.
+ *
+ * <p>2. NoteDb rewriters.
+ *
+ * <p>3. If any of the receive commands is of type {@link
+ * ReceiveCommand.Type#UPDATE_NONFASTFORWARD} (for example due to a force push).
+ *
+ * <p>Note that we don't need to explicitly allow non fast-forward updates for DELETE commands
+ * since JGit forces the update implicitly in this case.
+ */
+ private boolean allowNonFastForwards(ChainedReceiveCommands receiveCommands) {
+ return !draftUpdates.isEmpty()
+ || !rewriters.isEmpty()
+ || receiveCommands.getCommands().values().stream()
+ .anyMatch(cmd -> cmd.getType().equals(ReceiveCommand.Type.UPDATE_NONFASTFORWARD));
+ }
}
diff --git a/java/com/google/gerrit/server/notedb/RevisionNoteBuilder.java b/java/com/google/gerrit/server/notedb/RevisionNoteBuilder.java
index 7998476..ac9fa48 100644
--- a/java/com/google/gerrit/server/notedb/RevisionNoteBuilder.java
+++ b/java/com/google/gerrit/server/notedb/RevisionNoteBuilder.java
@@ -21,6 +21,7 @@
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Maps;
import com.google.common.collect.MultimapBuilder;
+import com.google.gerrit.common.Nullable;
import com.google.gerrit.entities.Comment;
import com.google.gerrit.entities.SubmitRequirementResult;
import java.io.ByteArrayOutputStream;
@@ -73,7 +74,13 @@
final Map<Comment.Key, Comment> put;
private final Set<Comment.Key> delete;
- private List<SubmitRequirementResult> submitRequirementResults;
+ /**
+ * Submit requirement results to be stored in the revision note. If this field is null, we don't
+ * store results in the revision note. Otherwise, we store a "submit requirements" section in the
+ * revision note even if it's empty.
+ */
+ @Nullable private List<SubmitRequirementResult> submitRequirementResults;
+
private String pushCert;
private RevisionNoteBuilder(RevisionNote<? extends Comment> base) {
@@ -90,7 +97,6 @@
put = new HashMap<>();
pushCert = null;
}
- submitRequirementResults = new ArrayList<>();
delete = new HashSet<>();
}
@@ -109,7 +115,18 @@
put.put(comment.key, comment);
}
+ /**
+ * Call this method to designate that we should store submit requirement results in the revision
+ * note. Even if no results are added, an empty submit requirements section will be added.
+ */
+ void createEmptySubmitRequirementResults() {
+ submitRequirementResults = new ArrayList<>();
+ }
+
void putSubmitRequirementResult(SubmitRequirementResult result) {
+ if (submitRequirementResults == null) {
+ submitRequirementResults = new ArrayList<>();
+ }
submitRequirementResults.add(result);
}
@@ -140,19 +157,19 @@
private void buildNoteJson(ChangeNoteJson noteUtil, OutputStream out) throws IOException {
ListMultimap<Integer, Comment> comments = buildCommentMap();
- if (submitRequirementResults.isEmpty() && comments.isEmpty() && pushCert == null) {
+ if (submitRequirementResults == null && comments.isEmpty() && pushCert == null) {
return;
}
RevisionNoteData data = new RevisionNoteData();
data.comments = COMMENT_ORDER.sortedCopy(comments.values());
data.pushCert = pushCert;
- if (!submitRequirementResults.isEmpty()) {
- data.submitRequirementResults =
- submitRequirementResults.stream()
- .sorted(SUBMIT_REQUIREMENT_RESULT_COMPARATOR)
- .collect(Collectors.toList());
- }
+ data.submitRequirementResults =
+ submitRequirementResults == null
+ ? null
+ : submitRequirementResults.stream()
+ .sorted(SUBMIT_REQUIREMENT_RESULT_COMPARATOR)
+ .collect(Collectors.toList());
try (OutputStreamWriter osw = new OutputStreamWriter(out, UTF_8)) {
noteUtil.getGson().toJson(data, osw);
diff --git a/java/com/google/gerrit/server/notedb/RobotCommentUpdate.java b/java/com/google/gerrit/server/notedb/RobotCommentUpdate.java
index 895f378..edf5bd3 100644
--- a/java/com/google/gerrit/server/notedb/RobotCommentUpdate.java
+++ b/java/com/google/gerrit/server/notedb/RobotCommentUpdate.java
@@ -28,9 +28,9 @@
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject;
import java.io.IOException;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -57,14 +57,14 @@
@Assisted("effective") Account.Id accountId,
@Assisted("real") Account.Id realAccountId,
PersonIdent authorIdent,
- Date when);
+ Instant when);
RobotCommentUpdate create(
Change change,
@Assisted("effective") Account.Id accountId,
@Assisted("real") Account.Id realAccountId,
PersonIdent authorIdent,
- Date when);
+ Instant when);
}
private List<RobotComment> put = new ArrayList<>();
@@ -77,7 +77,7 @@
@Assisted("effective") Account.Id accountId,
@Assisted("real") Account.Id realAccountId,
@Assisted PersonIdent authorIdent,
- @Assisted Date when) {
+ @Assisted Instant when) {
super(noteUtil, serverIdent, notes, null, accountId, realAccountId, authorIdent, when);
}
@@ -89,7 +89,7 @@
@Assisted("effective") Account.Id accountId,
@Assisted("real") Account.Id realAccountId,
@Assisted PersonIdent authorIdent,
- @Assisted Date when) {
+ @Assisted Instant when) {
super(noteUtil, serverIdent, null, change, accountId, realAccountId, authorIdent, when);
}
diff --git a/java/com/google/gerrit/server/plugins/JarPluginProvider.java b/java/com/google/gerrit/server/plugins/JarPluginProvider.java
index 82f97c9..c00a69d 100644
--- a/java/com/google/gerrit/server/plugins/JarPluginProvider.java
+++ b/java/com/google/gerrit/server/plugins/JarPluginProvider.java
@@ -29,9 +29,10 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
-import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
-import java.util.Date;
import java.util.List;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
@@ -104,8 +105,8 @@
}
private static String tempNameFor(String name) {
- SimpleDateFormat fmt = new SimpleDateFormat("yyMMdd_HHmm");
- return PLUGIN_TMP_PREFIX + name + "_" + fmt.format(new Date()) + "_";
+ DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyMMdd_HHmm").withZone(ZoneId.of("UTC"));
+ return PLUGIN_TMP_PREFIX + name + "_" + fmt.format(Instant.now()) + "_";
}
public static Path storeInTemp(String pluginName, InputStream in, SitePaths sitePaths)
diff --git a/java/com/google/gerrit/server/plugins/PluginResource.java b/java/com/google/gerrit/server/plugins/PluginResource.java
index e7ebd56..fb69233 100644
--- a/java/com/google/gerrit/server/plugins/PluginResource.java
+++ b/java/com/google/gerrit/server/plugins/PluginResource.java
@@ -19,8 +19,7 @@
import com.google.inject.TypeLiteral;
public class PluginResource implements RestResource {
- public static final TypeLiteral<RestView<PluginResource>> PLUGIN_KIND =
- new TypeLiteral<RestView<PluginResource>>() {};
+ public static final TypeLiteral<RestView<PluginResource>> PLUGIN_KIND = new TypeLiteral<>() {};
private final Plugin plugin;
private final String name;
diff --git a/java/com/google/gerrit/server/project/BranchResource.java b/java/com/google/gerrit/server/project/BranchResource.java
index a8936ac..f071fbe 100644
--- a/java/com/google/gerrit/server/project/BranchResource.java
+++ b/java/com/google/gerrit/server/project/BranchResource.java
@@ -21,8 +21,7 @@
import org.eclipse.jgit.lib.Ref;
public class BranchResource extends RefResource {
- public static final TypeLiteral<RestView<BranchResource>> BRANCH_KIND =
- new TypeLiteral<RestView<BranchResource>>() {};
+ public static final TypeLiteral<RestView<BranchResource>> BRANCH_KIND = new TypeLiteral<>() {};
private final String refName;
private final String revision;
diff --git a/java/com/google/gerrit/server/project/ChildProjectResource.java b/java/com/google/gerrit/server/project/ChildProjectResource.java
index 4b641ca..854f876 100644
--- a/java/com/google/gerrit/server/project/ChildProjectResource.java
+++ b/java/com/google/gerrit/server/project/ChildProjectResource.java
@@ -21,7 +21,7 @@
public class ChildProjectResource implements RestResource {
public static final TypeLiteral<RestView<ChildProjectResource>> CHILD_PROJECT_KIND =
- new TypeLiteral<RestView<ChildProjectResource>>() {};
+ new TypeLiteral<>() {};
private final ProjectResource parent;
private final ProjectState child;
diff --git a/java/com/google/gerrit/server/project/CommitResource.java b/java/com/google/gerrit/server/project/CommitResource.java
index f71c7fe..ffd498d 100644
--- a/java/com/google/gerrit/server/project/CommitResource.java
+++ b/java/com/google/gerrit/server/project/CommitResource.java
@@ -20,8 +20,7 @@
import org.eclipse.jgit.revwalk.RevCommit;
public class CommitResource implements RestResource {
- public static final TypeLiteral<RestView<CommitResource>> COMMIT_KIND =
- new TypeLiteral<RestView<CommitResource>>() {};
+ public static final TypeLiteral<RestView<CommitResource>> COMMIT_KIND = new TypeLiteral<>() {};
private final ProjectResource project;
private final RevCommit commit;
diff --git a/java/com/google/gerrit/server/project/DashboardResource.java b/java/com/google/gerrit/server/project/DashboardResource.java
index 54f958a..c918551 100644
--- a/java/com/google/gerrit/server/project/DashboardResource.java
+++ b/java/com/google/gerrit/server/project/DashboardResource.java
@@ -22,7 +22,7 @@
public class DashboardResource implements RestResource {
public static final TypeLiteral<RestView<DashboardResource>> DASHBOARD_KIND =
- new TypeLiteral<RestView<DashboardResource>>() {};
+ new TypeLiteral<>() {};
public static DashboardResource projectDefault(ProjectState projectState, CurrentUser user) {
return new DashboardResource(projectState, user, null, null, null, true);
diff --git a/java/com/google/gerrit/server/project/FileResource.java b/java/com/google/gerrit/server/project/FileResource.java
index e8926dc..f02522a 100644
--- a/java/com/google/gerrit/server/project/FileResource.java
+++ b/java/com/google/gerrit/server/project/FileResource.java
@@ -33,8 +33,7 @@
* <p>This is in the project package because it is accessed through the project/branch/file path.
*/
public class FileResource implements RestResource {
- public static final TypeLiteral<RestView<FileResource>> FILE_KIND =
- new TypeLiteral<RestView<FileResource>>() {};
+ public static final TypeLiteral<RestView<FileResource>> FILE_KIND = new TypeLiteral<>() {};
public static FileResource create(
GitRepositoryManager repoManager, ProjectState projectState, ObjectId rev, String path)
diff --git a/java/com/google/gerrit/server/project/LabelResource.java b/java/com/google/gerrit/server/project/LabelResource.java
index 2df9ff1..fcddc61 100644
--- a/java/com/google/gerrit/server/project/LabelResource.java
+++ b/java/com/google/gerrit/server/project/LabelResource.java
@@ -20,8 +20,7 @@
import com.google.inject.TypeLiteral;
public class LabelResource implements RestResource {
- public static final TypeLiteral<RestView<LabelResource>> LABEL_KIND =
- new TypeLiteral<RestView<LabelResource>>() {};
+ public static final TypeLiteral<RestView<LabelResource>> LABEL_KIND = new TypeLiteral<>() {};
private final ProjectResource project;
private final LabelType labelType;
diff --git a/java/com/google/gerrit/server/project/ProjectConfig.java b/java/com/google/gerrit/server/project/ProjectConfig.java
index b620193..03886a9 100644
--- a/java/com/google/gerrit/server/project/ProjectConfig.java
+++ b/java/com/google/gerrit/server/project/ProjectConfig.java
@@ -23,6 +23,7 @@
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.toList;
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.CharMatcher;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
@@ -532,6 +533,11 @@
submitRequirementSections.put(requirement.name(), requirement);
}
+ @VisibleForTesting
+ public void clearSubmitRequirements() {
+ submitRequirementSections = new LinkedHashMap<>();
+ }
+
/** Adds or replaces the given {@link LabelType} in this config. */
public void upsertLabelType(LabelType labelType) {
labelSections.put(labelType.getName(), labelType);
diff --git a/java/com/google/gerrit/server/project/ProjectResource.java b/java/com/google/gerrit/server/project/ProjectResource.java
index 8802758..f9fa22e 100644
--- a/java/com/google/gerrit/server/project/ProjectResource.java
+++ b/java/com/google/gerrit/server/project/ProjectResource.java
@@ -21,8 +21,7 @@
import com.google.inject.TypeLiteral;
public class ProjectResource implements RestResource {
- public static final TypeLiteral<RestView<ProjectResource>> PROJECT_KIND =
- new TypeLiteral<RestView<ProjectResource>>() {};
+ public static final TypeLiteral<RestView<ProjectResource>> PROJECT_KIND = new TypeLiteral<>() {};
private final ProjectState projectState;
private final CurrentUser user;
diff --git a/java/com/google/gerrit/server/project/TagResource.java b/java/com/google/gerrit/server/project/TagResource.java
index 08ef669..c837557 100644
--- a/java/com/google/gerrit/server/project/TagResource.java
+++ b/java/com/google/gerrit/server/project/TagResource.java
@@ -20,8 +20,7 @@
import com.google.inject.TypeLiteral;
public class TagResource extends RefResource {
- public static final TypeLiteral<RestView<TagResource>> TAG_KIND =
- new TypeLiteral<RestView<TagResource>>() {};
+ public static final TypeLiteral<RestView<TagResource>> TAG_KIND = new TypeLiteral<>() {};
private final TagInfo tagInfo;
diff --git a/java/com/google/gerrit/server/query/change/AgePredicate.java b/java/com/google/gerrit/server/query/change/AgePredicate.java
index d2c6e6f..c1138bd 100644
--- a/java/com/google/gerrit/server/query/change/AgePredicate.java
+++ b/java/com/google/gerrit/server/query/change/AgePredicate.java
@@ -36,7 +36,7 @@
@Override
public Instant getMinTimestamp() {
- return Instant.ofEpochMilli(0);
+ return Instant.EPOCH;
}
@Override
diff --git a/java/com/google/gerrit/server/query/change/BeforePredicate.java b/java/com/google/gerrit/server/query/change/BeforePredicate.java
index 61bf6b1..5d682fb 100644
--- a/java/com/google/gerrit/server/query/change/BeforePredicate.java
+++ b/java/com/google/gerrit/server/query/change/BeforePredicate.java
@@ -34,7 +34,7 @@
@Override
public Instant getMinTimestamp() {
- return Instant.ofEpochMilli(0);
+ return Instant.EPOCH;
}
@Override
diff --git a/java/com/google/gerrit/server/query/change/ChangeData.java b/java/com/google/gerrit/server/query/change/ChangeData.java
index 036c0ed..94dad84 100644
--- a/java/com/google/gerrit/server/query/change/ChangeData.java
+++ b/java/com/google/gerrit/server/query/change/ChangeData.java
@@ -96,7 +96,7 @@
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -276,7 +276,7 @@
.id(PatchSet.id(id, currentPatchSetId))
.commitId(commitId)
.uploader(Account.id(1000))
- .createdOn(TimeUtil.nowTs())
+ .createdOn(TimeUtil.now())
.build();
return cd;
}
@@ -358,7 +358,7 @@
private Integer unresolvedCommentCount;
private Integer totalCommentCount;
private LabelTypes labelTypes;
- private Optional<Timestamp> mergedOn;
+ private Optional<Instant> mergedOn;
private ImmutableSetMultimap<NameKey, RefState> refStates;
private ImmutableList<byte[]> refStatePatterns;
@@ -709,7 +709,7 @@
* @throws StorageException if {@code lazyLoad} is off, {@link ChangeNotes} can not be loaded
* because we do not expect to call the database.
*/
- public Optional<Timestamp> getMergedOn() throws StorageException {
+ public Optional<Instant> getMergedOn() throws StorageException {
if (mergedOn == null) {
// The value was not loaded yet, try to get from the database.
mergedOn = notes().getMergedOn();
@@ -718,7 +718,7 @@
}
/** Sets the value e.g. when loading from index. */
- public void setMergedOn(@Nullable Timestamp mergedOn) {
+ public void setMergedOn(@Nullable Instant mergedOn) {
this.mergedOn = Optional.ofNullable(mergedOn);
}
@@ -1338,7 +1338,7 @@
public abstract Account.Id author();
- public abstract Timestamp ts();
+ public abstract Instant ts();
}
@AutoValue
diff --git a/java/com/google/gerrit/server/query/change/ChangePredicates.java b/java/com/google/gerrit/server/query/change/ChangePredicates.java
index 6630cdc..355f9de 100644
--- a/java/com/google/gerrit/server/query/change/ChangePredicates.java
+++ b/java/com/google/gerrit/server/query/change/ChangePredicates.java
@@ -207,6 +207,11 @@
return new ChangeIndexPredicate(ChangeField.FUZZY_TOPIC, topic);
}
+ /** Returns a predicate that matches changes in the provided {@code topic}. Used with prefixes */
+ public static Predicate<ChangeData> prefixTopic(String topic) {
+ return new ChangeIndexPredicate(ChangeField.PREFIX_TOPIC, topic);
+ }
+
/** Returns a predicate that matches changes submitted in the provided {@code changeSet}. */
public static Predicate<ChangeData> submissionId(String changeSet) {
return new ChangeIndexPredicate(ChangeField.SUBMISSIONID, changeSet);
@@ -231,6 +236,15 @@
ChangeField.FUZZY_HASHTAG, HashtagsUtil.cleanupHashtag(hashtag).toLowerCase());
}
+ /**
+ * Returns a predicate that matches changes in the provided {@code hashtag}. Used with prefixes
+ */
+ public static Predicate<ChangeData> prefixHashtag(String hashtag) {
+ // Use toLowerCase without locale to match behavior in ChangeField.
+ return new ChangeIndexPredicate(
+ ChangeField.PREFIX_HASHTAG, HashtagsUtil.cleanupHashtag(hashtag).toLowerCase());
+ }
+
/** Returns a predicate that matches changes that modified the provided {@code file}. */
public static Predicate<ChangeData> file(ChangeQueryBuilder.Arguments args, String file) {
Predicate<ChangeData> eqPath = path(file);
diff --git a/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java b/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
index 80b3322..28c4da3 100644
--- a/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
+++ b/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
@@ -870,6 +870,16 @@
}
@Operator
+ public Predicate<ChangeData> prefixhashtag(String hashtag) throws QueryParseException {
+ if (hashtag.isEmpty()) {
+ return ChangePredicates.hashtag(hashtag);
+ }
+
+ checkFieldAvailable(ChangeField.PREFIX_HASHTAG, "prefixhashtag");
+ return ChangePredicates.prefixHashtag(hashtag);
+ }
+
+ @Operator
public Predicate<ChangeData> topic(String name) {
return ChangePredicates.exactTopic(name);
}
@@ -886,6 +896,16 @@
}
@Operator
+ public Predicate<ChangeData> prefixtopic(String name) throws QueryParseException {
+ if (name.isEmpty()) {
+ return ChangePredicates.exactTopic(name);
+ }
+
+ checkFieldAvailable(ChangeField.PREFIX_TOPIC, "prefixtopic");
+ return ChangePredicates.prefixTopic(name);
+ }
+
+ @Operator
public Predicate<ChangeData> ref(String ref) throws QueryParseException {
if (ref.startsWith("^")) {
return new RegexRefPredicate(ref);
diff --git a/java/com/google/gerrit/server/restapi/access/AccessResource.java b/java/com/google/gerrit/server/restapi/access/AccessResource.java
index 4847da4..36ffdcf 100644
--- a/java/com/google/gerrit/server/restapi/access/AccessResource.java
+++ b/java/com/google/gerrit/server/restapi/access/AccessResource.java
@@ -26,6 +26,5 @@
* collection.
*/
public class AccessResource implements RestResource {
- public static final TypeLiteral<RestView<AccessResource>> ACCESS_KIND =
- new TypeLiteral<RestView<AccessResource>>() {};
+ public static final TypeLiteral<RestView<AccessResource>> ACCESS_KIND = new TypeLiteral<>() {};
}
diff --git a/java/com/google/gerrit/server/restapi/account/DeleteDraftComments.java b/java/com/google/gerrit/server/restapi/account/DeleteDraftComments.java
index ad3c56b..fbd99eb 100644
--- a/java/com/google/gerrit/server/restapi/account/DeleteDraftComments.java
+++ b/java/com/google/gerrit/server/restapi/account/DeleteDraftComments.java
@@ -56,7 +56,7 @@
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
@@ -123,7 +123,7 @@
HumanCommentFormatter humanCommentFormatter =
commentJsonProvider.get().newHumanCommentFormatter();
Account.Id accountId = rsrc.getUser().getAccountId();
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
Map<Project.NameKey, BatchUpdate> updates = new LinkedHashMap<>();
List<Op> ops = new ArrayList<>();
for (ChangeData cd :
diff --git a/java/com/google/gerrit/server/restapi/account/GetDetail.java b/java/com/google/gerrit/server/restapi/account/GetDetail.java
index 1091599..ba7a37f 100644
--- a/java/com/google/gerrit/server/restapi/account/GetDetail.java
+++ b/java/com/google/gerrit/server/restapi/account/GetDetail.java
@@ -48,7 +48,7 @@
public Response<AccountDetailInfo> apply(AccountResource rsrc) throws PermissionBackendException {
Account a = rsrc.getUser().getAccount();
AccountDetailInfo info = new AccountDetailInfo(a.id().get());
- info.registeredOn = a.registeredOn();
+ info.setRegisteredOn(a.registeredOn());
info.inactive = !a.isActive() ? true : null;
directory.fillAccountInfo(Collections.singleton(info), EnumSet.allOf(FillOptions.class));
return Response.ok(info);
diff --git a/java/com/google/gerrit/server/restapi/change/Abandon.java b/java/com/google/gerrit/server/restapi/change/Abandon.java
index fa4a887..98514b2 100644
--- a/java/com/google/gerrit/server/restapi/change/Abandon.java
+++ b/java/com/google/gerrit/server/restapi/change/Abandon.java
@@ -126,7 +126,7 @@
AccountState accountState = user.isIdentifiedUser() ? user.asIdentifiedUser().state() : null;
AbandonOp op = abandonOpFactory.create(accountState, msgTxt);
ChangeData changeData = changeDataFactory.create(notes.getProjectName(), notes.getChangeId());
- try (BatchUpdate u = updateFactory.create(notes.getProjectName(), user, TimeUtil.nowTs())) {
+ try (BatchUpdate u = updateFactory.create(notes.getProjectName(), user, TimeUtil.now())) {
u.setNotify(notify);
u.addOp(notes.getChangeId(), op);
u.addOp(
diff --git a/java/com/google/gerrit/server/restapi/change/AddToAttentionSet.java b/java/com/google/gerrit/server/restapi/change/AddToAttentionSet.java
index cb1256c..a21431e 100644
--- a/java/com/google/gerrit/server/restapi/change/AddToAttentionSet.java
+++ b/java/com/google/gerrit/server/restapi/change/AddToAttentionSet.java
@@ -92,7 +92,7 @@
try (BatchUpdate bu =
updateFactory.create(
- changeResource.getChange().getProject(), changeResource.getUser(), TimeUtil.nowTs())) {
+ changeResource.getChange().getProject(), changeResource.getUser(), TimeUtil.now())) {
AddToAttentionSetOp op = opFactory.create(attentionUserId, input.reason, true);
bu.addOp(changeResource.getId(), op);
NotifyHandling notify = input.notify == null ? NotifyHandling.OWNER : input.notify;
diff --git a/java/com/google/gerrit/server/restapi/change/CherryPickChange.java b/java/com/google/gerrit/server/restapi/change/CherryPickChange.java
index 5375936..0fc5716 100644
--- a/java/com/google/gerrit/server/restapi/change/CherryPickChange.java
+++ b/java/com/google/gerrit/server/restapi/change/CherryPickChange.java
@@ -67,7 +67,7 @@
import com.google.inject.Provider;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -170,7 +170,7 @@
patch.commitId(),
input,
dest,
- TimeUtil.nowTs(),
+ TimeUtil.now(),
null,
null,
null,
@@ -205,7 +205,7 @@
throws IOException, InvalidChangeOperationException, UpdateException, RestApiException,
ConfigInvalidException, NoSuchProjectException {
return cherryPick(
- sourceChange, project, sourceCommit, input, dest, TimeUtil.nowTs(), null, null, null, null);
+ sourceChange, project, sourceCommit, input, dest, TimeUtil.now(), null, null, null, null);
}
/**
@@ -243,7 +243,7 @@
ObjectId sourceCommit,
CherryPickInput input,
BranchNameKey dest,
- Timestamp timestamp,
+ Instant timestamp,
@Nullable Change.Id revertedChange,
@Nullable ObjectId changeIdForNewChange,
@Nullable Change.Id idForNewChange,
diff --git a/java/com/google/gerrit/server/restapi/change/CreateChange.java b/java/com/google/gerrit/server/restapi/change/CreateChange.java
index fa47bef..6a637b3 100644
--- a/java/com/google/gerrit/server/restapi/change/CreateChange.java
+++ b/java/com/google/gerrit/server/restapi/change/CreateChange.java
@@ -84,8 +84,9 @@
import com.google.inject.Provider;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Collections;
+import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.TimeZone;
@@ -319,6 +320,9 @@
}
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
private ChangeInfo createNewChange(
ChangeInput input,
IdentifiedUser me,
@@ -353,13 +357,14 @@
RevCommit mergeTip = parentCommit == null ? null : rw.parseCommit(parentCommit);
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
PersonIdent committer = me.newCommitterIdent(now, serverTimeZone);
PersonIdent author =
input.author == null
? committer
- : new PersonIdent(input.author.name, input.author.email, now, serverTimeZone);
+ : new PersonIdent(
+ input.author.name, input.author.email, Date.from(now), serverTimeZone);
String commitMessage = getCommitMessage(input.subject, me);
diff --git a/java/com/google/gerrit/server/restapi/change/CreateDraftComment.java b/java/com/google/gerrit/server/restapi/change/CreateDraftComment.java
index 8476767..9e9cf6a 100644
--- a/java/com/google/gerrit/server/restapi/change/CreateDraftComment.java
+++ b/java/com/google/gerrit/server/restapi/change/CreateDraftComment.java
@@ -82,8 +82,7 @@
String.format("Invalid inReplyTo, comment %s not found", in.inReplyTo));
}
- try (BatchUpdate bu =
- updateFactory.create(rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = updateFactory.create(rsrc.getProject(), rsrc.getUser(), TimeUtil.now())) {
Op op = new Op(rsrc.getPatchSet().id(), in);
bu.addOp(rsrc.getChange().getId(), op);
bu.execute();
diff --git a/java/com/google/gerrit/server/restapi/change/CreateMergePatchSet.java b/java/com/google/gerrit/server/restapi/change/CreateMergePatchSet.java
index e943e47..651bf7b 100644
--- a/java/com/google/gerrit/server/restapi/change/CreateMergePatchSet.java
+++ b/java/com/google/gerrit/server/restapi/change/CreateMergePatchSet.java
@@ -67,7 +67,8 @@
import com.google.inject.Provider;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
+import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import org.eclipse.jgit.lib.ObjectId;
@@ -122,6 +123,9 @@
this.permissionBackend = permissionBackend;
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
@Override
public Response<ChangeInfo> apply(ChangeResource rsrc, MergePatchSetInput in)
throws IOException, RestApiException, UpdateException, PermissionBackendException {
@@ -176,12 +180,12 @@
currentPsCommit = rw.parseCommit(ps.commitId());
}
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
IdentifiedUser me = user.get().asIdentifiedUser();
PersonIdent author =
in.author == null
? me.newCommitterIdent(now, serverTimeZone)
- : new PersonIdent(in.author.name, in.author.email, now, serverTimeZone);
+ : new PersonIdent(in.author.name, in.author.email, Date.from(now), serverTimeZone);
CodeReviewCommit newCommit =
createMergeCommit(
in,
diff --git a/java/com/google/gerrit/server/restapi/change/DeleteAssignee.java b/java/com/google/gerrit/server/restapi/change/DeleteAssignee.java
index d867e00..d818210 100644
--- a/java/com/google/gerrit/server/restapi/change/DeleteAssignee.java
+++ b/java/com/google/gerrit/server/restapi/change/DeleteAssignee.java
@@ -67,8 +67,7 @@
throws RestApiException, UpdateException, PermissionBackendException {
rsrc.permissions().check(ChangePermission.EDIT_ASSIGNEE);
- try (BatchUpdate bu =
- updateFactory.create(rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = updateFactory.create(rsrc.getProject(), rsrc.getUser(), TimeUtil.now())) {
Op op = new Op();
bu.addOp(rsrc.getChange().getId(), op);
bu.execute();
diff --git a/java/com/google/gerrit/server/restapi/change/DeleteChange.java b/java/com/google/gerrit/server/restapi/change/DeleteChange.java
index 3ca5463..8298abb 100644
--- a/java/com/google/gerrit/server/restapi/change/DeleteChange.java
+++ b/java/com/google/gerrit/server/restapi/change/DeleteChange.java
@@ -54,8 +54,7 @@
}
rsrc.permissions().check(ChangePermission.DELETE);
- try (BatchUpdate bu =
- updateFactory.create(rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = updateFactory.create(rsrc.getProject(), rsrc.getUser(), TimeUtil.now())) {
Change.Id id = rsrc.getChange().getId();
bu.addOp(id, opFactory.create(id));
bu.execute();
diff --git a/java/com/google/gerrit/server/restapi/change/DeleteChangeMessage.java b/java/com/google/gerrit/server/restapi/change/DeleteChangeMessage.java
index 0e868e70..588d56e 100644
--- a/java/com/google/gerrit/server/restapi/change/DeleteChangeMessage.java
+++ b/java/com/google/gerrit/server/restapi/change/DeleteChangeMessage.java
@@ -89,7 +89,7 @@
DeleteChangeMessageOp deleteChangeMessageOp =
new DeleteChangeMessageOp(resource.getChangeMessageId(), newChangeMessage);
try (BatchUpdate batchUpdate =
- updateFactory.create(resource.getChangeResource().getProject(), user, TimeUtil.nowTs())) {
+ updateFactory.create(resource.getChangeResource().getProject(), user, TimeUtil.now())) {
batchUpdate.addOp(resource.getChangeId(), deleteChangeMessageOp).execute();
}
diff --git a/java/com/google/gerrit/server/restapi/change/DeleteComment.java b/java/com/google/gerrit/server/restapi/change/DeleteComment.java
index 044fd77..2056664 100644
--- a/java/com/google/gerrit/server/restapi/change/DeleteComment.java
+++ b/java/com/google/gerrit/server/restapi/change/DeleteComment.java
@@ -84,7 +84,7 @@
String newMessage = getCommentNewMessage(user.asIdentifiedUser().getName(), input.reason);
DeleteCommentOp deleteCommentOp = new DeleteCommentOp(rsrc, newMessage);
try (BatchUpdate batchUpdate =
- updateFactory.create(rsrc.getRevisionResource().getProject(), user, TimeUtil.nowTs())) {
+ updateFactory.create(rsrc.getRevisionResource().getProject(), user, TimeUtil.now())) {
batchUpdate.addOp(rsrc.getRevisionResource().getChange().getId(), deleteCommentOp).execute();
}
diff --git a/java/com/google/gerrit/server/restapi/change/DeleteDraftComment.java b/java/com/google/gerrit/server/restapi/change/DeleteDraftComment.java
index 51a0b8e..7d28a39 100644
--- a/java/com/google/gerrit/server/restapi/change/DeleteDraftComment.java
+++ b/java/com/google/gerrit/server/restapi/change/DeleteDraftComment.java
@@ -54,7 +54,7 @@
public Response<CommentInfo> apply(DraftCommentResource rsrc, Input input)
throws RestApiException, UpdateException {
try (BatchUpdate bu =
- updateFactory.create(rsrc.getChange().getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+ updateFactory.create(rsrc.getChange().getProject(), rsrc.getUser(), TimeUtil.now())) {
Op op = new Op(rsrc.getComment().key);
bu.addOp(rsrc.getChange().getId(), op);
bu.execute();
diff --git a/java/com/google/gerrit/server/restapi/change/DeletePrivate.java b/java/com/google/gerrit/server/restapi/change/DeletePrivate.java
index 16b7136..08725b5 100644
--- a/java/com/google/gerrit/server/restapi/change/DeletePrivate.java
+++ b/java/com/google/gerrit/server/restapi/change/DeletePrivate.java
@@ -62,8 +62,7 @@
}
SetPrivateOp op = setPrivateOpFactory.create(false, input);
- try (BatchUpdate u =
- updateFactory.create(rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+ try (BatchUpdate u = updateFactory.create(rsrc.getProject(), rsrc.getUser(), TimeUtil.now())) {
u.addOp(rsrc.getId(), op).execute();
}
diff --git a/java/com/google/gerrit/server/restapi/change/DeleteReviewer.java b/java/com/google/gerrit/server/restapi/change/DeleteReviewer.java
index db8e9de..7a409e8 100644
--- a/java/com/google/gerrit/server/restapi/change/DeleteReviewer.java
+++ b/java/com/google/gerrit/server/restapi/change/DeleteReviewer.java
@@ -58,7 +58,7 @@
updateFactory.create(
rsrc.getChangeResource().getProject(),
rsrc.getChangeResource().getUser(),
- TimeUtil.nowTs())) {
+ TimeUtil.now())) {
bu.setNotify(getNotify(rsrc.getChange(), input));
BatchUpdateOp op;
if (rsrc.isByEmail()) {
diff --git a/java/com/google/gerrit/server/restapi/change/DeleteVote.java b/java/com/google/gerrit/server/restapi/change/DeleteVote.java
index b266031..208cecf 100644
--- a/java/com/google/gerrit/server/restapi/change/DeleteVote.java
+++ b/java/com/google/gerrit/server/restapi/change/DeleteVote.java
@@ -134,7 +134,7 @@
try (BatchUpdate bu =
updateFactory.create(
- change.getProject(), r.getChangeResource().getUser(), TimeUtil.nowTs())) {
+ change.getProject(), r.getChangeResource().getUser(), TimeUtil.now())) {
bu.setNotify(
notifyResolver.resolve(
firstNonNull(input.notify, NotifyHandling.ALL), input.notifyDetails));
diff --git a/java/com/google/gerrit/server/restapi/change/Move.java b/java/com/google/gerrit/server/restapi/change/Move.java
index 17fe1ce..900b9e5 100644
--- a/java/com/google/gerrit/server/restapi/change/Move.java
+++ b/java/com/google/gerrit/server/restapi/change/Move.java
@@ -159,7 +159,7 @@
projectCache.get(project).orElseThrow(illegalState(project)).checkStatePermitsWrite();
Op op = new Op(input);
- try (BatchUpdate u = updateFactory.create(project, caller, TimeUtil.nowTs())) {
+ try (BatchUpdate u = updateFactory.create(project, caller, TimeUtil.now())) {
u.addOp(change.getId(), op);
u.execute();
}
diff --git a/java/com/google/gerrit/server/restapi/change/PostHashtags.java b/java/com/google/gerrit/server/restapi/change/PostHashtags.java
index c1a6a13..bcaa145 100644
--- a/java/com/google/gerrit/server/restapi/change/PostHashtags.java
+++ b/java/com/google/gerrit/server/restapi/change/PostHashtags.java
@@ -48,7 +48,7 @@
req.permissions().check(ChangePermission.EDIT_HASHTAGS);
try (BatchUpdate bu =
- updateFactory.create(req.getChange().getProject(), req.getUser(), TimeUtil.nowTs())) {
+ updateFactory.create(req.getChange().getProject(), req.getUser(), TimeUtil.now())) {
SetHashtagsOp op = hashtagsFactory.create(input);
bu.addOp(req.getId(), op);
bu.execute();
diff --git a/java/com/google/gerrit/server/restapi/change/PostPrivate.java b/java/com/google/gerrit/server/restapi/change/PostPrivate.java
index f774457..45d7250 100644
--- a/java/com/google/gerrit/server/restapi/change/PostPrivate.java
+++ b/java/com/google/gerrit/server/restapi/change/PostPrivate.java
@@ -74,8 +74,7 @@
}
SetPrivateOp op = setPrivateOpFactory.create(true, input);
- try (BatchUpdate u =
- updateFactory.create(rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+ try (BatchUpdate u = updateFactory.create(rsrc.getProject(), rsrc.getUser(), TimeUtil.now())) {
u.addOp(rsrc.getId(), op).execute();
}
diff --git a/java/com/google/gerrit/server/restapi/change/PostReview.java b/java/com/google/gerrit/server/restapi/change/PostReview.java
index 0c64402..d4e6205 100644
--- a/java/com/google/gerrit/server/restapi/change/PostReview.java
+++ b/java/com/google/gerrit/server/restapi/change/PostReview.java
@@ -137,6 +137,7 @@
import com.google.inject.Singleton;
import java.io.IOException;
import java.sql.Timestamp;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -274,10 +275,10 @@
public Response<ReviewResult> apply(RevisionResource revision, ReviewInput input)
throws RestApiException, UpdateException, IOException, PermissionBackendException,
ConfigInvalidException, PatchListNotAvailableException {
- return apply(revision, input, TimeUtil.nowTs());
+ return apply(revision, input, TimeUtil.now());
}
- public Response<ReviewResult> apply(RevisionResource revision, ReviewInput input, Timestamp ts)
+ public Response<ReviewResult> apply(RevisionResource revision, ReviewInput input, Instant ts)
throws RestApiException, UpdateException, IOException, PermissionBackendException,
ConfigInvalidException, PatchListNotAvailableException {
// Respect timestamp, but truncate at change created-on time.
@@ -530,7 +531,7 @@
ChangeData cd,
PatchSet patchSet,
List<ReviewerModification> reviewerModifications,
- Timestamp when) {
+ Instant when) {
List<AccountState> newlyAddedReviewers = new ArrayList<>();
// There are no events for CCs and reviewers added/deleted by email.
@@ -1203,7 +1204,7 @@
parent);
} else {
// In ChangeUpdate#putComment() the draft with the same ID will be deleted.
- comment.writtenOn = ctx.getWhen();
+ comment.writtenOn = Timestamp.from(ctx.getWhen());
comment.side = inputComment.side();
comment.message = inputComment.message;
}
diff --git a/java/com/google/gerrit/server/restapi/change/PostReviewers.java b/java/com/google/gerrit/server/restapi/change/PostReviewers.java
index 4691550..9bc80a4 100644
--- a/java/com/google/gerrit/server/restapi/change/PostReviewers.java
+++ b/java/com/google/gerrit/server/restapi/change/PostReviewers.java
@@ -70,8 +70,7 @@
if (modification.op == null) {
return Response.ok(modification.result);
}
- try (BatchUpdate bu =
- updateFactory.create(rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = updateFactory.create(rsrc.getProject(), rsrc.getUser(), TimeUtil.now())) {
bu.setNotify(resolveNotify(rsrc, input));
Change.Id id = rsrc.getChange().getId();
bu.addOp(id, modification.op);
diff --git a/java/com/google/gerrit/server/restapi/change/PutAssignee.java b/java/com/google/gerrit/server/restapi/change/PutAssignee.java
index dcf616c..d41620e 100644
--- a/java/com/google/gerrit/server/restapi/change/PutAssignee.java
+++ b/java/com/google/gerrit/server/restapi/change/PutAssignee.java
@@ -98,7 +98,7 @@
}
try (BatchUpdate bu =
- updateFactory.create(rsrc.getChange().getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+ updateFactory.create(rsrc.getChange().getProject(), rsrc.getUser(), TimeUtil.now())) {
SetAssigneeOp op = assigneeFactory.create(assignee);
bu.addOp(rsrc.getId(), op);
diff --git a/java/com/google/gerrit/server/restapi/change/PutDescription.java b/java/com/google/gerrit/server/restapi/change/PutDescription.java
index 7c54074..5b5bc15 100644
--- a/java/com/google/gerrit/server/restapi/change/PutDescription.java
+++ b/java/com/google/gerrit/server/restapi/change/PutDescription.java
@@ -57,7 +57,7 @@
Op op = new Op(input != null ? input : new DescriptionInput(), rsrc.getPatchSet().id());
try (BatchUpdate u =
- updateFactory.create(rsrc.getChange().getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+ updateFactory.create(rsrc.getChange().getProject(), rsrc.getUser(), TimeUtil.now())) {
u.addOp(rsrc.getChange().getId(), op);
u.execute();
}
diff --git a/java/com/google/gerrit/server/restapi/change/PutDraftComment.java b/java/com/google/gerrit/server/restapi/change/PutDraftComment.java
index 84a3d89..6411087 100644
--- a/java/com/google/gerrit/server/restapi/change/PutDraftComment.java
+++ b/java/com/google/gerrit/server/restapi/change/PutDraftComment.java
@@ -40,7 +40,7 @@
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Collections;
import java.util.Optional;
@@ -87,7 +87,7 @@
String.format("Invalid inReplyTo, comment %s not found", in.inReplyTo));
}
try (BatchUpdate bu =
- updateFactory.create(rsrc.getChange().getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+ updateFactory.create(rsrc.getChange().getProject(), rsrc.getUser(), TimeUtil.now())) {
Op op = new Op(rsrc.getComment().key, in);
bu.addOp(rsrc.getChange().getId(), op);
bu.execute();
@@ -145,7 +145,7 @@
}
}
- private static HumanComment update(HumanComment e, DraftInput in, Timestamp when) {
+ private static HumanComment update(HumanComment e, DraftInput in, Instant when) {
if (in.side != null) {
e.side = in.side();
}
@@ -154,7 +154,7 @@
}
e.setLineNbrAndRange(in.line, in.range);
e.message = in.message.trim();
- e.writtenOn = when;
+ e.setWrittenOn(when);
if (in.tag != null) {
// TODO(dborowitz): Can we support changing tags via PUT?
e.tag = in.tag;
diff --git a/java/com/google/gerrit/server/restapi/change/PutMessage.java b/java/com/google/gerrit/server/restapi/change/PutMessage.java
index 1ed7fd7..c62200a 100644
--- a/java/com/google/gerrit/server/restapi/change/PutMessage.java
+++ b/java/com/google/gerrit/server/restapi/change/PutMessage.java
@@ -47,7 +47,7 @@
import com.google.inject.Provider;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.TimeZone;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.CommitBuilder;
@@ -126,7 +126,7 @@
throw new ResourceConflictException("new and existing commit message are the same");
}
- Timestamp ts = TimeUtil.nowTs();
+ Instant ts = TimeUtil.now();
try (BatchUpdate bu =
updateFactory.create(resource.getChange().getProject(), userProvider.get(), ts)) {
// Ensure that BatchUpdate will update the same repo
@@ -161,7 +161,7 @@
ObjectInserter objectInserter,
RevCommit basePatchSetCommit,
String commitMessage,
- Timestamp timestamp)
+ Instant timestamp)
throws IOException {
CommitBuilder builder = new CommitBuilder();
builder.setTreeId(basePatchSetCommit.getTree());
diff --git a/java/com/google/gerrit/server/restapi/change/PutTopic.java b/java/com/google/gerrit/server/restapi/change/PutTopic.java
index 3031781..c9b436e 100644
--- a/java/com/google/gerrit/server/restapi/change/PutTopic.java
+++ b/java/com/google/gerrit/server/restapi/change/PutTopic.java
@@ -63,7 +63,7 @@
SetTopicOp op = topicOpFactory.create(sanitizedInput.topic);
try (BatchUpdate u =
- updateFactory.create(req.getChange().getProject(), req.getUser(), TimeUtil.nowTs())) {
+ updateFactory.create(req.getChange().getProject(), req.getUser(), TimeUtil.now())) {
u.addOp(req.getId(), op);
u.execute();
}
diff --git a/java/com/google/gerrit/server/restapi/change/Rebase.java b/java/com/google/gerrit/server/restapi/change/Rebase.java
index 2077fb8..1a0f2b6 100644
--- a/java/com/google/gerrit/server/restapi/change/Rebase.java
+++ b/java/com/google/gerrit/server/restapi/change/Rebase.java
@@ -114,7 +114,7 @@
ObjectReader reader = oi.newReader();
RevWalk rw = CodeReviewCommit.newRevWalk(reader);
BatchUpdate bu =
- updateFactory.create(change.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+ updateFactory.create(change.getProject(), rsrc.getUser(), TimeUtil.now())) {
if (!change.isNew()) {
throw new ResourceConflictException("change is " + ChangeUtil.status(change));
} else if (!hasOneParent(rw, rsrc.getPatchSet())) {
diff --git a/java/com/google/gerrit/server/restapi/change/RemoveFromAttentionSet.java b/java/com/google/gerrit/server/restapi/change/RemoveFromAttentionSet.java
index 7fe463e..bd3e8ec 100644
--- a/java/com/google/gerrit/server/restapi/change/RemoveFromAttentionSet.java
+++ b/java/com/google/gerrit/server/restapi/change/RemoveFromAttentionSet.java
@@ -81,7 +81,7 @@
ChangeResource changeResource = attentionResource.getChangeResource();
try (BatchUpdate bu =
updateFactory.create(
- changeResource.getProject(), changeResource.getUser(), TimeUtil.nowTs())) {
+ changeResource.getProject(), changeResource.getUser(), TimeUtil.now())) {
RemoveFromAttentionSetOp op =
opFactory.create(attentionResource.getAccountId(), input.reason, true);
bu.addOp(changeResource.getId(), op);
diff --git a/java/com/google/gerrit/server/restapi/change/ReplyAttentionSetUpdates.java b/java/com/google/gerrit/server/restapi/change/ReplyAttentionSetUpdates.java
index 0fabd69..49286fc 100644
--- a/java/com/google/gerrit/server/restapi/change/ReplyAttentionSetUpdates.java
+++ b/java/com/google/gerrit/server/restapi/change/ReplyAttentionSetUpdates.java
@@ -151,7 +151,7 @@
commentsUtil.newHumanComment(
changeNotes,
currentUser,
- TimeUtil.nowTs(),
+ TimeUtil.now(),
commentInput.path,
commentInput.patchSet == null
? changeNotes.getChange().currentPatchSetId()
diff --git a/java/com/google/gerrit/server/restapi/change/Restore.java b/java/com/google/gerrit/server/restapi/change/Restore.java
index b2d1d3a..19d0677 100644
--- a/java/com/google/gerrit/server/restapi/change/Restore.java
+++ b/java/com/google/gerrit/server/restapi/change/Restore.java
@@ -100,7 +100,7 @@
Op op = new Op(input);
try (BatchUpdate u =
- updateFactory.create(rsrc.getChange().getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+ updateFactory.create(rsrc.getChange().getProject(), rsrc.getUser(), TimeUtil.now())) {
u.addOp(rsrc.getId(), op).execute();
}
return Response.ok(json.noOptions().format(op.change));
diff --git a/java/com/google/gerrit/server/restapi/change/Revert.java b/java/com/google/gerrit/server/restapi/change/Revert.java
index 8d48c88..7dd3e7a 100644
--- a/java/com/google/gerrit/server/restapi/change/Revert.java
+++ b/java/com/google/gerrit/server/restapi/change/Revert.java
@@ -47,7 +47,6 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
import org.eclipse.jgit.errors.ConfigInvalidException;
@Singleton
@@ -99,12 +98,11 @@
if (patch == null) {
throw new ResourceNotFoundException(changeIdToRevert.toString());
}
- Timestamp timestamp = TimeUtil.nowTs();
return Response.ok(
json.noOptions()
.format(
rsrc.getProject(),
- commitUtil.createRevertChange(notes, rsrc.getUser(), input, timestamp)));
+ commitUtil.createRevertChange(notes, rsrc.getUser(), input, TimeUtil.now())));
}
@Override
diff --git a/java/com/google/gerrit/server/restapi/change/RevertSubmission.java b/java/com/google/gerrit/server/restapi/change/RevertSubmission.java
index 8bde6e7..383eda0 100644
--- a/java/com/google/gerrit/server/restapi/change/RevertSubmission.java
+++ b/java/com/google/gerrit/server/restapi/change/RevertSubmission.java
@@ -80,8 +80,8 @@
import com.google.inject.Inject;
import com.google.inject.Provider;
import java.io.IOException;
-import java.sql.Timestamp;
import java.text.MessageFormat;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -251,7 +251,7 @@
Multimap<BranchNameKey, ChangeData> changesPerProjectAndBranch = ArrayListMultimap.create();
changeData.stream().forEach(c -> changesPerProjectAndBranch.put(c.change().getDest(), c));
cherryPickInput = createCherryPickInput(revertInput);
- Timestamp timestamp = TimeUtil.nowTs();
+ Instant timestamp = TimeUtil.now();
for (BranchNameKey projectAndBranch : changesPerProjectAndBranch.keySet()) {
cherryPickInput.base = null;
@@ -290,7 +290,7 @@
Project.NameKey project,
Iterator<PatchSetData> sortedChangesInProjectAndBranch,
Set<ObjectId> commitIdsInProjectAndBranch,
- Timestamp timestamp)
+ Instant timestamp)
throws IOException, RestApiException, UpdateException, ConfigInvalidException,
PermissionBackendException {
@@ -314,10 +314,7 @@
}
private void createCherryPickedRevert(
- RevertInput revertInput,
- Project.NameKey project,
- ChangeNotes changeNotes,
- Timestamp timestamp)
+ RevertInput revertInput, Project.NameKey project, ChangeNotes changeNotes, Instant timestamp)
throws IOException, ConfigInvalidException, UpdateException, RestApiException {
ObjectId revCommitId =
commitUtil.createRevertCommit(revertInput.message, changeNotes, user.get(), timestamp);
@@ -326,7 +323,7 @@
cherryPickInput.message = revertInput.message;
ObjectId generatedChangeId = CommitMessageUtil.generateChangeId();
Change.Id cherryPickRevertChangeId = Change.id(seq.nextChangeId());
- try (BatchUpdate bu = updateFactory.create(project, user.get(), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = updateFactory.create(project, user.get(), TimeUtil.now())) {
bu.setNotify(
notifyResolver.resolve(
firstNonNull(cherryPickInput.notify, NotifyHandling.ALL),
@@ -349,7 +346,7 @@
}
private void craeteNormalRevert(
- RevertInput revertInput, ChangeNotes changeNotes, Timestamp timestamp)
+ RevertInput revertInput, ChangeNotes changeNotes, Instant timestamp)
throws IOException, RestApiException, UpdateException, ConfigInvalidException {
Change.Id revertId =
@@ -558,14 +555,14 @@
private final ObjectId revCommitId;
private final ObjectId computedChangeId;
private final Change.Id cherryPickRevertChangeId;
- private final Timestamp timestamp;
+ private final Instant timestamp;
private final boolean workInProgress;
CreateCherryPickOp(
ObjectId revCommitId,
ObjectId computedChangeId,
Change.Id cherryPickRevertChangeId,
- Timestamp timestamp,
+ Instant timestamp,
Boolean workInProgress) {
this.revCommitId = revCommitId;
this.computedChangeId = computedChangeId;
diff --git a/java/com/google/gerrit/server/restapi/change/Revisions.java b/java/com/google/gerrit/server/restapi/change/Revisions.java
index e11ab75..41fecaf 100644
--- a/java/com/google/gerrit/server/restapi/change/Revisions.java
+++ b/java/com/google/gerrit/server/restapi/change/Revisions.java
@@ -39,7 +39,6 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@@ -155,6 +154,9 @@
return ImmutableList.of();
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
private ImmutableList<RevisionResource> loadEdit(
ChangeResource change, @Nullable ObjectId commitId) throws AuthException, IOException {
Optional<ChangeEdit> edit = editUtil.byChange(change.getNotes(), change.getUser());
@@ -165,7 +167,7 @@
.id(PatchSet.id(change.getId(), 0))
.commitId(editCommit)
.uploader(change.getUser().getAccountId())
- .createdOn(new Timestamp(editCommit.getCommitterIdent().getWhen().getTime()))
+ .createdOn(editCommit.getCommitterIdent().getWhen().toInstant())
.build();
if (commitId == null || editCommit.equals(commitId)) {
return ImmutableList.of(new RevisionResource(change, ps, edit));
diff --git a/java/com/google/gerrit/server/restapi/change/SetReadyForReview.java b/java/com/google/gerrit/server/restapi/change/SetReadyForReview.java
index c118766..9f019b6 100644
--- a/java/com/google/gerrit/server/restapi/change/SetReadyForReview.java
+++ b/java/com/google/gerrit/server/restapi/change/SetReadyForReview.java
@@ -63,8 +63,7 @@
throw new ResourceConflictException("change is not work in progress");
}
- try (BatchUpdate bu =
- updateFactory.create(rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = updateFactory.create(rsrc.getProject(), rsrc.getUser(), TimeUtil.now())) {
bu.setNotify(NotifyResolver.Result.create(firstNonNull(input.notify, NotifyHandling.ALL)));
bu.addOp(rsrc.getChange().getId(), opFactory.create(false, input));
bu.execute();
diff --git a/java/com/google/gerrit/server/restapi/change/SetWorkInProgress.java b/java/com/google/gerrit/server/restapi/change/SetWorkInProgress.java
index fdaad9d..0ad5180 100644
--- a/java/com/google/gerrit/server/restapi/change/SetWorkInProgress.java
+++ b/java/com/google/gerrit/server/restapi/change/SetWorkInProgress.java
@@ -63,8 +63,7 @@
throw new ResourceConflictException("change is already work in progress");
}
- try (BatchUpdate bu =
- updateFactory.create(rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = updateFactory.create(rsrc.getProject(), rsrc.getUser(), TimeUtil.now())) {
bu.setNotify(NotifyResolver.Result.create(firstNonNull(input.notify, NotifyHandling.NONE)));
bu.addOp(rsrc.getChange().getId(), opFactory.create(true, input));
bu.execute();
diff --git a/java/com/google/gerrit/server/restapi/config/ListTasks.java b/java/com/google/gerrit/server/restapi/config/ListTasks.java
index a12cb5b..dcc44ae 100644
--- a/java/com/google/gerrit/server/restapi/config/ListTasks.java
+++ b/java/com/google/gerrit/server/restapi/config/ListTasks.java
@@ -36,7 +36,7 @@
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
-import java.time.Instant;
+import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -119,7 +119,7 @@
public static class TaskInfo {
public String id;
public Task.State state;
- public Instant startTime;
+ public Timestamp startTime;
public long delay;
public String command;
public String remoteName;
@@ -129,7 +129,7 @@
public TaskInfo(Task<?> task) {
this.id = HexFormat.fromInt(task.getTaskId());
this.state = task.getState();
- this.startTime = task.getStartTime();
+ this.startTime = Timestamp.from(task.getStartTime());
this.delay = task.getDelay(TimeUnit.MILLISECONDS);
this.command = task.toString();
this.queueName = task.getQueueName();
diff --git a/java/com/google/gerrit/server/restapi/group/CreateGroup.java b/java/com/google/gerrit/server/restapi/group/CreateGroup.java
index ee86010..f257f86 100644
--- a/java/com/google/gerrit/server/restapi/group/CreateGroup.java
+++ b/java/com/google/gerrit/server/restapi/group/CreateGroup.java
@@ -212,7 +212,7 @@
createGroupArgs.uuid,
GroupUuid.make(
createGroupArgs.getGroupName(),
- self.get().newCommitterIdent(TimeUtil.nowTs(), serverTimeZone)));
+ self.get().newCommitterIdent(TimeUtil.now(), serverTimeZone)));
InternalGroupCreation groupCreation =
InternalGroupCreation.builder()
.setGroupUUID(uuid)
diff --git a/java/com/google/gerrit/server/restapi/group/GetAuditLog.java b/java/com/google/gerrit/server/restapi/group/GetAuditLog.java
index e3aa0f3..1b0fcd4 100644
--- a/java/com/google/gerrit/server/restapi/group/GetAuditLog.java
+++ b/java/com/google/gerrit/server/restapi/group/GetAuditLog.java
@@ -102,7 +102,7 @@
auditEvents.add(
GroupAuditEventInfo.createRemoveUserEvent(
accountLoader.get(auditEvent.removedBy().orElse(null)),
- auditEvent.removedOn(),
+ auditEvent.removedOn().orElse(null),
member));
}
}
@@ -134,7 +134,7 @@
auditEvents.add(
GroupAuditEventInfo.createRemoveGroupEvent(
accountLoader.get(auditEvent.removedBy().orElse(null)),
- auditEvent.removedOn(),
+ auditEvent.removedOn().orElse(null),
member));
}
}
diff --git a/java/com/google/gerrit/server/restapi/group/GroupJson.java b/java/com/google/gerrit/server/restapi/group/GroupJson.java
index e1459c3..6d3fa01 100644
--- a/java/com/google/gerrit/server/restapi/group/GroupJson.java
+++ b/java/com/google/gerrit/server/restapi/group/GroupJson.java
@@ -121,7 +121,7 @@
}
}
- info.createdOn = internalGroup.getCreatedOn();
+ info.setCreatedOn(internalGroup.getCreatedOn());
if (options.contains(MEMBERS)) {
info.members = listMembers.get().getDirectMembers(internalGroup, groupControlSupplier.get());
diff --git a/java/com/google/gerrit/server/restapi/project/CreateAccessChange.java b/java/com/google/gerrit/server/restapi/project/CreateAccessChange.java
index 75dd014..8a0cc39 100644
--- a/java/com/google/gerrit/server/restapi/project/CreateAccessChange.java
+++ b/java/com/google/gerrit/server/restapi/project/CreateAccessChange.java
@@ -152,7 +152,7 @@
ObjectReader objReader = objInserter.newReader();
RevWalk rw = new RevWalk(objReader);
BatchUpdate bu =
- updateFactory.create(rsrc.getNameKey(), rsrc.getUser(), TimeUtil.nowTs())) {
+ updateFactory.create(rsrc.getNameKey(), rsrc.getUser(), TimeUtil.now())) {
bu.setRepository(md.getRepository(), rw, objInserter);
ChangeInserter ins = newInserter(changeId, commit);
bu.insertChange(ins);
diff --git a/java/com/google/gerrit/server/restapi/project/CreateTag.java b/java/com/google/gerrit/server/restapi/project/CreateTag.java
index b552ff5..6980006 100644
--- a/java/com/google/gerrit/server/restapi/project/CreateTag.java
+++ b/java/com/google/gerrit/server/restapi/project/CreateTag.java
@@ -136,7 +136,7 @@
resource
.getUser()
.asIdentifiedUser()
- .newCommitterIdent(TimeUtil.nowTs(), TimeZone.getDefault()));
+ .newCommitterIdent(TimeUtil.now(), TimeZone.getDefault()));
}
Ref result = tag.call();
diff --git a/java/com/google/gerrit/server/restapi/project/GetReflog.java b/java/com/google/gerrit/server/restapi/project/GetReflog.java
index d36ca22..e0131ee 100644
--- a/java/com/google/gerrit/server/restapi/project/GetReflog.java
+++ b/java/com/google/gerrit/server/restapi/project/GetReflog.java
@@ -23,7 +23,7 @@
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.RestReadView;
import com.google.gerrit.server.CommonConverters;
-import com.google.gerrit.server.args4j.TimestampHandler;
+import com.google.gerrit.server.args4j.InstantHandler;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.permissions.PermissionBackend;
import com.google.gerrit.server.permissions.PermissionBackendException;
@@ -31,7 +31,7 @@
import com.google.gerrit.server.project.BranchResource;
import com.google.inject.Inject;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jgit.lib.ReflogEntry;
@@ -60,9 +60,9 @@
metaVar = "TIMESTAMP",
usage =
"timestamp from which the reflog entries should be listed (UTC, format: "
- + TimestampHandler.TIMESTAMP_FORMAT
+ + InstantHandler.TIMESTAMP_FORMAT
+ ")")
- public GetReflog setFrom(Timestamp from) {
+ public GetReflog setFrom(Instant from) {
this.from = from;
return this;
}
@@ -72,16 +72,16 @@
metaVar = "TIMESTAMP",
usage =
"timestamp until which the reflog entries should be listed (UTC, format: "
- + TimestampHandler.TIMESTAMP_FORMAT
+ + InstantHandler.TIMESTAMP_FORMAT
+ ")")
- public GetReflog setTo(Timestamp to) {
+ public GetReflog setTo(Instant to) {
this.to = to;
return this;
}
private int limit;
- private Timestamp from;
- private Timestamp to;
+ private Instant from;
+ private Instant to;
@Inject
public GetReflog(GitRepositoryManager repoManager, PermissionBackend permissionBackend) {
@@ -89,6 +89,9 @@
this.permissionBackend = permissionBackend;
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
@Override
public Response<List<ReflogEntryInfo>> apply(BranchResource rsrc)
throws RestApiException, IOException, PermissionBackendException {
@@ -115,8 +118,8 @@
} else {
entries = limit > 0 ? new ArrayList<>(limit) : new ArrayList<>();
for (ReflogEntry e : r.getReverseEntries()) {
- Timestamp timestamp = new Timestamp(e.getWho().getWhen().getTime());
- if ((from == null || from.before(timestamp)) && (to == null || to.after(timestamp))) {
+ Instant timestamp = e.getWho().getWhen().toInstant();
+ if ((from == null || from.isBefore(timestamp)) && (to == null || to.isAfter(timestamp))) {
entries.add(e);
}
if (limit > 0 && entries.size() >= limit) {
diff --git a/java/com/google/gerrit/server/restapi/project/ListTags.java b/java/com/google/gerrit/server/restapi/project/ListTags.java
index 123c78a..eccdcfc 100644
--- a/java/com/google/gerrit/server/restapi/project/ListTags.java
+++ b/java/com/google/gerrit/server/restapi/project/ListTags.java
@@ -39,7 +39,7 @@
import com.google.gerrit.server.project.RefFilter;
import com.google.inject.Inject;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@@ -172,6 +172,9 @@
throw new ResourceNotFoundException(id);
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
public static TagInfo createTagInfo(
PermissionBackend.ForRef perm, Ref ref, RevWalk rw, ProjectState projectState, WebLinks links)
throws IOException {
@@ -197,12 +200,12 @@
tagger != null ? CommonConverters.toGitPerson(tagger) : null,
canDelete,
webLinks.isEmpty() ? null : webLinks,
- tagger != null ? new Timestamp(tagger.getWhen().getTime()) : null);
+ tagger != null ? tagger.getWhen().toInstant() : null);
}
- Timestamp timestamp =
+ Instant timestamp =
object instanceof RevCommit
- ? new Timestamp(((RevCommit) object).getCommitterIdent().getWhen().getTime())
+ ? ((RevCommit) object).getCommitterIdent().getWhen().toInstant()
: null;
// Lightweight tag
diff --git a/java/com/google/gerrit/server/rules/StoredValues.java b/java/com/google/gerrit/server/rules/StoredValues.java
index 6a802e86..dbaefb9 100644
--- a/java/com/google/gerrit/server/rules/StoredValues.java
+++ b/java/com/google/gerrit/server/rules/StoredValues.java
@@ -71,7 +71,7 @@
}
public static final StoredValue<RevCommit> COMMIT =
- new StoredValue<RevCommit>() {
+ new StoredValue<>() {
@Override
public RevCommit createValue(Prolog engine) {
Change change = getChange(engine);
@@ -87,7 +87,7 @@
};
public static final StoredValue<Map<String, FileDiffOutput>> DIFF_LIST =
- new StoredValue<Map<String, FileDiffOutput>>() {
+ new StoredValue<>() {
@Override
public Map<String, FileDiffOutput> createValue(Prolog engine) {
PrologEnvironment env = (PrologEnvironment) engine.control;
@@ -114,7 +114,7 @@
// It should be minimized or cached to reduce pause time
// when evaluating Prolog submit rules.
public static final StoredValue<GitRepositoryManager> REPO_MANAGER =
- new StoredValue<GitRepositoryManager>() {
+ new StoredValue<>() {
@Override
public GitRepositoryManager createValue(Prolog engine) {
PrologEnvironment env = (PrologEnvironment) engine.control;
@@ -123,7 +123,7 @@
};
public static final StoredValue<PluginConfigFactory> PLUGIN_CONFIG_FACTORY =
- new StoredValue<PluginConfigFactory>() {
+ new StoredValue<>() {
@Override
public PluginConfigFactory createValue(Prolog engine) {
PrologEnvironment env = (PrologEnvironment) engine.control;
@@ -132,7 +132,7 @@
};
public static final StoredValue<Repository> REPOSITORY =
- new StoredValue<Repository>() {
+ new StoredValue<>() {
@Override
public Repository createValue(Prolog engine) {
PrologEnvironment env = (PrologEnvironment) engine.control;
@@ -151,7 +151,7 @@
};
public static final StoredValue<PermissionBackend> PERMISSION_BACKEND =
- new StoredValue<PermissionBackend>() {
+ new StoredValue<>() {
@Override
protected PermissionBackend createValue(Prolog engine) {
PrologEnvironment env = (PrologEnvironment) engine.control;
@@ -160,7 +160,7 @@
};
public static final StoredValue<AnonymousUser> ANONYMOUS_USER =
- new StoredValue<AnonymousUser>() {
+ new StoredValue<>() {
@Override
protected AnonymousUser createValue(Prolog engine) {
PrologEnvironment env = (PrologEnvironment) engine.control;
@@ -169,7 +169,7 @@
};
public static final StoredValue<Map<Account.Id, IdentifiedUser>> USERS =
- new StoredValue<Map<Account.Id, IdentifiedUser>>() {
+ new StoredValue<>() {
@Override
protected Map<Account.Id, IdentifiedUser> createValue(Prolog engine) {
return new HashMap<>();
diff --git a/java/com/google/gerrit/server/submit/CherryPick.java b/java/com/google/gerrit/server/submit/CherryPick.java
index 71e248f..84b0ab7 100644
--- a/java/com/google/gerrit/server/submit/CherryPick.java
+++ b/java/com/google/gerrit/server/submit/CherryPick.java
@@ -102,8 +102,7 @@
args.rw.parseBody(mergeTip);
String cherryPickCmtMsg = args.mergeUtil.createCommitMessageOnSubmit(toMerge, mergeTip);
- PersonIdent committer =
- args.caller.newCommitterIdent(ctx.getWhen(), args.serverIdent.getTimeZone());
+ PersonIdent committer = ctx.newCommitterIdent(args.caller);
try {
newCommit =
args.mergeUtil.createCherryPickFromCommit(
@@ -196,7 +195,7 @@
&& !args.subscriptionGraph.hasSubscription(args.destBranch)) {
mergeTip.moveTipTo(toMerge, toMerge);
} else {
- PersonIdent myIdent = new PersonIdent(args.serverIdent, ctx.getWhen());
+ PersonIdent myIdent = ctx.newPersonIdent(args.serverIdent);
CodeReviewCommit result =
args.mergeUtil.mergeOneCommit(
myIdent,
diff --git a/java/com/google/gerrit/server/submit/MergeOneOp.java b/java/com/google/gerrit/server/submit/MergeOneOp.java
index f1b93e1..1840479 100644
--- a/java/com/google/gerrit/server/submit/MergeOneOp.java
+++ b/java/com/google/gerrit/server/submit/MergeOneOp.java
@@ -29,9 +29,7 @@
@Override
public void updateRepoImpl(RepoContext ctx) throws IntegrationConflictException, IOException {
- PersonIdent caller =
- ctx.getIdentifiedUser()
- .newCommitterIdent(args.serverIdent.getWhen(), args.serverIdent.getTimeZone());
+ PersonIdent caller = ctx.getIdentifiedUser().newCommitterIdent(args.serverIdent);
if (args.mergeTip.getCurrentTip() == null) {
throw new IllegalStateException(
"cannot merge commit "
diff --git a/java/com/google/gerrit/server/submit/MergeOp.java b/java/com/google/gerrit/server/submit/MergeOp.java
index 238e6ea..0160fc9 100644
--- a/java/com/google/gerrit/server/submit/MergeOp.java
+++ b/java/com/google/gerrit/server/submit/MergeOp.java
@@ -43,7 +43,7 @@
import com.google.gerrit.entities.SubmitRequirement;
import com.google.gerrit.entities.SubmitRequirementResult;
import com.google.gerrit.entities.SubmitTypeRecord;
-import com.google.gerrit.exceptions.InternalServerWithUserMessageException;
+import com.google.gerrit.exceptions.MergeUpdateException;
import com.google.gerrit.exceptions.StorageException;
import com.google.gerrit.extensions.api.changes.NotifyHandling;
import com.google.gerrit.extensions.api.changes.SubmitInput;
@@ -89,7 +89,7 @@
import com.google.inject.Provider;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@@ -248,7 +248,7 @@
// Changes that were updated by this MergeOp.
private final Map<Change.Id, Change> updatedChanges;
- private Timestamp ts;
+ private Instant ts;
private SubmissionId submissionId;
private IdentifiedUser caller;
@@ -444,7 +444,7 @@
firstNonNull(submitInput.notify, NotifyHandling.ALL), submitInput.notifyDetails);
this.dryrun = dryrun;
this.caller = caller;
- this.ts = TimeUtil.nowTs();
+ this.ts = TimeUtil.now();
this.submissionId = new SubmissionId(change);
try (TraceContext traceContext =
@@ -514,7 +514,7 @@
boolean isRetry = attempt > 1;
if (isRetry) {
logger.atFine().log("Retrying, attempt #%d; skipping merged changes", attempt);
- this.ts = TimeUtil.nowTs();
+ this.ts = TimeUtil.now();
openRepoManager();
}
this.commitStatus = new CommitStatus(filteredNoteDbChangeSet, isRetry);
@@ -690,7 +690,7 @@
if (e.getCause() instanceof IntegrationConflictException) {
throw (IntegrationConflictException) e.getCause();
}
- throw new InternalServerWithUserMessageException(genericMergeError(cs), e);
+ throw new MergeUpdateException(genericMergeError(cs), e);
}
}
diff --git a/java/com/google/gerrit/server/submit/MergeOpRepoManager.java b/java/com/google/gerrit/server/submit/MergeOpRepoManager.java
index 8981b07..2024448 100644
--- a/java/com/google/gerrit/server/submit/MergeOpRepoManager.java
+++ b/java/com/google/gerrit/server/submit/MergeOpRepoManager.java
@@ -37,7 +37,7 @@
import com.google.gerrit.server.update.BatchUpdate;
import com.google.inject.Inject;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@@ -167,7 +167,7 @@
private final GitRepositoryManager repoManager;
private final ProjectCache projectCache;
- private Timestamp ts;
+ private Instant ts;
private IdentifiedUser caller;
private NotifyResolver.Result notify;
@@ -185,7 +185,7 @@
openRepos = new HashMap<>();
}
- public void setContext(Timestamp ts, IdentifiedUser caller, NotifyResolver.Result notify) {
+ public void setContext(Instant ts, IdentifiedUser caller, NotifyResolver.Result notify) {
this.ts = requireNonNull(ts);
this.caller = requireNonNull(caller);
this.notify = requireNonNull(notify);
diff --git a/java/com/google/gerrit/server/submit/RebaseSubmitStrategy.java b/java/com/google/gerrit/server/submit/RebaseSubmitStrategy.java
index 8aef3c7..1409775 100644
--- a/java/com/google/gerrit/server/submit/RebaseSubmitStrategy.java
+++ b/java/com/google/gerrit/server/submit/RebaseSubmitStrategy.java
@@ -166,8 +166,7 @@
RevCommit mergeTip = args.mergeTip.getCurrentTip();
args.rw.parseBody(mergeTip);
String cherryPickCmtMsg = args.mergeUtil.createCommitMessageOnSubmit(toMerge, mergeTip);
- PersonIdent committer =
- args.caller.newCommitterIdent(ctx.getWhen(), args.serverIdent.getTimeZone());
+ PersonIdent committer = ctx.newCommitterIdent(args.caller);
try {
newCommit =
args.mergeUtil.createCherryPickFromCommit(
@@ -304,8 +303,7 @@
&& !args.subscriptionGraph.hasSubscription(args.destBranch)) {
mergeTip.moveTipTo(toMerge, toMerge);
} else {
- PersonIdent caller =
- ctx.getIdentifiedUser().newCommitterIdent(ctx.getWhen(), ctx.getTimeZone());
+ PersonIdent caller = ctx.newCommitterIdent();
CodeReviewCommit newTip =
args.mergeUtil.mergeOneCommit(
caller,
diff --git a/java/com/google/gerrit/server/update/BatchUpdate.java b/java/com/google/gerrit/server/update/BatchUpdate.java
index 46bf094..9edfdc4 100644
--- a/java/com/google/gerrit/server/update/BatchUpdate.java
+++ b/java/com/google/gerrit/server/update/BatchUpdate.java
@@ -68,7 +68,7 @@
import com.google.inject.Module;
import com.google.inject.assistedinject.Assisted;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@@ -122,7 +122,7 @@
}
public interface Factory {
- BatchUpdate create(Project.NameKey project, CurrentUser user, Timestamp when);
+ BatchUpdate create(Project.NameKey project, CurrentUser user, Instant when);
}
public static void execute(
@@ -252,7 +252,7 @@
}
@Override
- public Timestamp getWhen() {
+ public Instant getWhen() {
return when;
}
@@ -376,7 +376,7 @@
private final Project.NameKey project;
private final CurrentUser user;
- private final Timestamp when;
+ private final Instant when;
private final TimeZone tz;
private final ListMultimap<Change.Id, BatchUpdateOp> ops =
@@ -405,7 +405,7 @@
GitReferenceUpdated gitRefUpdated,
@Assisted Project.NameKey project,
@Assisted CurrentUser user,
- @Assisted Timestamp when) {
+ @Assisted Instant when) {
this.repoManager = repoManager;
this.changeDataFactory = changeDataFactory;
this.changeNotesFactory = changeNotesFactory;
diff --git a/java/com/google/gerrit/server/update/Context.java b/java/com/google/gerrit/server/update/Context.java
index 9947168..57ebedd 100644
--- a/java/com/google/gerrit/server/update/Context.java
+++ b/java/com/google/gerrit/server/update/Context.java
@@ -24,8 +24,9 @@
import com.google.gerrit.server.account.AccountState;
import com.google.gerrit.server.change.NotifyResolver;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.TimeZone;
+import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.revwalk.RevWalk;
/**
@@ -66,7 +67,7 @@
*
* @return timestamp.
*/
- Timestamp getWhen();
+ Instant getWhen();
/**
* Get the time zone in which this update takes place.
@@ -134,4 +135,33 @@
default Account.Id getAccountId() {
return getIdentifiedUser().getAccountId();
}
+
+ /**
+ * Creates a new {@link PersonIdent} with {@link #getWhen()} as timestamp.
+ *
+ * @param personIdent {@link PersonIdent} to be copied
+ * @return copied {@link PersonIdent} with {@link #getWhen()} as timestamp
+ */
+ default PersonIdent newPersonIdent(PersonIdent personIdent) {
+ return new PersonIdent(personIdent, getWhen().toEpochMilli(), personIdent.getTimeZoneOffset());
+ }
+
+ /**
+ * Creates a committer {@link PersonIdent} for {@link #getIdentifiedUser()}.
+ *
+ * @return the created committer {@link PersonIdent}
+ */
+ default PersonIdent newCommitterIdent() {
+ return newCommitterIdent(getIdentifiedUser());
+ }
+
+ /**
+ * Creates a committer {@link PersonIdent} for the given user.
+ *
+ * @param user user for which a committer {@link PersonIdent} should be created
+ * @return the created committer {@link PersonIdent}
+ */
+ default PersonIdent newCommitterIdent(IdentifiedUser user) {
+ return user.newCommitterIdent(getWhen(), getTimeZone());
+ }
}
diff --git a/java/com/google/gerrit/server/util/AttentionSetUtil.java b/java/com/google/gerrit/server/util/AttentionSetUtil.java
index 98200fd..26c8f47 100644
--- a/java/com/google/gerrit/server/util/AttentionSetUtil.java
+++ b/java/com/google/gerrit/server/util/AttentionSetUtil.java
@@ -28,7 +28,6 @@
import com.google.gerrit.server.account.AccountResolver;
import com.google.gerrit.server.notedb.ChangeNotes;
import java.io.IOException;
-import java.sql.Timestamp;
import java.util.Collection;
import org.eclipse.jgit.errors.ConfigInvalidException;
@@ -123,7 +122,7 @@
: null;
return new AttentionSetInfo(
accountLoader.get(attentionSetUpdate.account()),
- Timestamp.from(attentionSetUpdate.timestamp()),
+ attentionSetUpdate.timestamp(),
attentionSetUpdate.reason(),
reasonAccount);
}
diff --git a/java/com/google/gerrit/server/util/time/TimeUtil.java b/java/com/google/gerrit/server/util/time/TimeUtil.java
index 54ef305..f89324b 100644
--- a/java/com/google/gerrit/server/util/time/TimeUtil.java
+++ b/java/com/google/gerrit/server/util/time/TimeUtil.java
@@ -15,10 +15,7 @@
package com.google.gerrit.server.util.time;
import com.google.common.annotations.VisibleForTesting;
-import com.google.gerrit.common.UsedAt;
-import com.google.gerrit.common.UsedAt.Project;
import com.google.gerrit.server.util.git.DelegateSystemReader;
-import java.sql.Timestamp;
import java.time.Instant;
import java.util.concurrent.TimeUnit;
import java.util.function.LongSupplier;
@@ -44,23 +41,8 @@
return Instant.ofEpochMilli(nowMs());
}
- public static Timestamp nowTs() {
- return new Timestamp(nowMs());
- }
-
- /**
- * Returns the magic timestamp representing no specific time.
- *
- * <p>This "null object" is helpful in contexts where using {@code null} directly is not possible.
- */
- @UsedAt(Project.PLUGIN_CHECKS)
- public static Timestamp never() {
- // Always create a new object as timestamps are mutable.
- return new Timestamp(0);
- }
-
- public static Timestamp truncateToSecond(Timestamp t) {
- return new Timestamp((t.getTime() / 1000) * 1000);
+ public static Instant truncateToSecond(Instant t) {
+ return Instant.ofEpochMilli(t.getEpochSecond() * 1000);
}
@VisibleForTesting
diff --git a/java/com/google/gerrit/sshd/DispatchCommandProvider.java b/java/com/google/gerrit/sshd/DispatchCommandProvider.java
index 2a65ed0..acf2df9 100644
--- a/java/com/google/gerrit/sshd/DispatchCommandProvider.java
+++ b/java/com/google/gerrit/sshd/DispatchCommandProvider.java
@@ -91,7 +91,7 @@
return m;
}
- private static final TypeLiteral<Command> type = new TypeLiteral<Command>() {};
+ private static final TypeLiteral<Command> type = new TypeLiteral<>() {};
private List<Binding<Command>> allCommands() {
return injector.findBindingsByType(type);
diff --git a/java/com/google/gerrit/sshd/SshScope.java b/java/com/google/gerrit/sshd/SshScope.java
index e9ed750..0fe8b78 100644
--- a/java/com/google/gerrit/sshd/SshScope.java
+++ b/java/com/google/gerrit/sshd/SshScope.java
@@ -219,7 +219,7 @@
new Scope() {
@Override
public <T> Provider<T> scope(Key<T> key, Provider<T> creator) {
- return new Provider<T>() {
+ return new Provider<>() {
@Override
public T get() {
return requireContext().get(key, creator);
diff --git a/java/com/google/gerrit/sshd/commands/SetTopicCommand.java b/java/com/google/gerrit/sshd/commands/SetTopicCommand.java
index 35cb3ba..244fdbe 100644
--- a/java/com/google/gerrit/sshd/commands/SetTopicCommand.java
+++ b/java/com/google/gerrit/sshd/commands/SetTopicCommand.java
@@ -84,8 +84,7 @@
for (ChangeResource r : changes.values()) {
SetTopicOp op = topicOpFactory.create(topic);
- try (BatchUpdate u =
- updateFactory.create(r.getChange().getProject(), user, TimeUtil.nowTs())) {
+ try (BatchUpdate u = updateFactory.create(r.getChange().getProject(), user, TimeUtil.now())) {
u.addOp(r.getId(), op);
u.execute();
}
diff --git a/java/com/google/gerrit/sshd/commands/ShowCaches.java b/java/com/google/gerrit/sshd/commands/ShowCaches.java
index 62bdb32..5b89228 100644
--- a/java/com/google/gerrit/sshd/commands/ShowCaches.java
+++ b/java/com/google/gerrit/sshd/commands/ShowCaches.java
@@ -43,8 +43,9 @@
import com.google.gerrit.sshd.SshDaemon;
import com.google.inject.Inject;
import java.io.IOException;
-import java.text.SimpleDateFormat;
import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
import java.util.Collection;
import java.util.Map;
import org.apache.sshd.common.io.IoAcceptor;
@@ -115,11 +116,13 @@
enableGracefulStop();
nw = columns - 50;
Instant now = Instant.now();
+ DateTimeFormatter fmt =
+ DateTimeFormatter.ofPattern("HH:mm:ss zzz").withZone(ZoneId.of("UTC"));
stdout.format(
"%-25s %-20s now %16s\n",
"Gerrit Code Review",
Version.getVersion() != null ? Version.getVersion() : "",
- new SimpleDateFormat("HH:mm:ss zzz").format(now));
+ fmt.format(now));
stdout.format(
"%-25s %-20s uptime %16s\n", "", "", uptime(now.toEpochMilli() - serverStarted));
stdout.print('\n');
diff --git a/java/com/google/gerrit/sshd/commands/ShowQueue.java b/java/com/google/gerrit/sshd/commands/ShowQueue.java
index 928cdda..4254e5b 100644
--- a/java/com/google/gerrit/sshd/commands/ShowQueue.java
+++ b/java/com/google/gerrit/sshd/commands/ShowQueue.java
@@ -155,7 +155,7 @@
stdout.print(
String.format(
"%8s %-12s %-12s %-4s %s\n",
- task.id, start, startTime(task.startTime), "", command));
+ task.id, start, startTime(task.startTime.toInstant()), "", command));
} else {
String remoteName =
task.remoteName != null ? task.remoteName + "/" + task.projectName : task.projectName;
@@ -165,7 +165,7 @@
"%8s %-12s %-4s %s\n",
task.id,
start,
- startTime(task.startTime),
+ startTime(task.startTime.toInstant()),
MoreObjects.firstNonNull(remoteName, "n/a")));
}
}
diff --git a/java/com/google/gerrit/testing/FakeAccountCache.java b/java/com/google/gerrit/testing/FakeAccountCache.java
index ab3348b..49a8d71 100644
--- a/java/com/google/gerrit/testing/FakeAccountCache.java
+++ b/java/com/google/gerrit/testing/FakeAccountCache.java
@@ -40,7 +40,7 @@
return state;
}
return newState(
- Account.builder(accountId, TimeUtil.nowTs())
+ Account.builder(accountId, TimeUtil.now())
.setMetaId("1234567812345678123456781234567812345678")
.build());
}
diff --git a/java/com/google/gerrit/testing/IndexVersions.java b/java/com/google/gerrit/testing/IndexVersions.java
index 3281ffc..f245665 100644
--- a/java/com/google/gerrit/testing/IndexVersions.java
+++ b/java/com/google/gerrit/testing/IndexVersions.java
@@ -27,7 +27,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import java.util.SortedMap;
+import java.util.NavigableMap;
import org.eclipse.jgit.lib.Config;
public class IndexVersions {
@@ -90,7 +90,7 @@
value = value.trim();
}
- SortedMap<Integer, Schema<V>> schemas = schemaDef.getSchemas();
+ NavigableMap<Integer, Schema<V>> schemas = schemaDef.getSchemas();
if (!Strings.isNullOrEmpty(value)) {
if (ALL.equals(value)) {
return ImmutableList.copyOf(schemas.keySet());
diff --git a/java/com/google/gerrit/testing/TestChanges.java b/java/com/google/gerrit/testing/TestChanges.java
index b795c5b..8bd02b8 100644
--- a/java/com/google/gerrit/testing/TestChanges.java
+++ b/java/com/google/gerrit/testing/TestChanges.java
@@ -58,7 +58,7 @@
changeId,
userId,
BranchNameKey.create(project, "master"),
- TimeUtil.nowTs());
+ TimeUtil.now());
incrementPatchSet(c);
return c;
}
@@ -72,7 +72,7 @@
.id(id)
.commitId(ObjectId.fromString(revision))
.uploader(userId)
- .createdOn(TimeUtil.nowTs())
+ .createdOn(TimeUtil.now())
.build();
}
@@ -94,7 +94,7 @@
injector.getInstance(AbstractChangeNotes.Args.class), c, shouldExist, null)
.load(),
user,
- TimeUtil.nowTs(),
+ TimeUtil.now(),
Ordering.natural());
ChangeNotes notes = update.getNotes();
diff --git a/javatests/com/google/gerrit/acceptance/ProjectResetterTest.java b/javatests/com/google/gerrit/acceptance/ProjectResetterTest.java
index 7d04558..877ccd5 100644
--- a/javatests/com/google/gerrit/acceptance/ProjectResetterTest.java
+++ b/javatests/com/google/gerrit/acceptance/ProjectResetterTest.java
@@ -36,6 +36,7 @@
import com.google.gerrit.testing.InMemoryRepositoryManager;
import com.google.gerrit.testing.TestTimeUtil;
import java.io.IOException;
+import java.util.Date;
import java.util.concurrent.TimeUnit;
import org.eclipse.jgit.lib.CommitBuilder;
import org.eclipse.jgit.lib.Constants;
@@ -332,10 +333,13 @@
assertThat(repo.exactRef(ref.getName())).isNull();
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
private ObjectId createCommit(Repository repo) throws IOException {
try (ObjectInserter oi = repo.newObjectInserter()) {
PersonIdent ident =
- new PersonIdent(new PersonIdent("Foo Bar", "foo.bar@baz.com"), TimeUtil.nowTs());
+ new PersonIdent(new PersonIdent("Foo Bar", "foo.bar@baz.com"), Date.from(TimeUtil.now()));
CommitBuilder cb = new CommitBuilder();
cb.setTreeId(oi.insert(Constants.OBJ_TREE, new byte[] {}));
cb.setCommitter(ident);
diff --git a/javatests/com/google/gerrit/acceptance/annotation/UseClockStepTest.java b/javatests/com/google/gerrit/acceptance/annotation/UseClockStepTest.java
index ecfe3f5..9d689ba 100644
--- a/javatests/com/google/gerrit/acceptance/annotation/UseClockStepTest.java
+++ b/javatests/com/google/gerrit/acceptance/annotation/UseClockStepTest.java
@@ -19,7 +19,6 @@
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.UseClockStep;
import com.google.gerrit.server.util.time.TimeUtil;
-import java.sql.Timestamp;
import java.time.Instant;
import java.util.concurrent.TimeUnit;
import org.junit.Test;
@@ -52,6 +51,6 @@
@Test
@UseClockStep(startAtEpoch = true)
public void useClockStepWithStartAtEpoch() {
- assertThat(TimeUtil.nowTs()).isEqualTo(Timestamp.from(Instant.EPOCH));
+ assertThat(TimeUtil.now()).isEqualTo(Instant.EPOCH);
}
}
diff --git a/javatests/com/google/gerrit/acceptance/api/accounts/AccountIT.java b/javatests/com/google/gerrit/acceptance/api/accounts/AccountIT.java
index 915e759..3678e25 100644
--- a/javatests/com/google/gerrit/acceptance/api/accounts/AccountIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/accounts/AccountIT.java
@@ -158,6 +158,7 @@
import java.security.KeyPair;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -499,7 +500,7 @@
assertThat(ref).isNotNull();
RevCommit c = rw.parseCommit(ref.getObjectId());
long timestampDiffMs =
- Math.abs(c.getCommitTime() * 1000L - getAccount(accountId).registeredOn().getTime());
+ Math.abs(c.getCommitTime() * 1000L - getAccount(accountId).registeredOn().toEpochMilli());
assertThat(timestampDiffMs).isAtMost(SECONDS.toMillis(1));
// Check the 'account.config' file.
@@ -980,7 +981,8 @@
assertThat(detail.email).isEqualTo(email);
assertThat(detail.secondaryEmails).containsExactly(secondaryEmail);
assertThat(detail.status).isEqualTo(status);
- assertThat(detail.registeredOn).isEqualTo(getAccount(foo.id()).registeredOn());
+ assertThat(detail.registeredOn.getTime())
+ .isEqualTo(getAccount(foo.id()).registeredOn().toEpochMilli());
assertThat(detail.inactive).isNull();
assertThat(detail._moreAccounts).isNull();
}
@@ -2464,6 +2466,9 @@
}
@Test
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
public void stalenessChecker() throws Exception {
// Newly created account is not stale.
AccountInfo accountInfo = gApi.accounts().create(name("foo")).get();
@@ -2477,7 +2482,7 @@
RevWalk rw = new RevWalk(repo)) {
RevCommit commit = rw.parseCommit(repo.exactRef(userRef).getObjectId());
- PersonIdent ident = new PersonIdent(serverIdent.get(), TimeUtil.nowTs());
+ PersonIdent ident = new PersonIdent(serverIdent.get(), Date.from(TimeUtil.now()));
CommitBuilder cb = new CommitBuilder();
cb.setTreeId(commit.getTree());
cb.setCommitter(ident);
diff --git a/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java b/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java
index 54e1897..66dbe80 100644
--- a/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java
@@ -211,6 +211,7 @@
import java.io.IOException;
import java.sql.Timestamp;
import java.text.MessageFormat;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -1936,7 +1937,7 @@
PushOneCommit.Result r = createChange();
ChangeResource rsrc = parseResource(r);
String oldETag = rsrc.getETag();
- Timestamp oldTs = rsrc.getChange().getLastUpdatedOn();
+ Instant oldTs = rsrc.getChange().getLastUpdatedOn();
addReviewer.call(r.getChangeId(), user.email());
@@ -2047,7 +2048,7 @@
PushOneCommit.Result r = createChange();
ChangeResource rsrc = parseResource(r);
String oldETag = rsrc.getETag();
- Timestamp oldTs = rsrc.getChange().getLastUpdatedOn();
+ Instant oldTs = rsrc.getChange().getLastUpdatedOn();
// create a group named "ab" with one user: testUser
String email = "abcd@example.com";
@@ -2096,7 +2097,7 @@
PushOneCommit.Result r = createChange();
ChangeResource rsrc = parseResource(r);
String oldETag = rsrc.getETag();
- Timestamp oldTs = rsrc.getChange().getLastUpdatedOn();
+ Instant oldTs = rsrc.getChange().getLastUpdatedOn();
// create a group named "kobe" with one user: lee
String testUserFullname = "kobebryant";
@@ -2197,7 +2198,7 @@
PushOneCommit.Result r = createChange();
ChangeResource rsrc = parseResource(r);
String oldETag = rsrc.getETag();
- Timestamp oldTs = rsrc.getChange().getLastUpdatedOn();
+ Instant oldTs = rsrc.getChange().getLastUpdatedOn();
ReviewerInput in = new ReviewerInput();
in.reviewer = user.email();
@@ -3411,7 +3412,7 @@
assertThat(commitPatchSetCreation.getShortMessage()).isEqualTo("Create patch set 2");
PersonIdent expectedAuthor =
changeNoteUtil.newAccountIdIdent(
- getAccount(admin.id()).id(), c.updated, serverIdent.get());
+ getAccount(admin.id()).id(), c.updated.toInstant(), serverIdent.get());
assertThat(commitPatchSetCreation.getAuthorIdent()).isEqualTo(expectedAuthor);
assertThat(commitPatchSetCreation.getCommitterIdent())
.isEqualTo(new PersonIdent(serverIdent.get(), c.updated));
@@ -3421,7 +3422,7 @@
assertThat(commitChangeCreation.getShortMessage()).isEqualTo("Create change");
expectedAuthor =
changeNoteUtil.newAccountIdIdent(
- getAccount(admin.id()).id(), c.created, serverIdent.get());
+ getAccount(admin.id()).id(), c.created.toInstant(), serverIdent.get());
assertThat(commitChangeCreation.getAuthorIdent()).isEqualTo(expectedAuthor);
assertThat(commitChangeCreation.getCommitterIdent())
.isEqualTo(new PersonIdent(serverIdent.get(), c.created));
@@ -5137,6 +5138,277 @@
value =
ExperimentFeaturesConstants
.GERRIT_BACKEND_REQUEST_FEATURE_STORE_SUBMIT_REQUIREMENTS_ON_MERGE)
+ public void submitRequirement_loadedFromTheLatestRevisionNoteForClosedChanges() throws Exception {
+ for (SubmitType submitType : SubmitType.values()) {
+ Project.NameKey project = createProjectForPush(submitType);
+ TestRepository<InMemoryRepository> repo = cloneProject(project);
+ configSubmitRequirement(
+ project,
+ SubmitRequirement.builder()
+ .setName("Code-Review")
+ .setSubmittabilityExpression(
+ SubmitRequirementExpression.create("label:Code-Review=+2"))
+ .setAllowOverrideInChildProjects(false)
+ .build());
+
+ PushOneCommit.Result r =
+ createChange(repo, "master", "Add a file", "foo", "content", "topic");
+ String changeId = r.getChangeId();
+
+ // Abandon change. Submit requirements get stored in the revision note of patch-set 1.
+ gApi.changes().id(changeId).abandon();
+ ChangeInfo change = gApi.changes().id(changeId).get();
+ assertThat(change.submitRequirements).hasSize(1);
+ assertSubmitRequirementStatus(
+ change.submitRequirements, "Code-Review", Status.UNSATISFIED, /* isLegacy= */ false);
+
+ // Restore the change.
+ gApi.changes().id(changeId).restore();
+ change = gApi.changes().id(changeId).get();
+ assertThat(change.submitRequirements).hasSize(1);
+ assertSubmitRequirementStatus(
+ change.submitRequirements, "Code-Review", Status.UNSATISFIED, /* isLegacy= */ false);
+
+ // Upload a second patch-set, fulfill the CR submit requirement.
+ amendChange(changeId, "refs/for/master", user, repo);
+ change = gApi.changes().id(changeId).get();
+ assertThat(change.revisions).hasSize(2);
+ voteLabel(changeId, "Code-Review", 2);
+ change = gApi.changes().id(changeId).get();
+ assertThat(change.submitRequirements).hasSize(1);
+ assertSubmitRequirementStatus(
+ change.submitRequirements, "Code-Review", Status.SATISFIED, /* isLegacy= */ false);
+
+ // Abandon the change.
+ gApi.changes().id(changeId).abandon();
+ change = gApi.changes().id(changeId).get();
+ assertThat(change.submitRequirements).hasSize(1);
+ assertSubmitRequirementStatus(
+ change.submitRequirements, "Code-Review", Status.SATISFIED, /* isLegacy= */ false);
+ }
+ }
+
+ @Test
+ @GerritConfig(
+ name = "experiments.enabled",
+ value =
+ ExperimentFeaturesConstants
+ .GERRIT_BACKEND_REQUEST_FEATURE_STORE_SUBMIT_REQUIREMENTS_ON_MERGE)
+ public void submitRequirement_abandonRestoreUpdateMerge() throws Exception {
+ for (SubmitType submitType : SubmitType.values()) {
+ Project.NameKey project = createProjectForPush(submitType);
+ TestRepository<InMemoryRepository> repo = cloneProject(project);
+ configSubmitRequirement(
+ project,
+ SubmitRequirement.builder()
+ .setName("Code-Review")
+ .setSubmittabilityExpression(
+ SubmitRequirementExpression.create("label:Code-Review=+2"))
+ .setAllowOverrideInChildProjects(false)
+ .build());
+
+ PushOneCommit.Result r =
+ createChange(repo, "master", "Add a file", "foo", "content", "topic");
+ String changeId = r.getChangeId();
+
+ // Abandon change. Submit requirements get stored in the revision note of patch-set 1.
+ gApi.changes().id(changeId).abandon();
+ ChangeInfo change = gApi.changes().id(changeId).get();
+ assertThat(change.submitRequirements).hasSize(1);
+ assertSubmitRequirementStatus(
+ change.submitRequirements, "Code-Review", Status.UNSATISFIED, /* isLegacy= */ false);
+
+ // Restore the change.
+ gApi.changes().id(changeId).restore();
+ change = gApi.changes().id(changeId).get();
+ assertThat(change.submitRequirements).hasSize(1);
+ assertSubmitRequirementStatus(
+ change.submitRequirements, "Code-Review", Status.UNSATISFIED, /* isLegacy= */ false);
+
+ // Update the change.
+ amendChange(changeId, "refs/for/master", user, repo);
+ change = gApi.changes().id(changeId).get();
+ assertThat(change.revisions).hasSize(2);
+ voteLabel(changeId, "Code-Review", 2);
+ change = gApi.changes().id(changeId).get();
+ assertThat(change.submitRequirements).hasSize(1);
+ assertSubmitRequirementStatus(
+ change.submitRequirements, "Code-Review", Status.SATISFIED, /* isLegacy= */ false);
+
+ // Merge the change.
+ gApi.changes().id(changeId).current().submit();
+ change = gApi.changes().id(changeId).get();
+ assertThat(change.submitRequirements).hasSize(1);
+ assertSubmitRequirementStatus(
+ change.submitRequirements, "Code-Review", Status.SATISFIED, /* isLegacy= */ false);
+ }
+ }
+
+ @Test
+ @GerritConfig(
+ name = "experiments.enabled",
+ value =
+ ExperimentFeaturesConstants
+ .GERRIT_BACKEND_REQUEST_FEATURE_STORE_SUBMIT_REQUIREMENTS_ON_MERGE)
+ public void submitRequirement_returnsEmpty_ForAbandonedChangeWithPreviouslyStoredSRs()
+ throws Exception {
+ for (SubmitType submitType : SubmitType.values()) {
+ Project.NameKey project = createProjectForPush(submitType);
+ TestRepository<InMemoryRepository> repo = cloneProject(project);
+ configSubmitRequirement(
+ project,
+ SubmitRequirement.builder()
+ .setName("Code-Review")
+ .setSubmittabilityExpression(
+ SubmitRequirementExpression.create("label:Code-Review=+2"))
+ .setAllowOverrideInChildProjects(false)
+ .build());
+
+ PushOneCommit.Result r =
+ createChange(repo, "master", "Add a file", "foo", "content", "topic");
+ String changeId = r.getChangeId();
+
+ // Abandon change. Submit requirements get stored in the revision note of patch-set 1.
+ gApi.changes().id(changeId).abandon();
+ ChangeInfo change = gApi.changes().id(changeId).get();
+ assertThat(change.submitRequirements).hasSize(1);
+ assertSubmitRequirementStatus(
+ change.submitRequirements, "Code-Review", Status.UNSATISFIED, /* isLegacy= */ false);
+
+ // Clear SRs for the project and update code-review label to be non-blocking.
+ clearSubmitRequirements(project);
+ LabelType cr =
+ TestLabels.codeReview().toBuilder().setFunction(LabelFunction.NO_BLOCK).build();
+ try (ProjectConfigUpdate u = updateProject(project)) {
+ u.getConfig().upsertLabelType(cr);
+ u.save();
+ }
+
+ // Restore the change. No SRs apply.
+ gApi.changes().id(changeId).restore();
+ change = gApi.changes().id(changeId).get();
+ assertThat(change.submitRequirements).isEmpty();
+
+ // Abandon the change. Still, no SRs apply.
+ gApi.changes().id(changeId).abandon();
+ change = gApi.changes().id(changeId).get();
+ assertThat(change.submitRequirements).isEmpty();
+ }
+ }
+
+ @Test
+ @GerritConfig(
+ name = "experiments.enabled",
+ value =
+ ExperimentFeaturesConstants
+ .GERRIT_BACKEND_REQUEST_FEATURE_STORE_SUBMIT_REQUIREMENTS_ON_MERGE)
+ public void submitRequirement_returnsEmpty_ForMergedChangeWithPreviouslyStoredSRs()
+ throws Exception {
+ for (SubmitType submitType : SubmitType.values()) {
+ Project.NameKey project = createProjectForPush(submitType);
+ TestRepository<InMemoryRepository> repo = cloneProject(project);
+ configSubmitRequirement(
+ project,
+ SubmitRequirement.builder()
+ .setName("Code-Review")
+ .setSubmittabilityExpression(
+ SubmitRequirementExpression.create("label:Code-Review=+2"))
+ .setAllowOverrideInChildProjects(false)
+ .build());
+
+ PushOneCommit.Result r =
+ createChange(repo, "master", "Add a file", "foo", "content", "topic");
+ String changeId = r.getChangeId();
+
+ // Abandon change. Submit requirements get stored in the revision note of patch-set 1.
+ gApi.changes().id(changeId).abandon();
+ ChangeInfo change = gApi.changes().id(changeId).get();
+ assertThat(change.submitRequirements).hasSize(1);
+ assertSubmitRequirementStatus(
+ change.submitRequirements, "Code-Review", Status.UNSATISFIED, /* isLegacy= */ false);
+
+ // Clear SRs for the project and update code-review label to be non-blocking.
+ clearSubmitRequirements(project);
+ LabelType cr =
+ TestLabels.codeReview().toBuilder().setFunction(LabelFunction.NO_BLOCK).build();
+ try (ProjectConfigUpdate u = updateProject(project)) {
+ u.getConfig().upsertLabelType(cr);
+ u.save();
+ }
+
+ // Restore the change. No SRs apply.
+ gApi.changes().id(changeId).restore();
+ change = gApi.changes().id(changeId).get();
+ assertThat(change.submitRequirements).isEmpty();
+
+ // Merge the change. Still, no SRs apply.
+ gApi.changes().id(changeId).current().submit();
+ change = gApi.changes().id(changeId).get();
+ assertThat(change.submitRequirements).isEmpty();
+ }
+ }
+
+ @Test
+ @GerritConfig(
+ name = "experiments.enabled",
+ value =
+ ExperimentFeaturesConstants
+ .GERRIT_BACKEND_REQUEST_FEATURE_STORE_SUBMIT_REQUIREMENTS_ON_MERGE)
+ public void submitRequirement_withMultipleAbandonAndRestore() throws Exception {
+ for (SubmitType submitType : SubmitType.values()) {
+ Project.NameKey project = createProjectForPush(submitType);
+ TestRepository<InMemoryRepository> repo = cloneProject(project);
+ configSubmitRequirement(
+ project,
+ SubmitRequirement.builder()
+ .setName("Code-Review")
+ .setSubmittabilityExpression(
+ SubmitRequirementExpression.create("label:Code-Review=+2"))
+ .setAllowOverrideInChildProjects(false)
+ .build());
+
+ PushOneCommit.Result r =
+ createChange(repo, "master", "Add a file", "foo", "content", "topic");
+ String changeId = r.getChangeId();
+
+ // Abandon change. Submit requirements get stored in the revision note of patch-set 1.
+ gApi.changes().id(changeId).abandon();
+ ChangeInfo change = gApi.changes().id(changeId).get();
+ assertThat(change.submitRequirements).hasSize(1);
+ assertSubmitRequirementStatus(
+ change.submitRequirements, "Code-Review", Status.UNSATISFIED, /* isLegacy= */ false);
+
+ // Restore the change.
+ gApi.changes().id(changeId).restore();
+ change = gApi.changes().id(changeId).get();
+ assertThat(change.submitRequirements).hasSize(1);
+ assertSubmitRequirementStatus(
+ change.submitRequirements, "Code-Review", Status.UNSATISFIED, /* isLegacy= */ false);
+
+ // Abandon the change again.
+ gApi.changes().id(changeId).abandon();
+ change = gApi.changes().id(changeId).get();
+ assertThat(change.submitRequirements).hasSize(1);
+ assertSubmitRequirementStatus(
+ change.submitRequirements, "Code-Review", Status.UNSATISFIED, /* isLegacy= */ false);
+
+ // Restore, vote CR=+2, and abandon again. Make sure the requirement is now satisfied.
+ gApi.changes().id(changeId).restore();
+ voteLabel(changeId, "Code-Review", 2);
+ gApi.changes().id(changeId).abandon();
+ change = gApi.changes().id(changeId).get();
+ assertThat(change.submitRequirements).hasSize(1);
+ assertSubmitRequirementStatus(
+ change.submitRequirements, "Code-Review", Status.SATISFIED, /* isLegacy= */ false);
+ }
+ }
+
+ @Test
+ @GerritConfig(
+ name = "experiments.enabled",
+ value =
+ ExperimentFeaturesConstants
+ .GERRIT_BACKEND_REQUEST_FEATURE_STORE_SUBMIT_REQUIREMENTS_ON_MERGE)
public void submitRequirement_retrievedFromNoteDbForAbandonedChanges() throws Exception {
for (SubmitType submitType : SubmitType.values()) {
Project.NameKey project = createProjectForPush(submitType);
@@ -6389,7 +6661,7 @@
private void setChangeStatus(Change.Id id, Change.Status newStatus) throws Exception {
try (BatchUpdate batchUpdate =
- batchUpdateFactory.create(project, atrScope.get().getUser(), TimeUtil.nowTs())) {
+ batchUpdateFactory.create(project, atrScope.get().getUser(), TimeUtil.now())) {
batchUpdate.addOp(id, new ChangeStatusUpdateOp(newStatus));
batchUpdate.execute();
}
diff --git a/javatests/com/google/gerrit/acceptance/api/change/PrivateChangeIT.java b/javatests/com/google/gerrit/acceptance/api/change/PrivateChangeIT.java
index 97b7148..267f5a7 100644
--- a/javatests/com/google/gerrit/acceptance/api/change/PrivateChangeIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/change/PrivateChangeIT.java
@@ -251,7 +251,7 @@
private void markMergedChangePrivate(Change.Id changeId) throws Exception {
try (BatchUpdate u =
batchUpdateFactory.create(
- project, identifiedUserFactory.create(admin.id()), TimeUtil.nowTs())) {
+ project, identifiedUserFactory.create(admin.id()), TimeUtil.now())) {
u.addOp(
changeId,
new BatchUpdateOp() {
diff --git a/javatests/com/google/gerrit/acceptance/api/group/GroupAssert.java b/javatests/com/google/gerrit/acceptance/api/group/GroupAssert.java
index 079d43e9..27f6111 100644
--- a/javatests/com/google/gerrit/acceptance/api/group/GroupAssert.java
+++ b/javatests/com/google/gerrit/acceptance/api/group/GroupAssert.java
@@ -42,7 +42,7 @@
assertThat(toBoolean(info.options.visibleToAll)).isEqualTo(group.isVisibleToAll());
assertThat(info.description).isEqualTo(group.getDescription());
assertThat(Url.decode(info.ownerId)).isEqualTo(group.getOwnerGroupUUID().get());
- assertThat(info.createdOn).isEqualTo(group.getCreatedOn());
+ assertThat(info.createdOn.toInstant()).isEqualTo(group.getCreatedOn());
}
public static boolean toBoolean(Boolean b) {
diff --git a/javatests/com/google/gerrit/acceptance/api/group/GroupsIT.java b/javatests/com/google/gerrit/acceptance/api/group/GroupsIT.java
index 0c806b7..63b67f8 100644
--- a/javatests/com/google/gerrit/acceptance/api/group/GroupsIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/group/GroupsIT.java
@@ -109,8 +109,10 @@
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
@@ -557,14 +559,17 @@
assertThrows(AuthException.class, () -> gApi.groups().create(name("newGroup")));
}
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
@Test
public void createdOnFieldIsPopulatedForNewGroup() throws Exception {
// NoteDb allows only second precision.
- Timestamp testStartTime = TimeUtil.truncateToSecond(TimeUtil.nowTs());
+ Instant testStartTime = TimeUtil.truncateToSecond(TimeUtil.now());
String newGroupName = name("newGroup");
GroupInfo group = gApi.groups().create(newGroupName).get();
- assertThat(group.createdOn).isAtLeast(testStartTime);
+ assertThat(group.createdOn.toInstant()).isAtLeast(testStartTime);
}
@Test
@@ -1603,6 +1608,9 @@
return createCommit(repo, commitMessage, null);
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
private ObjectId createCommit(Repository repo, String commitMessage, @Nullable ObjectId treeId)
throws IOException {
try (ObjectInserter oi = repo.newObjectInserter()) {
@@ -1610,7 +1618,7 @@
treeId = oi.insert(Constants.OBJ_TREE, new byte[] {});
}
- PersonIdent ident = new PersonIdent(serverIdent.get(), TimeUtil.nowTs());
+ PersonIdent ident = new PersonIdent(serverIdent.get(), Date.from(TimeUtil.now()));
CommitBuilder cb = new CommitBuilder();
cb.setTreeId(treeId);
cb.setCommitter(ident);
diff --git a/javatests/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java b/javatests/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java
index 656451d..dcd274d 100644
--- a/javatests/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java
@@ -57,7 +57,7 @@
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
-import java.text.SimpleDateFormat;
+import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -2969,6 +2969,9 @@
return "An unchanged patchset\n\nChange-Id: " + changeId;
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
private void assertDiffForNewFile(
PushOneCommit.Result pushResult, String path, String expectedContentSideB) throws Exception {
DiffInfo diff =
@@ -2987,16 +2990,18 @@
abbreviateName(parentCommit, 8, testRepo.getRevWalk().getObjectReader());
headers.add("Parent: " + parentCommitId + " (" + parentCommit.getShortMessage() + ")");
- SimpleDateFormat dtfmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z", Locale.US);
PersonIdent author = c.getAuthorIdent();
- dtfmt.setTimeZone(author.getTimeZone());
+ DateTimeFormatter fmt =
+ DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss Z")
+ .withLocale(Locale.US)
+ .withZone(author.getTimeZone().toZoneId());
headers.add("Author: " + author.getName() + " <" + author.getEmailAddress() + ">");
- headers.add("AuthorDate: " + dtfmt.format(author.getWhen().getTime()));
+ headers.add("AuthorDate: " + fmt.format(author.getWhen().toInstant()));
PersonIdent committer = c.getCommitterIdent();
- dtfmt.setTimeZone(committer.getTimeZone());
+ fmt = fmt.withZone(committer.getTimeZone().toZoneId());
headers.add("Commit: " + committer.getName() + " <" + committer.getEmailAddress() + ">");
- headers.add("CommitDate: " + dtfmt.format(committer.getWhen().getTime()));
+ headers.add("CommitDate: " + fmt.format(committer.getWhen().toInstant()));
headers.add("");
}
diff --git a/javatests/com/google/gerrit/acceptance/api/revision/RevisionIT.java b/javatests/com/google/gerrit/acceptance/api/revision/RevisionIT.java
index d3fe83f..72b5f93 100644
--- a/javatests/com/google/gerrit/acceptance/api/revision/RevisionIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/revision/RevisionIT.java
@@ -100,7 +100,6 @@
import com.google.gerrit.testing.FakeEmailSender;
import com.google.inject.Inject;
import java.io.ByteArrayOutputStream;
-import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Collection;
@@ -1683,10 +1682,15 @@
}
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ // TODO(issue-15508): Migrate timestamp fields in *Info/*Input classes from type Timestamp to
+ // Instant
+ @SuppressWarnings("JdkObsolete")
private void assertPersonIdent(GitPerson gitPerson, PersonIdent expectedIdent) {
assertThat(gitPerson.name).isEqualTo(expectedIdent.getName());
assertThat(gitPerson.email).isEqualTo(expectedIdent.getEmailAddress());
- assertThat(gitPerson.date).isEqualTo(new Timestamp(expectedIdent.getWhen().getTime()));
+ assertThat(gitPerson.date.getTime()).isEqualTo(expectedIdent.getWhen().getTime());
assertThat(gitPerson.tz).isEqualTo(expectedIdent.getTimeZoneOffset());
}
diff --git a/javatests/com/google/gerrit/acceptance/rest/account/GetAccountDetailIT.java b/javatests/com/google/gerrit/acceptance/rest/account/GetAccountDetailIT.java
index a1e9bf1..c89e11a 100644
--- a/javatests/com/google/gerrit/acceptance/rest/account/GetAccountDetailIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/account/GetAccountDetailIT.java
@@ -59,7 +59,7 @@
AccountDetailInfo info = newGson().fromJson(r.getReader(), AccountDetailInfo.class);
assertAccountInfo(admin, info);
Account account = getAccount(admin.id());
- assertThat(info.registeredOn).isEqualTo(account.registeredOn());
+ assertThat(info.registeredOn.getTime()).isEqualTo(account.registeredOn().toEpochMilli());
}
@Test
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java b/javatests/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
index b55561b..de14d00 100644
--- a/javatests/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
+++ b/javatests/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
@@ -1126,7 +1126,7 @@
private void setChangeStatusToNew(PushOneCommit.Result... changes) throws Throwable {
for (PushOneCommit.Result change : changes) {
try (BatchUpdate bu =
- batchUpdateFactory.create(project, userFactory.create(admin.id()), TimeUtil.nowTs())) {
+ batchUpdateFactory.create(project, userFactory.create(admin.id()), TimeUtil.now())) {
bu.addOp(
change.getChange().getId(),
new BatchUpdateOp() {
@@ -1249,8 +1249,8 @@
submit(r.getChangeId());
assertThat(r.getChange().getMergedOn()).isPresent();
ChangeInfo change = gApi.changes().id(r.getChangeId()).get();
- assertThat(r.getChange().getMergedOn().get()).isEqualTo(change.updated);
- assertThat(r.getChange().getMergedOn().get()).isEqualTo(change.submitted);
+ assertThat(r.getChange().getMergedOn().get()).isEqualTo(change.getUpdated());
+ assertThat(r.getChange().getMergedOn().get()).isEqualTo(change.getSubmitted());
}
@Override
@@ -1360,6 +1360,9 @@
assertThat(actual.getTimeZone()).isEqualTo(expected.getTimeZone());
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
protected void assertAuthorAndCommitDateEquals(RevCommit commit) {
assertThat(commit.getAuthorIdent().getWhen().getTime())
.isEqualTo(commit.getCommitterIdent().getWhen().getTime());
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/AttentionSetIT.java b/javatests/com/google/gerrit/acceptance/rest/change/AttentionSetIT.java
index 9246442..b034a42 100644
--- a/javatests/com/google/gerrit/acceptance/rest/change/AttentionSetIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/change/AttentionSetIT.java
@@ -2049,7 +2049,7 @@
comment.side = Side.REVISION;
comment.path = Patch.COMMIT_MSG;
comment.message = "comment";
- comment.updated = TimeUtil.nowTs();
+ comment.setUpdated(TimeUtil.now());
comment.inReplyTo = id;
ReviewInput reviewInput = new ReviewInput();
reviewInput.comments = ImmutableMap.of(Patch.COMMIT_MSG, ImmutableList.of(comment));
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java b/javatests/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java
index 186e73e..dbebbf9 100644
--- a/javatests/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java
@@ -594,7 +594,7 @@
PersonIdent expectedAuthor =
changeNoteUtil.newAccountIdIdent(
- getAccount(admin.id()).id(), c.created, serverIdent.get());
+ getAccount(admin.id()).id(), c.created.toInstant(), serverIdent.get());
assertThat(commit.getAuthorIdent()).isEqualTo(expectedAuthor);
assertThat(commit.getCommitterIdent())
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/SubmitByRebaseAlwaysIT.java b/javatests/com/google/gerrit/acceptance/rest/change/SubmitByRebaseAlwaysIT.java
index aa93815..2eade27 100644
--- a/javatests/com/google/gerrit/acceptance/rest/change/SubmitByRebaseAlwaysIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/change/SubmitByRebaseAlwaysIT.java
@@ -33,7 +33,7 @@
import com.google.gerrit.entities.PatchSet;
import com.google.gerrit.entities.PatchSetApproval;
import com.google.gerrit.entities.Project.NameKey;
-import com.google.gerrit.exceptions.InternalServerWithUserMessageException;
+import com.google.gerrit.exceptions.MergeUpdateException;
import com.google.gerrit.extensions.api.changes.ReviewInput;
import com.google.gerrit.extensions.client.InheritableBoolean;
import com.google.gerrit.extensions.client.SubmitType;
@@ -136,8 +136,8 @@
ChangeMessageModifier modifier2 = (msg, orig, tip, dest) -> msg + "A-footer: value\n";
try (Registration registration =
extensionRegistry.newRegistration().add(modifier1).add(modifier2)) {
- InternalServerWithUserMessageException thrown =
- assertThrows(InternalServerWithUserMessageException.class, () -> submitWithRebase());
+ MergeUpdateException thrown =
+ assertThrows(MergeUpdateException.class, () -> submitWithRebase());
Throwable cause = Throwables.getRootCause(thrown);
assertThat(cause).isInstanceOf(RuntimeException.class);
assertThat(cause).hasMessageThat().isEqualTo("boom");
@@ -153,8 +153,8 @@
.newRegistration()
.add(modifier1, "modifier-1")
.add(modifier2, "modifier-2")) {
- InternalServerWithUserMessageException thrown =
- assertThrows(InternalServerWithUserMessageException.class, () -> submitWithRebase());
+ MergeUpdateException thrown =
+ assertThrows(MergeUpdateException.class, () -> submitWithRebase());
Throwable cause = Throwables.getRootCause(thrown);
assertThat(cause).isInstanceOf(RuntimeException.class);
assertThat(cause)
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/TagsIT.java b/javatests/com/google/gerrit/acceptance/rest/project/TagsIT.java
index b1879f6..8bf70f7 100644
--- a/javatests/com/google/gerrit/acceptance/rest/project/TagsIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/project/TagsIT.java
@@ -41,7 +41,7 @@
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.server.project.ProjectConfig;
import com.google.inject.Inject;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Arrays;
import java.util.List;
import org.eclipse.jgit.revwalk.RevCommit;
@@ -222,14 +222,14 @@
assertThat(result.ref).isEqualTo(R_TAGS + input.ref);
assertThat(result.revision).isEqualTo(input.revision);
assertThat(result.canDelete).isTrue();
- assertThat(result.created).isEqualTo(timestamp(r));
+ assertThat(result.created.toInstant()).isEqualTo(instant(r));
input.ref = "refs/tags/v2.0";
result = tag(input.ref).create(input).get();
assertThat(result.ref).isEqualTo(input.ref);
assertThat(result.revision).isEqualTo(input.revision);
assertThat(result.canDelete).isTrue();
- assertThat(result.created).isEqualTo(timestamp(r));
+ assertThat(result.created.toInstant()).isEqualTo(instant(r));
requestScopeOperations.setApiUser(user.id());
result = tag(input.ref).get();
@@ -457,8 +457,11 @@
return gApi.projects().name(project.get()).tag(tagname);
}
- private Timestamp timestamp(PushOneCommit.Result r) {
- return new Timestamp(r.getCommit().getCommitterIdent().getWhen().getTime());
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
+ private Instant instant(PushOneCommit.Result r) {
+ return r.getCommit().getCommitterIdent().getWhen().toInstant();
}
private void assertBadRequest(ListRefsRequest<TagInfo> req) throws Exception {
diff --git a/javatests/com/google/gerrit/acceptance/server/approval/PatchSetApprovalUuidTest.java b/javatests/com/google/gerrit/acceptance/server/approval/PatchSetApprovalUuidTest.java
index ed6800e..e1b4ccb 100644
--- a/javatests/com/google/gerrit/acceptance/server/approval/PatchSetApprovalUuidTest.java
+++ b/javatests/com/google/gerrit/acceptance/server/approval/PatchSetApprovalUuidTest.java
@@ -10,7 +10,7 @@
import com.google.gerrit.server.approval.PatchSetApprovalUuidGenerator;
import com.google.gerrit.server.approval.PatchSetApprovalUuidGeneratorImpl;
import com.google.gerrit.server.util.time.TimeUtil;
-import java.util.Date;
+import java.time.Instant;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -30,7 +30,7 @@
PatchSet.Id patchSetId = PatchSet.id(Change.id(1), 1);
Account.Id accountId = Account.id(1);
String label = LabelId.CODE_REVIEW;
- Date granted = TimeUtil.nowTs();
+ Instant granted = TimeUtil.now();
PatchSetApproval.UUID uuid1 =
patchSetApprovalUuidGenerator.get(patchSetId, accountId, label, value, granted);
PatchSetApproval.UUID uuid2 =
diff --git a/javatests/com/google/gerrit/acceptance/server/change/CommentsIT.java b/javatests/com/google/gerrit/acceptance/server/change/CommentsIT.java
index 8cdac85..6d980c7 100644
--- a/javatests/com/google/gerrit/acceptance/server/change/CommentsIT.java
+++ b/javatests/com/google/gerrit/acceptance/server/change/CommentsIT.java
@@ -69,7 +69,7 @@
import com.google.gerrit.testing.FakeEmailSender.Message;
import com.google.inject.Inject;
import com.google.inject.Provider;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -667,7 +667,7 @@
public void putDraft() throws Exception {
for (Integer line : lines) {
PushOneCommit.Result r = createChange();
- Timestamp origLastUpdated = r.getChange().change().getLastUpdatedOn();
+ Instant origLastUpdated = r.getChange().change().getLastUpdatedOn();
String changeId = r.getChangeId();
String revId = r.getCommit().getName();
String path = "file1";
@@ -914,7 +914,7 @@
public void deleteDraft() throws Exception {
for (Integer line : lines) {
PushOneCommit.Result r = createChange();
- Timestamp origLastUpdated = r.getChange().change().getLastUpdatedOn();
+ Instant origLastUpdated = r.getChange().change().getLastUpdatedOn();
String changeId = r.getChangeId();
String revId = r.getCommit().getName();
DraftInput draft = CommentsUtil.newDraft("file1", Side.REVISION, line, "comment 1");
@@ -930,7 +930,7 @@
@Test
public void insertCommentsWithHistoricTimestamp() throws Exception {
- Timestamp timestamp = new Timestamp(0);
+ Instant timestamp = Instant.EPOCH;
for (Integer line : lines) {
String file = "file";
String contents = "contents " + line;
@@ -939,11 +939,11 @@
PushOneCommit.Result r = push.to("refs/for/master");
String changeId = r.getChangeId();
String revId = r.getCommit().getName();
- Timestamp origLastUpdated = r.getChange().change().getLastUpdatedOn();
+ Instant origLastUpdated = r.getChange().change().getLastUpdatedOn();
ReviewInput input = new ReviewInput();
CommentInput comment = CommentsUtil.newComment(file, Side.REVISION, line, "comment 1", false);
- comment.updated = timestamp;
+ comment.setUpdated(timestamp);
input.comments = new HashMap<>();
input.comments.put(comment.path, Lists.newArrayList(comment));
ChangeResource changeRsrc =
diff --git a/javatests/com/google/gerrit/acceptance/server/change/ConsistencyCheckerIT.java b/javatests/com/google/gerrit/acceptance/server/change/ConsistencyCheckerIT.java
index 9d821b7..5b6da36 100644
--- a/javatests/com/google/gerrit/acceptance/server/change/ConsistencyCheckerIT.java
+++ b/javatests/com/google/gerrit/acceptance/server/change/ConsistencyCheckerIT.java
@@ -732,7 +732,7 @@
}
private BatchUpdate newUpdate(Account.Id owner) {
- return batchUpdateFactory.create(project, userFactory.create(owner), TimeUtil.nowTs());
+ return batchUpdateFactory.create(project, userFactory.create(owner), TimeUtil.now());
}
private ChangeNotes insertChange() throws Exception {
@@ -825,10 +825,14 @@
assertThat(ru.delete()).isEqualTo(RefUpdate.Result.FORCED);
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
private void addNoteDbCommit(Change.Id id, String commitMessage) throws Exception {
PersonIdent committer = serverIdent.get();
PersonIdent author =
- noteUtil.newAccountIdIdent(getAccount(admin.id()).id(), committer.getWhen(), committer);
+ noteUtil.newAccountIdIdent(
+ getAccount(admin.id()).id(), committer.getWhen().toInstant(), committer);
serverSideTestRepo
.branch(RefNames.changeMetaRef(id))
.commit()
diff --git a/javatests/com/google/gerrit/acceptance/server/change/GetRelatedIT.java b/javatests/com/google/gerrit/acceptance/server/change/GetRelatedIT.java
index e778a5c..fd3ac7f 100644
--- a/javatests/com/google/gerrit/acceptance/server/change/GetRelatedIT.java
+++ b/javatests/com/google/gerrit/acceptance/server/change/GetRelatedIT.java
@@ -666,7 +666,7 @@
}
private void clearGroups(PatchSet.Id psId) throws Exception {
- try (BatchUpdate bu = batchUpdateFactory.create(project, user(user), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = batchUpdateFactory.create(project, user(user), TimeUtil.now())) {
bu.addOp(
psId.changeId(),
new BatchUpdateOp() {
diff --git a/javatests/com/google/gerrit/acceptance/server/mail/MailMetadataIT.java b/javatests/com/google/gerrit/acceptance/server/mail/MailMetadataIT.java
index d6fcccc..4e490a7 100644
--- a/javatests/com/google/gerrit/acceptance/server/mail/MailMetadataIT.java
+++ b/javatests/com/google/gerrit/acceptance/server/mail/MailMetadataIT.java
@@ -30,11 +30,10 @@
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gerrit.testing.FakeEmailSender;
import com.google.inject.Inject;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Collection;
-import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -100,7 +99,7 @@
expectedHeaders.put("Gerrit-MessageType", "comment");
expectedHeaders.put("Gerrit-Commit", newChange.getCommit().getId().name());
expectedHeaders.put("Gerrit-ChangeURL", changeURL);
- expectedHeaders.put("Gerrit-Comment-Date", Iterables.getLast(result).date);
+ expectedHeaders.put("Gerrit-Comment-Date", Iterables.getLast(result).date.toInstant());
assertHeaders(message.headers(), expectedHeaders);
@@ -116,14 +115,14 @@
if (entry.getValue() instanceof String) {
assertThat(have)
.containsEntry("X-" + entry.getKey(), new StringEmailHeader((String) entry.getValue()));
- } else if (entry.getValue() instanceof Date) {
+ } else if (entry.getValue() instanceof Instant) {
assertThat(have)
- .containsEntry("X-" + entry.getKey(), new EmailHeader.Date((Date) entry.getValue()));
+ .containsEntry("X-" + entry.getKey(), new EmailHeader.Date((Instant) entry.getValue()));
} else {
throw new Exception(
"Object has unsupported type: "
+ entry.getValue().getClass().getName()
- + " must be java.util.Date or java.lang.String for key "
+ + " must be java.time.Instant or java.lang.String for key "
+ entry.getKey());
}
}
@@ -133,19 +132,18 @@
for (Map.Entry<String, Object> entry : want.entrySet()) {
if (entry.getValue() instanceof String) {
assertThat(body).contains(entry.getKey() + ": " + entry.getValue());
- } else if (entry.getValue() instanceof Timestamp) {
+ } else if (entry.getValue() instanceof Instant) {
assertThat(body)
.contains(
entry.getKey()
+ ": "
+ MailProcessingUtil.rfcDateformatter.format(
- ZonedDateTime.ofInstant(
- ((Timestamp) entry.getValue()).toInstant(), ZoneId.of("UTC"))));
+ ZonedDateTime.ofInstant((Instant) entry.getValue(), ZoneId.of("UTC"))));
} else {
throw new Exception(
"Object has unsupported type: "
+ entry.getValue().getClass().getName()
- + " must be java.util.Date or java.lang.String for key "
+ + " must be java.time.Instant or java.lang.String for key "
+ entry.getKey());
}
}
diff --git a/javatests/com/google/gerrit/acceptance/server/notedb/NoteDbOnlyIT.java b/javatests/com/google/gerrit/acceptance/server/notedb/NoteDbOnlyIT.java
index 3c066a3..ab5e1d8 100644
--- a/javatests/com/google/gerrit/acceptance/server/notedb/NoteDbOnlyIT.java
+++ b/javatests/com/google/gerrit/acceptance/server/notedb/NoteDbOnlyIT.java
@@ -274,7 +274,7 @@
}
private BatchUpdate newBatchUpdate(BatchUpdate.Factory buf) {
- return buf.create(project, identifiedUserFactory.create(user.id()), TimeUtil.nowTs());
+ return buf.create(project, identifiedUserFactory.create(user.id()), TimeUtil.now());
}
private Optional<ObjectId> getRef(String name) throws Exception {
diff --git a/javatests/com/google/gerrit/acceptance/server/query/ApprovalQueryIT.java b/javatests/com/google/gerrit/acceptance/server/query/ApprovalQueryIT.java
index 97f072e..925c855 100644
--- a/javatests/com/google/gerrit/acceptance/server/query/ApprovalQueryIT.java
+++ b/javatests/com/google/gerrit/acceptance/server/query/ApprovalQueryIT.java
@@ -35,7 +35,7 @@
import com.google.gerrit.server.query.approval.ApprovalContext;
import com.google.gerrit.server.query.approval.ApprovalQueryBuilder;
import com.google.inject.Inject;
-import java.util.Date;
+import java.time.Instant;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevWalk;
import org.junit.Test;
@@ -261,7 +261,7 @@
PatchSetApproval approval =
PatchSetApproval.builder()
.postSubmit(false)
- .granted(new Date())
+ .granted(Instant.now())
.key(PatchSetApproval.key(psId, approver, LabelId.create("Code-Review")))
.value(value)
.build();
diff --git a/javatests/com/google/gerrit/acceptance/testsuite/group/GroupOperationsImplTest.java b/javatests/com/google/gerrit/acceptance/testsuite/group/GroupOperationsImplTest.java
index a003f9d..473b128 100644
--- a/javatests/com/google/gerrit/acceptance/testsuite/group/GroupOperationsImplTest.java
+++ b/javatests/com/google/gerrit/acceptance/testsuite/group/GroupOperationsImplTest.java
@@ -31,7 +31,7 @@
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.truth.NullAwareCorrespondence;
import com.google.inject.Inject;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Optional;
import org.junit.Test;
@@ -325,9 +325,9 @@
GroupInfo group = gApi.groups().create(createArbitraryGroupInput()).detail();
AccountGroup.UUID groupUuid = AccountGroup.uuid(group.id);
- Timestamp createdOn = groupOperations.group(groupUuid).get().createdOn();
+ Instant createdOn = groupOperations.group(groupUuid).get().createdOn();
- assertThat(createdOn).isEqualTo(group.createdOn);
+ assertThat(createdOn).isEqualTo(group.createdOn.toInstant());
}
@Test
diff --git a/javatests/com/google/gerrit/entities/LabelFunctionTest.java b/javatests/com/google/gerrit/entities/LabelFunctionTest.java
index 0132697..80d97db 100644
--- a/javatests/com/google/gerrit/entities/LabelFunctionTest.java
+++ b/javatests/com/google/gerrit/entities/LabelFunctionTest.java
@@ -19,7 +19,6 @@
import com.google.common.collect.ImmutableList;
import java.time.Instant;
import java.util.ArrayList;
-import java.util.Date;
import java.util.List;
import org.junit.Test;
@@ -94,7 +93,7 @@
return PatchSetApproval.builder()
.key(PatchSetApproval.key(PS_ID, Account.id(10000 + value), LABEL_ID))
.value(value)
- .granted(Date.from(Instant.now()))
+ .granted(Instant.now())
.build();
}
diff --git a/javatests/com/google/gerrit/entities/converter/ChangeMessageProtoConverterTest.java b/javatests/com/google/gerrit/entities/converter/ChangeMessageProtoConverterTest.java
index ec6c372..22daf5b 100644
--- a/javatests/com/google/gerrit/entities/converter/ChangeMessageProtoConverterTest.java
+++ b/javatests/com/google/gerrit/entities/converter/ChangeMessageProtoConverterTest.java
@@ -27,7 +27,7 @@
import com.google.gerrit.proto.testing.SerializedClassSubject;
import com.google.gerrit.server.util.AccountTemplateUtil;
import java.lang.reflect.Type;
-import java.sql.Timestamp;
+import java.time.Instant;
import org.junit.Test;
public class ChangeMessageProtoConverterTest {
@@ -40,7 +40,7 @@
ChangeMessage.create(
ChangeMessage.key(Change.id(543), "change-message-21"),
Account.id(63),
- new Timestamp(9876543),
+ Instant.ofEpochMilli(9876543),
PatchSet.id(Change.id(34), 13),
"This is a change message.",
Account.id(10003),
@@ -73,7 +73,7 @@
ChangeMessage.create(
ChangeMessage.key(Change.id(543), "change-message-21"),
Account.id(63),
- new Timestamp(9876543),
+ Instant.ofEpochMilli(9876543),
PatchSet.id(Change.id(34), 13));
Entities.ChangeMessage proto = changeMessageProtoConverter.toProto(changeMessage);
@@ -140,7 +140,7 @@
ChangeMessage.create(
ChangeMessage.key(Change.id(543), "change-message-21"),
Account.id(63),
- new Timestamp(9876543),
+ Instant.ofEpochMilli(9876543),
PatchSet.id(Change.id(34), 13),
"This is a change message.",
Account.id(10003),
@@ -157,7 +157,7 @@
ChangeMessage.create(
ChangeMessage.key(Change.id(543), "change-message-21"),
Account.id(63),
- new Timestamp(9876543),
+ Instant.ofEpochMilli(9876543),
PatchSet.id(Change.id(34), 13),
String.format(
"This is a change message by %s and includes %s ",
@@ -178,7 +178,7 @@
ChangeMessage.create(
ChangeMessage.key(Change.id(543), "change-message-21"),
Account.id(63),
- new Timestamp(9876543),
+ Instant.ofEpochMilli(9876543),
PatchSet.id(Change.id(34), 13));
ChangeMessage convertedChangeMessage =
@@ -205,7 +205,7 @@
ImmutableMap.<String, Type>builder()
.put("key", ChangeMessage.Key.class)
.put("author", Account.Id.class)
- .put("writtenOn", Timestamp.class)
+ .put("writtenOn", Instant.class)
.put("message", String.class)
.put("patchset", PatchSet.Id.class)
.put("tag", String.class)
diff --git a/javatests/com/google/gerrit/entities/converter/ChangeProtoConverterTest.java b/javatests/com/google/gerrit/entities/converter/ChangeProtoConverterTest.java
index 8c5e449..bd4b2b1 100644
--- a/javatests/com/google/gerrit/entities/converter/ChangeProtoConverterTest.java
+++ b/javatests/com/google/gerrit/entities/converter/ChangeProtoConverterTest.java
@@ -27,7 +27,7 @@
import com.google.gerrit.proto.Entities;
import com.google.gerrit.proto.testing.SerializedClassSubject;
import java.lang.reflect.Type;
-import java.sql.Timestamp;
+import java.time.Instant;
import org.junit.Test;
public class ChangeProtoConverterTest {
@@ -41,8 +41,8 @@
Change.id(14),
Account.id(35),
BranchNameKey.create(Project.nameKey("project 67"), "branch 74"),
- new Timestamp(987654L));
- change.setLastUpdatedOn(new Timestamp(1234567L));
+ Instant.ofEpochMilli(987654L));
+ change.setLastUpdatedOn(Instant.ofEpochMilli(1234567L));
change.setStatus(Change.Status.MERGED);
change.setCurrentPatchSet(
PatchSet.id(Change.id(14), 23), "subject XYZ", "original subject ABC");
@@ -90,7 +90,7 @@
Change.id(14),
Account.id(35),
BranchNameKey.create(Project.nameKey("project 67"), "branch-74"),
- new Timestamp(987654L));
+ Instant.ofEpochMilli(987654L));
Entities.Change proto = changeProtoConverter.toProto(change);
@@ -125,7 +125,7 @@
Change.id(14),
Account.id(35),
BranchNameKey.create(Project.nameKey("project 67"), "branch-74"),
- new Timestamp(987654L));
+ Instant.ofEpochMilli(987654L));
// O as ID actually means that no current patch set is present.
change.setCurrentPatchSet(PatchSet.id(Change.id(14), 0), null, null);
@@ -162,7 +162,7 @@
Change.id(14),
Account.id(35),
BranchNameKey.create(Project.nameKey("project 67"), "branch-74"),
- new Timestamp(987654L));
+ Instant.ofEpochMilli(987654L));
change.setCurrentPatchSet(PatchSet.id(Change.id(14), 23), "subject ABC", null);
Entities.Change proto = changeProtoConverter.toProto(change);
@@ -198,8 +198,8 @@
Change.id(14),
Account.id(35),
BranchNameKey.create(Project.nameKey("project 67"), "branch-74"),
- new Timestamp(987654L));
- change.setLastUpdatedOn(new Timestamp(1234567L));
+ Instant.ofEpochMilli(987654L));
+ change.setLastUpdatedOn(Instant.ofEpochMilli(1234567L));
change.setStatus(Change.Status.MERGED);
change.setCurrentPatchSet(
PatchSet.id(Change.id(14), 23), "subject XYZ", "original subject ABC");
@@ -223,7 +223,7 @@
Change.id(14),
Account.id(35),
BranchNameKey.create(Project.nameKey("project 67"), "branch-74"),
- new Timestamp(987654L));
+ Instant.ofEpochMilli(987654L));
Change convertedChange = changeProtoConverter.fromProto(changeProtoConverter.toProto(change));
assertEqualChange(convertedChange, change);
@@ -242,8 +242,8 @@
assertThat(change.getKey()).isNull();
assertThat(change.getOwner()).isNull();
assertThat(change.getDest()).isNull();
- assertThat(change.getCreatedOn()).isEqualTo(new Timestamp(0));
- assertThat(change.getLastUpdatedOn()).isEqualTo(new Timestamp(0));
+ assertThat(change.getCreatedOn()).isEqualTo(Instant.EPOCH);
+ assertThat(change.getLastUpdatedOn()).isEqualTo(Instant.EPOCH);
assertThat(change.getSubject()).isNull();
assertThat(change.currentPatchSetId()).isNull();
// Default values for unset protobuf fields which can't be unset in the entity object.
@@ -268,7 +268,7 @@
.build();
Change change = changeProtoConverter.fromProto(proto);
- assertThat(change.getLastUpdatedOn()).isEqualTo(new Timestamp(987654L));
+ assertThat(change.getLastUpdatedOn()).isEqualTo(Instant.ofEpochMilli(987654L));
}
/** See {@link SerializedClassSubject} for background and what to do if this test fails. */
@@ -279,8 +279,8 @@
ImmutableMap.<String, Type>builder()
.put("changeId", Change.Id.class)
.put("changeKey", Change.Key.class)
- .put("createdOn", Timestamp.class)
- .put("lastUpdatedOn", Timestamp.class)
+ .put("createdOn", Instant.class)
+ .put("lastUpdatedOn", Instant.class)
.put("owner", Account.Id.class)
.put("dest", BranchNameKey.class)
.put("status", char.class)
diff --git a/javatests/com/google/gerrit/entities/converter/PatchSetApprovalProtoConverterTest.java b/javatests/com/google/gerrit/entities/converter/PatchSetApprovalProtoConverterTest.java
index 0338959..28f9cdb 100644
--- a/javatests/com/google/gerrit/entities/converter/PatchSetApprovalProtoConverterTest.java
+++ b/javatests/com/google/gerrit/entities/converter/PatchSetApprovalProtoConverterTest.java
@@ -28,8 +28,7 @@
import com.google.gerrit.proto.testing.SerializedClassSubject;
import com.google.inject.TypeLiteral;
import java.lang.reflect.Type;
-import java.sql.Timestamp;
-import java.util.Date;
+import java.time.Instant;
import java.util.Optional;
import org.junit.Test;
@@ -46,7 +45,7 @@
PatchSet.id(Change.id(42), 14), Account.id(100013), LabelId.create("label-8")))
.uuid(Optional.of(PatchSetApproval.uuid("577fb248e474018276351785930358ec0450e9f7")))
.value(456)
- .granted(new Date(987654L))
+ .granted(Instant.ofEpochMilli(987654L))
.tag("tag-21")
.realAccountId(Account.id(612))
.postSubmit(true)
@@ -84,7 +83,7 @@
PatchSetApproval.key(
PatchSet.id(Change.id(42), 14), Account.id(100013), LabelId.create("label-8")))
.value(456)
- .granted(new Date(987654L))
+ .granted(Instant.ofEpochMilli(987654L))
.build();
Entities.PatchSetApproval proto = protoConverter.toProto(patchSetApproval);
@@ -117,7 +116,7 @@
PatchSet.id(Change.id(42), 14), Account.id(100013), LabelId.create("label-8")))
.uuid(Optional.of(PatchSetApproval.uuid("577fb248e474018276351785930358ec0450e9f7")))
.value(456)
- .granted(new Date(987654L))
+ .granted(Instant.ofEpochMilli(987654L))
.tag("tag-21")
.realAccountId(Account.id(612))
.postSubmit(true)
@@ -137,7 +136,7 @@
PatchSetApproval.key(
PatchSet.id(Change.id(42), 14), Account.id(100013), LabelId.create("label-8")))
.value(456)
- .granted(new Date(987654L))
+ .granted(Instant.ofEpochMilli(987654L))
.build();
PatchSetApproval convertedPatchSetApproval =
@@ -167,7 +166,7 @@
assertThat(patchSetApproval.labelId()).isEqualTo(LabelId.create("label-8"));
// Default values for unset protobuf fields which can't be unset in the entity object.
assertThat(patchSetApproval.value()).isEqualTo(0);
- assertThat(patchSetApproval.granted()).isEqualTo(new Timestamp(0));
+ assertThat(patchSetApproval.granted()).isEqualTo(Instant.EPOCH);
assertThat(patchSetApproval.postSubmit()).isEqualTo(false);
assertThat(patchSetApproval.copied()).isEqualTo(false);
}
@@ -181,7 +180,7 @@
.put("key", PatchSetApproval.Key.class)
.put("uuid", new TypeLiteral<Optional<PatchSetApproval.UUID>>() {}.getType())
.put("value", short.class)
- .put("granted", Timestamp.class)
+ .put("granted", Instant.class)
.put("tag", new TypeLiteral<Optional<String>>() {}.getType())
.put("realAccountId", Account.Id.class)
.put("postSubmit", boolean.class)
diff --git a/javatests/com/google/gerrit/entities/converter/PatchSetProtoConverterTest.java b/javatests/com/google/gerrit/entities/converter/PatchSetProtoConverterTest.java
index efeb24f..3a534e9 100644
--- a/javatests/com/google/gerrit/entities/converter/PatchSetProtoConverterTest.java
+++ b/javatests/com/google/gerrit/entities/converter/PatchSetProtoConverterTest.java
@@ -27,7 +27,7 @@
import com.google.gerrit.proto.testing.SerializedClassSubject;
import com.google.inject.TypeLiteral;
import java.lang.reflect.Type;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Optional;
import org.eclipse.jgit.lib.ObjectId;
import org.junit.Test;
@@ -42,7 +42,7 @@
.id(PatchSet.id(Change.id(103), 73))
.commitId(ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"))
.uploader(Account.id(452))
- .createdOn(new Timestamp(930349320L))
+ .createdOn(Instant.ofEpochMilli(930349320L))
.groups(ImmutableList.of("group1", " group2"))
.pushCertificate("my push certificate")
.description("This is a patch set description.")
@@ -74,7 +74,7 @@
.id(PatchSet.id(Change.id(103), 73))
.commitId(ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"))
.uploader(Account.id(452))
- .createdOn(new Timestamp(930349320L))
+ .createdOn(Instant.ofEpochMilli(930349320L))
.build();
Entities.PatchSet proto = patchSetProtoConverter.toProto(patchSet);
@@ -100,7 +100,7 @@
.id(PatchSet.id(Change.id(103), 73))
.commitId(ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"))
.uploader(Account.id(452))
- .createdOn(new Timestamp(930349320L))
+ .createdOn(Instant.ofEpochMilli(930349320L))
.groups(ImmutableList.of("group1", " group2"))
.pushCertificate("my push certificate")
.description("This is a patch set description.")
@@ -118,7 +118,7 @@
.id(PatchSet.id(Change.id(103), 73))
.commitId(ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"))
.uploader(Account.id(452))
- .createdOn(new Timestamp(930349320L))
+ .createdOn(Instant.ofEpochMilli(930349320L))
.build();
PatchSet convertedPatchSet =
@@ -143,7 +143,7 @@
.id(PatchSet.id(Change.id(103), 73))
.commitId(ObjectId.fromString("0000000000000000000000000000000000000000"))
.uploader(Account.id(0))
- .createdOn(new Timestamp(0))
+ .createdOn(Instant.EPOCH)
.build());
}
@@ -156,7 +156,7 @@
.put("id", PatchSet.Id.class)
.put("commitId", ObjectId.class)
.put("uploader", Account.Id.class)
- .put("createdOn", Timestamp.class)
+ .put("createdOn", Instant.class)
.put("groups", new TypeLiteral<ImmutableList<String>>() {}.getType())
.put("pushCertificate", new TypeLiteral<Optional<String>>() {}.getType())
.put("description", new TypeLiteral<Optional<String>>() {}.getType())
diff --git a/javatests/com/google/gerrit/git/BUILD b/javatests/com/google/gerrit/git/BUILD
index c2c9cce..b12924a 100644
--- a/javatests/com/google/gerrit/git/BUILD
+++ b/javatests/com/google/gerrit/git/BUILD
@@ -7,7 +7,10 @@
size = "medium",
timeout = "short",
srcs = MEDIUM_TESTS,
- tags = ["no_windows"],
+ tags = [
+ "no_rbe",
+ "no_windows",
+ ],
deps = [
"//java/com/google/gerrit/git",
"//lib:guava",
diff --git a/javatests/com/google/gerrit/integration/git/BUILD b/javatests/com/google/gerrit/integration/git/BUILD
index 28755af..bcb16f4 100644
--- a/javatests/com/google/gerrit/integration/git/BUILD
+++ b/javatests/com/google/gerrit/integration/git/BUILD
@@ -3,7 +3,10 @@
acceptance_tests(
srcs = ["GitProtocolV2IT.java"],
group = "protocol-v2",
- labels = ["git-protocol-v2"],
+ labels = [
+ "git-protocol-v2",
+ "no_rbe",
+ ],
)
acceptance_tests(
diff --git a/javatests/com/google/gerrit/json/SqlTimestampDeserializerTest.java b/javatests/com/google/gerrit/json/SqlTimestampDeserializerTest.java
index 2699c3b..44ef822 100644
--- a/javatests/com/google/gerrit/json/SqlTimestampDeserializerTest.java
+++ b/javatests/com/google/gerrit/json/SqlTimestampDeserializerTest.java
@@ -16,9 +16,9 @@
import static com.google.common.truth.Truth.assertThat;
-import com.google.gerrit.server.util.time.TimeUtil;
import com.google.gson.JsonPrimitive;
import java.sql.Timestamp;
+import java.time.Instant;
import org.junit.Test;
public class SqlTimestampDeserializerTest {
@@ -28,6 +28,6 @@
@Test
public void emptyStringIsDeserializedToMagicTimestamp() {
Timestamp timestamp = deserializer.deserialize(new JsonPrimitive(""), Timestamp.class, null);
- assertThat(timestamp).isEqualTo(TimeUtil.never());
+ assertThat(timestamp).isEqualTo(Timestamp.from(Instant.EPOCH));
}
}
diff --git a/javatests/com/google/gerrit/mail/AbstractParserTest.java b/javatests/com/google/gerrit/mail/AbstractParserTest.java
index a2432a2..f99a2af 100644
--- a/javatests/com/google/gerrit/mail/AbstractParserTest.java
+++ b/javatests/com/google/gerrit/mail/AbstractParserTest.java
@@ -20,7 +20,6 @@
import com.google.gerrit.entities.Address;
import com.google.gerrit.entities.Comment;
import com.google.gerrit.entities.HumanComment;
-import java.sql.Timestamp;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
@@ -58,7 +57,7 @@
new HumanComment(
new Comment.Key(uuid, file, 1),
Account.id(0),
- new Timestamp(0L),
+ Instant.EPOCH,
(short) 0,
message,
"",
@@ -73,7 +72,7 @@
new HumanComment(
new Comment.Key(uuid, file, 1),
Account.id(0),
- new Timestamp(0L),
+ Instant.EPOCH,
(short) 0,
message,
"",
diff --git a/javatests/com/google/gerrit/pgm/BUILD b/javatests/com/google/gerrit/pgm/BUILD
index 0fe4fad..0655bb2 100644
--- a/javatests/com/google/gerrit/pgm/BUILD
+++ b/javatests/com/google/gerrit/pgm/BUILD
@@ -4,6 +4,7 @@
junit_tests(
name = "pgm_tests",
srcs = glob(["**/*.java"]),
+ tags = ["no_rbe"],
deps = [
"//java/com/google/gerrit/pgm/http/jetty",
"//java/com/google/gerrit/pgm/init/api",
diff --git a/javatests/com/google/gerrit/server/BUILD b/javatests/com/google/gerrit/server/BUILD
index c694a87..87d1729 100644
--- a/javatests/com/google/gerrit/server/BUILD
+++ b/javatests/com/google/gerrit/server/BUILD
@@ -27,7 +27,10 @@
),
resource_strip_prefix = "resources",
resources = ["//resources/com/google/gerrit/server"],
- tags = ["no_windows"],
+ tags = [
+ "no_rbe",
+ "no_windows",
+ ],
visibility = ["//visibility:public"],
runtime_deps = [
"//java/com/google/gerrit/lucene",
diff --git a/javatests/com/google/gerrit/server/IdentifiedUserTest.java b/javatests/com/google/gerrit/server/IdentifiedUserTest.java
index 463af35..855a0bc 100644
--- a/javatests/com/google/gerrit/server/IdentifiedUserTest.java
+++ b/javatests/com/google/gerrit/server/IdentifiedUserTest.java
@@ -99,7 +99,7 @@
injector.injectMembers(this);
Account account =
- Account.builder(Account.id(1), TimeUtil.nowTs())
+ Account.builder(Account.id(1), TimeUtil.now())
.setMetaId("1234567812345678123456781234567812345678")
.build();
Account.Id ownerId = account.id();
diff --git a/javatests/com/google/gerrit/server/account/AccountCacheTest.java b/javatests/com/google/gerrit/server/account/AccountCacheTest.java
index a2aa40b..c1eff15 100644
--- a/javatests/com/google/gerrit/server/account/AccountCacheTest.java
+++ b/javatests/com/google/gerrit/server/account/AccountCacheTest.java
@@ -23,7 +23,6 @@
import com.google.gerrit.entities.Project;
import com.google.gerrit.server.cache.proto.Cache;
import com.google.gerrit.server.config.CachedPreferences;
-import java.sql.Timestamp;
import java.time.Instant;
import org.junit.Test;
@@ -32,8 +31,7 @@
* of the {@code AccountCache}.
*/
public class AccountCacheTest {
- private static final Account ACCOUNT =
- Account.builder(Account.id(1), Timestamp.from(Instant.EPOCH)).build();
+ private static final Account ACCOUNT = Account.builder(Account.id(1), Instant.EPOCH).build();
private static final Cache.AccountProto ACCOUNT_PROTO =
Cache.AccountProto.newBuilder().setId(1).setRegisteredOn(0).build();
private static final CachedAccountDetails.Serializer SERIALIZER =
@@ -42,7 +40,7 @@
@Test
public void account_roundTrip() throws Exception {
Account account =
- Account.builder(Account.id(1), Timestamp.from(Instant.EPOCH))
+ Account.builder(Account.id(1), Instant.EPOCH)
.setFullName("foo bar")
.setDisplayName("foo")
.setActive(false)
diff --git a/javatests/com/google/gerrit/server/account/AccountResolverTest.java b/javatests/com/google/gerrit/server/account/AccountResolverTest.java
index 146090c..3658834 100644
--- a/javatests/com/google/gerrit/server/account/AccountResolverTest.java
+++ b/javatests/com/google/gerrit/server/account/AccountResolverTest.java
@@ -361,13 +361,13 @@
private AccountState newAccount(int id) {
return AccountState.forAccount(
- Account.builder(Account.id(id), TimeUtil.nowTs())
+ Account.builder(Account.id(id), TimeUtil.now())
.setMetaId("1234567812345678123456781234567812345678")
.build());
}
private AccountState newInactiveAccount(int id) {
- Account.Builder a = Account.builder(Account.id(id), TimeUtil.nowTs());
+ Account.Builder a = Account.builder(Account.id(id), TimeUtil.now());
a.setActive(false);
return AccountState.forAccount(a.build());
}
diff --git a/javatests/com/google/gerrit/server/cache/h2/H2CacheTest.java b/javatests/com/google/gerrit/server/cache/h2/H2CacheTest.java
index 14af43b..16fd4ca 100644
--- a/javatests/com/google/gerrit/server/cache/h2/H2CacheTest.java
+++ b/javatests/com/google/gerrit/server/cache/h2/H2CacheTest.java
@@ -45,7 +45,7 @@
import org.junit.Test;
public class H2CacheTest {
- private static final TypeLiteral<String> KEY_TYPE = new TypeLiteral<String>() {};
+ private static final TypeLiteral<String> KEY_TYPE = new TypeLiteral<>() {};
private static final int DEFAULT_VERSION = 1234;
private static int dbCnt;
diff --git a/javatests/com/google/gerrit/server/cache/serialize/entities/InternalGroupSerializerTest.java b/javatests/com/google/gerrit/server/cache/serialize/entities/InternalGroupSerializerTest.java
index 8d301e4..78947a2 100644
--- a/javatests/com/google/gerrit/server/cache/serialize/entities/InternalGroupSerializerTest.java
+++ b/javatests/com/google/gerrit/server/cache/serialize/entities/InternalGroupSerializerTest.java
@@ -34,7 +34,7 @@
.setOwnerGroupUUID(AccountGroup.uuid("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"))
.setVisibleToAll(false)
.setGroupUUID(AccountGroup.uuid("deadbeefdeadbeefdeadbeefdeadbeef12345678"))
- .setCreatedOn(TimeUtil.nowTs())
+ .setCreatedOn(TimeUtil.now())
.setMembers(ImmutableSet.of(Account.id(123), Account.id(321)))
.setSubgroups(
ImmutableSet.of(
diff --git a/javatests/com/google/gerrit/server/change/CommentThreadTest.java b/javatests/com/google/gerrit/server/change/CommentThreadTest.java
index 08485a4..d0b6c14 100644
--- a/javatests/com/google/gerrit/server/change/CommentThreadTest.java
+++ b/javatests/com/google/gerrit/server/change/CommentThreadTest.java
@@ -20,7 +20,7 @@
import com.google.gerrit.entities.Account;
import com.google.gerrit.entities.Comment;
import com.google.gerrit.entities.HumanComment;
-import java.sql.Timestamp;
+import java.time.Instant;
import org.junit.Test;
public class CommentThreadTest {
@@ -60,7 +60,7 @@
return new HumanComment(
new Comment.Key(commentUuid, "myFile", 1),
Account.id(100),
- new Timestamp(1234),
+ Instant.ofEpochMilli(1234),
(short) 1,
"Comment text",
"serverId",
diff --git a/javatests/com/google/gerrit/server/change/CommentThreadsTest.java b/javatests/com/google/gerrit/server/change/CommentThreadsTest.java
index 0c61906..83e8370 100644
--- a/javatests/com/google/gerrit/server/change/CommentThreadsTest.java
+++ b/javatests/com/google/gerrit/server/change/CommentThreadsTest.java
@@ -21,7 +21,7 @@
import com.google.gerrit.entities.Account;
import com.google.gerrit.entities.Comment;
import com.google.gerrit.entities.HumanComment;
-import java.sql.Timestamp;
+import java.time.Instant;
import org.junit.Test;
public class CommentThreadsTest {
@@ -126,13 +126,15 @@
@Test
public void branchedThreadsAreFlattenedAccordingToDate() {
- HumanComment root = writtenOn(createComment("root"), new Timestamp(1));
- HumanComment sibling1 = writtenOn(asReply(createComment("sibling1"), "root"), new Timestamp(2));
- HumanComment sibling2 = writtenOn(asReply(createComment("sibling2"), "root"), new Timestamp(3));
+ HumanComment root = writtenOn(createComment("root"), Instant.ofEpochMilli(1));
+ HumanComment sibling1 =
+ writtenOn(asReply(createComment("sibling1"), "root"), Instant.ofEpochMilli(2));
+ HumanComment sibling2 =
+ writtenOn(asReply(createComment("sibling2"), "root"), Instant.ofEpochMilli(3));
HumanComment sibling1Child =
- writtenOn(asReply(createComment("sibling1Child"), "sibling1"), new Timestamp(4));
+ writtenOn(asReply(createComment("sibling1Child"), "sibling1"), Instant.ofEpochMilli(4));
HumanComment sibling2Child =
- writtenOn(asReply(createComment("sibling2Child"), "sibling2"), new Timestamp(5));
+ writtenOn(asReply(createComment("sibling2Child"), "sibling2"), Instant.ofEpochMilli(5));
ImmutableList<HumanComment> comments =
ImmutableList.of(sibling2, sibling2Child, sibling1, sibling1Child, root);
@@ -146,9 +148,11 @@
@Test
public void threadsConsiderParentRelationshipStrongerThanDate() {
- HumanComment root = writtenOn(createComment("root"), new Timestamp(3));
- HumanComment child1 = writtenOn(asReply(createComment("child1"), "root"), new Timestamp(2));
- HumanComment child2 = writtenOn(asReply(createComment("child2"), "child1"), new Timestamp(1));
+ HumanComment root = writtenOn(createComment("root"), Instant.ofEpochMilli(3));
+ HumanComment child1 =
+ writtenOn(asReply(createComment("child1"), "root"), Instant.ofEpochMilli(2));
+ HumanComment child2 =
+ writtenOn(asReply(createComment("child2"), "child1"), Instant.ofEpochMilli(1));
ImmutableList<HumanComment> comments = ImmutableList.of(child2, child1, root);
ImmutableSet<CommentThread<HumanComment>> commentThreads =
@@ -161,9 +165,11 @@
@Test
public void threadsFallBackToUuidOrderIfParentAndDateAreTheSame() {
- HumanComment root = writtenOn(createComment("root"), new Timestamp(1));
- HumanComment sibling1 = writtenOn(asReply(createComment("sibling1"), "root"), new Timestamp(2));
- HumanComment sibling2 = writtenOn(asReply(createComment("sibling2"), "root"), new Timestamp(2));
+ HumanComment root = writtenOn(createComment("root"), Instant.ofEpochMilli(1));
+ HumanComment sibling1 =
+ writtenOn(asReply(createComment("sibling1"), "root"), Instant.ofEpochMilli(2));
+ HumanComment sibling2 =
+ writtenOn(asReply(createComment("sibling2"), "root"), Instant.ofEpochMilli(2));
ImmutableList<HumanComment> comments = ImmutableList.of(sibling2, sibling1, root);
ImmutableSet<CommentThread<HumanComment>> commentThreads =
@@ -224,13 +230,15 @@
@Test
public void completeThreadWithBranchesCanBeRequestedByReplyToIntermediateComment() {
- HumanComment root = writtenOn(createComment("root"), new Timestamp(1));
- HumanComment sibling1 = writtenOn(asReply(createComment("sibling1"), "root"), new Timestamp(2));
- HumanComment sibling2 = writtenOn(asReply(createComment("sibling2"), "root"), new Timestamp(3));
+ HumanComment root = writtenOn(createComment("root"), Instant.ofEpochMilli(1));
+ HumanComment sibling1 =
+ writtenOn(asReply(createComment("sibling1"), "root"), Instant.ofEpochMilli(2));
+ HumanComment sibling2 =
+ writtenOn(asReply(createComment("sibling2"), "root"), Instant.ofEpochMilli(3));
HumanComment sibling1Child =
- writtenOn(asReply(createComment("sibling1Child"), "sibling1"), new Timestamp(4));
+ writtenOn(asReply(createComment("sibling1Child"), "sibling1"), Instant.ofEpochMilli(4));
HumanComment sibling2Child =
- writtenOn(asReply(createComment("sibling2Child"), "sibling2"), new Timestamp(5));
+ writtenOn(asReply(createComment("sibling2Child"), "sibling2"), Instant.ofEpochMilli(5));
HumanComment reply = asReply(createComment("sibling1"), "root");
@@ -262,7 +270,7 @@
return new HumanComment(
new Comment.Key(commentUuid, "myFile", 1),
Account.id(100),
- new Timestamp(1234),
+ Instant.ofEpochMilli(1234),
(short) 1,
"Comment text",
"serverId",
@@ -274,8 +282,8 @@
return comment;
}
- private static HumanComment writtenOn(HumanComment comment, Timestamp writtenOn) {
- comment.writtenOn = writtenOn;
+ private static HumanComment writtenOn(HumanComment comment, Instant writtenOn) {
+ comment.setWrittenOn(writtenOn);
return comment;
}
diff --git a/javatests/com/google/gerrit/server/change/LabelNormalizerTest.java b/javatests/com/google/gerrit/server/change/LabelNormalizerTest.java
index 8f341aa..38e50b5 100644
--- a/javatests/com/google/gerrit/server/change/LabelNormalizerTest.java
+++ b/javatests/com/google/gerrit/server/change/LabelNormalizerTest.java
@@ -213,7 +213,7 @@
return PatchSetApproval.builder()
.key(PatchSetApproval.key(change.currentPatchSetId(), accountId, LabelId.create(label)))
.value(value)
- .granted(TimeUtil.nowTs())
+ .granted(TimeUtil.now())
.build();
}
diff --git a/javatests/com/google/gerrit/server/events/EventDeserializerTest.java b/javatests/com/google/gerrit/server/events/EventDeserializerTest.java
index 97f6e4e..00b92b4 100644
--- a/javatests/com/google/gerrit/server/events/EventDeserializerTest.java
+++ b/javatests/com/google/gerrit/server/events/EventDeserializerTest.java
@@ -27,8 +27,8 @@
import com.google.gerrit.server.data.AccountAttribute;
import com.google.gerrit.server.data.ChangeAttribute;
import com.google.gerrit.server.data.RefUpdateAttribute;
+import com.google.gerrit.server.util.time.TimeUtil;
import com.google.gson.Gson;
-import java.sql.Timestamp;
import org.junit.Test;
public class EventDeserializerTest {
@@ -278,7 +278,7 @@
Change.id(1000),
Account.id(1000),
BranchNameKey.create(Project.nameKey("myproject"), "mybranch"),
- new Timestamp(System.currentTimeMillis()));
+ TimeUtil.now());
return change;
}
@@ -335,7 +335,7 @@
a.commitMessage = "This is a test commit message";
a.url = "http://somewhere.com";
a.status = change.getStatus();
- a.createdOn = change.getCreatedOn().getTime() / 1000L;
+ a.createdOn = change.getCreatedOn().getEpochSecond();
a.wip = change.isWorkInProgress() ? true : null;
a.isPrivate = change.isPrivate() ? true : null;
return Suppliers.ofInstance(a);
diff --git a/javatests/com/google/gerrit/server/events/EventJsonTest.java b/javatests/com/google/gerrit/server/events/EventJsonTest.java
index 8e4f436..3c9a355 100644
--- a/javatests/com/google/gerrit/server/events/EventJsonTest.java
+++ b/javatests/com/google/gerrit/server/events/EventJsonTest.java
@@ -607,7 +607,7 @@
Change.id(CHANGE_NUM),
Account.id(9999),
BranchNameKey.create(Project.nameKey(PROJECT), BRANCH),
- TimeUtil.nowTs());
+ TimeUtil.now());
}
private <T> Supplier<T> createSupplier(T value) {
@@ -625,7 +625,7 @@
a.commitMessage = COMMIT_MESSAGE;
a.url = URL;
a.status = change.getStatus();
- a.createdOn = change.getCreatedOn().getTime() / 1000L;
+ a.createdOn = change.getCreatedOn().getEpochSecond();
a.wip = change.isWorkInProgress() ? true : null;
a.isPrivate = change.isPrivate() ? true : null;
return Suppliers.ofInstance(a);
diff --git a/javatests/com/google/gerrit/server/git/DeleteZombieCommentsRefsTest.java b/javatests/com/google/gerrit/server/git/DeleteZombieCommentsRefsTest.java
index 3a8d7e4..29dbe58 100644
--- a/javatests/com/google/gerrit/server/git/DeleteZombieCommentsRefsTest.java
+++ b/javatests/com/google/gerrit/server/git/DeleteZombieCommentsRefsTest.java
@@ -29,6 +29,7 @@
import com.google.gerrit.testing.InMemoryRepositoryManager;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Date;
import java.util.List;
import org.eclipse.jgit.lib.BatchRefUpdate;
import org.eclipse.jgit.lib.CommitBuilder;
@@ -203,11 +204,14 @@
return repo.exactRef(refName);
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
private static ObjectId createCommit(Repository repo, ObjectId treeId, ObjectId parentCommit)
throws IOException {
try (ObjectInserter oi = repo.newObjectInserter()) {
PersonIdent committer =
- new PersonIdent(new PersonIdent("Foo Bar", "foo.bar@baz.com"), TimeUtil.nowTs());
+ new PersonIdent(new PersonIdent("Foo Bar", "foo.bar@baz.com"), Date.from(TimeUtil.now()));
CommitBuilder cb = new CommitBuilder();
cb.setTreeId(treeId);
cb.setCommitter(committer);
diff --git a/javatests/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManagerTest.java b/javatests/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManagerTest.java
index 4902830..6c771d7 100644
--- a/javatests/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManagerTest.java
+++ b/javatests/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManagerTest.java
@@ -26,7 +26,7 @@
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
-import java.util.SortedSet;
+import java.util.NavigableSet;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.Constants;
@@ -77,7 +77,7 @@
assertThat(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString())
.isEqualTo(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString());
- SortedSet<Project.NameKey> repoList = repoManager.list();
+ NavigableSet<Project.NameKey> repoList = repoManager.list();
assertThat(repoList).hasSize(1);
assertThat(repoList.toArray(new Project.NameKey[repoList.size()]))
.isEqualTo(new Project.NameKey[] {someProjectKey});
@@ -105,7 +105,7 @@
assertThat(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString())
.isEqualTo(alternateBasePath.toString());
- SortedSet<Project.NameKey> repoList = repoManager.list();
+ NavigableSet<Project.NameKey> repoList = repoManager.list();
assertThat(repoList).hasSize(1);
assertThat(repoList.toArray(new Project.NameKey[repoList.size()]))
.isEqualTo(new Project.NameKey[] {someProjectKey});
@@ -131,7 +131,7 @@
createRepository(repoManager.getBasePath(basePathProject), misplacedProject2);
createRepository(alternateBasePath, misplacedProject1);
- SortedSet<Project.NameKey> repoList = repoManager.list();
+ NavigableSet<Project.NameKey> repoList = repoManager.list();
assertThat(repoList).hasSize(2);
assertThat(repoList.toArray(new Project.NameKey[repoList.size()]))
.isEqualTo(new Project.NameKey[] {altPathProject, basePathProject});
diff --git a/javatests/com/google/gerrit/server/git/meta/VersionedMetaDataTest.java b/javatests/com/google/gerrit/server/git/meta/VersionedMetaDataTest.java
index 690a5cc..6792703 100644
--- a/javatests/com/google/gerrit/server/git/meta/VersionedMetaDataTest.java
+++ b/javatests/com/google/gerrit/server/git/meta/VersionedMetaDataTest.java
@@ -30,6 +30,7 @@
import com.google.gerrit.testing.TestTimeUtil;
import java.io.IOException;
import java.util.Arrays;
+import java.util.Date;
import java.util.Optional;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
@@ -220,9 +221,13 @@
return u;
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
private CommitBuilder newCommitBuilder() {
CommitBuilder cb = new CommitBuilder();
- PersonIdent author = new PersonIdent("J. Author", "author@example.com", TimeUtil.nowTs(), TZ);
+ PersonIdent author =
+ new PersonIdent("J. Author", "author@example.com", Date.from(TimeUtil.now()), TZ);
cb.setAuthor(author);
cb.setCommitter(
new PersonIdent(
diff --git a/javatests/com/google/gerrit/server/group/db/AbstractGroupTest.java b/javatests/com/google/gerrit/server/group/db/AbstractGroupTest.java
index e24d481..54407ca 100644
--- a/javatests/com/google/gerrit/server/group/db/AbstractGroupTest.java
+++ b/javatests/com/google/gerrit/server/group/db/AbstractGroupTest.java
@@ -30,7 +30,8 @@
import com.google.gerrit.server.util.time.TimeUtil;
import com.google.gerrit.testing.InMemoryRepositoryManager;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
+import java.util.Date;
import java.util.Optional;
import java.util.TimeZone;
import org.eclipse.jgit.errors.ConfigInvalidException;
@@ -59,13 +60,16 @@
protected Account.Id userId;
protected PersonIdent userIdent;
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
@Before
public void abstractGroupTestSetUp() throws Exception {
allUsersName = new AllUsersName(AllUsersNameProvider.DEFAULT);
repoManager = new InMemoryRepositoryManager();
allUsersRepo = repoManager.createRepository(allUsersName);
serverAccountId = Account.id(SERVER_ACCOUNT_NUMBER);
- serverIdent = new PersonIdent(SERVER_NAME, SERVER_EMAIL, TimeUtil.nowTs(), TZ);
+ serverIdent = new PersonIdent(SERVER_NAME, SERVER_EMAIL, Date.from(TimeUtil.now()), TZ);
userId = Account.id(USER_ACCOUNT_NUMBER);
userIdent = newPersonIdent(userId, serverIdent);
}
@@ -75,12 +79,15 @@
allUsersRepo.close();
}
- protected Timestamp getTipTimestamp(AccountGroup.UUID uuid) throws Exception {
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
+ protected Instant getTipTimestamp(AccountGroup.UUID uuid) throws Exception {
try (RevWalk rw = new RevWalk(allUsersRepo)) {
Ref ref = allUsersRepo.exactRef(RefNames.refsGroups(uuid));
return ref == null
? null
- : new Timestamp(rw.parseCommit(ref.getObjectId()).getAuthorIdent().getWhen().getTime());
+ : rw.parseCommit(ref.getObjectId()).getAuthorIdent().getWhen().toInstant();
}
}
@@ -109,8 +116,11 @@
return md;
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
protected static PersonIdent newPersonIdent() {
- return new PersonIdent(SERVER_NAME, SERVER_EMAIL, TimeUtil.nowTs(), TZ);
+ return new PersonIdent(SERVER_NAME, SERVER_EMAIL, Date.from(TimeUtil.now()), TZ);
}
protected static PersonIdent newPersonIdent(Account.Id id, PersonIdent ident) {
@@ -123,7 +133,7 @@
}
private static Optional<Account> getAccount(Account.Id id) {
- Account.Builder account = Account.builder(id, TimeUtil.nowTs());
+ Account.Builder account = Account.builder(id, TimeUtil.now());
account.setFullName("Account " + id);
return Optional.of(account.build());
}
diff --git a/javatests/com/google/gerrit/server/group/db/AuditLogReaderTest.java b/javatests/com/google/gerrit/server/group/db/AuditLogReaderTest.java
index 6ad899e..a764654 100644
--- a/javatests/com/google/gerrit/server/group/db/AuditLogReaderTest.java
+++ b/javatests/com/google/gerrit/server/group/db/AuditLogReaderTest.java
@@ -24,7 +24,7 @@
import com.google.gerrit.entities.AccountGroupMemberAudit;
import com.google.gerrit.entities.InternalGroup;
import com.google.gerrit.server.account.GroupUuid;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Set;
import org.eclipse.jgit.lib.PersonIdent;
import org.junit.Before;
@@ -299,7 +299,7 @@
}
private static AccountGroupMemberAudit createExpMemberAudit(
- AccountGroup.Id groupId, Account.Id id, Account.Id addedBy, Timestamp addedOn) {
+ AccountGroup.Id groupId, Account.Id id, Account.Id addedBy, Instant addedOn) {
return AccountGroupMemberAudit.builder()
.groupId(groupId)
.memberId(id)
@@ -309,7 +309,7 @@
}
private static AccountGroupByIdAudit createExpGroupAudit(
- AccountGroup.Id groupId, AccountGroup.UUID uuid, Account.Id addedBy, Timestamp addedOn) {
+ AccountGroup.Id groupId, AccountGroup.UUID uuid, Account.Id addedBy, Instant addedOn) {
return AccountGroupByIdAudit.builder()
.groupId(groupId)
.includeUuid(uuid)
diff --git a/javatests/com/google/gerrit/server/group/db/GroupConfigTest.java b/javatests/com/google/gerrit/server/group/db/GroupConfigTest.java
index 31b2bc3..dbe255c 100644
--- a/javatests/com/google/gerrit/server/group/db/GroupConfigTest.java
+++ b/javatests/com/google/gerrit/server/group/db/GroupConfigTest.java
@@ -37,11 +37,12 @@
import com.google.gerrit.server.util.time.TimeUtil;
import com.google.gerrit.truth.OptionalSubject;
import java.io.IOException;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Month;
import java.time.ZoneId;
+import java.util.Date;
import java.util.Optional;
import java.util.TimeZone;
import org.eclipse.jgit.errors.ConfigInvalidException;
@@ -245,7 +246,7 @@
@Test
public void createdOnDefaultsToNow() throws Exception {
// Git timestamps are only precise to the second.
- Timestamp testStart = TimeUtil.truncateToSecond(TimeUtil.nowTs());
+ Instant testStart = TimeUtil.truncateToSecond(TimeUtil.now());
InternalGroupCreation groupCreation =
InternalGroupCreation.builder()
@@ -261,7 +262,7 @@
@Test
public void specifiedCreatedOnIsRespectedForNewGroup() throws Exception {
- Timestamp createdOn = toTimestamp(LocalDate.of(2017, Month.DECEMBER, 11).atTime(13, 44, 10));
+ Instant createdOn = toInstant(LocalDate.of(2017, Month.DECEMBER, 11).atTime(13, 44, 10));
InternalGroupCreation groupCreation = getPrefilledGroupCreationBuilder().build();
GroupDelta groupDelta = GroupDelta.builder().setUpdatedOn(createdOn).build();
@@ -604,8 +605,8 @@
@Test
public void createdOnIsNotAffectedByFurtherUpdates() throws Exception {
- Timestamp createdOn = toTimestamp(LocalDate.of(2017, Month.MAY, 11).atTime(13, 44, 10));
- Timestamp updatedOn = toTimestamp(LocalDate.of(2017, Month.DECEMBER, 12).atTime(10, 21, 49));
+ Instant createdOn = toInstant(LocalDate.of(2017, Month.MAY, 11).atTime(13, 44, 10));
+ Instant updatedOn = toInstant(LocalDate.of(2017, Month.DECEMBER, 12).atTime(10, 21, 49));
InternalGroupCreation groupCreation = getPrefilledGroupCreationBuilder().build();
GroupDelta initialGroupDelta = GroupDelta.builder().setUpdatedOn(createdOn).build();
@@ -737,7 +738,7 @@
.setOwnerGroupUUID(AccountGroup.uuid("another owner"))
.setVisibleToAll(true)
.setName(AccountGroup.nameKey("Another name"))
- .setUpdatedOn(new Timestamp(92900892))
+ .setUpdatedOn(Instant.ofEpochMilli(92900892))
.setMemberModification(members -> ImmutableSet.of(Account.id(1), Account.id(2)))
.setSubgroupModification(subgroups -> ImmutableSet.of(AccountGroup.uuid("subgroup")))
.build();
@@ -758,7 +759,7 @@
.setOwnerGroupUUID(AccountGroup.uuid("another owner"))
.setVisibleToAll(true)
.setName(AccountGroup.nameKey("Another name"))
- .setUpdatedOn(new Timestamp(92900892))
+ .setUpdatedOn(Instant.ofEpochMilli(92900892))
.setMemberModification(members -> ImmutableSet.of(Account.id(1), Account.id(2)))
.setSubgroupModification(subgroups -> ImmutableSet.of(AccountGroup.uuid("subgroup")))
.build();
@@ -780,7 +781,7 @@
.setOwnerGroupUUID(AccountGroup.uuid("another owner"))
.setVisibleToAll(true)
.setName(AccountGroup.nameKey("Another name"))
- .setUpdatedOn(new Timestamp(92900892))
+ .setUpdatedOn(Instant.ofEpochMilli(92900892))
.setMemberModification(members -> ImmutableSet.of(Account.id(1), Account.id(2)))
.setSubgroupModification(subgroups -> ImmutableSet.of(AccountGroup.uuid("subgroup")))
.build();
@@ -864,7 +865,7 @@
public void newCommitIsNotCreatedForPureUpdatedOnUpdate() throws Exception {
createArbitraryGroup(groupUuid);
- Timestamp updatedOn = toTimestamp(LocalDate.of(3017, Month.DECEMBER, 12).atTime(10, 21, 49));
+ Instant updatedOn = toInstant(LocalDate.of(3017, Month.DECEMBER, 12).atTime(10, 21, 49));
GroupDelta groupDelta = GroupDelta.builder().setUpdatedOn(updatedOn).build();
RevCommit commitBeforeUpdate = getLatestCommitForGroup(groupUuid);
@@ -1005,7 +1006,7 @@
@Test
public void commitTimeMatchesDefaultCreatedOnOfNewGroup() throws Exception {
// Git timestamps are only precise to the second.
- long testStartAsSecondsSinceEpoch = TimeUtil.nowTs().getTime() / 1000;
+ long testStartAsSecondsSinceEpoch = TimeUtil.now().getEpochSecond();
InternalGroupCreation groupCreation =
InternalGroupCreation.builder()
@@ -1032,7 +1033,7 @@
.build();
GroupDelta groupDelta =
GroupDelta.builder()
- .setUpdatedOn(new Timestamp(createdOnAsSecondsSinceEpoch * 1000))
+ .setUpdatedOn(Instant.ofEpochSecond(createdOnAsSecondsSinceEpoch))
.build();
createGroup(groupCreation, groupDelta);
@@ -1040,11 +1041,14 @@
assertThat(revCommit.getCommitTime()).isEqualTo(createdOnAsSecondsSinceEpoch);
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
@Test
public void timestampOfCommitterMatchesSpecifiedCreatedOnOfNewGroup() throws Exception {
- Timestamp committerTimestamp =
- toTimestamp(LocalDate.of(2017, Month.DECEMBER, 13).atTime(15, 5, 27));
- Timestamp createdOn = toTimestamp(LocalDate.of(2016, Month.MARCH, 11).atTime(23, 49, 11));
+ Instant committerTimestamp =
+ toInstant(LocalDate.of(2017, Month.DECEMBER, 13).atTime(15, 5, 27));
+ Instant createdOn = toInstant(LocalDate.of(2016, Month.MARCH, 11).atTime(23, 49, 11));
InternalGroupCreation groupCreation =
InternalGroupCreation.builder()
@@ -1061,23 +1065,27 @@
groupConfig.setGroupDelta(groupDelta, auditLogFormatter);
PersonIdent committerIdent =
- new PersonIdent("Jane", "Jane@gerritcodereview.com", committerTimestamp, timeZone);
+ new PersonIdent(
+ "Jane", "Jane@gerritcodereview.com", Date.from(committerTimestamp), timeZone);
try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate()) {
metaDataUpdate.getCommitBuilder().setCommitter(committerIdent);
groupConfig.commit(metaDataUpdate);
}
RevCommit revCommit = getLatestCommitForGroup(groupUuid);
- assertThat(revCommit.getCommitterIdent().getWhen().getTime()).isEqualTo(createdOn.getTime());
+ assertThat(revCommit.getCommitterIdent().getWhen().getTime())
+ .isEqualTo(createdOn.toEpochMilli());
assertThat(revCommit.getCommitterIdent().getTimeZone().getRawOffset())
.isEqualTo(timeZone.getRawOffset());
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
@Test
public void timestampOfAuthorMatchesSpecifiedCreatedOnOfNewGroup() throws Exception {
- Timestamp authorTimestamp =
- toTimestamp(LocalDate.of(2017, Month.DECEMBER, 13).atTime(15, 5, 27));
- Timestamp createdOn = toTimestamp(LocalDate.of(2016, Month.MARCH, 11).atTime(23, 49, 11));
+ Instant authorTimestamp = toInstant(LocalDate.of(2017, Month.DECEMBER, 13).atTime(15, 5, 27));
+ Instant createdOn = toInstant(LocalDate.of(2016, Month.MARCH, 11).atTime(23, 49, 11));
InternalGroupCreation groupCreation =
InternalGroupCreation.builder()
@@ -1094,14 +1102,14 @@
groupConfig.setGroupDelta(groupDelta, auditLogFormatter);
PersonIdent authorIdent =
- new PersonIdent("Jane", "Jane@gerritcodereview.com", authorTimestamp, timeZone);
+ new PersonIdent("Jane", "Jane@gerritcodereview.com", Date.from(authorTimestamp), timeZone);
try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate()) {
metaDataUpdate.getCommitBuilder().setAuthor(authorIdent);
groupConfig.commit(metaDataUpdate);
}
RevCommit revCommit = getLatestCommitForGroup(groupUuid);
- assertThat(revCommit.getAuthorIdent().getWhen().getTime()).isEqualTo(createdOn.getTime());
+ assertThat(revCommit.getAuthorIdent().getWhen().getTime()).isEqualTo(createdOn.toEpochMilli());
assertThat(revCommit.getAuthorIdent().getTimeZone().getRawOffset())
.isEqualTo(timeZone.getRawOffset());
}
@@ -1109,7 +1117,7 @@
@Test
public void commitTimeMatchesDefaultUpdatedOnOfUpdatedGroup() throws Exception {
// Git timestamps are only precise to the second.
- long testStartAsSecondsSinceEpoch = TimeUtil.nowTs().getTime() / 1000;
+ long testStartAsSecondsSinceEpoch = TimeUtil.now().getEpochSecond();
createArbitraryGroup(groupUuid);
GroupDelta groupDelta =
@@ -1129,7 +1137,7 @@
GroupDelta groupDelta =
GroupDelta.builder()
.setName(AccountGroup.nameKey("Another name"))
- .setUpdatedOn(new Timestamp(updatedOnAsSecondsSinceEpoch * 1000))
+ .setUpdatedOn(Instant.ofEpochSecond(updatedOnAsSecondsSinceEpoch))
.build();
updateGroup(groupUuid, groupDelta);
@@ -1138,10 +1146,13 @@
}
@Test
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
public void timestampOfCommitterMatchesSpecifiedUpdatedOnOfUpdatedGroup() throws Exception {
- Timestamp committerTimestamp =
- toTimestamp(LocalDate.of(2017, Month.DECEMBER, 13).atTime(15, 5, 27));
- Timestamp updatedOn = toTimestamp(LocalDate.of(2016, Month.MARCH, 11).atTime(23, 49, 11));
+ Instant committerTimestamp =
+ toInstant(LocalDate.of(2017, Month.DECEMBER, 13).atTime(15, 5, 27));
+ Instant updatedOn = toInstant(LocalDate.of(2016, Month.MARCH, 11).atTime(23, 49, 11));
createArbitraryGroup(groupUuid);
GroupDelta groupDelta =
@@ -1153,23 +1164,27 @@
groupConfig.setGroupDelta(groupDelta, auditLogFormatter);
PersonIdent committerIdent =
- new PersonIdent("Jane", "Jane@gerritcodereview.com", committerTimestamp, timeZone);
+ new PersonIdent(
+ "Jane", "Jane@gerritcodereview.com", Date.from(committerTimestamp), timeZone);
try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate()) {
metaDataUpdate.getCommitBuilder().setCommitter(committerIdent);
groupConfig.commit(metaDataUpdate);
}
RevCommit revCommit = getLatestCommitForGroup(groupUuid);
- assertThat(revCommit.getCommitterIdent().getWhen().getTime()).isEqualTo(updatedOn.getTime());
+ assertThat(revCommit.getCommitterIdent().getWhen().getTime())
+ .isEqualTo(updatedOn.toEpochMilli());
assertThat(revCommit.getCommitterIdent().getTimeZone().getRawOffset())
.isEqualTo(timeZone.getRawOffset());
}
@Test
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
public void timestampOfAuthorMatchesSpecifiedUpdatedOnOfUpdatedGroup() throws Exception {
- Timestamp authorTimestamp =
- toTimestamp(LocalDate.of(2017, Month.DECEMBER, 13).atTime(15, 5, 27));
- Timestamp updatedOn = toTimestamp(LocalDate.of(2016, Month.MARCH, 11).atTime(23, 49, 11));
+ Instant authorTimestamp = toInstant(LocalDate.of(2017, Month.DECEMBER, 13).atTime(15, 5, 27));
+ Instant updatedOn = toInstant(LocalDate.of(2016, Month.MARCH, 11).atTime(23, 49, 11));
createArbitraryGroup(groupUuid);
GroupDelta groupDelta =
@@ -1181,14 +1196,14 @@
groupConfig.setGroupDelta(groupDelta, auditLogFormatter);
PersonIdent authorIdent =
- new PersonIdent("Jane", "Jane@gerritcodereview.com", authorTimestamp, timeZone);
+ new PersonIdent("Jane", "Jane@gerritcodereview.com", Date.from(authorTimestamp), timeZone);
try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate()) {
metaDataUpdate.getCommitBuilder().setAuthor(authorIdent);
groupConfig.commit(metaDataUpdate);
}
RevCommit revCommit = getLatestCommitForGroup(groupUuid);
- assertThat(revCommit.getAuthorIdent().getWhen().getTime()).isEqualTo(updatedOn.getTime());
+ assertThat(revCommit.getAuthorIdent().getWhen().getTime()).isEqualTo(updatedOn.toEpochMilli());
assertThat(revCommit.getAuthorIdent().getTimeZone().getRawOffset())
.isEqualTo(timeZone.getRawOffset());
}
@@ -1455,8 +1470,8 @@
+ "Rename from Old name to New name");
}
- private static Timestamp toTimestamp(LocalDateTime localDateTime) {
- return Timestamp.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
+ private static Instant toInstant(LocalDateTime localDateTime) {
+ return localDateTime.atZone(ZoneId.systemDefault()).toInstant();
}
private void populateGroupConfig(AccountGroup.UUID uuid, String fileContent) throws Exception {
@@ -1539,10 +1554,13 @@
}
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
private MetaDataUpdate createMetaDataUpdate() {
PersonIdent serverIdent =
new PersonIdent(
- "Gerrit Server", "noreply@gerritcodereview.com", TimeUtil.nowTs(), timeZone);
+ "Gerrit Server", "noreply@gerritcodereview.com", Date.from(TimeUtil.now()), timeZone);
MetaDataUpdate metaDataUpdate =
new MetaDataUpdate(
@@ -1564,7 +1582,7 @@
}
private static Account createAccount(Account.Id id, String name) {
- Account.Builder account = Account.builder(id, TimeUtil.nowTs());
+ Account.Builder account = Account.builder(id, TimeUtil.now());
account.setFullName(name);
return account.build();
}
diff --git a/javatests/com/google/gerrit/server/group/db/GroupNameNotesTest.java b/javatests/com/google/gerrit/server/group/db/GroupNameNotesTest.java
index 3b7beb9..afc56ff 100644
--- a/javatests/com/google/gerrit/server/group/db/GroupNameNotesTest.java
+++ b/javatests/com/google/gerrit/server/group/db/GroupNameNotesTest.java
@@ -45,6 +45,7 @@
import com.google.gerrit.truth.OptionalSubject;
import java.io.IOException;
import java.util.Arrays;
+import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.TimeZone;
@@ -557,8 +558,11 @@
return GroupReference.create(AccountGroup.uuid(name + "-" + id), name);
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
private static PersonIdent newPersonIdent() {
- return new PersonIdent(SERVER_NAME, SERVER_EMAIL, TimeUtil.nowTs(), TZ);
+ return new PersonIdent(SERVER_NAME, SERVER_EMAIL, Date.from(TimeUtil.now()), TZ);
}
private static ObjectId getNoteKey(GroupReference g) {
diff --git a/javatests/com/google/gerrit/server/index/account/AccountFieldTest.java b/javatests/com/google/gerrit/server/index/account/AccountFieldTest.java
index d16efc3..4d9cb76 100644
--- a/javatests/com/google/gerrit/server/index/account/AccountFieldTest.java
+++ b/javatests/com/google/gerrit/server/index/account/AccountFieldTest.java
@@ -36,7 +36,7 @@
@Test
public void refStateFieldValues() throws Exception {
AllUsersName allUsersName = new AllUsersName(AllUsersNameProvider.DEFAULT);
- Account.Builder account = Account.builder(Account.id(1), TimeUtil.nowTs());
+ Account.Builder account = Account.builder(Account.id(1), TimeUtil.now());
String metaId = "0e39795bb25dc914118224995c53c5c36923a461";
account.setMetaId(metaId);
List<String> values =
@@ -51,7 +51,7 @@
public void externalIdStateFieldValues() throws Exception {
Account.Id id = Account.id(1);
Account account =
- Account.builder(id, TimeUtil.nowTs())
+ Account.builder(id, TimeUtil.now())
.setMetaId("1234567812345678123456781234567812345678")
.build();
ExternalId extId1 =
diff --git a/javatests/com/google/gerrit/server/index/change/ChangeFieldTest.java b/javatests/com/google/gerrit/server/index/change/ChangeFieldTest.java
index 6ad2060..dc1440b 100644
--- a/javatests/com/google/gerrit/server/index/change/ChangeFieldTest.java
+++ b/javatests/com/google/gerrit/server/index/change/ChangeFieldTest.java
@@ -33,7 +33,7 @@
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gerrit.server.util.time.TimeUtil;
import com.google.gerrit.testing.TestTimeUtil;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -55,17 +55,22 @@
@Test
public void reviewerFieldValues() {
- Table<ReviewerStateInternal, Account.Id, Timestamp> t = HashBasedTable.create();
- Timestamp t1 = TimeUtil.nowTs();
+ Table<ReviewerStateInternal, Account.Id, Instant> t = HashBasedTable.create();
+
+ // Timestamps are stored as epoch millis in the reviewer field. Epoch millis are less precise
+ // than Instants which have nanosecond precision. Create Instants with millisecond precision
+ // here so that the comparison for the assertions works.
+ Instant t1 = Instant.ofEpochMilli(TimeUtil.nowMs());
+ Instant t2 = Instant.ofEpochMilli(TimeUtil.nowMs());
+
t.put(ReviewerStateInternal.REVIEWER, Account.id(1), t1);
- Timestamp t2 = TimeUtil.nowTs();
t.put(ReviewerStateInternal.CC, Account.id(2), t2);
ReviewerSet reviewers = ReviewerSet.fromTable(t);
List<String> values = ChangeField.getReviewerFieldValues(reviewers);
assertThat(values)
.containsExactly(
- "REVIEWER,1", "REVIEWER,1," + t1.getTime(), "CC,2", "CC,2," + t2.getTime());
+ "REVIEWER,1", "REVIEWER,1," + t1.toEpochMilli(), "CC,2", "CC,2," + t2.toEpochMilli());
assertThat(ChangeField.parseReviewerFieldValues(Change.id(1), values)).isEqualTo(reviewers);
}
diff --git a/javatests/com/google/gerrit/server/index/change/FakeQueryBuilder.java b/javatests/com/google/gerrit/server/index/change/FakeQueryBuilder.java
index 3ec2044..e879170 100644
--- a/javatests/com/google/gerrit/server/index/change/FakeQueryBuilder.java
+++ b/javatests/com/google/gerrit/server/index/change/FakeQueryBuilder.java
@@ -72,6 +72,6 @@
}
private Predicate<ChangeData> predicate(String name, String value) {
- return new OperatorPredicate<ChangeData>(name, value) {};
+ return new OperatorPredicate<>(name, value) {};
}
}
diff --git a/javatests/com/google/gerrit/server/mail/SignedTokenTest.java b/javatests/com/google/gerrit/server/mail/SignedTokenTest.java
index 41d8d69..27c4f56 100644
--- a/javatests/com/google/gerrit/server/mail/SignedTokenTest.java
+++ b/javatests/com/google/gerrit/server/mail/SignedTokenTest.java
@@ -152,7 +152,7 @@
private static String randomString(int length) {
String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random random = new Random();
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++) {
int number = random.nextInt(62);
sb.append(str.charAt(number));
diff --git a/javatests/com/google/gerrit/server/mail/send/FromAddressGeneratorProviderTest.java b/javatests/com/google/gerrit/server/mail/send/FromAddressGeneratorProviderTest.java
index 5980071..629b0cc 100644
--- a/javatests/com/google/gerrit/server/mail/send/FromAddressGeneratorProviderTest.java
+++ b/javatests/com/google/gerrit/server/mail/send/FromAddressGeneratorProviderTest.java
@@ -362,7 +362,7 @@
private AccountState makeUser(String name, String email) {
final Account.Id userId = Account.id(42);
- final Account.Builder account = Account.builder(userId, TimeUtil.nowTs());
+ final Account.Builder account = Account.builder(userId, TimeUtil.now());
account.setFullName(name);
account.setPreferredEmail(email);
return AccountState.forAccount(account.build());
diff --git a/javatests/com/google/gerrit/server/notedb/AbstractChangeNotesTest.java b/javatests/com/google/gerrit/server/notedb/AbstractChangeNotesTest.java
index a2a9b7d..222be83 100644
--- a/javatests/com/google/gerrit/server/notedb/AbstractChangeNotesTest.java
+++ b/javatests/com/google/gerrit/server/notedb/AbstractChangeNotesTest.java
@@ -67,7 +67,8 @@
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
-import java.sql.Timestamp;
+import java.time.Instant;
+import java.util.Date;
import java.util.TimeZone;
import java.util.concurrent.ExecutorService;
import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
@@ -114,22 +115,26 @@
protected Injector injector;
private String systemTimeZone;
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
@Before
public void setUpTestEnvironment() throws Exception {
setTimeForTesting();
- serverIdent = new PersonIdent("Gerrit Server", "noreply@gerrit.com", TimeUtil.nowTs(), TZ);
+ serverIdent =
+ new PersonIdent("Gerrit Server", "noreply@gerrit.com", Date.from(TimeUtil.now()), TZ);
project = Project.nameKey("test-project");
repoManager = new InMemoryRepositoryManager();
repo = repoManager.createRepository(project);
tr = new TestRepository<>(repo);
rw = tr.getRevWalk();
accountCache = new FakeAccountCache();
- Account.Builder co = Account.builder(Account.id(1), TimeUtil.nowTs());
+ Account.Builder co = Account.builder(Account.id(1), TimeUtil.now());
co.setFullName("Change Owner");
co.setPreferredEmail("change@owner.com");
accountCache.put(co.build());
- Account.Builder ou = Account.builder(Account.id(2), TimeUtil.nowTs());
+ Account.Builder ou = Account.builder(Account.id(2), TimeUtil.now());
ou.setFullName("Other Account");
ou.setPreferredEmail("other@account.com");
accountCache.put(ou.build());
@@ -265,7 +270,7 @@
int line,
IdentifiedUser commenter,
String parentUUID,
- Timestamp t,
+ Instant t,
String message,
short side,
ObjectId commitId,
@@ -286,11 +291,11 @@
return c;
}
- protected static Timestamp truncate(Timestamp ts) {
- return new Timestamp((ts.getTime() / 1000) * 1000);
+ protected static Instant truncate(Instant ts) {
+ return Instant.ofEpochMilli((ts.toEpochMilli() / 1000) * 1000);
}
- protected static Timestamp after(Change c, long millis) {
- return new Timestamp(c.getCreatedOn().getTime() + millis);
+ protected static Instant after(Change c, long millis) {
+ return Instant.ofEpochMilli(c.getCreatedOn().toEpochMilli() + millis);
}
}
diff --git a/javatests/com/google/gerrit/server/notedb/ChangeNotesCommitTest.java b/javatests/com/google/gerrit/server/notedb/ChangeNotesCommitTest.java
index f105cf1..666b8fc 100644
--- a/javatests/com/google/gerrit/server/notedb/ChangeNotesCommitTest.java
+++ b/javatests/com/google/gerrit/server/notedb/ChangeNotesCommitTest.java
@@ -106,7 +106,7 @@
ChangeNotes notes = newNotes(change).load();
ChangeNoteUtil noteUtil = injector.getInstance(ChangeNoteUtil.class);
PersonIdent author =
- noteUtil.newAccountIdIdent(changeOwner.getAccount().id(), TimeUtil.nowTs(), serverIdent);
+ noteUtil.newAccountIdIdent(changeOwner.getAccount().id(), TimeUtil.now(), serverIdent);
try (ObjectInserter ins = testRepo.getRepository().newObjectInserter()) {
CommitBuilder cb = new CommitBuilder();
cb.setParentId(notes.getRevision());
diff --git a/javatests/com/google/gerrit/server/notedb/ChangeNotesParserTest.java b/javatests/com/google/gerrit/server/notedb/ChangeNotesParserTest.java
index 548764b..e557277 100644
--- a/javatests/com/google/gerrit/server/notedb/ChangeNotesParserTest.java
+++ b/javatests/com/google/gerrit/server/notedb/ChangeNotesParserTest.java
@@ -712,7 +712,7 @@
ChangeNoteUtil noteUtil = injector.getInstance(ChangeNoteUtil.class);
return writeCommit(
body,
- noteUtil.newAccountIdIdent(changeOwner.getAccount().id(), TimeUtil.nowTs(), serverIdent),
+ noteUtil.newAccountIdIdent(changeOwner.getAccount().id(), TimeUtil.now(), serverIdent),
false);
}
@@ -724,7 +724,7 @@
ChangeNoteUtil noteUtil = injector.getInstance(ChangeNoteUtil.class);
return writeCommit(
body,
- noteUtil.newAccountIdIdent(changeOwner.getAccount().id(), TimeUtil.nowTs(), serverIdent),
+ noteUtil.newAccountIdIdent(changeOwner.getAccount().id(), TimeUtil.now(), serverIdent),
initWorkInProgress);
}
diff --git a/javatests/com/google/gerrit/server/notedb/ChangeNotesStateTest.java b/javatests/com/google/gerrit/server/notedb/ChangeNotesStateTest.java
index d9846ce..3295828 100644
--- a/javatests/com/google/gerrit/server/notedb/ChangeNotesStateTest.java
+++ b/javatests/com/google/gerrit/server/notedb/ChangeNotesStateTest.java
@@ -92,8 +92,8 @@
cols =
ChangeColumns.builder()
.changeKey(Change.key(CHANGE_KEY))
- .createdOn(new Timestamp(123456L))
- .lastUpdatedOn(new Timestamp(234567L))
+ .createdOn(Instant.ofEpochMilli(123456L))
+ .lastUpdatedOn(Instant.ofEpochMilli(234567L))
.owner(Account.id(1000))
.branch("refs/heads/master")
.subject("Test change")
@@ -135,7 +135,9 @@
@Test
public void serializeCreatedOn() throws Exception {
assertRoundTrip(
- newBuilder().columns(cols.toBuilder().createdOn(new Timestamp(98765L)).build()).build(),
+ newBuilder()
+ .columns(cols.toBuilder().createdOn(Instant.ofEpochMilli(98765L)).build())
+ .build(),
ChangeNotesStateProto.newBuilder()
.setMetaId(SHA_BYTES)
.setChangeId(ID.get())
@@ -146,7 +148,9 @@
@Test
public void serializeLastUpdatedOn() throws Exception {
assertRoundTrip(
- newBuilder().columns(cols.toBuilder().lastUpdatedOn(new Timestamp(98765L)).build()).build(),
+ newBuilder()
+ .columns(cols.toBuilder().lastUpdatedOn(Instant.ofEpochMilli(98765L)).build())
+ .build(),
ChangeNotesStateProto.newBuilder()
.setMetaId(SHA_BYTES)
.setChangeId(ID.get())
@@ -376,7 +380,7 @@
PatchSet.id(ID, 1), Account.id(2001), LabelId.create(LabelId.CODE_REVIEW)))
.value(1)
.tag("tag")
- .granted(new Timestamp(1212L))
+ .granted(Instant.ofEpochMilli(1212L))
.build();
Entities.PatchSetApproval psa1 = PatchSetApprovalProtoConverter.INSTANCE.toProto(a1);
ByteString a1Bytes = Protos.toByteString(psa1);
@@ -389,7 +393,7 @@
.value(-1)
.tag("tag")
.copied(true)
- .granted(new Timestamp(3434L))
+ .granted(Instant.ofEpochMilli(3434L))
.build();
Entities.PatchSetApproval psa2 = PatchSetApprovalProtoConverter.INSTANCE.toProto(a2);
ByteString a2Bytes = Protos.toByteString(psa2);
@@ -419,7 +423,7 @@
.uuid(Optional.of(PatchSetApproval.uuid("577fb248e474018276351785930358ec0450e9f7")))
.value(1)
.tag("tag")
- .granted(new Timestamp(1212L))
+ .granted(Instant.ofEpochMilli(1212L))
.build();
Entities.PatchSetApproval psa1 = PatchSetApprovalProtoConverter.INSTANCE.toProto(a1);
ByteString a1Bytes = Protos.toByteString(psa1);
@@ -433,7 +437,7 @@
.value(-1)
.tag("tag")
.copied(true)
- .granted(new Timestamp(3434L))
+ .granted(Instant.ofEpochMilli(3434L))
.build();
Entities.PatchSetApproval psa2 = PatchSetApprovalProtoConverter.INSTANCE.toProto(a2);
ByteString a2Bytes = Protos.toByteString(psa2);
@@ -459,9 +463,13 @@
newBuilder()
.reviewers(
ReviewerSet.fromTable(
- ImmutableTable.<ReviewerStateInternal, Account.Id, Timestamp>builder()
- .put(ReviewerStateInternal.CC, Account.id(2001), new Timestamp(1212L))
- .put(ReviewerStateInternal.REVIEWER, Account.id(2002), new Timestamp(3434L))
+ ImmutableTable.<ReviewerStateInternal, Account.Id, Instant>builder()
+ .put(
+ ReviewerStateInternal.CC, Account.id(2001), Instant.ofEpochMilli(1212L))
+ .put(
+ ReviewerStateInternal.REVIEWER,
+ Account.id(2002),
+ Instant.ofEpochMilli(3434L))
.build()))
.build(),
ChangeNotesStateProto.newBuilder()
@@ -487,15 +495,15 @@
newBuilder()
.reviewersByEmail(
ReviewerByEmailSet.fromTable(
- ImmutableTable.<ReviewerStateInternal, Address, Timestamp>builder()
+ ImmutableTable.<ReviewerStateInternal, Address, Instant>builder()
.put(
ReviewerStateInternal.CC,
Address.create("Name1", "email1@example.com"),
- new Timestamp(1212L))
+ Instant.ofEpochMilli(1212L))
.put(
ReviewerStateInternal.REVIEWER,
Address.create("Name2", "email2@example.com"),
- new Timestamp(3434L))
+ Instant.ofEpochMilli(3434L))
.build()))
.build(),
ChangeNotesStateProto.newBuilder()
@@ -525,7 +533,7 @@
ImmutableTable.of(
ReviewerStateInternal.CC,
Address.create("emailonly@example.com"),
- new Timestamp(1212L))))
+ Instant.ofEpochMilli(1212L))))
.build(),
ChangeNotesStateProto.newBuilder()
.setMetaId(SHA_BYTES)
@@ -553,9 +561,13 @@
newBuilder()
.pendingReviewers(
ReviewerSet.fromTable(
- ImmutableTable.<ReviewerStateInternal, Account.Id, Timestamp>builder()
- .put(ReviewerStateInternal.CC, Account.id(2001), new Timestamp(1212L))
- .put(ReviewerStateInternal.REVIEWER, Account.id(2002), new Timestamp(3434L))
+ ImmutableTable.<ReviewerStateInternal, Account.Id, Instant>builder()
+ .put(
+ ReviewerStateInternal.CC, Account.id(2001), Instant.ofEpochMilli(1212L))
+ .put(
+ ReviewerStateInternal.REVIEWER,
+ Account.id(2002),
+ Instant.ofEpochMilli(3434L))
.build()))
.build(),
ChangeNotesStateProto.newBuilder()
@@ -581,15 +593,15 @@
newBuilder()
.pendingReviewersByEmail(
ReviewerByEmailSet.fromTable(
- ImmutableTable.<ReviewerStateInternal, Address, Timestamp>builder()
+ ImmutableTable.<ReviewerStateInternal, Address, Instant>builder()
.put(
ReviewerStateInternal.CC,
Address.create("Name1", "email1@example.com"),
- new Timestamp(1212L))
+ Instant.ofEpochMilli(1212L))
.put(
ReviewerStateInternal.REVIEWER,
Address.create("Name2", "email2@example.com"),
- new Timestamp(3434L))
+ Instant.ofEpochMilli(3434L))
.build()))
.build(),
ChangeNotesStateProto.newBuilder()
@@ -629,12 +641,12 @@
.reviewerUpdates(
ImmutableList.of(
ReviewerStatusUpdate.create(
- new Timestamp(1212L),
+ Instant.ofEpochMilli(1212L),
Account.id(1000),
Account.id(2002),
ReviewerStateInternal.CC),
ReviewerStatusUpdate.create(
- new Timestamp(3434L),
+ Instant.ofEpochMilli(3434L),
Account.id(1000),
Account.id(2001),
ReviewerStateInternal.REVIEWER)))
@@ -796,9 +808,11 @@
.assigneeUpdates(
ImmutableList.of(
AssigneeStatusUpdate.create(
- new Timestamp(1212L), Account.id(1000), Optional.of(Account.id(2001))),
+ Instant.ofEpochMilli(1212L),
+ Account.id(1000),
+ Optional.of(Account.id(2001))),
AssigneeStatusUpdate.create(
- new Timestamp(3434L), Account.id(1000), Optional.empty())))
+ Instant.ofEpochMilli(3434L), Account.id(1000), Optional.empty())))
.build(),
ChangeNotesStateProto.newBuilder()
.setMetaId(SHA_BYTES)
@@ -843,7 +857,7 @@
ChangeMessage.create(
ChangeMessage.key(ID, "uuid1"),
Account.id(1000),
- new Timestamp(1212L),
+ Instant.ofEpochMilli(1212L),
PatchSet.id(ID, 1));
Entities.ChangeMessage m1Proto = ChangeMessageProtoConverter.INSTANCE.toProto(m1);
ByteString m1Bytes = Protos.toByteString(m1Proto);
@@ -853,7 +867,7 @@
ChangeMessage.create(
ChangeMessage.key(ID, "uuid2"),
Account.id(2000),
- new Timestamp(3434L),
+ Instant.ofEpochMilli(3434L),
PatchSet.id(ID, 2));
Entities.ChangeMessage m2Proto = ChangeMessageProtoConverter.INSTANCE.toProto(m2);
ByteString m2Bytes = Protos.toByteString(m2Proto);
@@ -877,7 +891,7 @@
new HumanComment(
new Comment.Key("uuid1", "file1", 1),
Account.id(1001),
- new Timestamp(1212L),
+ Instant.ofEpochMilli(1212L),
(short) 1,
"message 1",
"serverId",
@@ -889,7 +903,7 @@
new HumanComment(
new Comment.Key("uuid2", "file2", 2),
Account.id(1002),
- new Timestamp(3434L),
+ Instant.ofEpochMilli(3434L),
(short) 2,
"message 2",
"serverId",
@@ -965,7 +979,7 @@
"submitRequirementsResult",
new TypeLiteral<ImmutableList<SubmitRequirementResult>>() {}.getType())
.put("updateCount", int.class)
- .put("mergedOn", Timestamp.class)
+ .put("mergedOn", Instant.class)
.build());
}
@@ -975,8 +989,8 @@
.hasAutoValueMethods(
ImmutableMap.<String, Type>builder()
.put("changeKey", Change.Key.class)
- .put("createdOn", Timestamp.class)
- .put("lastUpdatedOn", Timestamp.class)
+ .put("createdOn", Instant.class)
+ .put("lastUpdatedOn", Instant.class)
.put("owner", Account.Id.class)
.put("branch", String.class)
.put("currentPatchSetId", PatchSet.Id.class)
@@ -1002,7 +1016,7 @@
.put("id", PatchSet.Id.class)
.put("commitId", ObjectId.class)
.put("uploader", Account.Id.class)
- .put("createdOn", Timestamp.class)
+ .put("createdOn", Instant.class)
.put("groups", new TypeLiteral<ImmutableList<String>>() {}.getType())
.put("pushCertificate", new TypeLiteral<Optional<String>>() {}.getType())
.put("description", new TypeLiteral<Optional<String>>() {}.getType())
@@ -1024,7 +1038,7 @@
.put("key", PatchSetApproval.Key.class)
.put("uuid", new TypeLiteral<Optional<PatchSetApproval.UUID>>() {}.getType())
.put("value", short.class)
- .put("granted", Timestamp.class)
+ .put("granted", Instant.class)
.put("tag", new TypeLiteral<Optional<String>>() {}.getType())
.put("realAccountId", Account.Id.class)
.put("postSubmit", boolean.class)
@@ -1040,7 +1054,7 @@
ImmutableMap.of(
"table",
new TypeLiteral<
- ImmutableTable<ReviewerStateInternal, Account.Id, Timestamp>>() {}.getType(),
+ ImmutableTable<ReviewerStateInternal, Account.Id, Instant>>() {}.getType(),
"accounts",
new TypeLiteral<ImmutableSet<Account.Id>>() {}.getType()));
}
@@ -1052,7 +1066,7 @@
ImmutableMap.of(
"table",
new TypeLiteral<
- ImmutableTable<ReviewerStateInternal, Address, Timestamp>>() {}.getType(),
+ ImmutableTable<ReviewerStateInternal, Address, Instant>>() {}.getType(),
"users",
new TypeLiteral<ImmutableSet<Address>>() {}.getType()));
}
@@ -1062,7 +1076,7 @@
assertThatSerializedClass(ReviewerStatusUpdate.class)
.hasAutoValueMethods(
ImmutableMap.of(
- "date", Timestamp.class,
+ "date", Instant.class,
"updatedBy", Account.Id.class,
"reviewer", Account.Id.class,
"state", ReviewerStateInternal.class));
@@ -1074,7 +1088,7 @@
.hasAutoValueMethods(
ImmutableMap.of(
"date",
- Timestamp.class,
+ Instant.class,
"updatedBy",
Account.Id.class,
"currentAssignee",
@@ -1112,7 +1126,7 @@
@Test
public void serializeMergedOn() throws Exception {
assertRoundTrip(
- newBuilder().mergedOn(new Timestamp(234567L)).build(),
+ newBuilder().mergedOn(Instant.ofEpochMilli(234567L)).build(),
ChangeNotesStateProto.newBuilder()
.setMetaId(SHA_BYTES)
.setChangeId(ID.get())
@@ -1131,7 +1145,7 @@
ImmutableMap.<String, Type>builder()
.put("key", ChangeMessage.Key.class)
.put("author", Account.Id.class)
- .put("writtenOn", Timestamp.class)
+ .put("writtenOn", Instant.class)
.put("message", String.class)
.put("patchset", PatchSet.Id.class)
.put("tag", String.class)
diff --git a/javatests/com/google/gerrit/server/notedb/ChangeNotesTest.java b/javatests/com/google/gerrit/server/notedb/ChangeNotesTest.java
index 38daae6..09c8059 100644
--- a/javatests/com/google/gerrit/server/notedb/ChangeNotesTest.java
+++ b/javatests/com/google/gerrit/server/notedb/ChangeNotesTest.java
@@ -62,7 +62,6 @@
import com.google.gerrit.server.validators.ValidationException;
import com.google.gerrit.testing.TestChanges;
import com.google.inject.Inject;
-import java.sql.Timestamp;
import java.time.Instant;
import java.util.LinkedHashSet;
import java.util.List;
@@ -132,7 +131,7 @@
1,
changeOwner,
null,
- TimeUtil.nowTs(),
+ TimeUtil.now(),
"Comment",
(short) 1,
commit,
@@ -194,7 +193,7 @@
1,
changeOwner,
null,
- TimeUtil.nowTs(),
+ TimeUtil.now(),
"Comment",
(short) 1,
commit,
@@ -923,7 +922,7 @@
LabelId.create(LabelId.CODE_REVIEW)))
.value(1)
.copied(true)
- .granted(TimeUtil.nowTs())
+ .granted(TimeUtil.now())
.tag("tag")
.realAccountId(otherUserId)
.build());
@@ -975,7 +974,7 @@
LabelId.create(LabelId.CODE_REVIEW)))
.value(1)
.copied(true)
- .granted(TimeUtil.nowTs())
+ .granted(TimeUtil.now())
.build());
update.commit();
@@ -1008,7 +1007,7 @@
LabelId.create(LabelId.CODE_REVIEW)))
.value(1)
.copied(true)
- .granted(TimeUtil.nowTs())
+ .granted(TimeUtil.now())
.tag(strangeTag)
.build());
update.commit();
@@ -1037,7 +1036,7 @@
LabelId.create(LabelId.CODE_REVIEW)))
.value(1)
.copied(true)
- .granted(TimeUtil.nowTs())
+ .granted(TimeUtil.now())
.build());
update.putCopiedApproval(
PatchSetApproval.builder()
@@ -1048,7 +1047,7 @@
LabelId.create(LabelId.VERIFIED)))
.value(1)
.copied(true)
- .granted(TimeUtil.nowTs())
+ .granted(TimeUtil.now())
.build());
update.commit();
@@ -1073,7 +1072,7 @@
LabelId.create(LabelId.CODE_REVIEW)))
.value(2)
.copied(true)
- .granted(TimeUtil.nowTs())
+ .granted(TimeUtil.now())
.build());
update.commit();
@@ -1097,11 +1096,11 @@
update.commit();
ChangeNotes notes = newNotes(c);
- Timestamp ts = new Timestamp(update.getWhen().getTime());
+ Instant ts = update.getWhen();
assertThat(notes.getReviewers())
.isEqualTo(
ReviewerSet.fromTable(
- ImmutableTable.<ReviewerStateInternal, Account.Id, Timestamp>builder()
+ ImmutableTable.<ReviewerStateInternal, Account.Id, Instant>builder()
.put(REVIEWER, Account.id(1), ts)
.put(REVIEWER, Account.id(2), ts)
.build()));
@@ -1116,11 +1115,11 @@
update.commit();
ChangeNotes notes = newNotes(c);
- Timestamp ts = new Timestamp(update.getWhen().getTime());
+ Instant ts = update.getWhen();
assertThat(notes.getReviewers())
.isEqualTo(
ReviewerSet.fromTable(
- ImmutableTable.<ReviewerStateInternal, Account.Id, Timestamp>builder()
+ ImmutableTable.<ReviewerStateInternal, Account.Id, Instant>builder()
.put(REVIEWER, Account.id(1), ts)
.put(CC, Account.id(2), ts)
.build()));
@@ -1134,7 +1133,7 @@
update.commit();
ChangeNotes notes = newNotes(c);
- Timestamp ts = new Timestamp(update.getWhen().getTime());
+ Instant ts = update.getWhen();
assertThat(notes.getReviewers())
.isEqualTo(ReviewerSet.fromTable(ImmutableTable.of(REVIEWER, Account.id(2), ts)));
@@ -1143,7 +1142,7 @@
update.commit();
notes = newNotes(c);
- ts = new Timestamp(update.getWhen().getTime());
+ ts = update.getWhen();
assertThat(notes.getReviewers())
.isEqualTo(ReviewerSet.fromTable(ImmutableTable.of(CC, Account.id(2), ts)));
}
@@ -1278,7 +1277,7 @@
update.commit();
ChangeNotes notes = newNotes(c);
assertThat(notes.getMergedOn()).isPresent();
- Timestamp mergedOn = notes.getMergedOn().get();
+ Instant mergedOn = notes.getMergedOn().get();
assertThat(mergedOn).isEqualTo(notes.getChange().getLastUpdatedOn());
// Next update does not change mergedOn date.
@@ -1304,7 +1303,7 @@
update.commit();
ChangeNotes notes = newNotes(c);
assertThat(notes.getMergedOn()).isPresent();
- Timestamp mergedOn = notes.getMergedOn().get();
+ Instant mergedOn = notes.getMergedOn().get();
assertThat(mergedOn).isEqualTo(notes.getChange().getLastUpdatedOn());
incrementPatchSet(c);
@@ -1698,7 +1697,7 @@
public void createdOnChangeNotes() throws Exception {
Change c = newChange();
- Timestamp createdOn = newNotes(c).getChange().getCreatedOn();
+ Instant createdOn = newNotes(c).getChange().getCreatedOn();
assertThat(createdOn).isNotNull();
// An update doesn't affect the createdOn timestamp.
@@ -1713,54 +1712,54 @@
Change c = newChange();
ChangeNotes notes = newNotes(c);
- Timestamp ts1 = notes.getChange().getLastUpdatedOn();
+ Instant ts1 = notes.getChange().getLastUpdatedOn();
assertThat(ts1).isEqualTo(notes.getChange().getCreatedOn());
// Various kinds of updates that update the timestamp.
ChangeUpdate update = newUpdate(c, changeOwner);
update.setTopic("topic"); // Change something to get a new commit.
update.commit();
- Timestamp ts2 = newNotes(c).getChange().getLastUpdatedOn();
+ Instant ts2 = newNotes(c).getChange().getLastUpdatedOn();
assertThat(ts2).isGreaterThan(ts1);
update = newUpdate(c, changeOwner);
update.setChangeMessage("Some message");
update.commit();
- Timestamp ts3 = newNotes(c).getChange().getLastUpdatedOn();
+ Instant ts3 = newNotes(c).getChange().getLastUpdatedOn();
assertThat(ts3).isGreaterThan(ts2);
update = newUpdate(c, changeOwner);
update.setHashtags(ImmutableSet.of("foo"));
update.commit();
- Timestamp ts4 = newNotes(c).getChange().getLastUpdatedOn();
+ Instant ts4 = newNotes(c).getChange().getLastUpdatedOn();
assertThat(ts4).isGreaterThan(ts3);
incrementPatchSet(c);
- Timestamp ts5 = newNotes(c).getChange().getLastUpdatedOn();
+ Instant ts5 = newNotes(c).getChange().getLastUpdatedOn();
assertThat(ts5).isGreaterThan(ts4);
update = newUpdate(c, changeOwner);
update.putApproval(LabelId.CODE_REVIEW, (short) 1);
update.commit();
- Timestamp ts6 = newNotes(c).getChange().getLastUpdatedOn();
+ Instant ts6 = newNotes(c).getChange().getLastUpdatedOn();
assertThat(ts6).isGreaterThan(ts5);
update = newUpdate(c, changeOwner);
update.setStatus(Change.Status.ABANDONED);
update.commit();
- Timestamp ts7 = newNotes(c).getChange().getLastUpdatedOn();
+ Instant ts7 = newNotes(c).getChange().getLastUpdatedOn();
assertThat(ts7).isGreaterThan(ts6);
update = newUpdate(c, changeOwner);
update.putReviewer(otherUser.getAccountId(), ReviewerStateInternal.REVIEWER);
update.commit();
- Timestamp ts8 = newNotes(c).getChange().getLastUpdatedOn();
+ Instant ts8 = newNotes(c).getChange().getLastUpdatedOn();
assertThat(ts8).isGreaterThan(ts7);
update = newUpdate(c, changeOwner);
update.setGroups(ImmutableList.of("a", "b"));
update.commit();
- Timestamp ts9 = newNotes(c).getChange().getLastUpdatedOn();
+ Instant ts9 = newNotes(c).getChange().getLastUpdatedOn();
assertThat(ts9).isGreaterThan(ts8);
// Finish off by merging the change.
@@ -1774,7 +1773,7 @@
submitLabel(LabelId.VERIFIED, "OK", changeOwner.getAccountId()),
submitLabel("Alternative-Code-Review", "NEED", null))));
update.commit();
- Timestamp ts10 = newNotes(c).getChange().getLastUpdatedOn();
+ Instant ts10 = newNotes(c).getChange().getLastUpdatedOn();
assertThat(ts10).isGreaterThan(ts9);
}
@@ -1887,7 +1886,7 @@
1,
changeOwner,
null,
- TimeUtil.nowTs(),
+ TimeUtil.now(),
"Comment",
(short) 1,
commit,
@@ -1976,7 +1975,7 @@
// comment on ps2
update = newUpdate(c, changeOwner);
update.setPatchSetId(psId2);
- Timestamp ts = TimeUtil.nowTs();
+ Instant ts = TimeUtil.now();
update.putComment(
HumanComment.Status.PUBLISHED,
newComment(
@@ -2044,7 +2043,7 @@
String uuid1 = "uuid1";
String message1 = "comment 1";
CommentRange range1 = new CommentRange(1, 1, 2, 1);
- Timestamp time1 = TimeUtil.nowTs();
+ Instant time1 = TimeUtil.now();
PatchSet.Id psId = c.currentPatchSetId();
RevCommit tipCommit;
try (NoteDbUpdateManager updateManager = updateManagerFactory.create(project)) {
@@ -2293,7 +2292,7 @@
0,
otherUser,
null,
- TimeUtil.nowTs(),
+ TimeUtil.now(),
"message",
(short) 1,
commitId,
@@ -2323,7 +2322,7 @@
range.getEndLine(),
otherUser,
null,
- TimeUtil.nowTs(),
+ TimeUtil.now(),
"message",
(short) 1,
commitId,
@@ -2353,7 +2352,7 @@
range.getEndLine(),
otherUser,
null,
- TimeUtil.nowTs(),
+ TimeUtil.now(),
"message",
(short) 1,
commitId,
@@ -2383,7 +2382,7 @@
range.getEndLine(),
otherUser,
null,
- TimeUtil.nowTs(),
+ TimeUtil.now(),
"message",
(short) 1,
commitId,
@@ -2410,7 +2409,7 @@
String message3 = "comment 3";
CommentRange range1 = new CommentRange(1, 1, 2, 1);
CommentRange range2 = new CommentRange(2, 1, 3, 1);
- Timestamp time = TimeUtil.nowTs();
+ Instant time = TimeUtil.now();
ObjectId commitId = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
HumanComment comment1 =
@@ -2480,7 +2479,7 @@
String uuid = "uuid";
String message = "comment";
CommentRange range = new CommentRange(1, 1, 2, 1);
- Timestamp time = TimeUtil.nowTs();
+ Instant time = TimeUtil.now();
PatchSet.Id psId = c.currentPatchSetId();
ObjectId commitId = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
@@ -2510,7 +2509,7 @@
@Test
public void patchLineCommentNotesFormatWeirdUser() throws Exception {
- Account.Builder account = Account.builder(Account.id(3), TimeUtil.nowTs());
+ Account.Builder account = Account.builder(Account.id(3), TimeUtil.now());
account.setFullName("Weird\n\u0002<User>\n");
account.setPreferredEmail(" we\r\nird@ex>ample<.com");
accountCache.put(account.build());
@@ -2520,7 +2519,7 @@
ChangeUpdate update = newUpdate(c, user);
String uuid = "uuid";
CommentRange range = new CommentRange(1, 1, 2, 1);
- Timestamp time = TimeUtil.nowTs();
+ Instant time = TimeUtil.now();
PatchSet.Id psId = c.currentPatchSetId();
HumanComment comment =
@@ -2558,7 +2557,7 @@
String messageForBase = "comment for base";
String messageForPS = "comment for ps";
CommentRange range = new CommentRange(1, 1, 2, 1);
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
PatchSet.Id psId = c.currentPatchSetId();
HumanComment commentForBase =
@@ -2617,8 +2616,8 @@
short side = (short) 1;
ChangeUpdate update = newUpdate(c, otherUser);
- Timestamp timeForComment1 = TimeUtil.nowTs();
- Timestamp timeForComment2 = TimeUtil.nowTs();
+ Instant timeForComment1 = TimeUtil.now();
+ Instant timeForComment2 = TimeUtil.now();
HumanComment comment1 =
newComment(
psId,
@@ -2676,7 +2675,7 @@
short side = (short) 1;
ChangeUpdate update = newUpdate(c, otherUser);
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
HumanComment comment1 =
newComment(
psId,
@@ -2734,7 +2733,7 @@
short side = (short) 1;
ChangeUpdate update = newUpdate(c, otherUser);
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
HumanComment comment1 =
newComment(
ps1,
@@ -2757,7 +2756,7 @@
PatchSet.Id ps2 = c.currentPatchSetId();
update = newUpdate(c, otherUser);
- now = TimeUtil.nowTs();
+ now = TimeUtil.now();
HumanComment comment2 =
newComment(
ps2,
@@ -2794,7 +2793,7 @@
short side = (short) 1;
ChangeUpdate update = newUpdate(c, otherUser);
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
HumanComment comment1 =
newComment(
ps1,
@@ -2839,7 +2838,7 @@
CommentRange range2 = new CommentRange(2, 2, 3, 3);
String filename = "filename1";
short side = (short) 1;
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
PatchSet.Id psId = c.currentPatchSetId();
// Write two drafts on the same side of one patch set.
@@ -2909,7 +2908,7 @@
CommentRange range1 = new CommentRange(1, 1, 2, 2);
CommentRange range2 = new CommentRange(2, 2, 3, 3);
String filename = "filename1";
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
PatchSet.Id psId = c.currentPatchSetId();
// Write two drafts, one on each side of the patchset.
@@ -2984,7 +2983,7 @@
short side = (short) 1;
ChangeUpdate update = newUpdate(c, otherUser);
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
HumanComment comment =
newComment(
psId,
@@ -3029,7 +3028,7 @@
short side = (short) 1;
ChangeUpdate update = newUpdate(c, otherUser);
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
HumanComment comment1 =
newComment(
ps1,
@@ -3052,7 +3051,7 @@
PatchSet.Id ps2 = c.currentPatchSetId();
update = newUpdate(c, otherUser);
- now = TimeUtil.nowTs();
+ now = TimeUtil.now();
HumanComment comment2 =
newComment(
ps2,
@@ -3097,7 +3096,7 @@
short side = (short) 1;
ChangeUpdate update = newUpdate(c, otherUser);
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
HumanComment comment =
newComment(
ps1,
@@ -3130,7 +3129,7 @@
short side = (short) 1;
ChangeUpdate update = newUpdate(c, otherUser);
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
HumanComment draft =
newComment(
ps1,
@@ -3180,7 +3179,7 @@
String uuid = "uuid";
ObjectId commitId = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
String messageForBase = "comment for base";
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
PatchSet.Id psId = c.currentPatchSetId();
HumanComment comment =
@@ -3212,7 +3211,7 @@
String uuid = "uuid";
ObjectId commitId = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
String messageForBase = "comment for base";
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
PatchSet.Id psId = c.currentPatchSetId();
HumanComment comment =
@@ -3253,7 +3252,7 @@
ChangeUpdate update = newUpdate(c, otherUser);
update.setPatchSetId(ps2);
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
HumanComment comment1 =
newComment(
ps1,
@@ -3311,7 +3310,7 @@
ChangeUpdate update = newUpdate(c, otherUser);
update.setPatchSetId(ps1);
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
HumanComment comment1 =
newComment(
ps1,
@@ -3385,7 +3384,7 @@
short side = (short) 1;
ChangeUpdate update = newUpdate(c, otherUser);
- Timestamp now = TimeUtil.nowTs();
+ Instant now = TimeUtil.now();
HumanComment comment1 =
newComment(
ps1,
@@ -3472,7 +3471,7 @@
range.getEndLine(),
otherUser,
null,
- new Timestamp(update1.getWhen().getTime()),
+ update1.getWhen(),
"comment 1",
(short) 1,
commitId,
@@ -3489,7 +3488,7 @@
range.getEndLine(),
otherUser,
null,
- new Timestamp(update2.getWhen().getTime()),
+ update2.getWhen(),
"comment 2",
(short) 1,
commitId,
@@ -3546,7 +3545,7 @@
range.getEndLine(),
changeOwner,
null,
- new Timestamp(update.getWhen().getTime()),
+ update.getWhen(),
"comment",
(short) 1,
ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234"),
@@ -3982,9 +3981,9 @@
}
private AttentionSetUpdate addTimestamp(AttentionSetUpdate attentionSetUpdate, Change c) {
- Timestamp timestamp = newNotes(c).getChange().getLastUpdatedOn();
+ Instant timestamp = newNotes(c).getChange().getLastUpdatedOn();
return AttentionSetUpdate.createFromRead(
- timestamp.toInstant(),
+ timestamp,
attentionSetUpdate.account(),
attentionSetUpdate.operation(),
attentionSetUpdate.reason());
@@ -4016,7 +4015,7 @@
.key(originalPsa.key())
.value(originalPsa.value())
.copied(true)
- .granted(TimeUtil.nowTs())
+ .granted(TimeUtil.now())
.tag(originalPsa.tag())
.uuid(originalPsa.uuid())
.realAccountId(originalPsa.realAccountId())
diff --git a/javatests/com/google/gerrit/server/notedb/ChangeUpdateTest.java b/javatests/com/google/gerrit/server/notedb/ChangeUpdateTest.java
index fa05adc..cf1b5ae 100644
--- a/javatests/com/google/gerrit/server/notedb/ChangeUpdateTest.java
+++ b/javatests/com/google/gerrit/server/notedb/ChangeUpdateTest.java
@@ -81,7 +81,7 @@
1,
changeOwner,
null,
- TimeUtil.nowTs(),
+ TimeUtil.now(),
"Comment",
(short) 1,
commit,
diff --git a/javatests/com/google/gerrit/server/notedb/CommentTimestampAdapterTest.java b/javatests/com/google/gerrit/server/notedb/CommentTimestampAdapterTest.java
index 2c1348c..2191f00 100644
--- a/javatests/com/google/gerrit/server/notedb/CommentTimestampAdapterTest.java
+++ b/javatests/com/google/gerrit/server/notedb/CommentTimestampAdapterTest.java
@@ -34,7 +34,7 @@
/** Arbitrary time outside of a DST transition, as an ISO instant. */
private static final String NON_DST_STR = "2017-02-07T10:20:30.123Z";
- /** Arbitrary time outside of a DST transition, as a reasonable Java 8 representation. */
+ /** Arbitrary time outside of a DST transition, as a reasonable Java 11 representation. */
private static final ZonedDateTime NON_DST = ZonedDateTime.parse(NON_DST_STR);
/** {@link #NON_DST_STR} truncated to seconds. */
@@ -155,7 +155,7 @@
new HumanComment(
new Comment.Key("uuid", "filename", 1),
Account.id(100),
- NON_DST_TS,
+ NON_DST_TS.toInstant(),
(short) 0,
"message",
"serverId",
diff --git a/javatests/com/google/gerrit/server/notedb/CommitMessageOutputTest.java b/javatests/com/google/gerrit/server/notedb/CommitMessageOutputTest.java
index ce4ec39..5e2e1f2 100644
--- a/javatests/com/google/gerrit/server/notedb/CommitMessageOutputTest.java
+++ b/javatests/com/google/gerrit/server/notedb/CommitMessageOutputTest.java
@@ -35,6 +35,9 @@
import org.junit.Test;
public class CommitMessageOutputTest extends AbstractChangeNotesTest {
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
@Test
public void approvalsCommitFormatSimple() throws Exception {
Change c = TestChanges.newChange(project, changeOwner.getAccountId(), 1);
@@ -67,7 +70,7 @@
PersonIdent author = commit.getAuthorIdent();
assertThat(author.getName()).isEqualTo("Gerrit User 1");
assertThat(author.getEmailAddress()).isEqualTo("1@gerrit");
- assertThat(author.getWhen().getTime()).isEqualTo(c.getCreatedOn().getTime() + 1000);
+ assertThat(author.getWhen().getTime()).isEqualTo(c.getCreatedOn().toEpochMilli() + 1000);
assertThat(author.getTimeZone()).isEqualTo(TimeZone.getTimeZone("GMT-7:00"));
PersonIdent committer = commit.getCommitterIdent();
@@ -142,6 +145,9 @@
}
@Test
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
public void submitCommitFormat() throws Exception {
Change c = newChange();
ChangeUpdate update = newUpdate(c, changeOwner);
@@ -183,7 +189,7 @@
PersonIdent author = commit.getAuthorIdent();
assertThat(author.getName()).isEqualTo("Gerrit User 1");
assertThat(author.getEmailAddress()).isEqualTo("1@gerrit");
- assertThat(author.getWhen().getTime()).isEqualTo(c.getCreatedOn().getTime() + 2000);
+ assertThat(author.getWhen().getTime()).isEqualTo(c.getCreatedOn().toEpochMilli() + 2000);
assertThat(author.getTimeZone()).isEqualTo(TimeZone.getTimeZone("GMT-7:00"));
PersonIdent committer = commit.getCommitterIdent();
@@ -196,7 +202,7 @@
@Test
public void anonymousUser() throws Exception {
Account anon =
- Account.builder(Account.id(3), TimeUtil.nowTs())
+ Account.builder(Account.id(3), TimeUtil.now())
.setMetaId("1234567812345678123456781234567812345678")
.build();
accountCache.put(anon);
diff --git a/javatests/com/google/gerrit/server/notedb/CommitRewriterTest.java b/javatests/com/google/gerrit/server/notedb/CommitRewriterTest.java
index b29ce29..3b18183 100644
--- a/javatests/com/google/gerrit/server/notedb/CommitRewriterTest.java
+++ b/javatests/com/google/gerrit/server/notedb/CommitRewriterTest.java
@@ -47,8 +47,9 @@
import com.google.gerrit.server.util.time.TimeUtil;
import com.google.gson.Gson;
import com.google.inject.Inject;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Arrays;
+import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -320,15 +321,18 @@
assertThat(secondRunResult.fixedRefDiff.keySet().size()).isEqualTo(expectedSecondRunResult);
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
@Test
public void fixAuthorIdent() throws Exception {
Change c = newChange();
- Timestamp when = TimeUtil.nowTs();
+ Instant when = TimeUtil.now();
PersonIdent invalidAuthorIdent =
new PersonIdent(
changeOwner.getName(),
changeNoteUtil.getAccountIdAsEmailAddress(changeOwner.getAccountId()),
- when,
+ Date.from(when),
serverIdent.getTimeZone());
RevCommit invalidUpdateCommit =
writeUpdate(
@@ -449,6 +453,9 @@
assertThat(secondRunResult.refsFailedToFix).isEmpty();
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
@Test
public void fixReviewerFooterIdent() throws Exception {
Change c = newChange();
@@ -495,7 +502,7 @@
BackfillResult result = rewriter.backfillProject(project, repo, options);
assertThat(result.fixedRefDiff.keySet()).containsExactly(RefNames.changeMetaRef(c.getId()));
- Timestamp updateTimestamp = new Timestamp(serverIdent.getWhen().getTime());
+ Instant updateTimestamp = serverIdent.getWhen().toInstant();
ImmutableList<ReviewerStatusUpdate> expectedReviewerUpdates =
ImmutableList.of(
ReviewerStatusUpdate.create(
@@ -532,6 +539,9 @@
assertThat(secondRunResult.refsFailedToFix).isEmpty();
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
@Test
public void fixReviewerMessage() throws Exception {
Change c = newChange();
@@ -579,21 +589,15 @@
BackfillResult result = rewriter.backfillProject(project, repo, options);
assertThat(result.fixedRefDiff.keySet()).containsExactly(RefNames.changeMetaRef(c.getId()));
- Timestamp updateTimestamp = new Timestamp(serverIdent.getWhen().getTime());
+ Instant updateTimestamp = serverIdent.getWhen().toInstant();
ImmutableList<ReviewerStatusUpdate> expectedReviewerUpdates =
ImmutableList.of(
ReviewerStatusUpdate.create(
- new Timestamp(addReviewerUpdate.when.getTime()),
- changeOwner.getAccountId(),
- otherUserId,
- REVIEWER),
+ addReviewerUpdate.when, changeOwner.getAccountId(), otherUserId, REVIEWER),
ReviewerStatusUpdate.create(
updateTimestamp, changeOwner.getAccountId(), otherUserId, REMOVED),
ReviewerStatusUpdate.create(
- new Timestamp(addCcUpdate.when.getTime()),
- changeOwner.getAccountId(),
- otherUserId,
- CC),
+ addCcUpdate.when, changeOwner.getAccountId(), otherUserId, CC),
ReviewerStatusUpdate.create(
updateTimestamp, changeOwner.getAccountId(), otherUserId, REMOVED));
ChangeNotes notesAfterRewrite = newNotes(c);
@@ -665,6 +669,9 @@
assertThat(secondRunResult.refsFailedToFix).isEmpty();
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
@Test
public void fixLabelFooterIdent() throws Exception {
Change c = newChange();
@@ -715,7 +722,7 @@
BackfillResult result = rewriter.backfillProject(project, repo, options);
assertThat(result.fixedRefDiff.keySet()).containsExactly(RefNames.changeMetaRef(c.getId()));
- Timestamp updateTimestamp = new Timestamp(serverIdent.getWhen().getTime());
+ Instant updateTimestamp = serverIdent.getWhen().toInstant();
ImmutableList<PatchSetApproval> expectedApprovals =
ImmutableList.of(
PatchSetApproval.builder()
@@ -799,6 +806,9 @@
assertThat(secondRunResult.refsFailedToFix).isEmpty();
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
@Test
public void fixRemoveVoteChangeMessage() throws Exception {
Change c = newChange();
@@ -852,7 +862,7 @@
BackfillResult result = rewriter.backfillProject(project, repo, options);
assertThat(result.fixedRefDiff.keySet()).containsExactly(RefNames.changeMetaRef(c.getId()));
- Timestamp updateTimestamp = new Timestamp(serverIdent.getWhen().getTime());
+ Instant updateTimestamp = serverIdent.getWhen().toInstant();
ImmutableList<PatchSetApproval> expectedApprovals =
ImmutableList.of(
PatchSetApproval.builder()
@@ -922,6 +932,9 @@
assertThat(secondRunResult.refsFailedToFix).isEmpty();
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
@Test
public void fixRemoveVoteChangeMessageWithUnparsableAuthorIdent() throws Exception {
Change c = newChange();
@@ -929,7 +942,7 @@
new PersonIdent(
changeOwner.getName(),
"server@" + serverId,
- TimeUtil.nowTs(),
+ Date.from(TimeUtil.now()),
serverIdent.getTimeZone());
writeUpdate(
RefNames.changeMetaRef(c.getId()),
@@ -1065,7 +1078,7 @@
public void fixRemoveVoteChangeMessageWithNoFooterLabel_matchDuplicateAccounts()
throws Exception {
Account duplicateCodeOwner =
- Account.builder(Account.id(4), TimeUtil.nowTs())
+ Account.builder(Account.id(4), TimeUtil.now())
.setFullName(changeOwner.getName())
.setPreferredEmail("other@test.com")
.build();
@@ -1175,6 +1188,9 @@
assertThat(secondRunResult.refsFailedToFix).isEmpty();
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
@Test
public void fixAttentionFooter() throws Exception {
Change c = newChange();
@@ -1255,46 +1271,46 @@
BackfillResult result = rewriter.backfillProject(project, repo, options);
assertThat(result.fixedRefDiff.keySet()).containsExactly(RefNames.changeMetaRef(c.getId()));
notesBeforeRewrite.getAttentionSetUpdates();
- Timestamp updateTimestamp = new Timestamp(serverIdent.getWhen().getTime());
+ Instant updateTimestamp = serverIdent.getWhen().toInstant();
ImmutableList<AttentionSetUpdate> attentionSetUpdatesBeforeRewrite =
ImmutableList.of(
AttentionSetUpdate.createFromRead(
- invalidRemovedByClickUpdate.getWhen().toInstant(),
+ invalidRemovedByClickUpdate.getWhen(),
changeOwner.getAccountId(),
Operation.REMOVE,
String.format("Removed by %s by clicking the attention icon", otherUser.getName())),
AttentionSetUpdate.createFromRead(
- validAttentionSetUpdate.getWhen().toInstant(),
+ validAttentionSetUpdate.getWhen(),
changeOwner.getAccountId(),
Operation.ADD,
"Added by someone"),
AttentionSetUpdate.createFromRead(
- validAttentionSetUpdate.getWhen().toInstant(),
+ validAttentionSetUpdate.getWhen(),
otherUserId,
Operation.REMOVE,
"Removed by someone"),
AttentionSetUpdate.createFromRead(
- updateTimestamp.toInstant(),
+ updateTimestamp,
changeOwner.getAccountId(),
Operation.REMOVE,
String.format("%s replied on the change", otherUser.getName())),
AttentionSetUpdate.createFromRead(
- updateTimestamp.toInstant(),
+ updateTimestamp,
otherUserId,
Operation.ADD,
"Added by someone using the hovercard menu"),
AttentionSetUpdate.createFromRead(
- invalidMultipleAttentionSetUpdate.getWhen().toInstant(),
+ invalidMultipleAttentionSetUpdate.getWhen(),
otherUserId,
Operation.REMOVE,
String.format("Removed by %s using the hovercard menu", otherUser.getName())),
AttentionSetUpdate.createFromRead(
- invalidMultipleAttentionSetUpdate.getWhen().toInstant(),
+ invalidMultipleAttentionSetUpdate.getWhen(),
changeOwner.getAccountId(),
Operation.ADD,
String.format("%s replied on the change", otherUser.getName())),
AttentionSetUpdate.createFromRead(
- invalidAttentionSetUpdate.getWhen().toInstant(),
+ invalidAttentionSetUpdate.getWhen(),
otherUserId,
Operation.ADD,
String.format("Added by %s using the hovercard menu", otherUser.getName())));
@@ -1302,42 +1318,42 @@
ImmutableList<AttentionSetUpdate> attentionSetUpdatesAfterRewrite =
ImmutableList.of(
AttentionSetUpdate.createFromRead(
- invalidRemovedByClickUpdate.getWhen().toInstant(),
+ invalidRemovedByClickUpdate.getWhen(),
changeOwner.getAccountId(),
Operation.REMOVE,
"Removed by someone by clicking the attention icon"),
AttentionSetUpdate.createFromRead(
- validAttentionSetUpdate.getWhen().toInstant(),
+ validAttentionSetUpdate.getWhen(),
changeOwner.getAccountId(),
Operation.ADD,
"Added by someone"),
AttentionSetUpdate.createFromRead(
- validAttentionSetUpdate.getWhen().toInstant(),
+ validAttentionSetUpdate.getWhen(),
otherUserId,
Operation.REMOVE,
"Removed by someone"),
AttentionSetUpdate.createFromRead(
- updateTimestamp.toInstant(),
+ updateTimestamp,
changeOwner.getAccountId(),
Operation.REMOVE,
"Someone replied on the change"),
AttentionSetUpdate.createFromRead(
- updateTimestamp.toInstant(),
+ updateTimestamp,
otherUserId,
Operation.ADD,
"Added by someone using the hovercard menu"),
AttentionSetUpdate.createFromRead(
- invalidMultipleAttentionSetUpdate.getWhen().toInstant(),
+ invalidMultipleAttentionSetUpdate.getWhen(),
otherUserId,
Operation.REMOVE,
"Removed by someone using the hovercard menu"),
AttentionSetUpdate.createFromRead(
- invalidMultipleAttentionSetUpdate.getWhen().toInstant(),
+ invalidMultipleAttentionSetUpdate.getWhen(),
changeOwner.getAccountId(),
Operation.ADD,
"Someone replied on the change"),
AttentionSetUpdate.createFromRead(
- invalidAttentionSetUpdate.getWhen().toInstant(),
+ invalidAttentionSetUpdate.getWhen(),
otherUserId,
Operation.ADD,
"Added by someone using the hovercard menu"));
@@ -1432,22 +1448,22 @@
thirdAttentionSetUpdate.commit();
attentionSetUpdatesBeforeRewrite.add(
AttentionSetUpdate.createFromRead(
- thirdAttentionSetUpdate.getWhen().toInstant(),
+ thirdAttentionSetUpdate.getWhen(),
changeOwner.getAccountId(),
Operation.REMOVE,
String.format("Removed by %s by clicking the attention icon", okAccountName)),
AttentionSetUpdate.createFromRead(
- secondAttentionSetUpdate.getWhen().toInstant(),
+ secondAttentionSetUpdate.getWhen(),
otherUserId,
Operation.REMOVE,
String.format("Removed by %s using the hovercard menu", okAccountName)),
AttentionSetUpdate.createFromRead(
- secondAttentionSetUpdate.getWhen().toInstant(),
+ secondAttentionSetUpdate.getWhen(),
changeOwner.getAccountId(),
Operation.ADD,
String.format("%s replied on the change", okAccountName)),
AttentionSetUpdate.createFromRead(
- firstAttentionSetUpdate.getWhen().toInstant(),
+ firstAttentionSetUpdate.getWhen(),
otherUserId,
Operation.ADD,
String.format("Added by %s using the hovercard menu", okAccountName)));
@@ -1553,6 +1569,9 @@
assertThat(secondRunResult.refsFailedToFix).isEmpty();
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
@Test
public void fixSubmitChangeMessageAndFooters() throws Exception {
Change c = newChange();
@@ -1560,7 +1579,7 @@
new PersonIdent(
changeOwner.getName(),
changeNoteUtil.getAccountIdAsEmailAddress(changeOwner.getAccountId()),
- TimeUtil.nowTs(),
+ Date.from(TimeUtil.now()),
serverIdent.getTimeZone());
String changeOwnerIdentToFix = getAccountIdentToFix(changeOwner.getAccount());
writeUpdate(
@@ -1756,16 +1775,16 @@
public void fixCodeOwnersOnAddReviewerChangeMessage() throws Exception {
Account reviewer =
- Account.builder(Account.id(3), TimeUtil.nowTs())
+ Account.builder(Account.id(3), TimeUtil.now())
.setFullName("Reviewer User")
.setPreferredEmail("reviewer@account.com")
.build();
accountCache.put(reviewer);
Account duplicateCodeOwner =
- Account.builder(Account.id(4), TimeUtil.nowTs()).setFullName(changeOwner.getName()).build();
+ Account.builder(Account.id(4), TimeUtil.now()).setFullName(changeOwner.getName()).build();
accountCache.put(duplicateCodeOwner);
Account duplicateReviewer =
- Account.builder(Account.id(5), TimeUtil.nowTs()).setFullName(reviewer.getName()).build();
+ Account.builder(Account.id(5), TimeUtil.now()).setFullName(reviewer.getName()).build();
accountCache.put(duplicateReviewer);
Change c = newChange();
ImmutableList.Builder<ObjectId> commitsToFix = new ImmutableList.Builder<>();
@@ -2223,7 +2242,7 @@
getChangeUpdateBody(c, "Assignee deleted: " + otherUser.getName()),
getAuthorIdent(changeOwner.getAccount()));
Account reviewer =
- Account.builder(Account.id(3), TimeUtil.nowTs())
+ Account.builder(Account.id(3), TimeUtil.now())
.setFullName("Reviewer User")
.setPreferredEmail("reviewer@account.com")
.build();
@@ -2262,16 +2281,19 @@
assertThat(secondRunResult.refsFailedToFix).isEmpty();
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
@Test
public void singleRunFixesAll() throws Exception {
Change c = newChange();
- Timestamp when = TimeUtil.nowTs();
+ Instant when = TimeUtil.now();
String assigneeIdentToFix = getAccountIdentToFix(otherUser.getAccount());
PersonIdent authorIdentToFix =
new PersonIdent(
changeOwner.getName(),
changeNoteUtil.getAccountIdAsEmailAddress(changeOwner.getAccountId()),
- when,
+ Date.from(when),
serverIdent.getTimeZone());
RevCommit invalidUpdateCommit =
@@ -2428,7 +2450,6 @@
}
private PersonIdent getAuthorIdent(Account account) {
- Timestamp when = TimeUtil.nowTs();
- return changeNoteUtil.newAccountIdIdent(account.id(), when, serverIdent);
+ return changeNoteUtil.newAccountIdIdent(account.id(), TimeUtil.now(), serverIdent);
}
}
diff --git a/javatests/com/google/gerrit/server/notedb/DraftCommentNotesTest.java b/javatests/com/google/gerrit/server/notedb/DraftCommentNotesTest.java
index 041366c..31b1db0 100644
--- a/javatests/com/google/gerrit/server/notedb/DraftCommentNotesTest.java
+++ b/javatests/com/google/gerrit/server/notedb/DraftCommentNotesTest.java
@@ -89,7 +89,7 @@
0,
otherUser,
null,
- TimeUtil.nowTs(),
+ TimeUtil.now(),
"comment",
(short) 0,
ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234"),
diff --git a/javatests/com/google/gerrit/server/patch/DiffOperationsTest.java b/javatests/com/google/gerrit/server/patch/DiffOperationsTest.java
index 5a8b266..9f0fc29 100644
--- a/javatests/com/google/gerrit/server/patch/DiffOperationsTest.java
+++ b/javatests/com/google/gerrit/server/patch/DiffOperationsTest.java
@@ -32,6 +32,7 @@
import com.google.inject.Inject;
import com.google.inject.Injector;
import java.io.IOException;
+import java.util.Date;
import java.util.Map;
import java.util.Optional;
import org.eclipse.jgit.lib.CommitBuilder;
@@ -256,11 +257,14 @@
: createCommitInRepo(repo, treeId, parentCommit);
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
private static ObjectId createCommitInRepo(Repository repo, ObjectId treeId, ObjectId... parents)
throws IOException {
try (ObjectInserter oi = repo.newObjectInserter()) {
PersonIdent committer =
- new PersonIdent(new PersonIdent("Foo Bar", "foo.bar@baz.com"), TimeUtil.nowTs());
+ new PersonIdent(new PersonIdent("Foo Bar", "foo.bar@baz.com"), Date.from(TimeUtil.now()));
CommitBuilder cb = new CommitBuilder();
cb.setTreeId(treeId);
cb.setCommitter(committer);
diff --git a/javatests/com/google/gerrit/server/patch/MagicFileTest.java b/javatests/com/google/gerrit/server/patch/MagicFileTest.java
index 93928f0..21ea641 100644
--- a/javatests/com/google/gerrit/server/patch/MagicFileTest.java
+++ b/javatests/com/google/gerrit/server/patch/MagicFileTest.java
@@ -95,6 +95,9 @@
assertThat(magicFile.getStartLineOfModifiableContent()).isEqualTo(1);
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
@Test
public void commitMessageFileOfRootCommitContainsCorrectContent() throws Exception {
try (Repository repository = repositoryManager.createRepository(Project.nameKey("repo1"));
@@ -146,6 +149,9 @@
}
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
@Test
public void commitMessageFileOfNonMergeCommitContainsCorrectContent() throws Exception {
try (Repository repository = repositoryManager.createRepository(Project.nameKey("repo1"));
@@ -202,6 +208,9 @@
}
}
+ // TODO(issue-15517): Fix the JdkObsolete issue with Date once JGit's PersonIdent class supports
+ // Instants
+ @SuppressWarnings("JdkObsolete")
@Test
public void commitMessageFileOfMergeCommitContainsCorrectContent() throws Exception {
try (Repository repository = repositoryManager.createRepository(Project.nameKey("repo1"));
diff --git a/javatests/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java b/javatests/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java
index ecdb066..55340e3 100644
--- a/javatests/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java
+++ b/javatests/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java
@@ -142,6 +142,7 @@
import com.google.inject.Provider;
import java.io.IOException;
import java.sql.Timestamp;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -923,6 +924,7 @@
@Test
public void byTopic() throws Exception {
+
TestRepository<Repo> repo = createProject("repo");
ChangeInserter ins1 = newChangeWithTopic(repo, "feature1");
Change change1 = insert(repo, ins1);
@@ -953,6 +955,11 @@
assertQuery("intopic:gerrit", change6, change5);
assertQuery("topic:\"\"", change_no_topic);
assertQuery("intopic:\"\"", change_no_topic);
+
+ assume().that(getSchema().hasField(ChangeField.PREFIX_TOPIC)).isTrue();
+ assertQuery("prefixtopic:feature", change4, change2, change1);
+ assertQuery("prefixtopic:Cher", change3);
+ assertQuery("prefixtopic:feature22");
}
@Test
@@ -1775,8 +1782,9 @@
resetTimeWithClockStep(thirtyHoursInMs, MILLISECONDS);
TestRepository<Repo> repo = createProject("repo");
long startMs = TestTimeUtil.START.toEpochMilli();
- Change change1 = insert(repo, newChange(repo), null, new Timestamp(startMs));
- Change change2 = insert(repo, newChange(repo), null, new Timestamp(startMs + thirtyHoursInMs));
+ Change change1 = insert(repo, newChange(repo), null, Instant.ofEpochMilli(startMs));
+ Change change2 =
+ insert(repo, newChange(repo), null, Instant.ofEpochMilli(startMs + thirtyHoursInMs));
// Stop time so age queries use the same endpoint.
TestTimeUtil.setClockStep(0, MILLISECONDS);
@@ -1815,8 +1823,9 @@
resetTimeWithClockStep(thirtyHoursInMs, MILLISECONDS);
TestRepository<Repo> repo = createProject("repo");
long startMs = TestTimeUtil.START.toEpochMilli();
- Change change1 = insert(repo, newChange(repo), null, new Timestamp(startMs));
- Change change2 = insert(repo, newChange(repo), null, new Timestamp(startMs + thirtyHoursInMs));
+ Change change1 = insert(repo, newChange(repo), null, Instant.ofEpochMilli(startMs));
+ Change change2 =
+ insert(repo, newChange(repo), null, Instant.ofEpochMilli(startMs + thirtyHoursInMs));
TestTimeUtil.setClockStep(0, MILLISECONDS);
// Change1 was last updated on 2009-09-30 21:00:00 -0000
@@ -1866,8 +1875,9 @@
resetTimeWithClockStep(thirtyHoursInMs, MILLISECONDS);
TestRepository<Repo> repo = createProject("repo");
long startMs = TestTimeUtil.START.toEpochMilli();
- Change change1 = insert(repo, newChange(repo), null, new Timestamp(startMs));
- Change change2 = insert(repo, newChange(repo), null, new Timestamp(startMs + thirtyHoursInMs));
+ Change change1 = insert(repo, newChange(repo), null, Instant.ofEpochMilli(startMs));
+ Change change2 =
+ insert(repo, newChange(repo), null, Instant.ofEpochMilli(startMs + thirtyHoursInMs));
TestTimeUtil.setClockStep(0, MILLISECONDS);
// Change1 was last updated on 2009-09-30 21:00:00 -0000
@@ -2177,6 +2187,15 @@
}
@Test
+ public void byHashtagPrefix() throws Exception {
+ assume().that(getSchema().hasField(ChangeField.PREFIX_HASHTAG)).isTrue();
+ List<Change> changes = setUpHashtagChanges();
+ assertQuery("prefixhashtag:a", changes.get(1), changes.get(0));
+ assertQuery("prefixhashtag:aa", changes.get(0));
+ assertQuery("prefixhashtag:bar", changes.get(1));
+ }
+
+ @Test
public void byHashtagRegex() throws Exception {
TestRepository<Repo> repo = createProject("repo");
Change change1 = insert(repo, newChange(repo));
@@ -4134,19 +4153,16 @@
}
protected Change insert(TestRepository<Repo> repo, ChangeInserter ins) throws Exception {
- return insert(repo, ins, null, TimeUtil.nowTs());
+ return insert(repo, ins, null, TimeUtil.now());
}
protected Change insert(TestRepository<Repo> repo, ChangeInserter ins, @Nullable Account.Id owner)
throws Exception {
- return insert(repo, ins, owner, TimeUtil.nowTs());
+ return insert(repo, ins, owner, TimeUtil.now());
}
protected Change insert(
- TestRepository<Repo> repo,
- ChangeInserter ins,
- @Nullable Account.Id owner,
- Timestamp createdOn)
+ TestRepository<Repo> repo, ChangeInserter ins, @Nullable Account.Id owner, Instant createdOn)
throws Exception {
Project.NameKey project =
Project.nameKey(repo.getRepository().getDescription().getRepositoryName());
@@ -4172,7 +4188,7 @@
.create(changeNotesFactory.createChecked(c), PatchSet.id(c.getId(), n), commit)
.setFireRevisionCreated(false)
.setValidate(false);
- try (BatchUpdate bu = updateFactory.create(c.getProject(), user, TimeUtil.nowTs());
+ try (BatchUpdate bu = updateFactory.create(c.getProject(), user, TimeUtil.now());
ObjectInserter oi = repo.getRepository().newObjectInserter();
ObjectReader reader = oi.newReader();
RevWalk rw = new RevWalk(reader)) {
@@ -4311,7 +4327,7 @@
}
protected static long lastUpdatedMs(Change c) {
- return c.getLastUpdatedOn().getTime();
+ return c.getLastUpdatedOn().toEpochMilli();
}
// Get the last updated time from ChangeApi
diff --git a/javatests/com/google/gerrit/server/query/change/ChangeDataTest.java b/javatests/com/google/gerrit/server/query/change/ChangeDataTest.java
index e42230f..e48d4af 100644
--- a/javatests/com/google/gerrit/server/query/change/ChangeDataTest.java
+++ b/javatests/com/google/gerrit/server/query/change/ChangeDataTest.java
@@ -46,7 +46,7 @@
.id(PatchSet.id(changeId, num))
.commitId(ObjectId.zeroId())
.uploader(Account.id(1234))
- .createdOn(TimeUtil.nowTs())
+ .createdOn(TimeUtil.now())
.build();
}
}
diff --git a/javatests/com/google/gerrit/server/restapi/change/CommentPorterTest.java b/javatests/com/google/gerrit/server/restapi/change/CommentPorterTest.java
index 47bfb2a..4c8750a 100644
--- a/javatests/com/google/gerrit/server/restapi/change/CommentPorterTest.java
+++ b/javatests/com/google/gerrit/server/restapi/change/CommentPorterTest.java
@@ -41,7 +41,7 @@
import com.google.gerrit.server.patch.DiffOptions;
import com.google.gerrit.server.restapi.change.CommentPorter.Metrics;
import com.google.gerrit.truth.NullAwareCorrespondence;
-import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Arrays;
import java.util.Optional;
import org.eclipse.jgit.lib.ObjectId;
@@ -231,7 +231,7 @@
changeId,
Account.id(123),
BranchNameKey.create(project, "myBranch"),
- new Timestamp(12345));
+ Instant.ofEpochMilli(12345));
}
private PatchSet createPatchset(PatchSet.Id id) {
@@ -239,7 +239,7 @@
.id(id)
.commitId(dummyObjectId)
.uploader(Account.id(123))
- .createdOn(new Timestamp(12345))
+ .createdOn(Instant.ofEpochMilli(12345))
.build();
}
@@ -262,7 +262,7 @@
return new HumanComment(
new Comment.Key(getUniqueUuid(), filePath, patchsetId.get()),
Account.id(100),
- new Timestamp(1234),
+ Instant.ofEpochMilli(1234),
(short) 1,
"Comment text",
"serverId",
diff --git a/javatests/com/google/gerrit/server/restapi/change/ListChangeCommentsTest.java b/javatests/com/google/gerrit/server/restapi/change/ListChangeCommentsTest.java
index 44c3cef..2685a8b 100644
--- a/javatests/com/google/gerrit/server/restapi/change/ListChangeCommentsTest.java
+++ b/javatests/com/google/gerrit/server/restapi/change/ListChangeCommentsTest.java
@@ -23,6 +23,9 @@
import com.google.gerrit.server.ChangeMessagesUtil;
import com.google.gerrit.server.CommentsUtil;
import java.sql.Timestamp;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@@ -124,9 +127,11 @@
/** Create a new change message with an id, message, timestamp and tag */
private static ChangeMessage newChangeMessage(String id, String message, String ts, String tag) {
ChangeMessage.Key key = ChangeMessage.key(Change.id(1), id);
- ChangeMessage cm =
- ChangeMessage.create(
- key, null, Timestamp.valueOf("2000-01-01 00:00:" + ts), null, message, null, tag);
+ Instant timestamp =
+ DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
+ .withZone(ZoneId.systemDefault())
+ .parse("2000-01-01 00:00:" + ts, Instant::from);
+ ChangeMessage cm = ChangeMessage.create(key, null, timestamp, null, message, null, tag);
return cm;
}
diff --git a/javatests/com/google/gerrit/server/rules/IgnoreSelfApprovalRuleTest.java b/javatests/com/google/gerrit/server/rules/IgnoreSelfApprovalRuleTest.java
index e5dd817..509447a 100644
--- a/javatests/com/google/gerrit/server/rules/IgnoreSelfApprovalRuleTest.java
+++ b/javatests/com/google/gerrit/server/rules/IgnoreSelfApprovalRuleTest.java
@@ -27,7 +27,6 @@
import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Date;
import java.util.List;
import org.junit.Test;
@@ -84,7 +83,7 @@
return PatchSetApproval.builder()
.key(PatchSetApproval.key(PS_ID, accountId, labelId))
.value(value)
- .granted(Date.from(Instant.now()))
+ .granted(Instant.now())
.build();
}
diff --git a/javatests/com/google/gerrit/server/update/BatchUpdateTest.java b/javatests/com/google/gerrit/server/update/BatchUpdateTest.java
index 10599c6..1f22564 100644
--- a/javatests/com/google/gerrit/server/update/BatchUpdateTest.java
+++ b/javatests/com/google/gerrit/server/update/BatchUpdateTest.java
@@ -95,7 +95,7 @@
RevCommit masterCommit = repo.branch("master").commit().create();
RevCommit branchCommit = repo.branch("branch").commit().parent(masterCommit).create();
- try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.now())) {
bu.addRepoOnlyOp(
new RepoOnlyOp() {
@Override
@@ -114,7 +114,7 @@
public void cannotExceedMaxUpdates() throws Exception {
Change.Id id = createChangeWithUpdates(MAX_UPDATES);
ObjectId oldMetaId = getMetaId(id);
- try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.now())) {
bu.addOp(id, new AddMessageOp("Excessive update"));
ResourceConflictException thrown = assertThrows(ResourceConflictException.class, bu::execute);
assertThat(thrown)
@@ -130,7 +130,7 @@
Change.Id id = createChangeWithPatchSets(2);
ObjectId oldMetaId = getMetaId(id);
- try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.now())) {
bu.addOp(id, new AddMessageOp("Update on PS1", PatchSet.id(id, 1)));
bu.addOp(id, new AddMessageOp("Update on PS2", PatchSet.id(id, 2)));
ResourceConflictException thrown = assertThrows(ResourceConflictException.class, bu::execute);
@@ -146,7 +146,7 @@
public void exceedingMaxUpdatesAllowedWithCompleteNoOp() throws Exception {
Change.Id id = createChangeWithUpdates(MAX_UPDATES);
ObjectId oldMetaId = getMetaId(id);
- try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.now())) {
bu.addOp(
id,
new BatchUpdateOp() {
@@ -165,7 +165,7 @@
public void exceedingMaxUpdatesAllowedWithNoOpAfterPopulatingUpdate() throws Exception {
Change.Id id = createChangeWithUpdates(MAX_UPDATES);
ObjectId oldMetaId = getMetaId(id);
- try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.now())) {
bu.addOp(
id,
new BatchUpdateOp() {
@@ -185,7 +185,7 @@
public void exceedingMaxUpdatesAllowedWithSubmit() throws Exception {
Change.Id id = createChangeWithUpdates(MAX_UPDATES);
ObjectId oldMetaId = getMetaId(id);
- try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.now())) {
bu.addOp(id, new SubmitOp());
bu.execute();
}
@@ -197,7 +197,7 @@
public void exceedingMaxUpdatesAllowedWithSubmitAfterOtherOp() throws Exception {
Change.Id id = createChangeWithPatchSets(2);
ObjectId oldMetaId = getMetaId(id);
- try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.now())) {
bu.addOp(id, new AddMessageOp("Message on PS1", PatchSet.id(id, 1)));
bu.addOp(id, new SubmitOp());
bu.execute();
@@ -212,7 +212,7 @@
public void exceedingMaxUpdatesAllowedWithAbandon() throws Exception {
Change.Id id = createChangeWithUpdates(MAX_UPDATES);
ObjectId oldMetaId = getMetaId(id);
- try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.now())) {
bu.addOp(
id,
new BatchUpdateOp() {
@@ -235,7 +235,7 @@
Change.Id changeId = createChangeWithPatchSets(MAX_PATCH_SETS);
ObjectId oldMetaId = getMetaId(changeId);
ChangeNotes notes = changeNotesFactory.create(project, changeId);
- try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.now())) {
ObjectId commitId =
repo.amend(notes.getCurrentPatchSet().commitId()).message("kaboom").create();
bu.addOp(
@@ -257,7 +257,7 @@
Change.Id changeId = createChangeWithUpdates(1);
ChangeNotes notes = changeNotesFactory.create(project, changeId);
- try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.now())) {
ObjectId commitId =
repo.amend(notes.getCurrentPatchSet().commitId())
.add("bar.txt", "bar")
@@ -285,7 +285,7 @@
int cacheSizeBefore = diffSummaryCache.asMap().size();
// We don't want to depend on the test helper used above so we perform an explicit commit here.
- try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.now())) {
ObjectId commitId =
repo.amend(notes.getCurrentPatchSet().commitId())
.add("bar.txt", "bar")
@@ -309,7 +309,7 @@
checkArgument(totalUpdates > 0);
checkArgument(totalUpdates <= MAX_UPDATES);
Change.Id id = Change.id(sequences.nextChangeId());
- try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.now())) {
bu.insertChange(
changeInserterFactory.create(
id, repo.commit().message("Change").insertChangeId().create(), "refs/heads/master"));
@@ -317,7 +317,7 @@
}
assertThat(getUpdateCount(id)).isEqualTo(1);
for (int i = 2; i <= totalUpdates; i++) {
- try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.now())) {
bu.addOp(id, new AddMessageOp("Update " + i));
bu.execute();
}
@@ -331,7 +331,7 @@
Change.Id id = createChangeWithUpdates(MAX_UPDATES - 2);
ChangeNotes notes = changeNotesFactory.create(project, id);
for (int i = 2; i <= patchSets; ++i) {
- try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.nowTs())) {
+ try (BatchUpdate bu = batchUpdateFactory.create(project, user.get(), TimeUtil.now())) {
ObjectId commitId =
repo.amend(notes.getCurrentPatchSet().commitId()).message("PS" + i).create();
bu.addOp(
diff --git a/lib/BUILD b/lib/BUILD
index 01e6a25..ce83ba1 100644
--- a/lib/BUILD
+++ b/lib/BUILD
@@ -535,18 +535,6 @@
exports = ["@icu4j//jar"],
)
-java_library(
- name = "javax-annotation",
- data = ["//lib:LICENSE-DO_NOT_DISTRIBUTE"],
- visibility = [
- "//java/com/google/gerrit/acceptance:__pkg__",
- "//java/com/google/gerrit/extensions:__pkg__",
- "//java/com/google/gerrit/server:__pkg__",
- "//plugins:__subpackages__",
- ],
- exports = ["@javax-annotation//jar"],
-)
-
sh_test(
name = "nongoogle_test",
srcs = ["nongoogle_test.sh"],
diff --git a/modules/jgit b/modules/jgit
index 3571358..4d34cdf 160000
--- a/modules/jgit
+++ b/modules/jgit
@@ -1 +1 @@
-Subproject commit 35713588fe739af74081d12fabc6c6017ee56c00
+Subproject commit 4d34cdf3459022d0878dfbd099c6f7b7ea03ea73
diff --git a/plugins/delete-project b/plugins/delete-project
index fac8815..5717bad 160000
--- a/plugins/delete-project
+++ b/plugins/delete-project
@@ -1 +1 @@
-Subproject commit fac8815949114d58b65dceda355bf80f7ec2adee
+Subproject commit 5717badf4250dfe900c05fc00d0758a09ba77297
diff --git a/plugins/gitiles b/plugins/gitiles
index fa993c0..97ce60f 160000
--- a/plugins/gitiles
+++ b/plugins/gitiles
@@ -1 +1 @@
-Subproject commit fa993c05a1861c766c79cc304cc2ce4e9ae2905a
+Subproject commit 97ce60f8bb4dbf40dde79cf56db6425c384dabcf
diff --git a/plugins/plugin-manager b/plugins/plugin-manager
index 367f434..dbd6820 160000
--- a/plugins/plugin-manager
+++ b/plugins/plugin-manager
@@ -1 +1 @@
-Subproject commit 367f43435c8c0699828abe24e765e4fc0881737e
+Subproject commit dbd68200d867513e2c0449798476e275aaf08cfd
diff --git a/plugins/replication b/plugins/replication
index 36ed18a..e19028c 160000
--- a/plugins/replication
+++ b/plugins/replication
@@ -1 +1 @@
-Subproject commit 36ed18af69d005a7cf89a9bba2f2585ead8d46da
+Subproject commit e19028c4f7e5d26bbc4be7762aa96434bf1d7781
diff --git a/plugins/reviewnotes b/plugins/reviewnotes
index a28ae59..6226d01 160000
--- a/plugins/reviewnotes
+++ b/plugins/reviewnotes
@@ -1 +1 @@
-Subproject commit a28ae590486934690e4e0a95d7eb75f8b60644a6
+Subproject commit 6226d01c563846ae479cb4fdafd698b31472772c
diff --git a/plugins/webhooks b/plugins/webhooks
index 3b1ca2e..7830135 160000
--- a/plugins/webhooks
+++ b/plugins/webhooks
@@ -1 +1 @@
-Subproject commit 3b1ca2e743ac74c3f1f4181b9b708b8fdf76c0af
+Subproject commit 7830135fd85ff9de10a8ca1f2e6112af59fca15f
diff --git a/polygerrit-ui/app/BUILD b/polygerrit-ui/app/BUILD
index 898de14..80e208d 100644
--- a/polygerrit-ui/app/BUILD
+++ b/polygerrit-ui/app/BUILD
@@ -15,6 +15,7 @@
"embed",
"gr-diff",
"mixins",
+ "models",
"samples",
"scripts",
"services",
@@ -118,7 +119,7 @@
"elements/gr-app-element_html.ts",
"elements/settings/gr-watched-projects-editor/gr-watched-projects-editor_html.ts",
"elements/shared/gr-account-list/gr-account-list_html.ts",
- "services/dependency.ts",
+ "models/dependency.ts",
]
sources_for_template_checking = glob(
diff --git a/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog.ts b/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog.ts
index 88ade26..bed1c54 100644
--- a/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog.ts
+++ b/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog.ts
@@ -36,6 +36,8 @@
import {BindValueChangeEvent} from '../../../types/events';
import {fireEvent} from '../../../utils/event-util';
import {subscribe} from '../../lit/subscription-controller';
+import {configModelToken} from '../../../models/config/config-model';
+import {resolve} from '../../../models/dependency';
const SUGGESTIONS_LIMIT = 15;
const REF_PREFIX = 'refs/heads/';
@@ -76,7 +78,7 @@
private readonly restApiService = getAppContext().restApiService;
- private readonly configModel = getAppContext().configModel;
+ private readonly configModel = resolve(this, configModelToken);
constructor() {
super();
@@ -87,7 +89,7 @@
super.connectedCallback();
if (!this.repoName) return;
- subscribe(this, this.configModel.serverConfig$, config => {
+ subscribe(this, this.configModel().serverConfig$, config => {
this.privateChangesEnabled =
config?.change?.disable_private_changes ?? false;
});
diff --git a/polygerrit-ui/app/elements/admin/gr-create-repo-dialog/gr-create-repo-dialog.ts b/polygerrit-ui/app/elements/admin/gr-create-repo-dialog/gr-create-repo-dialog.ts
index b2e8ce6..ea9495c 100644
--- a/polygerrit-ui/app/elements/admin/gr-create-repo-dialog/gr-create-repo-dialog.ts
+++ b/polygerrit-ui/app/elements/admin/gr-create-repo-dialog/gr-create-repo-dialog.ts
@@ -138,7 +138,7 @@
id="rightsInheritFromInput"
.text=${convertToString(this.repoConfig.parent)}
.query=${this.query}
- .placeholder="Optional, defaults to 'All-Projects'"
+ .placeholder=${"Optional, defaults to 'All-Projects'"}
@text-changed=${this.handleRightsTextChanged}
>
</gr-autocomplete>
diff --git a/polygerrit-ui/app/elements/admin/gr-group/gr-group.ts b/polygerrit-ui/app/elements/admin/gr-group/gr-group.ts
index a8f3141..0b01d45 100644
--- a/polygerrit-ui/app/elements/admin/gr-group/gr-group.ts
+++ b/polygerrit-ui/app/elements/admin/gr-group/gr-group.ts
@@ -248,7 +248,7 @@
?disabled=${this.computeGroupDisabled()}
.text=${this.groupConfig?.description}
@text-changed=${this.handleDescriptionTextChanged}
- >
+ ></gr-textarea>
</div>
<span class="value" ?disabled=${this.computeGroupDisabled()}>
<gr-button
diff --git a/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.ts b/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.ts
index 3292cd7..d21feae 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.ts
+++ b/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.ts
@@ -267,7 +267,7 @@
?disabled=${this.readOnly}
.text=${this.repoConfig?.description}
@text-changed=${this.handleDescriptionTextChanged}
- >
+ ></gr-textarea>
</fieldset>
`;
}
@@ -599,7 +599,6 @@
id="maxGitObjSizeIronInput"
.bindValue=${this.repoConfig?.max_object_size_limit
?.configured_value}
- type="text"
?disabled=${this.readOnly}
@bind-value-changed=${this.handleMaxGitObjSizeBindValueChanged}
>
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.ts b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.ts
index 2ea22ef..c161204 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.ts
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.ts
@@ -504,7 +504,7 @@
return html`
<td class="cell size">
- <gr-tooltip-content hasTooltip title="${this.computeSizeTooltip()}">
+ <gr-tooltip-content has-tooltip title="${this.computeSizeTooltip()}">
${this.renderChangeSize()}
</gr-tooltip-content>
</td>
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list/gr-change-list.ts b/polygerrit-ui/app/elements/change-list/gr-change-list/gr-change-list.ts
index 1185fe8..92547e5 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list/gr-change-list.ts
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list/gr-change-list.ts
@@ -292,7 +292,7 @@
) {
return html`
<tr class="noChanges">
- <td class="leftPadding" ?aria-hidden="true"></td>
+ <td class="leftPadding" aria-hidden="true"></td>
<td
class="star"
?aria-hidden=${!this.showStar}
@@ -318,7 +318,7 @@
) {
return html`
<tr class="groupTitle">
- <td class="leftPadding" ?aria-hidden="true"></td>
+ <td class="leftPadding" aria-hidden="true"></td>
<td
class="star"
aria-label="Star status column"
diff --git a/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary.ts b/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary.ts
index 27cdac3..c90359e 100644
--- a/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary.ts
@@ -59,8 +59,8 @@
import {modifierPressed} from '../../../utils/dom-util';
import {DropdownLink} from '../../shared/gr-dropdown/gr-dropdown';
import {fontStyles} from '../../../styles/gr-font-styles';
-import {commentsModelToken} from '../../../services/comments/comments-model';
-import {resolve} from '../../../services/dependency';
+import {commentsModelToken} from '../../../models/comments/comments-model';
+import {resolve} from '../../../models/dependency';
export enum SummaryChipStyles {
INFO = 'info',
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
index 5a54599..18eda12 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
@@ -197,8 +197,8 @@
} from '../../../utils/attention-set-util';
import {listen} from '../../../services/shortcuts/shortcuts-service';
import {LoadingStatus} from '../../../services/change/change-model';
-import {commentsModelToken} from '../../../services/comments/comments-model';
-import {resolve, DIPolymerElement} from '../../../services/dependency';
+import {commentsModelToken} from '../../../models/comments/comments-model';
+import {resolve, DIPolymerElement} from '../../../models/dependency';
const MIN_LINES_FOR_COMMIT_COLLAPSE = 18;
@@ -1314,6 +1314,7 @@
// need to reload anything and we render the change view component as is.
document.documentElement.scrollTop = this.scrollPosition ?? 0;
this.reporting.reportInteraction('change-view-re-rendered');
+ this.updateTitle(this._change);
// We still need to check if post load tasks need to be done such as when
// user wants to open the reply dialog when in the diff page, the change
// page should open the reply dialog
@@ -1504,6 +1505,12 @@
this.set('viewState.patchRange', this._patchRange);
}
+ private updateTitle(change?: ChangeInfo | ParsedChangeInfo) {
+ if (!change) return;
+ const title = change.subject + ' (' + change.change_id.substr(0, 9) + ')';
+ fireTitleChange(this, title);
+ }
+
_changeChanged(change?: ChangeInfo | ParsedChangeInfo) {
if (!change || !this._patchRange || !this._allPatchSets) {
return;
@@ -1519,9 +1526,7 @@
);
this.set('_patchRange.basePatchNum', parent);
-
- const title = change.subject + ' (' + change.change_id.substr(0, 9) + ')';
- fireTitleChange(this, title);
+ this.updateTitle(change);
}
/**
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-submit-dialog/gr-confirm-submit-dialog.ts b/polygerrit-ui/app/elements/change/gr-confirm-submit-dialog/gr-confirm-submit-dialog.ts
index 9bcedc8..aeff1c7 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-submit-dialog/gr-confirm-submit-dialog.ts
+++ b/polygerrit-ui/app/elements/change/gr-confirm-submit-dialog/gr-confirm-submit-dialog.ts
@@ -31,8 +31,8 @@
import {subscribe} from '../../lit/subscription-controller';
import {getAppContext} from '../../../services/app-context';
import {ParsedChangeInfo} from '../../../types/types';
-import {commentsModelToken} from '../../../services/comments/comments-model';
-import {resolve} from '../../../services/dependency';
+import {commentsModelToken} from '../../../models/comments/comments-model';
+import {resolve} from '../../../models/dependency';
@customElement('gr-confirm-submit-dialog')
export class GrConfirmSubmitDialog extends LitElement {
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.ts b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.ts
index 94039f4..441c233 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.ts
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.ts
@@ -85,9 +85,9 @@
import {RevisionInfo} from '../../shared/revision-info/revision-info';
import {listen} from '../../../services/shortcuts/shortcuts-service';
import {select} from '../../../utils/observable-util';
-import {resolve, DIPolymerElement} from '../../../services/dependency';
-import {browserModelToken} from '../../../services/browser/browser-model';
-import {commentsModelToken} from '../../../services/comments/comments-model';
+import {resolve, DIPolymerElement} from '../../../models/dependency';
+import {browserModelToken} from '../../../models/browser/browser-model';
+import {commentsModelToken} from '../../../models/comments/comments-model';
export const DEFAULT_NUM_FILES_SHOWN = 200;
@@ -221,7 +221,7 @@
_loggedIn = false;
@property({type: Array})
- _reviewed?: string[] = [];
+ reviewed?: string[] = [];
@property({type: Object, notify: true, observer: '_updateDiffPreferences'})
diffPrefs?: DiffPreferencesInfo;
@@ -318,6 +318,8 @@
private readonly userModel = getAppContext().userModel;
+ private readonly changeModel = getAppContext().changeModel;
+
private readonly getCommentsModel = resolve(this, commentsModelToken);
private readonly getBrowserModel = resolve(this, browserModelToken);
@@ -394,6 +396,9 @@
).subscribe(sizeBarInChangeTable => {
this._showSizeBars = sizeBarInChangeTable;
}),
+ this.changeModel.reviewedFiles$.subscribe(reviewedFiles => {
+ this.reviewed = reviewedFiles ?? [];
+ }),
];
getPluginLoader()
@@ -470,7 +475,7 @@
this._loading = true;
this.collapseAllDiffs();
- const promises = [];
+ const promises: Promise<boolean | void>[] = [];
promises.push(
this.restApiService
@@ -481,19 +486,7 @@
);
promises.push(
- this._getLoggedIn()
- .then(loggedIn => (this._loggedIn = loggedIn))
- .then(loggedIn => {
- if (!loggedIn) {
- return;
- }
-
- return this._getReviewedFiles(changeNum, patchRange).then(
- reviewed => {
- this._reviewed = reviewed;
- }
- );
- })
+ this._getLoggedIn().then(loggedIn => (this._loggedIn = loggedIn))
);
return Promise.all(promises).then(() => {
@@ -755,7 +748,7 @@
throw new Error('changeNum and patchRange must be set');
}
- return this.restApiService.saveFileReviewed(
+ return this.changeModel.setReviewedFilesStatus(
this.changeNum,
this.patchRange.patchNum,
path,
@@ -780,8 +773,7 @@
const paths = Object.keys(response).sort(specialFilePathCompare);
const files: NormalizedFileInfo[] = [];
for (let i = 0; i < paths.length; i++) {
- // TODO(TS): make copy instead of as NormalizedFileInfo
- const info = response[paths[i]] as NormalizedFileInfo;
+ const info = {...response[paths[i]]} as NormalizedFileInfo;
info.__path = paths[i];
info.lines_inserted = info.lines_inserted || 0;
info.lines_deleted = info.lines_deleted || 0;
@@ -1133,7 +1125,7 @@
'_filesByPath',
'changeComments',
'patchRange',
- '_reviewed',
+ 'reviewed',
'_loading'
)
_computeFiles(
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.js b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.js
index e212bcb..bd12eae 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.js
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.js
@@ -662,7 +662,7 @@
});
test('file review status', () => {
- element._reviewed = ['/COMMIT_MSG', 'myfile.txt'];
+ element.reviewed = ['/COMMIT_MSG', 'myfile.txt'];
element._filesByPath = {
'/COMMIT_MSG': {},
'file_added_in_rev2.txt': {},
@@ -1509,7 +1509,7 @@
size: 100,
},
};
- element._reviewed = ['/COMMIT_MSG', 'myfile.txt'];
+ element.reviewed = ['/COMMIT_MSG', 'myfile.txt'];
element._loggedIn = true;
element.changeNum = '42';
element.patchRange = {
diff --git a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.ts b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.ts
index 8ae0115..6b1ecf2 100644
--- a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.ts
+++ b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.ts
@@ -50,8 +50,8 @@
FormattedReviewerUpdateInfo,
ParsedChangeInfo,
} from '../../../types/types';
-import {commentsModelToken} from '../../../services/comments/comments-model';
-import {resolve, DIPolymerElement} from '../../../services/dependency';
+import {commentsModelToken} from '../../../models/comments/comments-model';
+import {resolve, DIPolymerElement} from '../../../models/dependency';
/**
* The content of the enum is also used in the UI for the button text.
diff --git a/polygerrit-ui/app/elements/checks/gr-checks-action.ts b/polygerrit-ui/app/elements/checks/gr-checks-action.ts
index 74d0e30..bec6e08 100644
--- a/polygerrit-ui/app/elements/checks/gr-checks-action.ts
+++ b/polygerrit-ui/app/elements/checks/gr-checks-action.ts
@@ -72,7 +72,7 @@
private renderTooltip() {
if (!this.action.tooltip) return;
return html`
- <paper-tooltip offset="5" fit-to-visible-bounds>
+ <paper-tooltip offset="5" ?fitToVisibleBounds=${true}>
${this.action.tooltip}
</paper-tooltip>
`;
diff --git a/polygerrit-ui/app/elements/checks/gr-checks-results.ts b/polygerrit-ui/app/elements/checks/gr-checks-results.ts
index 7097c21..7f66423 100644
--- a/polygerrit-ui/app/elements/checks/gr-checks-results.ts
+++ b/polygerrit-ui/app/elements/checks/gr-checks-results.ts
@@ -67,6 +67,8 @@
import {subscribe} from '../lit/subscription-controller';
import {fontStyles} from '../../styles/gr-font-styles';
import {fire} from '../../utils/event-util';
+import {resolve} from '../../models/dependency';
+import {configModelToken} from '../../models/config/config-model';
/**
* Firing this event sets the regular expression of the results filter.
@@ -106,8 +108,8 @@
private checksModel = getAppContext().checksModel;
- constructor() {
- super();
+ override connectedCallback() {
+ super.connectedCallback();
subscribe(this, this.changeModel.labels$, x => (this.labels = x));
}
@@ -542,12 +544,10 @@
>
<span>${tag.name}</span>
<paper-tooltip offset="5" ?fitToVisibleBounds="${true}">
- ${
- tag.tooltip ??
- 'A category tag for this check result. Click to filter.'
- }
+ ${tag.tooltip ??
+ 'A category tag for this check result. Click to filter.'}
</paper-tooltip>
- </div>`;
+ </button>`;
}
}
@@ -561,7 +561,7 @@
private changeModel = getAppContext().changeModel;
- private configModel = getAppContext().configModel;
+ private configModel = resolve(this, configModelToken);
static override get styles() {
return [
@@ -584,9 +584,9 @@
];
}
- constructor() {
- super();
- subscribe(this, this.configModel.repoConfig$, x => (this.repoConfig = x));
+ override connectedCallback() {
+ super.connectedCallback();
+ subscribe(this, this.configModel().repoConfig$, x => (this.repoConfig = x));
}
override render() {
diff --git a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.ts b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.ts
index 21d9b97..5cc3737 100644
--- a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.ts
+++ b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.ts
@@ -38,6 +38,8 @@
import {LitElement, PropertyValues, html, css} from 'lit';
import {customElement, property, state} from 'lit/decorators';
import {fireEvent} from '../../../utils/event-util';
+import {resolve} from '../../../models/dependency';
+import {configModelToken} from '../../../models/config/config-model';
type MainHeaderLink = RequireProperties<DropdownLink, 'url' | 'name'>;
@@ -153,7 +155,7 @@
private readonly userModel = getAppContext().userModel;
- private readonly configModel = getAppContext().configModel;
+ private readonly configModel = resolve(this, configModelToken);
private subscriptions: Subscription[] = [];
@@ -172,7 +174,7 @@
})
);
this.subscriptions.push(
- this.configModel.serverConfig$.subscribe(config => {
+ this.configModel().serverConfig$.subscribe(config => {
if (!config) return;
this.serverConfig = config;
this.retrieveFeedbackURL(config);
diff --git a/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar.ts b/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar.ts
index 8912551..4d52ee9 100644
--- a/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar.ts
+++ b/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar.ts
@@ -221,7 +221,7 @@
multi
.threshold=${this.threshold}
tab-complete
- verticalOffset="30"
+ .verticalOffset=${30}
@commit=${(e: Event) => {
this.handleInputCommit(e);
}}
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-element.ts b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-element.ts
index 7ab24ab..ee44b2b 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-element.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-element.ts
@@ -44,7 +44,11 @@
import {DiffViewMode, RenderPreferences} from '../../../api/diff';
import {createDefaultDiffPrefs, Side} from '../../../constants/constants';
import {GrDiffLine, LineNumber} from '../gr-diff/gr-diff-line';
-import {GrDiffGroup} from '../gr-diff/gr-diff-group';
+import {
+ GrDiffGroup,
+ GrDiffGroupType,
+ hideInContextControl,
+} from '../gr-diff/gr-diff-group';
import {PolymerSpliceChange} from '@polymer/polymer/interfaces';
import {getLineNumber, getSideByLineEl} from '../gr-diff/gr-diff-utils';
import {fireAlert, fireEvent} from '../../../utils/event-util';
@@ -206,7 +210,8 @@
this.addEventListener(
'diff-context-expanded',
(e: CustomEvent<DiffContextExpandedEventDetail>) => {
- // Don't stop propagation. The host may listen for reporting or resizing.
+ // Don't stop propagation. The host may listen for reporting or
+ // resizing.
this.rerenderSection(e.detail.groups, e.detail.section);
}
);
@@ -337,6 +342,50 @@
}
/**
+ * When the line is hidden behind a context expander, expand it.
+ *
+ * @param lineNum A line number to expand. Using number here because other
+ * special case line numbers are never hidden, so it does not make sense
+ * to expand them.
+ * @param side The side the line number refer to.
+ */
+ unhideLine(lineNum: number, side: Side) {
+ if (!this._builder) return;
+ const groupIndex = this.$.processor.groups.findIndex(group =>
+ group.containsLine(side, lineNum)
+ );
+ // Cannot unhide a line that is not part of the diff.
+ if (groupIndex < 0) return;
+ const group = this._groups[groupIndex];
+ // If it's already visible, great!
+ if (group.type !== GrDiffGroupType.CONTEXT_CONTROL) return;
+ const lineRange = group.lineRange[side];
+ const lineOffset = lineNum - lineRange.start_line;
+ const newGroups = [];
+ const groups = hideInContextControl(
+ group.contextGroups,
+ 0,
+ lineOffset - 1 - this.prefs.context
+ );
+ // If there is a context group, it will be the first group because we
+ // start hiding from 0 offset
+ if (groups[0].type === GrDiffGroupType.CONTEXT_CONTROL) {
+ newGroups.push(groups.shift()!);
+ }
+ newGroups.push(
+ ...hideInContextControl(
+ groups,
+ lineOffset + 1 + this.prefs.context,
+ // Both ends inclusive, so difference is the offset of the last line.
+ // But we need to pass the first line not to hide, which is the element
+ // after.
+ lineRange.end_line - lineRange.start_line + 1
+ )
+ );
+ this._builder.spliceGroups(groupIndex, 1, ...newGroups);
+ }
+
+ /**
* Replace the provided section by rendering the provided groups.
*
* @param newGroups The groups to be rendered in the place of the section.
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-element_test.js b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-element_test.js
index 9f42e9e..0e74dfe 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-element_test.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-element_test.js
@@ -26,7 +26,7 @@
import {GrDiffBuilder} from './gr-diff-builder.js';
import {GrDiffBuilderSideBySide} from './gr-diff-builder-side-by-side.js';
import {html} from '@polymer/polymer/lib/utils/html-tag.js';
-import {DiffViewMode} from '../../../api/diff.js';
+import {DiffViewMode, Side} from '../../../api/diff.js';
import {stubRestApi} from '../../../test/test-utils.js';
import {afterNextRender} from '@polymer/polymer/lib/utils/render-status';
@@ -884,6 +884,27 @@
assert.include(diffRows[12].textContent, 'after');
assert.include(diffRows[13].textContent, 'unchanged 11');
});
+
+ test('unhideLine shows the line with context', () => {
+ element.unhideLine(4, Side.LEFT);
+
+ const diffRows = element.querySelectorAll('.diff-row');
+ // The first two are LOST and FILE line
+ // Lines 3-5 (Line 4 plus 1 context in each direction) will be expanded
+ // Because context expanders do not hide <3 lines, lines 1-2 will also
+ // be shown.
+ // Lines 6-9 continue to be hidden
+ assert.equal(diffRows.length, 2 + 5 + 1 + 1 + 1);
+ assert.include(diffRows[2].textContent, 'unchanged 1');
+ assert.include(diffRows[3].textContent, 'unchanged 2');
+ assert.include(diffRows[4].textContent, 'unchanged 3');
+ assert.include(diffRows[5].textContent, 'unchanged 4');
+ assert.include(diffRows[6].textContent, 'unchanged 5');
+ assert.include(diffRows[7].textContent, 'unchanged 10');
+ assert.include(diffRows[8].textContent, 'before');
+ assert.include(diffRows[8].textContent, 'after');
+ assert.include(diffRows[9].textContent, 'unchanged 11');
+ });
});
suite('mock-diff', () => {
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.ts b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.ts
index 9aafd36..de439cd 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.ts
@@ -88,9 +88,9 @@
import {ChangeComments} from '../gr-comment-api/gr-comment-api';
import {Subscription} from 'rxjs';
import {DisplayLine, RenderPreferences} from '../../../api/diff';
-import {resolve, DIPolymerElement} from '../../../services/dependency';
-import {browserModelToken} from '../../../services/browser/browser-model';
-import {commentsModelToken} from '../../../services/comments/comments-model';
+import {resolve, DIPolymerElement} from '../../../models/dependency';
+import {browserModelToken} from '../../../models/browser/browser-model';
+import {commentsModelToken} from '../../../models/comments/comments-model';
const EMPTY_BLAME = 'No blame information for this diff.';
@@ -412,11 +412,13 @@
this.reporting.timeEnd(Timing.DIFF_SYNTAX);
}
}
- } catch (e) {
+ } catch (e: unknown) {
if (e instanceof Response) {
this._handleGetDiffError(e);
- } else {
+ } else if (e instanceof Error) {
this.reporting.error(e);
+ } else {
+ this.reporting.error(new Error('reload error'), undefined, e);
}
} finally {
this.reporting.timeEnd(Timing.DIFF_TOTAL);
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-mode-selector/gr-diff-mode-selector.ts b/polygerrit-ui/app/elements/diff/gr-diff-mode-selector/gr-diff-mode-selector.ts
index a5ab586..bfb2bce 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-mode-selector/gr-diff-mode-selector.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-mode-selector/gr-diff-mode-selector.ts
@@ -26,8 +26,8 @@
import {FixIronA11yAnnouncer} from '../../../types/types';
import {getAppContext} from '../../../services/app-context';
import {fireIronAnnounce} from '../../../utils/event-util';
-import {browserModelToken} from '../../../services/browser/browser-model';
-import {resolve, DIPolymerElement} from '../../../services/dependency';
+import {browserModelToken} from '../../../models/browser/browser-model';
+import {resolve, DIPolymerElement} from '../../../models/dependency';
@customElement('gr-diff-mode-selector')
export class GrDiffModeSelector extends DIPolymerElement {
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts
index 92657dc..2fdb650 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts
@@ -112,18 +112,17 @@
import {addGlobalShortcut, Key, toggleClass} from '../../../utils/dom-util';
import {CursorMoveResult} from '../../../api/core';
import {isFalse, throttleWrap, until} from '../../../utils/async-util';
-import {filter, take} from 'rxjs/operators';
-import {Subscription, combineLatest} from 'rxjs';
+import {filter, take, switchMap} from 'rxjs/operators';
+import {combineLatest, Subscription} from 'rxjs';
import {listen} from '../../../services/shortcuts/shortcuts-service';
import {LoadingStatus} from '../../../services/change/change-model';
import {DisplayLine} from '../../../api/diff';
import {GrDownloadDialog} from '../../change/gr-download-dialog/gr-download-dialog';
-import {browserModelToken} from '../../../services/browser/browser-model';
-import {commentsModelToken} from '../../../services/comments/comments-model';
-import {resolve, DIPolymerElement} from '../../../services/dependency';
+import {browserModelToken} from '../../../models/browser/browser-model';
+import {commentsModelToken} from '../../../models/comments/comments-model';
+import {resolve, DIPolymerElement} from '../../../models/dependency';
import {BehaviorSubject} from 'rxjs';
-const ERR_REVIEW_STATUS = 'Couldn’t change file review status.';
const LOADING_BLAME = 'Loading blame...';
const LOADED_BLAME = 'Blame loaded';
@@ -273,20 +272,14 @@
@property({type: Object, computed: '_getRevisionInfo(_change)'})
_revisionInfo?: RevisionInfoObj;
- @property({type: Object})
- _reviewedFiles = new Set<string>();
-
@property({type: Number})
_focusLineNum?: number;
- private getReviewedParams: {
- changeNum?: NumericChangeId;
- patchNum?: PatchSetNum;
- } = {};
-
/** Called in disconnectedCallback. */
private cleanups: (() => void)[] = [];
+ private reviewedFiles = new Set<string>();
+
override keyboardShortcuts(): ShortcutListener[] {
return [
listen(Shortcut.LEFT_PANE, _ => this.cursor.moveLeft()),
@@ -422,29 +415,53 @@
})
);
+ this.subscriptions.push(
+ this.changeModel.reviewedFiles$.subscribe(reviewedFiles => {
+ this.reviewedFiles = new Set(reviewedFiles) ?? new Set();
+ })
+ );
+
+ this.subscriptions.push(
+ this.changeModel.diffPath$.subscribe(path => (this._path = path))
+ );
+
+ this.subscriptions.push(
+ combineLatest(
+ this.changeModel.diffPath$,
+ this.changeModel.reviewedFiles$
+ ).subscribe(([path, files]) => {
+ this.$.reviewed.checked = !!path && !!files && files.includes(path);
+ })
+ );
+
// When user initially loads the diff view, we want to autmatically mark
// the file as reviewed if they have it enabled. We can't observe these
// properties since the method will be called anytime a property updates
// but we only want to call this on the initial load.
this.subscriptions.push(
- combineLatest([
- this.changeModel.currentPatchNum$,
- this.routerModel.routerView$,
- this.changeModel.diffPath$,
- this.userModel.diffPreferences$,
- ])
+ this.changeModel.diffPath$
.pipe(
- filter(
- ([currentPatchNum, routerView, path, diffPrefs]) =>
- !!currentPatchNum &&
- routerView === GerritView.DIFF &&
- !!path &&
- !!diffPrefs
- ),
- take(1)
+ filter(diffPath => !!diffPath),
+ switchMap(() =>
+ combineLatest(
+ this.changeModel.currentPatchNum$,
+ this.routerModel.routerView$,
+ this.userModel.diffPreferences$,
+ this.changeModel.reviewedFiles$
+ ).pipe(
+ filter(
+ ([currentPatchNum, routerView, diffPrefs, reviewedFiles]) =>
+ !!currentPatchNum &&
+ routerView === GerritView.DIFF &&
+ !!diffPrefs &&
+ !!reviewedFiles
+ ),
+ take(1)
+ )
+ )
)
- .subscribe(([currentPatchNum, _routerView, path, diffPrefs]) => {
- this.setReviewedStatus(currentPatchNum!, path!, diffPrefs);
+ .subscribe(([currentPatchNum, _routerView, diffPrefs]) => {
+ this.setReviewedStatus(currentPatchNum!, diffPrefs);
})
);
this.subscriptions.push(
@@ -479,17 +496,18 @@
super.disconnectedCallback();
}
+ /**
+ * Set initial review status of the file.
+ * automatically mark the file as reviewed if manual review is not set.
+ */
+
async setReviewedStatus(
currentPatchNum: PatchSetNum,
- path: string,
diffPrefs: DiffPreferencesInfo
) {
const loggedIn = await this._getLoggedIn();
if (!loggedIn) return;
- await this._getReviewedFiles();
- if (diffPrefs.manual_review) {
- this.$.reviewed.checked = this._getReviewedStatus(path!);
- } else {
+ if (!diffPrefs.manual_review) {
this._setReviewed(true, currentPatchNum as RevisionPatchSetNum);
}
}
@@ -590,32 +608,14 @@
patchNum: RevisionPatchSetNum | undefined = this._patchRange?.patchNum
) {
if (this._editMode) return;
- this.$.reviewed.checked = reviewed;
- if (!patchNum || !this._path) return;
+ if (!patchNum || !this._path || !this._changeNum) return;
const path = this._path;
// if file is already reviewed then do not make a saveReview request
- if (this._reviewedFiles.has(path) && reviewed) return;
- if (reviewed) this._reviewedFiles.add(path);
- else this._reviewedFiles.delete(path);
- this._saveReviewedState(reviewed, patchNum).catch(err => {
- if (this._reviewedFiles.has(path)) this._reviewedFiles.delete(path);
- else this._reviewedFiles.add(path);
- fireAlert(this, ERR_REVIEW_STATUS);
- throw err;
- });
- }
-
- _saveReviewedState(
- reviewed: boolean,
- patchNum?: RevisionPatchSetNum
- ): Promise<Response | undefined> {
- if (!this._changeNum) return Promise.resolve(undefined);
- if (!patchNum) return Promise.resolve(undefined);
- if (!this._path) return Promise.resolve(undefined);
- return this.restApiService.saveFileReviewed(
+ if (this.reviewedFiles.has(path) && reviewed) return;
+ this.changeModel.setReviewedFilesStatus(
this._changeNum,
patchNum,
- this._path,
+ path,
reviewed
);
}
@@ -736,11 +736,11 @@
private navigateToUnreviewedFile(direction: string) {
if (!this._path) return;
if (!this._fileList) return;
- if (!this._reviewedFiles) return;
+ if (!this.reviewedFiles) return;
// Ensure that the currently viewed file always appears in unreviewedFiles
// so we resolve the right "next" file.
const unreviewedFiles = this._fileList.filter(
- file => file === this._path || !this._reviewedFiles.has(file)
+ file => file === this._path || !this.reviewedFiles.has(file)
);
this._navToFile(this._path, unreviewedFiles, direction === 'next' ? 1 : -1);
@@ -940,30 +940,6 @@
return {path: fileList[idx]};
}
- _getReviewedFiles(changeNum?: NumericChangeId, patchNum?: PatchSetNum) {
- if (!changeNum || !patchNum) return;
- if (
- this.getReviewedParams.changeNum === changeNum &&
- this.getReviewedParams.patchNum === patchNum
- ) {
- return Promise.resolve();
- }
- this.getReviewedParams = {
- changeNum,
- patchNum,
- };
- return this.restApiService
- .getReviewedFiles(changeNum, patchNum)
- .then(files => {
- this._reviewedFiles = new Set(files);
- });
- }
-
- _getReviewedStatus(path: string) {
- if (this._editMode) return false;
- return this._reviewedFiles.has(path);
- }
-
_initLineOfInterestAndCursor(leftSide: boolean) {
this.$.diffHost.lineOfInterest = this._getLineOfInterest(leftSide);
this._initCursor(leftSide);
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.js b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.js
index b590625..77bbded 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.js
@@ -19,7 +19,7 @@
import './gr-diff-view.js';
import {GerritNav} from '../../core/gr-navigation/gr-navigation.js';
import {ChangeStatus, DiffViewMode, createDefaultDiffPrefs} from '../../../constants/constants.js';
-import {stubRestApi, stubUsers, waitUntil} from '../../../test/test-utils.js';
+import {stubRestApi, stubUsers, waitUntil, stubChange} from '../../../test/test-utils.js';
import {ChangeComments} from '../gr-comment-api/gr-comment-api.js';
import {GerritView} from '../../../services/router/router-model.js';
import {
@@ -1190,10 +1190,10 @@
test('_prefs.manual_review true means set reviewed is not ' +
'automatically called', async () => {
- const saveReviewedStub = sinon.stub(element, '_saveReviewedState')
+ const setReviewedFileStatusStub = stubChange('setReviewedFilesStatus')
.callsFake(() => Promise.resolve());
- const getReviewedStub = sinon.stub(element, '_getReviewedStatus')
- .returns(false);
+
+ const setReviewedStatusStub = sinon.spy(element, 'setReviewedStatus');
sinon.stub(element.$.diffHost, 'reload');
sinon.stub(element, '_getLoggedIn').returns(Promise.resolve(true));
@@ -1204,7 +1204,9 @@
element.userModel.setDiffPreferences(diffPreferences);
element.changeModel.setState({
change: createChange(),
- diffPath: '/COMMIT_MSG'});
+ diffPath: '/COMMIT_MSG',
+ reviewedFiles: [],
+ });
element.routerModel.setState({
changeNum: TEST_NUMERIC_CHANGE_ID, view: GerritView.DIFF, patchNum: 2}
@@ -1214,25 +1216,21 @@
basePatchNum: 1,
};
- await waitUntil(() => getReviewedStub.called);
+ await waitUntil(() => setReviewedStatusStub.called);
- assert.isFalse(saveReviewedStub.called);
- assert.isTrue(getReviewedStub.called);
+ assert.isFalse(setReviewedFileStatusStub.called);
// if prefs are updated then the reviewed status should not be set again
element.userModel.setDiffPreferences(createDefaultDiffPrefs());
await flush();
- assert.isFalse(saveReviewedStub.called);
- assert.isTrue(getReviewedStub.calledOnce);
+ assert.isFalse(setReviewedFileStatusStub.called);
});
test('_prefs.manual_review false means set reviewed is called',
async () => {
- const saveReviewedStub = sinon.stub(element, '_saveReviewedState')
+ const setReviewedFileStatusStub = stubChange('setReviewedFilesStatus')
.callsFake(() => Promise.resolve());
- const getReviewedStub = sinon.stub(element, '_getReviewedStatus')
- .returns(false);
sinon.stub(element.$.diffHost, 'reload');
sinon.stub(element, '_getLoggedIn').returns(Promise.resolve(true));
@@ -1243,7 +1241,9 @@
element.userModel.setDiffPreferences(diffPreferences);
element.changeModel.setState({
change: createChange(),
- diffPath: '/COMMIT_MSG'});
+ diffPath: '/COMMIT_MSG',
+ reviewedFiles: [],
+ });
element.routerModel.setState({
changeNum: TEST_NUMERIC_CHANGE_ID, view: GerritView.DIFF,
@@ -1254,22 +1254,23 @@
basePatchNum: 1,
};
- await waitUntil(() => saveReviewedStub.called);
+ await waitUntil(() => setReviewedFileStatusStub.called);
- assert.isTrue(saveReviewedStub.called);
- assert.isFalse(getReviewedStub.called);
+ assert.isTrue(setReviewedFileStatusStub.called);
});
test('file review status', async () => {
+ element.changeModel.setState({
+ change: createChange(),
+ diffPath: '/COMMIT_MSG',
+ reviewedFiles: [],
+ });
sinon.stub(element, '_getLoggedIn').returns(Promise.resolve(true));
- const saveReviewedStub = sinon.stub(element, '_saveReviewedState')
+ const saveReviewedStub = stubChange('setReviewedFilesStatus')
.callsFake(() => Promise.resolve());
sinon.stub(element.$.diffHost, 'reload');
element.userModel.setDiffPreferences(createDefaultDiffPrefs());
- element.changeModel.setState({
- change: createChange(),
- diffPath: '/COMMIT_MSG'});
element.routerModel.setState({
changeNum: TEST_NUMERIC_CHANGE_ID, view: GerritView.DIFF, patchNum: 2}
@@ -1282,19 +1283,28 @@
await waitUntil(() => saveReviewedStub.called);
+ element.changeModel.updateStateFileReviewed('/COMMIT_MSG', true);
+ await flush();
+
const reviewedStatusCheckBox = element.root.querySelector(
'input[type="checkbox"]');
assert.isTrue(reviewedStatusCheckBox.checked);
- assert.deepEqual(saveReviewedStub.lastCall.args, [true, 2]);
+ assert.deepEqual(saveReviewedStub.lastCall.args,
+ ['42', 2, '/COMMIT_MSG', true]);
MockInteractions.tap(reviewedStatusCheckBox);
assert.isFalse(reviewedStatusCheckBox.checked);
- assert.deepEqual(saveReviewedStub.lastCall.args, [false, 2]);
+ assert.deepEqual(saveReviewedStub.lastCall.args,
+ ['42', 2, '/COMMIT_MSG', false]);
+
+ element.changeModel.updateStateFileReviewed('/COMMIT_MSG', false);
+ await flush();
MockInteractions.tap(reviewedStatusCheckBox);
assert.isTrue(reviewedStatusCheckBox.checked);
- assert.deepEqual(saveReviewedStub.lastCall.args, [true, 2]);
+ assert.deepEqual(saveReviewedStub.lastCall.args,
+ ['42', 2, '/COMMIT_MSG', true]);
const callCount = saveReviewedStub.callCount;
@@ -1307,7 +1317,7 @@
});
test('file review status with edit loaded', () => {
- const saveReviewedStub = sinon.stub(element, '_saveReviewedState');
+ const saveReviewedStub = stubChange('setReviewedFilesStatus');
element._patchRange = {patchNum: EditPatchSetNum};
flush();
@@ -1796,7 +1806,7 @@
isAtEndStub.returns(true);
element._files = getFilesFromFileList(['file1', 'file2', 'file3']);
- element._reviewedFiles = new Set(['file2']);
+ element.reviewedFiles = new Set(['file2']);
element._path = 'file1';
nowStub.returns(5);
@@ -1840,7 +1850,7 @@
isAtStartStub.returns(true);
element._files = getFilesFromFileList(['file1', 'file2', 'file3']);
- element._reviewedFiles = new Set(['file2']);
+ element.reviewedFiles = new Set(['file2']);
element._path = 'file3';
nowStub.returns(5);
@@ -1887,7 +1897,7 @@
test('shift+m navigates to next unreviewed file', () => {
element._files = getFilesFromFileList(['file1', 'file2', 'file3']);
- element._reviewedFiles = new Set(['file1', 'file2']);
+ element.reviewedFiles = new Set(['file1', 'file2']);
element._path = 'file1';
const reviewedStub = sinon.stub(element, '_setReviewed');
const navStub = sinon.stub(element, '_navToFile');
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.ts b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.ts
index 6f9765d..030275f 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.ts
@@ -198,7 +198,7 @@
@property({type: String, observer: '_viewModeObserver'})
viewMode = DiffViewMode.SIDE_BY_SIDE;
- @property({type: Object})
+ @property({type: Object, observer: '_lineOfInterestObserver'})
lineOfInterest?: DisplayLine;
/**
@@ -706,6 +706,14 @@
this._prefsChanged(this.prefs);
}
+ _lineOfInterestObserver() {
+ if (this.loading) return;
+ if (!this.lineOfInterest) return;
+ const lineNum = this.lineOfInterest.lineNum;
+ if (typeof lineNum !== 'number') return;
+ this.$.diffBuilder.unhideLine(lineNum, this.lineOfInterest.side);
+ }
+
_cleanup() {
this.cancel();
this.blame = null;
diff --git a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.ts b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.ts
index b6397b0..c4ffad4 100644
--- a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.ts
+++ b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.ts
@@ -51,8 +51,8 @@
import {LitElement, PropertyValues, css, html} from 'lit';
import {customElement, property, query, state} from 'lit/decorators';
import {subscribe} from '../../lit/subscription-controller';
-import {commentsModelToken} from '../../../services/comments/comments-model';
-import {resolve} from '../../../services/dependency';
+import {commentsModelToken} from '../../../models/comments/comments-model';
+import {resolve} from '../../../models/dependency';
// Maximum length for patch set descriptions.
const PATCH_DESC_MAX_LENGTH = 500;
diff --git a/polygerrit-ui/app/elements/gr-app-element.ts b/polygerrit-ui/app/elements/gr-app-element.ts
index 288489e..efcf8f6 100644
--- a/polygerrit-ui/app/elements/gr-app-element.ts
+++ b/polygerrit-ui/app/elements/gr-app-element.ts
@@ -84,8 +84,8 @@
import {fireIronAnnounce} from '../utils/event-util';
import {assertIsDefined} from '../utils/common-util';
import {listen} from '../services/shortcuts/shortcuts-service';
-import {resolve, DIPolymerElement} from '../services/dependency';
-import {browserModelToken} from '../services/browser/browser-model';
+import {resolve, DIPolymerElement} from '../models/dependency';
+import {browserModelToken} from '../models/browser/browser-model';
interface ErrorInfo {
text: string;
diff --git a/polygerrit-ui/app/elements/gr-app.ts b/polygerrit-ui/app/elements/gr-app.ts
index ec7379b..1d0b1ad 100644
--- a/polygerrit-ui/app/elements/gr-app.ts
+++ b/polygerrit-ui/app/elements/gr-app.ts
@@ -36,7 +36,7 @@
import {initGlobalVariables} from './gr-app-global-var-init';
import './gr-app-element';
import {Finalizable} from '../services/registry';
-import {provide} from '../services/dependency';
+import {provide} from '../models/dependency';
import {installPolymerResin} from '../scripts/polymer-resin-install';
import {
diff --git a/polygerrit-ui/app/elements/plugins/gr-event-helper/gr-event-helper.ts b/polygerrit-ui/app/elements/plugins/gr-event-helper/gr-event-helper.ts
index 652f5cc..24fc613 100644
--- a/polygerrit-ui/app/elements/plugins/gr-event-helper/gr-event-helper.ts
+++ b/polygerrit-ui/app/elements/plugins/gr-event-helper/gr-event-helper.ts
@@ -56,8 +56,12 @@
let mayContinue = true;
try {
mayContinue = callback(e);
- } catch (exception) {
- this.reporting.error(exception);
+ } catch (exception: unknown) {
+ this.reporting.error(
+ new Error('event listener callback error'),
+ undefined,
+ exception
+ );
}
if (mayContinue === false) {
e.stopImmediatePropagation();
diff --git a/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link.ts b/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link.ts
index f0c9106..bbb743a 100644
--- a/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link.ts
+++ b/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link.ts
@@ -99,6 +99,12 @@
exportparts="gr-account-label-text: gr-account-link-text"
>
</gr-account-label>
+ <gr-endpoint-decorator name="account-status">
+ <gr-endpoint-param
+ name="accountId"
+ .value="${this.account._account_id}"
+ ></gr-endpoint-param>
+ </gr-endpoint-decorator>
</a>
</span>`;
}
diff --git a/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link_test.ts b/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link_test.ts
index a78f32f..00990b8 100644
--- a/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link_test.ts
@@ -45,6 +45,9 @@
exportparts="gr-account-label-text: gr-account-link-text"
>
</gr-account-label>
+ <gr-endpoint-decorator name="account-status">
+ <gr-endpoint-param name="accountId"></gr-endpoint-param>
+ </gr-endpoint-decorator>
</a>
</span>
`);
diff --git a/polygerrit-ui/app/elements/shared/gr-button/gr-button.ts b/polygerrit-ui/app/elements/shared/gr-button/gr-button.ts
index 6b8789e..2da1b19 100644
--- a/polygerrit-ui/app/elements/shared/gr-button/gr-button.ts
+++ b/polygerrit-ui/app/elements/shared/gr-button/gr-button.ts
@@ -27,7 +27,11 @@
'gr-button': GrButton;
}
}
-
+/**
+ * @attr {Boolean} no-uppercase - text in button is not uppercased
+ * @attr {Boolean} primary - set primary button color
+ * @attr {Boolean} secondary - set secondary button color
+ */
@customElement('gr-button')
export class GrButton extends LitElement {
// Private but used in tests.
diff --git a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.ts b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.ts
index 0f33ffb..ee40ad5 100644
--- a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.ts
+++ b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.ts
@@ -70,8 +70,8 @@
import {ShortcutController} from '../../lit/shortcut-controller';
import {ValueChangedEvent} from '../../../types/events';
import {notDeepEqual} from '../../../utils/deep-util';
-import {resolve} from '../../../services/dependency';
-import {commentsModelToken} from '../../../services/comments/comments-model';
+import {resolve} from '../../../models/dependency';
+import {commentsModelToken} from '../../../models/comments/comments-model';
const NEWLINE_PATTERN = /\n/g;
@@ -423,7 +423,7 @@
renderFilePath() {
if (!this.showFilePath) return;
- const href = this.getUrlForComment();
+ const href = this.getUrlForFileComment();
const line = this.computeDisplayLine();
return html`
${this.renderFileName()}
@@ -473,7 +473,6 @@
<gr-comment
.comment="${comment}"
.comments="${this.thread!.comments}"
- .patchNum="${this.thread?.patchNum}"
?initially-collapsed="${initiallyCollapsed}"
?robot-button-disabled="${robotButtonDisabled}"
?show-patchset="${this.showPatchset}"
@@ -558,7 +557,7 @@
renderContextualDiff() {
if (!this.changeNum || !this.showCommentContext || !this.diff) return;
if (!this.thread?.path) return;
- const href = this.getUrlForComment();
+ const href = this.getUrlForFileComment();
return html`
<div class="diff-container">
<gr-diff
@@ -704,7 +703,8 @@
return undefined;
}
- private getUrlForComment() {
+ // Does not work for patchset level comments
+ private getUrlForFileComment() {
if (!this.repoName || !this.changeNum || this.isNewThread()) {
return undefined;
}
@@ -717,7 +717,17 @@
}
private handleCopyLink() {
- const url = this.getUrlForComment();
+ const comment = this.getFirstComment();
+ if (!comment) return;
+ assertIsDefined(this.changeNum, 'changeNum');
+ assertIsDefined(this.repoName, 'repoName');
+ const url = generateAbsoluteUrl(
+ GerritNav.getUrlForCommentsTab(
+ this.changeNum!,
+ this.repoName!,
+ comment.id
+ )
+ );
assertIsDefined(url, 'url for comment');
navigator.clipboard.writeText(generateAbsoluteUrl(url)).then(() => {
fireAlert(this, 'Link copied to clipboard');
diff --git a/polygerrit-ui/app/elements/shared/gr-comment/gr-comment.ts b/polygerrit-ui/app/elements/shared/gr-comment/gr-comment.ts
index 18ef5a9..c8dab62 100644
--- a/polygerrit-ui/app/elements/shared/gr-comment/gr-comment.ts
+++ b/polygerrit-ui/app/elements/shared/gr-comment/gr-comment.ts
@@ -30,7 +30,7 @@
import {getAppContext} from '../../../services/app-context';
import {css, html, LitElement, PropertyValues} from 'lit';
import {customElement, property, query, state} from 'lit/decorators';
-import {resolve} from '../../../services/dependency';
+import {resolve} from '../../../models/dependency';
import {GerritNav} from '../../core/gr-navigation/gr-navigation';
import {GrTextarea} from '../gr-textarea/gr-textarea';
import {GrOverlay} from '../gr-overlay/gr-overlay';
@@ -56,7 +56,7 @@
import {fire, fireEvent} from '../../../utils/event-util';
import {assertIsDefined} from '../../../utils/common-util';
import {Key, Modifier} from '../../../utils/dom-util';
-import {commentsModelToken} from '../../../services/comments/comments-model';
+import {commentsModelToken} from '../../../models/comments/comments-model';
import {sharedStyles} from '../../../styles/shared-styles';
import {subscribe} from '../../lit/subscription-controller';
import {ShortcutController} from '../../lit/shortcut-controller';
@@ -66,6 +66,7 @@
import {getRandomInt} from '../../../utils/math-util';
import {Subject} from 'rxjs';
import {debounceTime} from 'rxjs/operators';
+import {configModelToken} from '../../../models/config/config-model';
const UNSAVED_MESSAGE = 'Unable to save draft';
@@ -237,7 +238,7 @@
private readonly userModel = getAppContext().userModel;
- private readonly configModel = getAppContext().configModel;
+ private readonly configModel = resolve(this, configModelToken);
private readonly shortcuts = new ShortcutController(this);
@@ -263,11 +264,7 @@
super();
subscribe(this, this.userModel.account$, x => (this.account = x));
subscribe(this, this.userModel.isAdmin$, x => (this.isAdmin = x));
- subscribe(
- this,
- this.configModel.repoCommentLinks$,
- x => (this.commentLinks = x)
- );
+
subscribe(this, this.changeModel.repo$, x => (this.repoName = x));
subscribe(this, this.changeModel.changeNum$, x => (this.changeNum = x));
subscribe(
@@ -287,6 +284,15 @@
}
}
+ override connectedCallback() {
+ super.connectedCallback();
+ subscribe(
+ this,
+ this.configModel().repoCommentLinks$,
+ x => (this.commentLinks = x)
+ );
+ }
+
override disconnectedCallback() {
// Clean up emoji dropdown.
if (this.textarea) this.textarea.closeDropdown();
diff --git a/polygerrit-ui/app/elements/shared/gr-icons/gr-icons.ts b/polygerrit-ui/app/elements/shared/gr-icons/gr-icons.ts
index e7594a8..4456381 100644
--- a/polygerrit-ui/app/elements/shared/gr-icons/gr-icons.ts
+++ b/polygerrit-ui/app/elements/shared/gr-icons/gr-icons.ts
@@ -168,6 +168,8 @@
<g id="overridden"><path xmlns="http://www.w3.org/2000/svg" d="M0 0h24v24H0V0z" fill="none"/><path xmlns="http://www.w3.org/2000/svg" d="M12 15 zM2 4v6h6V8H5.09C6.47 5.61 9.04 4 12 4c4.42 0 8 3.58 8 8s-3.58 8-8 8-8-3.58-8-8H2c0 5.52 4.48 10 10.01 10C17.53 22 22 17.52 22 12S17.53 2 12.01 2C8.73 2 5.83 3.58 4 6.01V4H2z"/><path xmlns="http://www.w3.org/2000/svg" d="M9.85 14.53 7.12 11.8l-.91.91L9.85 16.35 17.65 8.55l-.91-.91L9.85 14.53z"/></g>
<!-- This SVG is a copy from material.io https://fonts.google.com/icons?selected=Material+Icons:event_busy -->
<g id="unavailable"><path d="M0 0h24v24H0z" fill="none"/><path d="M9.31 17l2.44-2.44L14.19 17l1.06-1.06-2.44-2.44 2.44-2.44L14.19 10l-2.44 2.44L9.31 10l-1.06 1.06 2.44 2.44-2.44 2.44L9.31 17zM19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11z"/></g>
+ <!-- This SVG is a custom PolyGerrit SVG -->
+ <g id="not-working-hours"><path d="M20.8,13.9c-0.6,0.1-1.3,0.2-2,0.2c-4.9,0-8.9-4-8.9-8.9c0-0.7,0.1-1.4,0.2-2c-4,0.9-6.9,4.5-6.9,8.7c0,4.9,4,8.9,8.9,8.9C16.3,20.8,19.9,17.9,20.8,13.9z"/></g>
<!-- This SVG is a copy from material.io https://fonts.google.com/icons?selected=Material+Icons:pending_actions -->
<g id="scheduled"><path d="M0 0h24v24H0z" fill="none"/><path d="M17.0 22.0Q14.925 22.0 13.4625 20.5375Q12.0 19.075 12.0 17.0Q12.0 14.925 13.4625 13.4625Q14.925 12.0 17.0 12.0Q19.075 12.0 20.5375 13.4625Q22.0 14.925 22.0 17.0Q22.0 19.075 20.5375 20.5375Q19.075 22.0 17.0 22.0ZM18.675 19.375 19.375 18.675 17.5 16.8V14.0H16.5V17.2ZM5.0 21.0Q4.175 21.0 3.5875 20.4125Q3.0 19.825 3.0 19.0V5.0Q3.0 4.175 3.5875 3.5875Q4.175 3.0 5.0 3.0H9.175Q9.5 2.125 10.2625 1.5625Q11.025 1.0 12.0 1.0Q12.975 1.0 13.7375 1.5625Q14.5 2.125 14.825 3.0H19.0Q19.825 3.0 20.4125 3.5875Q21.0 4.175 21.0 5.0V11.25Q20.55 10.925 20.05 10.7Q19.55 10.475 19.0 10.3V5.0Q19.0 5.0 19.0 5.0Q19.0 5.0 19.0 5.0H17.0V8.0H7.0V5.0H5.0Q5.0 5.0 5.0 5.0Q5.0 5.0 5.0 5.0V19.0Q5.0 19.0 5.0 19.0Q5.0 19.0 5.0 19.0H10.3Q10.475 19.55 10.7 20.05Q10.925 20.55 11.25 21.0ZM12.0 5.0Q12.425 5.0 12.7125 4.7125Q13.0 4.425 13.0 4.0Q13.0 3.575 12.7125 3.2875Q12.425 3.0 12.0 3.0Q11.575 3.0 11.2875 3.2875Q11.0 3.575 11.0 4.0Q11.0 4.425 11.2875 4.7125Q11.575 5.0 12.0 5.0Z"/></g>
</defs>
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface-element.ts b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface-element.ts
index 0bd3e59..e7354c5 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface-element.ts
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface-element.ts
@@ -98,8 +98,12 @@
const cancelSubmit = submitCallbacks.some(callback => {
try {
return callback(change, revision) === false;
- } catch (err) {
- this.reporting.error(err);
+ } catch (err: unknown) {
+ this.reporting.error(
+ new Error('canSubmitChange callback error'),
+ undefined,
+ err
+ );
}
return false;
});
@@ -119,8 +123,12 @@
for (const cb of this._getEventCallbacks(EventType.HISTORY)) {
try {
cb(detail.path);
- } catch (err) {
- this.reporting.error(err);
+ } catch (err: unknown) {
+ this.reporting.error(
+ new Error('handleHistory callback error'),
+ undefined,
+ err
+ );
}
}
}
@@ -160,8 +168,12 @@
for (const cb of this._getEventCallbacks(EventType.SHOW_CHANGE)) {
try {
cb(change, revision, info);
- } catch (err) {
- this.reporting.error(err);
+ } catch (err: unknown) {
+ this.reporting.error(
+ new Error('showChange callback error'),
+ undefined,
+ err
+ );
}
}
}
@@ -173,8 +185,12 @@
for (const cb of registeredCallbacks) {
try {
cb(detail.revisionActions, detail.change);
- } catch (err) {
- this.reporting.error(err);
+ } catch (err: unknown) {
+ this.reporting.error(
+ new Error('showRevisionActions callback error'),
+ undefined,
+ err
+ );
}
}
}
@@ -183,8 +199,12 @@
for (const cb of this._getEventCallbacks(EventType.COMMIT_MSG_EDIT)) {
try {
cb(change, msg);
- } catch (err) {
- this.reporting.error(err);
+ } catch (err: unknown) {
+ this.reporting.error(
+ new Error('commitMessage callback error'),
+ undefined,
+ err
+ );
}
}
}
@@ -194,8 +214,12 @@
for (const cb of this._getEventCallbacks(EventType.COMMENT)) {
try {
cb(detail.node);
- } catch (err) {
- this.reporting.error(err);
+ } catch (err: unknown) {
+ this.reporting.error(
+ new Error('comment callback error'),
+ undefined,
+ err
+ );
}
}
}
@@ -204,8 +228,12 @@
for (const cb of this._getEventCallbacks(EventType.LABEL_CHANGE)) {
try {
cb(detail.change);
- } catch (err) {
- this.reporting.error(err);
+ } catch (err: unknown) {
+ this.reporting.error(
+ new Error('labelChange callback error'),
+ undefined,
+ err
+ );
}
}
}
@@ -214,8 +242,12 @@
for (const cb of this._getEventCallbacks(EventType.HIGHLIGHTJS_LOADED)) {
try {
cb(detail.hljs);
- } catch (err) {
- this.reporting.error(err);
+ } catch (err: unknown) {
+ this.reporting.error(
+ new Error('HighlightjsLoaded callback error'),
+ undefined,
+ err
+ );
}
}
}
@@ -224,8 +256,12 @@
for (const cb of this._getEventCallbacks(EventType.REVERT)) {
try {
revertMsg = cb(change, revertMsg, origMsg) as string;
- } catch (err) {
- this.reporting.error(err);
+ } catch (err: unknown) {
+ this.reporting.error(
+ new Error('modifyRevertMsg callback error'),
+ undefined,
+ err
+ );
}
}
return revertMsg;
@@ -243,8 +279,12 @@
revertSubmissionMsg,
origMsg
) as string;
- } catch (err) {
- this.reporting.error(err);
+ } catch (err: unknown) {
+ this.reporting.error(
+ new Error('modifyRevertSubmissionMsg callback error'),
+ undefined,
+ err
+ );
}
}
return revertSubmissionMsg;
@@ -257,8 +297,12 @@
try {
const layer = annotationApi.createLayer(path);
if (layer) layers.push(layer);
- } catch (err) {
- this.reporting.error(err);
+ } catch (err: unknown) {
+ this.reporting.error(
+ new Error('getDiffLayers callback error'),
+ undefined,
+ err
+ );
}
}
return layers;
@@ -269,8 +313,12 @@
try {
const annotationApi = cb as unknown as GrAnnotationActionsInterface;
annotationApi.disposeLayer(path);
- } catch (err) {
- this.reporting.error(err);
+ } catch (err: unknown) {
+ this.reporting.error(
+ new Error('disposeDiffLayers callback error'),
+ undefined,
+ err
+ );
}
}
}
@@ -315,8 +363,12 @@
} else {
review = {labels: r as LabelNameToValuesMap};
}
- } catch (err) {
- this.reporting.error(err);
+ } catch (err: unknown) {
+ this.reporting.error(
+ new Error('getReviewPostRevert callback error'),
+ undefined,
+ err
+ );
}
}
return review;
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-loader.ts b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-loader.ts
index ba6de67..bef5b97 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-loader.ts
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-loader.ts
@@ -135,8 +135,8 @@
if (!(url instanceof URL)) {
try {
url = new URL(url);
- } catch (e) {
- this._getReporting().error(e);
+ } catch (e: unknown) {
+ this._getReporting().error(new Error('url parse error'), undefined, e);
return false;
}
}
@@ -183,8 +183,16 @@
try {
callback(plugin);
this._pluginInstalled(url, plugin);
- } catch (e) {
- this._failToLoad(`${e.name}: ${e.message}`, src);
+ } catch (e: unknown) {
+ if (e instanceof Error) {
+ this._failToLoad(`${e.name}: ${e.message}`, src);
+ } else {
+ this._getReporting().error(
+ new Error('plugin callback error'),
+ undefined,
+ e
+ );
+ }
}
}
diff --git a/polygerrit-ui/app/elements/shared/gr-limited-text/gr-limited-text.ts b/polygerrit-ui/app/elements/shared/gr-limited-text/gr-limited-text.ts
index 7008db2..9bb112e 100644
--- a/polygerrit-ui/app/elements/shared/gr-limited-text/gr-limited-text.ts
+++ b/polygerrit-ui/app/elements/shared/gr-limited-text/gr-limited-text.ts
@@ -16,6 +16,7 @@
*/
import {customElement, property} from 'lit/decorators';
import {html, LitElement} from 'lit';
+import '../gr-tooltip-content/gr-tooltip-content';
declare global {
interface HTMLElementTagNameMap {
diff --git a/polygerrit-ui/app/elements/shared/gr-list-view/gr-list-view.ts b/polygerrit-ui/app/elements/shared/gr-list-view/gr-list-view.ts
index 0d3e86a..ab5f1ad 100644
--- a/polygerrit-ui/app/elements/shared/gr-list-view/gr-list-view.ts
+++ b/polygerrit-ui/app/elements/shared/gr-list-view/gr-list-view.ts
@@ -117,7 +117,6 @@
<div class="filterContainer">
<label>Filter:</label>
<iron-input
- type="text"
.bindValue=${this.filter}
@bind-value-changed=${this.handleFilterBindValueChanged}
>
diff --git a/polygerrit-ui/app/embed/gr-diff-app-context-init.ts b/polygerrit-ui/app/embed/gr-diff-app-context-init.ts
index 7d31062..bbcfd23 100644
--- a/polygerrit-ui/app/embed/gr-diff-app-context-init.ts
+++ b/polygerrit-ui/app/embed/gr-diff-app-context-init.ts
@@ -87,9 +87,6 @@
storageService: (_ctx: Partial<AppContext>) => {
throw new Error('storageService is not implemented');
},
- configModel: (_ctx: Partial<AppContext>) => {
- throw new Error('configModel is not implemented');
- },
userModel: (_ctx: Partial<AppContext>) => {
throw new Error('userModel is not implemented');
},
diff --git a/polygerrit-ui/app/services/browser/browser-model.ts b/polygerrit-ui/app/models/browser/browser-model.ts
similarity index 83%
rename from polygerrit-ui/app/services/browser/browser-model.ts
rename to polygerrit-ui/app/models/browser/browser-model.ts
index 244ced2..490f868 100644
--- a/polygerrit-ui/app/services/browser/browser-model.ts
+++ b/polygerrit-ui/app/models/browser/browser-model.ts
@@ -14,12 +14,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import {BehaviorSubject, Observable, combineLatest} from 'rxjs';
+import {Observable, combineLatest} from 'rxjs';
import {distinctUntilChanged, map} from 'rxjs/operators';
-import {Finalizable} from '../registry';
+import {Finalizable} from '../../services/registry';
import {define} from '../dependency';
import {DiffViewMode} from '../../api/diff';
import {UserModel} from '../user/user-model';
+import {Model} from '../model';
// This value is somewhat arbitrary and not based on research or calculations.
const MAX_UNIFIED_DEFAULT_WINDOW_WIDTH_PX = 850;
@@ -36,17 +37,12 @@
export const browserModelToken = define<BrowserModel>('browser-model');
-export class BrowserModel implements Finalizable {
- private readonly privateState$ = new BehaviorSubject(initialState);
-
+export class BrowserModel extends Model<BrowserState> implements Finalizable {
readonly diffViewMode$: Observable<DiffViewMode>;
- get viewState$(): Observable<BrowserState> {
- return this.privateState$;
- }
-
constructor(readonly userModel: UserModel) {
- const screenWidth$ = this.privateState$.pipe(
+ super(initialState);
+ const screenWidth$ = this.state$.pipe(
map(
state =>
!!state.screenWidth &&
@@ -79,7 +75,7 @@
// Private but used in tests.
setScreenWidth(screenWidth: number) {
- this.privateState$.next({...this.privateState$.getValue(), screenWidth});
+ this.subject$.next({...this.subject$.getValue(), screenWidth});
}
finalize() {}
diff --git a/polygerrit-ui/app/services/comments/comments-model.ts b/polygerrit-ui/app/models/comments/comments-model.ts
similarity index 95%
rename from polygerrit-ui/app/services/comments/comments-model.ts
rename to polygerrit-ui/app/models/comments/comments-model.ts
index 8f47e38..a722e14 100644
--- a/polygerrit-ui/app/services/comments/comments-model.ts
+++ b/polygerrit-ui/app/models/comments/comments-model.ts
@@ -15,7 +15,6 @@
* limitations under the License.
*/
-import {BehaviorSubject} from 'rxjs';
import {ChangeComments} from '../../elements/diff/gr-comment-api/gr-comment-api';
import {
CommentBasics,
@@ -37,19 +36,20 @@
} from '../../utils/comment-util';
import {deepEqual} from '../../utils/deep-util';
import {select} from '../../utils/observable-util';
-import {RouterModel} from '../router/router-model';
-import {Finalizable} from '../registry';
+import {RouterModel} from '../../services/router/router-model';
+import {Finalizable} from '../../services/registry';
import {define} from '../dependency';
import {combineLatest, Subscription} from 'rxjs';
import {fire, fireAlert, fireEvent} from '../../utils/event-util';
import {CURRENT} from '../../utils/patch-set-util';
-import {RestApiService} from '../gr-rest-api/gr-rest-api';
-import {ChangeModel} from '../change/change-model';
+import {RestApiService} from '../../services/gr-rest-api/gr-rest-api';
+import {ChangeModel} from '../../services/change/change-model';
import {Interaction, Timing} from '../../constants/reporting';
import {assertIsDefined} from '../../utils/common-util';
import {debounce, DelayedTask} from '../../utils/async-util';
import {pluralize} from '../../utils/string-util';
-import {ReportingService} from '../gr-reporting/gr-reporting';
+import {ReportingService} from '../../services/gr-reporting/gr-reporting';
+import {Model} from '../model';
export interface CommentState {
/** undefined means 'still loading' */
@@ -222,12 +222,9 @@
}
export const commentsModelToken = define<CommentsModel>('comments-model');
-export class CommentsModel implements Finalizable {
- private readonly privateState$: BehaviorSubject<CommentState> =
- new BehaviorSubject(initialState);
-
+export class CommentsModel extends Model<CommentState> implements Finalizable {
public readonly commentsLoading$ = select(
- this.privateState$,
+ this.state$,
commentState =>
commentState.comments === undefined ||
commentState.robotComments === undefined ||
@@ -235,29 +232,29 @@
);
public readonly comments$ = select(
- this.privateState$,
+ this.state$,
commentState => commentState.comments
);
public readonly drafts$ = select(
- this.privateState$,
+ this.state$,
commentState => commentState.drafts
);
public readonly portedComments$ = select(
- this.privateState$,
+ this.state$,
commentState => commentState.portedComments
);
public readonly discardedDrafts$ = select(
- this.privateState$,
+ this.state$,
commentState => commentState.discardedDrafts
);
// Emits a new value even if only a single draft is changed. Components should
// aim to subsribe to something more specific.
public readonly changeComments$ = select(
- this.privateState$,
+ this.state$,
commentState =>
new ChangeComments(
commentState.comments,
@@ -298,6 +295,7 @@
readonly restApiService: RestApiService,
readonly reporting: ReportingService
) {
+ super(initialState);
this.subscriptions.push(
this.discardedDrafts$.subscribe(x => (this.discardedDrafts = x))
);
@@ -360,13 +358,13 @@
// visible for testing
updateState(reducer: (state: CommentState) => CommentState) {
- const current = this.privateState$.getValue();
+ const current = this.subject$.getValue();
this.setState(reducer({...current}));
}
// visible for testing
setState(state: CommentState) {
- this.privateState$.next(state);
+ this.subject$.next(state);
}
async reloadComments(changeNum: NumericChangeId): Promise<void> {
diff --git a/polygerrit-ui/app/services/comments/comments-model_test.ts b/polygerrit-ui/app/models/comments/comments-model_test.ts
similarity index 96%
rename from polygerrit-ui/app/services/comments/comments-model_test.ts
rename to polygerrit-ui/app/models/comments/comments-model_test.ts
index a8f2118..e713893 100644
--- a/polygerrit-ui/app/services/comments/comments-model_test.ts
+++ b/polygerrit-ui/app/models/comments/comments-model_test.ts
@@ -29,8 +29,8 @@
TEST_NUMERIC_CHANGE_ID,
} from '../../test/test-data-generators';
import {stubRestApi, waitUntil, waitUntilCalled} from '../../test/test-utils';
-import {getAppContext} from '../app-context';
-import {GerritView} from '../router/router-model';
+import {getAppContext} from '../../services/app-context';
+import {GerritView} from '../../services/router/router-model';
import {PathToCommentsInfoMap} from '../../types/common';
suite('comments model tests', () => {
diff --git a/polygerrit-ui/app/services/config/config-model.ts b/polygerrit-ui/app/models/config/config-model.ts
similarity index 69%
rename from polygerrit-ui/app/services/config/config-model.ts
rename to polygerrit-ui/app/models/config/config-model.ts
index 91a77b8..e57a724 100644
--- a/polygerrit-ui/app/services/config/config-model.ts
+++ b/polygerrit-ui/app/models/config/config-model.ts
@@ -15,31 +15,24 @@
* limitations under the License.
*/
import {ConfigInfo, RepoName, ServerInfo} from '../../types/common';
-import {BehaviorSubject, from, Observable, of, Subscription} from 'rxjs';
+import {from, of, Subscription} from 'rxjs';
import {switchMap} from 'rxjs/operators';
-import {Finalizable} from '../registry';
-import {RestApiService} from '../gr-rest-api/gr-rest-api';
-import {ChangeModel} from '../change/change-model';
+import {Finalizable} from '../../services/registry';
+import {RestApiService} from '../../services/gr-rest-api/gr-rest-api';
+import {ChangeModel} from '../../services/change/change-model';
import {select} from '../../utils/observable-util';
+import {Model} from '../model';
+import {define} from '../dependency';
export interface ConfigState {
repoConfig?: ConfigInfo;
serverConfig?: ServerInfo;
}
-export class ConfigModel implements Finalizable {
- // TODO: Figure out how to best enforce immutability of all states. Use Immer?
- // Use DeepReadOnly?
- private initialState: ConfigState = {};
-
- private privateState$ = new BehaviorSubject(this.initialState);
-
- // Re-exporting as Observable so that you can only subscribe, but not emit.
- public configState$: Observable<ConfigState> =
- this.privateState$.asObservable();
-
+export const configModelToken = define<ConfigModel>('config-model');
+export class ConfigModel extends Model<ConfigState> implements Finalizable {
public repoConfig$ = select(
- this.privateState$,
+ this.state$,
configState => configState.repoConfig
);
@@ -49,7 +42,7 @@
);
public serverConfig$ = select(
- this.privateState$,
+ this.state$,
configState => configState.serverConfig
);
@@ -59,6 +52,7 @@
readonly changeModel: ChangeModel,
readonly restApiService: RestApiService
) {
+ super({});
this.subscriptions = [
from(this.restApiService.getConfig()).subscribe((config?: ServerInfo) => {
this.updateServerConfig(config);
@@ -77,13 +71,13 @@
}
updateRepoConfig(repoConfig?: ConfigInfo) {
- const current = this.privateState$.getValue();
- this.privateState$.next({...current, repoConfig});
+ const current = this.subject$.getValue();
+ this.subject$.next({...current, repoConfig});
}
updateServerConfig(serverConfig?: ServerInfo) {
- const current = this.privateState$.getValue();
- this.privateState$.next({...current, serverConfig});
+ const current = this.subject$.getValue();
+ this.subject$.next({...current, serverConfig});
}
finalize() {
diff --git a/polygerrit-ui/app/services/dependency.ts b/polygerrit-ui/app/models/dependency.ts
similarity index 100%
rename from polygerrit-ui/app/services/dependency.ts
rename to polygerrit-ui/app/models/dependency.ts
diff --git a/polygerrit-ui/app/services/dependency_test.ts b/polygerrit-ui/app/models/dependency_test.ts
similarity index 100%
rename from polygerrit-ui/app/services/dependency_test.ts
rename to polygerrit-ui/app/models/dependency_test.ts
diff --git a/polygerrit-ui/app/models/model.ts b/polygerrit-ui/app/models/model.ts
new file mode 100644
index 0000000..4a7f5ac
--- /dev/null
+++ b/polygerrit-ui/app/models/model.ts
@@ -0,0 +1,42 @@
+/**
+ * @license
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {BehaviorSubject, Observable} from 'rxjs';
+
+/**
+ * A Model stores a value <T> and controls changes to that value via `subject$`
+ * while allowing others to subscribe to value updates via the `state$`
+ * Observable.
+ *
+ * Typically a given Model subclass will provide:
+ * 1. an initial value
+ * 2. "reducers": functions for users to request changes to the value
+ * 3. "selectors": convenient sub-Observables that only contain updates for a
+ * nested property from the value
+ *
+ * Any new subscriber will immediately receive the current value.
+ */
+export abstract class Model<T> {
+ protected subject$: BehaviorSubject<T>;
+
+ public state$: Observable<T>;
+
+ constructor(initialState: T) {
+ this.subject$ = new BehaviorSubject(initialState);
+ this.state$ = this.subject$.asObservable();
+ }
+}
diff --git a/polygerrit-ui/app/services/user/user-model.ts b/polygerrit-ui/app/models/user/user-model.ts
similarity index 83%
rename from polygerrit-ui/app/services/user/user-model.ts
rename to polygerrit-ui/app/models/user/user-model.ts
index 441c09d..5e9ed3f 100644
--- a/polygerrit-ui/app/services/user/user-model.ts
+++ b/polygerrit-ui/app/models/user/user-model.ts
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import {from, of, BehaviorSubject, Observable, Subscription} from 'rxjs';
+import {from, of, Observable, Subscription} from 'rxjs';
import {switchMap} from 'rxjs/operators';
import {
DiffPreferencesInfo as DiffPreferencesInfoAPI,
@@ -29,10 +29,11 @@
createDefaultPreferences,
createDefaultDiffPrefs,
} from '../../constants/constants';
-import {RestApiService} from '../gr-rest-api/gr-rest-api';
+import {RestApiService} from '../../services/gr-rest-api/gr-rest-api';
import {DiffPreferencesInfo} from '../../types/diff';
-import {Finalizable} from '../registry';
+import {Finalizable} from '../../services/registry';
import {select} from '../../utils/observable-util';
+import {Model} from '../model';
export interface UserState {
/**
@@ -44,15 +45,9 @@
capabilities?: AccountCapabilityInfo;
}
-export class UserModel implements Finalizable {
- private readonly privateState$: BehaviorSubject<UserState> =
- new BehaviorSubject({
- preferences: createDefaultPreferences(),
- diffPreferences: createDefaultDiffPrefs(),
- });
-
+export class UserModel extends Model<UserState> implements Finalizable {
readonly account$: Observable<AccountDetailInfo | undefined> = select(
- this.privateState$,
+ this.state$,
userState => userState.account
);
@@ -63,7 +58,7 @@
);
readonly capabilities$: Observable<AccountCapabilityInfo | undefined> =
- select(this.userState$, userState => userState.capabilities);
+ select(this.state$, userState => userState.capabilities);
readonly isAdmin$: Observable<boolean> = select(
this.capabilities$,
@@ -71,12 +66,12 @@
);
readonly preferences$: Observable<PreferencesInfo> = select(
- this.privateState$,
+ this.state$,
userState => userState.preferences
);
readonly diffPreferences$: Observable<DiffPreferencesInfo> = select(
- this.privateState$,
+ this.state$,
userState => userState.diffPreferences
);
@@ -87,11 +82,11 @@
private subscriptions: Subscription[] = [];
- get userState$(): Observable<UserState> {
- return this.privateState$;
- }
-
constructor(readonly restApiService: RestApiService) {
+ super({
+ preferences: createDefaultPreferences(),
+ diffPreferences: createDefaultDiffPrefs(),
+ });
this.subscriptions = [
from(this.restApiService.getAccount()).subscribe(
(account?: AccountDetailInfo) => {
@@ -167,22 +162,22 @@
}
setPreferences(preferences: PreferencesInfo) {
- const current = this.privateState$.getValue();
- this.privateState$.next({...current, preferences});
+ const current = this.subject$.getValue();
+ this.subject$.next({...current, preferences});
}
setDiffPreferences(diffPreferences: DiffPreferencesInfo) {
- const current = this.privateState$.getValue();
- this.privateState$.next({...current, diffPreferences});
+ const current = this.subject$.getValue();
+ this.subject$.next({...current, diffPreferences});
}
setCapabilities(capabilities?: AccountCapabilityInfo) {
- const current = this.privateState$.getValue();
- this.privateState$.next({...current, capabilities});
+ const current = this.subject$.getValue();
+ this.subject$.next({...current, capabilities});
}
private setAccount(account?: AccountDetailInfo) {
- const current = this.privateState$.getValue();
- this.privateState$.next({...current, account});
+ const current = this.subject$.getValue();
+ this.subject$.next({...current, account});
}
}
diff --git a/polygerrit-ui/app/services/app-context-init.ts b/polygerrit-ui/app/services/app-context-init.ts
index 0cb3876..81d64e02 100644
--- a/polygerrit-ui/app/services/app-context-init.ts
+++ b/polygerrit-ui/app/services/app-context-init.ts
@@ -16,7 +16,7 @@
*/
import {AppContext} from './app-context';
import {create, Finalizable, Registry} from './registry';
-import {DependencyToken} from './dependency';
+import {DependencyToken} from '../models/dependency';
import {FlagsServiceImplementation} from './flags/flags_impl';
import {GrReporting} from './gr-reporting/gr-reporting_impl';
import {EventEmitter} from './gr-event-interface/gr-event-interface_impl';
@@ -26,13 +26,16 @@
import {ChecksModel} from './checks/checks-model';
import {GrJsApiInterface} from '../elements/shared/gr-js-api-interface/gr-js-api-interface-element';
import {GrStorageService} from './storage/gr-storage_impl';
-import {UserModel} from './user/user-model';
-import {CommentsModel, commentsModelToken} from './comments/comments-model';
+import {UserModel} from '../models/user/user-model';
+import {
+ CommentsModel,
+ commentsModelToken,
+} from '../models/comments/comments-model';
import {RouterModel} from './router/router-model';
import {ShortcutsService} from './shortcuts/shortcuts-service';
import {assertIsDefined} from '../utils/common-util';
-import {ConfigModel} from './config/config-model';
-import {BrowserModel, browserModelToken} from './browser/browser-model';
+import {ConfigModel, configModelToken} from '../models/config/config-model';
+import {BrowserModel, browserModelToken} from '../models/browser/browser-model';
/**
* The AppContext lazy initializator for all services
@@ -59,9 +62,11 @@
changeModel: (ctx: Partial<AppContext>) => {
const routerModel = ctx.routerModel;
const restApiService = ctx.restApiService;
+ const userModel = ctx.userModel;
assertIsDefined(routerModel, 'routerModel');
assertIsDefined(restApiService, 'restApiService');
- return new ChangeModel(routerModel, restApiService);
+ assertIsDefined(userModel, 'userModel');
+ return new ChangeModel(routerModel, restApiService, userModel);
},
checksModel: (ctx: Partial<AppContext>) => {
const routerModel = ctx.routerModel;
@@ -78,13 +83,6 @@
return new GrJsApiInterface(reportingService!);
},
storageService: (_ctx: Partial<AppContext>) => new GrStorageService(),
- configModel: (ctx: Partial<AppContext>) => {
- const changeModel = ctx.changeModel;
- const restApiService = ctx.restApiService;
- assertIsDefined(changeModel, 'changeModel');
- assertIsDefined(restApiService, 'restApiService');
- return new ConfigModel(changeModel, restApiService);
- },
userModel: (ctx: Partial<AppContext>) => {
assertIsDefined(ctx.restApiService, 'restApiService');
return new UserModel(ctx.restApiService!);
@@ -113,5 +111,11 @@
);
dependencies.set(commentsModelToken, commentsModel);
+ const configModel = new ConfigModel(
+ appContext.changeModel,
+ appContext.restApiService
+ );
+ dependencies.set(configModelToken, configModel);
+
return dependencies;
}
diff --git a/polygerrit-ui/app/services/app-context.ts b/polygerrit-ui/app/services/app-context.ts
index 2e02ebf..6d6afc9 100644
--- a/polygerrit-ui/app/services/app-context.ts
+++ b/polygerrit-ui/app/services/app-context.ts
@@ -24,10 +24,9 @@
import {ChecksModel} from './checks/checks-model';
import {JsApiService} from '../elements/shared/gr-js-api-interface/gr-js-api-types';
import {StorageService} from './storage/gr-storage';
-import {UserModel} from './user/user-model';
+import {UserModel} from '../models/user/user-model';
import {RouterModel} from './router/router-model';
import {ShortcutsService} from './shortcuts/shortcuts-service';
-import {ConfigModel} from './config/config-model';
export interface AppContext {
routerModel: RouterModel;
@@ -40,7 +39,6 @@
checksModel: ChecksModel;
jsApiService: JsApiService;
storageService: StorageService;
- configModel: ConfigModel;
userModel: UserModel;
shortcutsService: ShortcutsService;
}
diff --git a/polygerrit-ui/app/services/change/change-model.ts b/polygerrit-ui/app/services/change/change-model.ts
index e410dd5..6bf7c103 100644
--- a/polygerrit-ui/app/services/change/change-model.ts
+++ b/polygerrit-ui/app/services/change/change-model.ts
@@ -25,10 +25,10 @@
combineLatest,
from,
fromEvent,
- BehaviorSubject,
Observable,
Subscription,
forkJoin,
+ of,
} from 'rxjs';
import {
map,
@@ -44,12 +44,15 @@
computeLatestPatchNum,
} from '../../utils/patch-set-util';
import {ParsedChangeInfo} from '../../types/types';
+import {fireAlert} from '../../utils/event-util';
import {ChangeInfo} from '../../types/common';
import {RestApiService} from '../gr-rest-api/gr-rest-api';
import {Finalizable} from '../registry';
import {select} from '../../utils/observable-util';
import {assertIsDefined} from '../../utils/common-util';
+import {Model} from '../../models/model';
+import {UserModel} from '../../models/user/user-model';
export enum LoadingStatus {
NOT_LOADED = 'NOT_LOADED',
@@ -58,6 +61,8 @@
LOADED = 'LOADED',
}
+const ERR_REVIEW_STATUS = 'Couldn’t change file review status.';
+
export interface ChangeState {
/**
* If `change` is undefined, this must be either NOT_LOADED or LOADING.
@@ -71,6 +76,12 @@
* Does not apply to change-view or edit-view.
*/
diffPath?: string;
+ /**
+ * The list of reviewed files, kept in the model because we want changes made
+ * in one view to reflect on other views without re-rendering the other views.
+ * Undefined means it's still loading and empty set means no files reviewed.
+ */
+ reviewedFiles?: string[];
}
/**
@@ -111,27 +122,31 @@
loadingStatus: LoadingStatus.NOT_LOADED,
};
-export class ChangeModel implements Finalizable {
- private readonly privateState$ = new BehaviorSubject(initialState);
+export class ChangeModel extends Model<ChangeState> implements Finalizable {
+ private change?: ParsedChangeInfo;
- public readonly changeState$: Observable<ChangeState> =
- this.privateState$.asObservable();
+ private currentPatchNum?: PatchSetNum;
public readonly change$ = select(
- this.privateState$,
+ this.state$,
changeState => changeState.change
);
public readonly changeLoadingStatus$ = select(
- this.privateState$,
+ this.state$,
changeState => changeState.loadingStatus
);
public readonly diffPath$ = select(
- this.privateState$,
+ this.state$,
changeState => changeState?.diffPath
);
+ public readonly reviewedFiles$ = select(
+ this.state$,
+ changeState => changeState?.reviewedFiles
+ );
+
public readonly changeNum$ = select(this.change$, change => change?._number);
public readonly repo$ = select(this.change$, change => change?.project);
@@ -156,7 +171,7 @@
* out inconsistent state, e.g. router changeNum already updated, change not
* yet reset to undefined.
*/
- combineLatest([this.routerModel.routerState$, this.changeState$])
+ combineLatest([this.routerModel.state$, this.state$])
.pipe(
filter(([routerState, changeState]) => {
const changeNum = changeState.change?._number;
@@ -182,8 +197,10 @@
constructor(
readonly routerModel: RouterModel,
- readonly restApiService: RestApiService
+ readonly restApiService: RestApiService,
+ readonly userModel: UserModel
) {
+ super(initialState);
this.subscriptions = [
combineLatest([this.routerModel.routerChangeNum$, this.reload$])
.pipe(
@@ -209,6 +226,25 @@
// helps with that.
this.updateStateChange(change ?? undefined);
}),
+ this.change$.subscribe(change => (this.change = change)),
+ this.currentPatchNum$.subscribe(
+ currentPatchNum => (this.currentPatchNum = currentPatchNum)
+ ),
+ combineLatest([
+ this.currentPatchNum$,
+ this.changeNum$,
+ this.userModel.loggedIn$,
+ ])
+ .pipe(
+ switchMap(([currentPatchNum, changeNum, loggedIn]) => {
+ if (!changeNum || !currentPatchNum || !loggedIn) {
+ this.updateStateReviewedFiles([]);
+ return of(undefined);
+ }
+ return from(this.fetchReviewedFiles(currentPatchNum!, changeNum!));
+ })
+ )
+ .subscribe(),
];
}
@@ -221,17 +257,79 @@
// Temporary workaround until path is derived in the model itself.
updatePath(diffPath?: string) {
- const current = this.getState();
+ const current = this.subject$.getValue();
this.setState({...current, diffPath});
}
+ updateStateReviewedFiles(reviewedFiles: string[]) {
+ const current = this.subject$.getValue();
+ this.setState({...current, reviewedFiles});
+ }
+
+ updateStateFileReviewed(file: string, reviewed: boolean) {
+ const current = this.subject$.getValue();
+ if (current.reviewedFiles === undefined) {
+ // Reviewed files haven't loaded yet.
+ // TODO(dhruvsri): disable updating status if reviewed files are not loaded.
+ fireAlert(
+ document,
+ 'Updating status failed. Reviewed files not loaded yet.'
+ );
+ return;
+ }
+ const reviewedFiles = [...current.reviewedFiles];
+
+ // File is already reviewed and is being marked reviewed
+ if (reviewedFiles.includes(file) && reviewed) return;
+ // File is not reviewed and is being marked not reviewed
+ if (!reviewedFiles.includes(file) && !reviewed) return;
+
+ if (reviewed) reviewedFiles.push(file);
+ else reviewedFiles.splice(reviewedFiles.indexOf(file), 1);
+ this.setState({...current, reviewedFiles});
+ }
+
+ fetchReviewedFiles(currentPatchNum: PatchSetNum, changeNum: NumericChangeId) {
+ return this.restApiService
+ .getReviewedFiles(changeNum, currentPatchNum)
+ .then(files => {
+ if (
+ changeNum !== this.change?._number ||
+ currentPatchNum !== this.currentPatchNum
+ )
+ return;
+ this.updateStateReviewedFiles(files ?? []);
+ });
+ }
+
+ setReviewedFilesStatus(
+ changeNum: NumericChangeId,
+ patchNum: PatchSetNum,
+ file: string,
+ reviewed: boolean
+ ) {
+ return this.restApiService
+ .saveFileReviewed(changeNum, patchNum, file, reviewed)
+ .then(() => {
+ if (
+ changeNum !== this.change?._number ||
+ patchNum !== this.currentPatchNum
+ )
+ return;
+ this.updateStateFileReviewed(file, reviewed);
+ })
+ .catch(() => {
+ fireAlert(document, ERR_REVIEW_STATUS);
+ });
+ }
+
/**
* Typically you would just subscribe to change$ yourself to get updates. But
* sometimes it is nice to also be able to get the current ChangeInfo on
* demand. So here it is for your convenience.
*/
getChange() {
- return this.getState().change;
+ return this.subject$.getValue().change;
}
/**
@@ -275,7 +373,7 @@
* a new change number, but an old change.
*/
private updateStateLoading(changeNum: NumericChangeId) {
- const current = this.getState();
+ const current = this.subject$.getValue();
const reloading = current.change?._number === changeNum;
this.setState({
...current,
@@ -288,7 +386,7 @@
// Private but used in tests.
updateStateChange(change?: ParsedChangeInfo) {
- const current = this.getState();
+ const current = this.subject$.getValue();
this.setState({
...current,
change,
@@ -297,12 +395,8 @@
});
}
- getState(): ChangeState {
- return this.privateState$.getValue();
- }
-
// Private but used in tests
setState(state: ChangeState) {
- this.privateState$.next(state);
+ this.subject$.next(state);
}
}
diff --git a/polygerrit-ui/app/services/change/change-model_test.ts b/polygerrit-ui/app/services/change/change-model_test.ts
index edbc403..37924c1 100644
--- a/polygerrit-ui/app/services/change/change-model_test.ts
+++ b/polygerrit-ui/app/services/change/change-model_test.ts
@@ -77,7 +77,8 @@
setup(() => {
changeModel = new ChangeModel(
getAppContext().routerModel,
- getAppContext().restApiService
+ getAppContext().restApiService,
+ getAppContext().userModel
);
knownChange = {
...createChange(),
@@ -110,7 +111,7 @@
let state: ChangeState | undefined = {
loadingStatus: LoadingStatus.NOT_LOADED,
};
- changeModel.changeState$
+ changeModel.state$
.pipe(takeUntil(testCompleted))
.subscribe(s => (state = s));
@@ -139,7 +140,7 @@
let state: ChangeState | undefined = {
loadingStatus: LoadingStatus.NOT_LOADED,
};
- changeModel.changeState$
+ changeModel.state$
.pipe(takeUntil(testCompleted))
.subscribe(s => (state = s));
changeModel.routerModel.setState({
@@ -168,7 +169,7 @@
let state: ChangeState | undefined = {
loadingStatus: LoadingStatus.NOT_LOADED,
};
- changeModel.changeState$
+ changeModel.state$
.pipe(takeUntil(testCompleted))
.subscribe(s => (state = s));
changeModel.routerModel.setState({
@@ -206,7 +207,7 @@
let state: ChangeState | undefined = {
loadingStatus: LoadingStatus.NOT_LOADED,
};
- changeModel.changeState$
+ changeModel.state$
.pipe(takeUntil(testCompleted))
.subscribe(s => (state = s));
changeModel.routerModel.setState({
diff --git a/polygerrit-ui/app/services/checks/checks-model.ts b/polygerrit-ui/app/services/checks/checks-model.ts
index a1d8018..2bdee51 100644
--- a/polygerrit-ui/app/services/checks/checks-model.ts
+++ b/polygerrit-ui/app/services/checks/checks-model.ts
@@ -55,6 +55,7 @@
import {Execution} from '../../constants/reporting';
import {fireAlert, fireEvent} from '../../utils/event-util';
import {RouterModel} from '../router/router-model';
+import {Model} from '../../models/model';
/**
* The checks model maintains the state of checks for two patchsets: the latest
@@ -150,7 +151,7 @@
[name: string]: string;
}
-export class ChecksModel implements Finalizable {
+export class ChecksModel extends Model<ChecksState> implements Finalizable {
private readonly providers: {[name: string]: ChecksProvider} = {};
private readonly reloadSubjects: {[name: string]: Subject<void>} = {};
@@ -169,25 +170,14 @@
private subscriptions: Subscription[] = [];
- private readonly privateState$ = new BehaviorSubject<ChecksState>({
- pluginStateLatest: {},
- pluginStateSelected: {},
- });
-
- public checksState$: Observable<ChecksState> =
- this.privateState$.asObservable();
-
public checksSelectedPatchsetNumber$ = select(
- this.checksState$,
+ this.state$,
state => state.patchsetNumberSelected
);
- public checksLatest$ = select(
- this.checksState$,
- state => state.pluginStateLatest
- );
+ public checksLatest$ = select(this.state$, state => state.pluginStateLatest);
- public checksSelected$ = select(this.checksState$, state =>
+ public checksSelected$ = select(this.state$, state =>
state.patchsetNumberSelected
? state.pluginStateSelected
: state.pluginStateLatest
@@ -325,6 +315,10 @@
readonly changeModel: ChangeModel,
readonly reporting: ReportingService
) {
+ super({
+ pluginStateLatest: {},
+ pluginStateSelected: {},
+ });
this.subscriptions = [
this.changeModel.changeNum$.subscribe(x => (this.changeNum = x)),
this.checkToPluginMap$.subscribe(map => {
@@ -365,13 +359,13 @@
s.unsubscribe();
}
this.subscriptions = [];
- this.privateState$.complete();
+ this.subject$.complete();
}
// Must only be used by the checks service or whatever is in control of this
// model.
updateStateSetProvider(pluginName: string, patchset: ChecksPatchset) {
- const nextState = {...this.privateState$.getValue()};
+ const nextState = {...this.subject$.getValue()};
const pluginState = this.getPluginState(nextState, patchset);
pluginState[pluginName] = {
pluginName,
@@ -381,7 +375,7 @@
actions: [],
links: [],
};
- this.privateState$.next(nextState);
+ this.subject$.next(nextState);
}
getPluginState(
@@ -398,13 +392,13 @@
}
updateStateSetLoading(pluginName: string, patchset: ChecksPatchset) {
- const nextState = {...this.privateState$.getValue()};
+ const nextState = {...this.subject$.getValue()};
const pluginState = this.getPluginState(nextState, patchset);
pluginState[pluginName] = {
...pluginState[pluginName],
loading: true,
};
- this.privateState$.next(nextState);
+ this.subject$.next(nextState);
}
updateStateSetError(
@@ -412,7 +406,7 @@
errorMessage: string,
patchset: ChecksPatchset
) {
- const nextState = {...this.privateState$.getValue()};
+ const nextState = {...this.subject$.getValue()};
const pluginState = this.getPluginState(nextState, patchset);
pluginState[pluginName] = {
...pluginState[pluginName],
@@ -423,7 +417,7 @@
runs: [],
actions: [],
};
- this.privateState$.next(nextState);
+ this.subject$.next(nextState);
}
updateStateSetNotLoggedIn(
@@ -431,7 +425,7 @@
loginCallback: () => void,
patchset: ChecksPatchset
) {
- const nextState = {...this.privateState$.getValue()};
+ const nextState = {...this.subject$.getValue()};
const pluginState = this.getPluginState(nextState, patchset);
pluginState[pluginName] = {
...pluginState[pluginName],
@@ -442,7 +436,7 @@
runs: [],
actions: [],
};
- this.privateState$.next(nextState);
+ this.subject$.next(nextState);
}
updateStateSetResults(
@@ -460,7 +454,7 @@
(a, b) => (a.attempt ?? -1) - (b.attempt ?? -1)
);
}
- const nextState = {...this.privateState$.getValue()};
+ const nextState = {...this.subject$.getValue()};
const pluginState = this.getPluginState(nextState, patchset);
pluginState[pluginName] = {
...pluginState[pluginName],
@@ -490,7 +484,7 @@
actions: [...actions],
links: [...links],
};
- this.privateState$.next(nextState);
+ this.subject$.next(nextState);
}
updateStateUpdateResult(
@@ -499,7 +493,7 @@
updatedResult: CheckResultApi,
patchset: ChecksPatchset
) {
- const nextState = {...this.privateState$.getValue()};
+ const nextState = {...this.subject$.getValue()};
const pluginState = this.getPluginState(nextState, patchset);
let runUpdated = false;
const runs: CheckRun[] = pluginState[pluginName].runs.map(run => {
@@ -529,13 +523,13 @@
...pluginState[pluginName],
runs,
};
- this.privateState$.next(nextState);
+ this.subject$.next(nextState);
}
updateStateSetPatchset(patchsetNumber?: PatchSetNumber) {
- const nextState = {...this.privateState$.getValue()};
+ const nextState = {...this.subject$.getValue()};
nextState.patchsetNumberSelected = patchsetNumber;
- this.privateState$.next(nextState);
+ this.subject$.next(nextState);
}
setPatchset(num?: PatchSetNumber) {
diff --git a/polygerrit-ui/app/services/router/router-model.ts b/polygerrit-ui/app/services/router/router-model.ts
index 73dee78..5bd228b 100644
--- a/polygerrit-ui/app/services/router/router-model.ts
+++ b/polygerrit-ui/app/services/router/router-model.ts
@@ -15,10 +15,11 @@
* limitations under the License.
*/
-import {BehaviorSubject, Observable} from 'rxjs';
+import {Observable} from 'rxjs';
import {distinctUntilChanged, map} from 'rxjs/operators';
import {Finalizable} from '../registry';
import {NumericChangeId, PatchSetNum} from '../../types/common';
+import {Model} from '../../models/model';
export enum GerritView {
ADMIN = 'admin',
@@ -43,9 +44,7 @@
patchNum?: PatchSetNum;
}
-export class RouterModel implements Finalizable {
- private readonly privateState$ = new BehaviorSubject<RouterState>({});
-
+export class RouterModel extends Model<RouterState> implements Finalizable {
readonly routerView$: Observable<GerritView | undefined>;
readonly routerChangeNum$: Observable<NumericChangeId | undefined>;
@@ -53,15 +52,16 @@
readonly routerPatchNum$: Observable<PatchSetNum | undefined>;
constructor() {
- this.routerView$ = this.privateState$.pipe(
+ super({});
+ this.routerView$ = this.state$.pipe(
map(state => state.view),
distinctUntilChanged()
);
- this.routerChangeNum$ = this.privateState$.pipe(
+ this.routerChangeNum$ = this.state$.pipe(
map(state => state.changeNum),
distinctUntilChanged()
);
- this.routerPatchNum$ = this.privateState$.pipe(
+ this.routerPatchNum$ = this.state$.pipe(
map(state => state.patchNum),
distinctUntilChanged()
);
@@ -69,18 +69,15 @@
finalize() {}
+ // Private but used in tests
setState(state: RouterState) {
- this.privateState$.next(state);
+ this.subject$.next(state);
}
updateState(partial: Partial<RouterState>) {
- this.privateState$.next({
- ...this.privateState$.getValue(),
+ this.subject$.next({
+ ...this.subject$.getValue(),
...partial,
});
}
-
- get routerState$(): Observable<RouterState> {
- return this.privateState$;
- }
}
diff --git a/polygerrit-ui/app/services/shortcuts/shortcuts-service.ts b/polygerrit-ui/app/services/shortcuts/shortcuts-service.ts
index 79f2993..41591a2 100644
--- a/polygerrit-ui/app/services/shortcuts/shortcuts-service.ts
+++ b/polygerrit-ui/app/services/shortcuts/shortcuts-service.ts
@@ -33,7 +33,7 @@
} from '../../utils/dom-util';
import {ReportingService} from '../gr-reporting/gr-reporting';
import {Finalizable} from '../registry';
-import {UserModel} from '../user/user-model';
+import {UserModel} from '../../models/user/user-model';
export type SectionView = Array<{binding: string[][]; text: string}>;
diff --git a/polygerrit-ui/app/services/storage/gr-storage_impl.ts b/polygerrit-ui/app/services/storage/gr-storage_impl.ts
index 0824fb4..5c8a765 100644
--- a/polygerrit-ui/app/services/storage/gr-storage_impl.ts
+++ b/polygerrit-ui/app/services/storage/gr-storage_impl.ts
@@ -139,16 +139,17 @@
}
try {
this.storage.setItem(key, JSON.stringify(obj));
- } catch (exc) {
- // Catch for QuotaExceededError and disable writes on local storage the
- // first time that it occurs.
- if (exc.code === 22) {
- this.exceededQuota = true;
- console.warn('Local storage quota exceeded: disabling');
- return;
- } else {
- throw exc;
+ } catch (exc: unknown) {
+ if (exc instanceof DOMException) {
+ // Catch for QuotaExceededError and disable writes on local storage the
+ // first time that it occurs.
+ if (exc.code === 22) {
+ this.exceededQuota = true;
+ console.warn('Local storage quota exceeded: disabling');
+ return;
+ }
}
+ throw exc;
}
}
}
diff --git a/polygerrit-ui/app/services/storage/gr-storage_test.js b/polygerrit-ui/app/services/storage/gr-storage_test.js
index 6cbfacf..93567ec 100644
--- a/polygerrit-ui/app/services/storage/gr-storage_test.js
+++ b/polygerrit-ui/app/services/storage/gr-storage_test.js
@@ -26,8 +26,9 @@
getItem(key) { return this[key]; },
removeItem(key) { delete this[key]; },
setItem(key, value) {
- // eslint-disable-next-line no-throw-literal
- if (opt_quotaExceeded) { throw {code: 22}; /* Quota exceeded */ }
+ if (opt_quotaExceeded) {
+ throw new DOMException('error', 'QuotaExceededError');
+ }
this[key] = value;
},
};
diff --git a/polygerrit-ui/app/test/common-test-setup.ts b/polygerrit-ui/app/test/common-test-setup.ts
index 19cb790..23c4141 100644
--- a/polygerrit-ui/app/test/common-test-setup.ts
+++ b/polygerrit-ui/app/test/common-test-setup.ts
@@ -53,7 +53,7 @@
DependencyError,
DependencyToken,
Provider,
-} from '../services/dependency';
+} from '../models/dependency';
declare global {
interface Window {
diff --git a/polygerrit-ui/app/test/test-app-context-init.ts b/polygerrit-ui/app/test/test-app-context-init.ts
index 491a891..2f39b3c 100644
--- a/polygerrit-ui/app/test/test-app-context-init.ts
+++ b/polygerrit-ui/app/test/test-app-context-init.ts
@@ -17,7 +17,7 @@
// Init app context before any other imports
import {create, Registry, Finalizable} from '../services/registry';
-import {DependencyToken} from '../services/dependency';
+import {DependencyToken} from '../models/dependency';
import {assertIsDefined} from '../utils/common-util';
import {AppContext} from '../services/app-context';
import {grReportingMock} from '../services/gr-reporting/gr-reporting_mock';
@@ -29,18 +29,15 @@
import {ChangeModel} from '../services/change/change-model';
import {ChecksModel} from '../services/checks/checks-model';
import {GrJsApiInterface} from '../elements/shared/gr-js-api-interface/gr-js-api-interface-element';
-import {UserModel} from '../services/user/user-model';
+import {UserModel} from '../models/user/user-model';
import {
CommentsModel,
commentsModelToken,
-} from '../services/comments/comments-model';
+} from '../models/comments/comments-model';
import {RouterModel} from '../services/router/router-model';
import {ShortcutsService} from '../services/shortcuts/shortcuts-service';
-import {ConfigModel} from '../services/config/config-model';
-import {
- BrowserModel,
- browserModelToken,
-} from '../services/browser/browser-model';
+import {ConfigModel, configModelToken} from '../models/config/config-model';
+import {BrowserModel, browserModelToken} from '../models/browser/browser-model';
export function createTestAppContext(): AppContext & Finalizable {
const appRegistry: Registry<AppContext> = {
@@ -57,9 +54,11 @@
changeModel: (ctx: Partial<AppContext>) => {
const routerModel = ctx.routerModel;
const restApiService = ctx.restApiService;
+ const userModel = ctx.userModel;
assertIsDefined(routerModel, 'routerModel');
assertIsDefined(restApiService, 'restApiService');
- return new ChangeModel(routerModel, restApiService);
+ assertIsDefined(userModel, 'userModel');
+ return new ChangeModel(routerModel, restApiService, userModel);
},
checksModel: (ctx: Partial<AppContext>) => {
const routerModel = ctx.routerModel;
@@ -75,11 +74,6 @@
return new GrJsApiInterface(ctx.reportingService!);
},
storageService: (_ctx: Partial<AppContext>) => grStorageMock,
- configModel: (ctx: Partial<AppContext>) => {
- assertIsDefined(ctx.changeModel, 'changeModel');
- assertIsDefined(ctx.restApiService, 'restApiService');
- return new ConfigModel(ctx.changeModel!, ctx.restApiService!);
- },
userModel: (ctx: Partial<AppContext>) => {
assertIsDefined(ctx.restApiService, 'restApiService');
return new UserModel(ctx.restApiService!);
@@ -115,5 +109,9 @@
);
dependencies.set(commentsModelToken, commentsModel);
+ const configModel = () =>
+ new ConfigModel(appContext.changeModel, appContext.restApiService);
+ dependencies.set(configModelToken, configModel);
+
return dependencies;
}
diff --git a/polygerrit-ui/app/test/test-utils.ts b/polygerrit-ui/app/test/test-utils.ts
index 7652039..88167e0 100644
--- a/polygerrit-ui/app/test/test-utils.ts
+++ b/polygerrit-ui/app/test/test-utils.ts
@@ -23,11 +23,12 @@
import {StorageService} from '../services/storage/gr-storage';
import {AuthService} from '../services/gr-auth/gr-auth';
import {ReportingService} from '../services/gr-reporting/gr-reporting';
-import {UserModel} from '../services/user/user-model';
+import {UserModel} from '../models/user/user-model';
import {ShortcutsService} from '../services/shortcuts/shortcuts-service';
import {queryAndAssert, query} from '../utils/common-util';
import {FlagsService} from '../services/flags/flags';
import {Key, Modifier} from '../utils/dom-util';
+import {ChangeModel} from '../services/change/change-model';
export {query, queryAll, queryAndAssert} from '../utils/common-util';
export interface MockPromise<T> extends Promise<T> {
@@ -111,6 +112,10 @@
return sinon.spy(getAppContext().restApiService, method);
}
+export function stubChange<K extends keyof ChangeModel>(method: K) {
+ return sinon.stub(getAppContext().changeModel, method);
+}
+
export function stubUsers<K extends keyof UserModel>(method: K) {
return sinon.stub(getAppContext().userModel, method);
}
diff --git a/polygerrit-ui/app/tsconfig.json b/polygerrit-ui/app/tsconfig.json
index 5040496..a335926 100644
--- a/polygerrit-ui/app/tsconfig.json
+++ b/polygerrit-ui/app/tsconfig.json
@@ -87,6 +87,7 @@
"embed/**/*",
"gr-diff/**/*",
"mixins/**/*",
+ "models/**/*",
"samples/**/*",
"scripts/**/*",
"services/**/*",
diff --git a/polygerrit-ui/app/tsconfig_bazel.json b/polygerrit-ui/app/tsconfig_bazel.json
index dfd2078..cd83fc0 100644
--- a/polygerrit-ui/app/tsconfig_bazel.json
+++ b/polygerrit-ui/app/tsconfig_bazel.json
@@ -16,6 +16,7 @@
"embed/**/*",
"gr-diff/**/*",
"mixins/**/*",
+ "models/**/*",
"samples/**/*",
"scripts/**/*",
"services/**/*",
diff --git a/polygerrit-ui/app/tsconfig_bazel_test.json b/polygerrit-ui/app/tsconfig_bazel_test.json
index 7137e23..be3c934 100644
--- a/polygerrit-ui/app/tsconfig_bazel_test.json
+++ b/polygerrit-ui/app/tsconfig_bazel_test.json
@@ -20,6 +20,7 @@
"embed/**/*",
"gr-diff/**/*",
"mixins/**/*",
+ "models/**/*",
"samples/**/*",
"scripts/**/*",
"services/**/*",
diff --git a/tools/BUILD b/tools/BUILD
index 48cc854..04375f9 100644
--- a/tools/BUILD
+++ b/tools/BUILD
@@ -1,22 +1,11 @@
load(
"@bazel_tools//tools/jdk:default_java_toolchain.bzl",
- "JDK9_JVM_OPTS",
"default_java_toolchain",
)
load("@rules_java//java:defs.bzl", "java_package_configuration")
exports_files(["nongoogle.bzl"])
-default_java_toolchain(
- name = "error_prone_warnings_toolchain",
- bootclasspath = ["@bazel_tools//tools/jdk:platformclasspath.jar"],
- jvm_opts = JDK9_JVM_OPTS,
- package_configuration = [
- ":error_prone",
- ],
- visibility = ["//visibility:public"],
-)
-
JDK11_JVM_OPTS = select({
"@bazel_tools//src/conditions:openbsd": ["-Xbootclasspath/p:$(location @bazel_tools//tools/jdk:javac_jar)"],
"//conditions:default": [
@@ -276,7 +265,7 @@
"-Xep:JavaPeriodGetDays:ERROR",
"-Xep:JavaTimeDefaultTimeZone:ERROR",
"-Xep:JavaUtilDate:WARN",
- # "-Xep:JdkObsolete:WARN",
+ "-Xep:JdkObsolete:ERROR",
"-Xep:JodaConstructors:ERROR",
"-Xep:JodaDateTimeConstants:ERROR",
"-Xep:JodaDurationWithMillis:ERROR",
diff --git a/tools/bzl/javadoc.bzl b/tools/bzl/javadoc.bzl
index 62b4010..3add025 100644
--- a/tools/bzl/javadoc.bzl
+++ b/tools/bzl/javadoc.bzl
@@ -61,14 +61,14 @@
command = " && ".join(cmd),
)
-_java_doc = rule(
+java_doc = rule(
attrs = {
"external_docs": attr.string_list(),
"libs": attr.label_list(allow_files = False),
"pkgs": attr.string_list(),
"title": attr.string(),
"_jdk": attr.label(
- default = Label("@bazel_tools//tools/jdk:current_host_java_runtime"),
+ default = Label("@bazel_tools//tools/jdk:current_java_runtime"),
allow_files = True,
providers = [java_common.JavaRuntimeInfo],
),
@@ -76,16 +76,3 @@
outputs = {"zip": "%{name}.zip"},
implementation = _impl,
)
-
-def java_doc(**kwargs):
- libs = kwargs.get("libs", [])
- libs = libs + select({
- "//:java11": [],
- "//:java_next": [],
- # TODO(davido): Remove this dependency, when Java 8 support is removed.
- # auto-value generates @javax.annotation.Generated annotation on generated
- # classes when Java 8 source compatibility level is used, but Java 11 and
- # later don't have this class any more.
- "//conditions:default": ["//lib:javax-annotation"],
- })
- _java_doc(**dict(kwargs, libs = libs))
diff --git a/tools/deps.bzl b/tools/deps.bzl
index fc450c7..2e89b9e 100644
--- a/tools/deps.bzl
+++ b/tools/deps.bzl
@@ -695,12 +695,6 @@
)
maven_jar(
- name = "javax-annotation",
- artifact = "javax.annotation:javax.annotation-api:1.3.2",
- sha1 = "934c04d3cfef185a8008e7bf34331b79730a9d43",
- )
-
- maven_jar(
name = "mockito",
artifact = "org.mockito:mockito-core:3.3.3",
sha1 = "4878395d4e63173f3825e17e5e0690e8054445f1",
diff --git a/tools/eclipse/project.py b/tools/eclipse/project.py
index ed5b464..d574ecf 100755
--- a/tools/eclipse/project.py
+++ b/tools/eclipse/project.py
@@ -49,9 +49,7 @@
opts.add_argument('-b', '--batch', action='store_true',
dest='batch', help='Bazel batch option')
opts.add_argument('-j', '--java', action='store',
- dest='java', help='Legacy Java 1.8 or post Java 11')
-opts.add_argument('-e', '--edge_java', action='store',
- dest='edge_java', help='Post Java 11 support (14|...)')
+ dest='java', help='Post Java 11')
opts.add_argument('--bazel',
help=('name of the bazel executable. Defaults to using'
' bazelisk if found, or bazel if bazelisk is not'
@@ -85,7 +83,6 @@
batch_option = '--batch' if args.batch else None
custom_java = args.java
-edge_java = args.edge_java
bazel_exe = find_bazel()
@@ -98,13 +95,9 @@
if arg == "build":
build = True
cmd.append(arg)
- if custom_java == '1.8':
- cmd.append('--java_toolchain=//tools:error_prone_warnings_toolchain')
- elif custom_java and not edge_java:
+ if custom_java:
cmd.append('--host_java_toolchain=@bazel_tools//tools/jdk:toolchain_java%s' % custom_java)
cmd.append('--java_toolchain=@bazel_tools//tools/jdk:toolchain_java%s' % custom_java)
- if edge_java and build:
- cmd.append(edge_java)
return cmd