Merge branch 'stable-2.11'
* stable-2.11:
Update 2.11 release notes
Make LabelTypeIT tests assume copy-score defaults now initialized herein
Remove duplication of defaults for boolean label types in ProjectConfig
Add tests for copyAllScoresIfNoChange in LabelTypeIT
Change-Id: I035ce888508fcab47e3939a4332710966049bb91
diff --git a/.buckconfig b/.buckconfig
index e4a19f1..e3d0ffc 100644
--- a/.buckconfig
+++ b/.buckconfig
@@ -9,6 +9,7 @@
docs = //Documentation:searchfree
firefox = //:firefox
gerrit = //:gerrit
+ headless = //:headless
release = //:release
safari = //:safari
soyc = //gerrit-gwtui:ui_soyc
diff --git a/.buckversion b/.buckversion
index 05c1944..9c09744 100644
--- a/.buckversion
+++ b/.buckversion
@@ -1 +1 @@
-e8190a34ff10bdb55729a8a50669805f833f6a85
+79d36de9f5284f6e833cca81867d6088a25685fb
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..1f149cf
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,11 @@
+# http://EditorConfig.org
+
+# top-most EditorConfig file
+root = true
+
+[*]
+end_of_line = lf
+insert_final_newline = true
+charset = utf-8
+indent_style = space
+indent_size = 2
diff --git a/.settings/edu.umd.cs.findbugs.core.prefs b/.settings/edu.umd.cs.findbugs.core.prefs
new file mode 100644
index 0000000..a838b1e
--- /dev/null
+++ b/.settings/edu.umd.cs.findbugs.core.prefs
@@ -0,0 +1,137 @@
+#FindBugs User Preferences
+#Fri Mar 13 16:09:14 JST 2015
+cloud_id=edu.umd.cs.findbugs.cloud.doNothingCloud
+detectorAppendingToAnObjectOutputStream=AppendingToAnObjectOutputStream|true
+detectorAtomicityProblem=AtomicityProblem|true
+detectorBadAppletConstructor=BadAppletConstructor|false
+detectorBadResultSetAccess=BadResultSetAccess|true
+detectorBadSyntaxForRegularExpression=BadSyntaxForRegularExpression|true
+detectorBadUseOfReturnValue=BadUseOfReturnValue|true
+detectorBadlyOverriddenAdapter=BadlyOverriddenAdapter|true
+detectorBooleanReturnNull=BooleanReturnNull|true
+detectorCallToUnsupportedMethod=CallToUnsupportedMethod|false
+detectorCheckExpectedWarnings=CheckExpectedWarnings|false
+detectorCheckImmutableAnnotation=CheckImmutableAnnotation|true
+detectorCheckRelaxingNullnessAnnotation=CheckRelaxingNullnessAnnotation|true
+detectorCheckTypeQualifiers=CheckTypeQualifiers|true
+detectorCloneIdiom=CloneIdiom|true
+detectorComparatorIdiom=ComparatorIdiom|true
+detectorConfusedInheritance=ConfusedInheritance|true
+detectorConfusionBetweenInheritedAndOuterMethod=ConfusionBetweenInheritedAndOuterMethod|true
+detectorCrossSiteScripting=CrossSiteScripting|true
+detectorDefaultEncodingDetector=DefaultEncodingDetector|true
+detectorDoInsideDoPrivileged=DoInsideDoPrivileged|true
+detectorDontCatchIllegalMonitorStateException=DontCatchIllegalMonitorStateException|true
+detectorDontIgnoreResultOfPutIfAbsent=DontIgnoreResultOfPutIfAbsent|true
+detectorDontUseEnum=DontUseEnum|true
+detectorDroppedException=DroppedException|true
+detectorDumbMethodInvocations=DumbMethodInvocations|true
+detectorDumbMethods=DumbMethods|true
+detectorDuplicateBranches=DuplicateBranches|true
+detectorEmptyZipFileEntry=EmptyZipFileEntry|false
+detectorEqualsOperandShouldHaveClassCompatibleWithThis=EqualsOperandShouldHaveClassCompatibleWithThis|true
+detectorExplicitSerialization=ExplicitSerialization|true
+detectorFinalizerNullsFields=FinalizerNullsFields|true
+detectorFindBadCast2=FindBadCast2|true
+detectorFindBadForLoop=FindBadForLoop|true
+detectorFindCircularDependencies=FindCircularDependencies|false
+detectorFindDeadLocalStores=FindDeadLocalStores|true
+detectorFindDoubleCheck=FindDoubleCheck|true
+detectorFindEmptySynchronizedBlock=FindEmptySynchronizedBlock|true
+detectorFindFieldSelfAssignment=FindFieldSelfAssignment|true
+detectorFindFinalizeInvocations=FindFinalizeInvocations|true
+detectorFindFloatEquality=FindFloatEquality|true
+detectorFindHEmismatch=FindHEmismatch|true
+detectorFindInconsistentSync2=FindInconsistentSync2|true
+detectorFindJSR166LockMonitorenter=FindJSR166LockMonitorenter|true
+detectorFindLocalSelfAssignment2=FindLocalSelfAssignment2|true
+detectorFindMaskedFields=FindMaskedFields|true
+detectorFindMismatchedWaitOrNotify=FindMismatchedWaitOrNotify|true
+detectorFindNakedNotify=FindNakedNotify|true
+detectorFindNonShortCircuit=FindNonShortCircuit|true
+detectorFindNullDeref=FindNullDeref|true
+detectorFindNullDerefsInvolvingNonShortCircuitEvaluation=FindNullDerefsInvolvingNonShortCircuitEvaluation|true
+detectorFindOpenStream=FindOpenStream|true
+detectorFindPuzzlers=FindPuzzlers|true
+detectorFindRefComparison=FindRefComparison|true
+detectorFindReturnRef=FindReturnRef|true
+detectorFindRoughConstants=FindRoughConstants|true
+detectorFindRunInvocations=FindRunInvocations|true
+detectorFindSelfComparison=FindSelfComparison|true
+detectorFindSelfComparison2=FindSelfComparison2|true
+detectorFindSleepWithLockHeld=FindSleepWithLockHeld|true
+detectorFindSpinLoop=FindSpinLoop|true
+detectorFindSqlInjection=FindSqlInjection|true
+detectorFindTwoLockWait=FindTwoLockWait|true
+detectorFindUncalledPrivateMethods=FindUncalledPrivateMethods|true
+detectorFindUnconditionalWait=FindUnconditionalWait|true
+detectorFindUninitializedGet=FindUninitializedGet|true
+detectorFindUnrelatedTypesInGenericContainer=FindUnrelatedTypesInGenericContainer|true
+detectorFindUnreleasedLock=FindUnreleasedLock|true
+detectorFindUnsatisfiedObligation=FindUnsatisfiedObligation|true
+detectorFindUnsyncGet=FindUnsyncGet|true
+detectorFindUseOfNonSerializableValue=FindUseOfNonSerializableValue|true
+detectorFindUselessControlFlow=FindUselessControlFlow|true
+detectorFormatStringChecker=FormatStringChecker|true
+detectorHugeSharedStringConstants=HugeSharedStringConstants|true
+detectorIDivResultCastToDouble=IDivResultCastToDouble|true
+detectorIncompatMask=IncompatMask|true
+detectorInconsistentAnnotations=InconsistentAnnotations|true
+detectorInefficientIndexOf=InefficientIndexOf|true
+detectorInefficientMemberAccess=InefficientMemberAccess|false
+detectorInefficientToArray=InefficientToArray|true
+detectorInfiniteLoop=InfiniteLoop|true
+detectorInfiniteRecursiveLoop=InfiniteRecursiveLoop|true
+detectorInheritanceUnsafeGetResource=InheritanceUnsafeGetResource|true
+detectorInitializationChain=InitializationChain|true
+detectorInitializeNonnullFieldsInConstructor=InitializeNonnullFieldsInConstructor|true
+detectorInstantiateStaticClass=InstantiateStaticClass|true
+detectorIntCast2LongAsInstant=IntCast2LongAsInstant|true
+detectorInvalidJUnitTest=InvalidJUnitTest|true
+detectorIteratorIdioms=IteratorIdioms|true
+detectorLazyInit=LazyInit|true
+detectorLoadOfKnownNullValue=LoadOfKnownNullValue|true
+detectorLostLoggerDueToWeakReference=LostLoggerDueToWeakReference|true
+detectorMethodReturnCheck=MethodReturnCheck|true
+detectorMultithreadedInstanceAccess=MultithreadedInstanceAccess|true
+detectorMutableLock=MutableLock|true
+detectorMutableStaticFields=MutableStaticFields|true
+detectorNaming=Naming|true
+detectorNoteUnconditionalParamDerefs=NoteUnconditionalParamDerefs|true
+detectorNumberConstructor=NumberConstructor|true
+detectorOptionalReturnNull=OptionalReturnNull|true
+detectorOverridingEqualsNotSymmetrical=OverridingEqualsNotSymmetrical|true
+detectorPreferZeroLengthArrays=PreferZeroLengthArrays|true
+detectorPublicSemaphores=PublicSemaphores|false
+detectorQuestionableBooleanAssignment=QuestionableBooleanAssignment|true
+detectorReadOfInstanceFieldInMethodInvokedByConstructorInSuperclass=ReadOfInstanceFieldInMethodInvokedByConstructorInSuperclass|true
+detectorReadReturnShouldBeChecked=ReadReturnShouldBeChecked|true
+detectorRedundantInterfaces=RedundantInterfaces|true
+detectorRepeatedConditionals=RepeatedConditionals|true
+detectorRuntimeExceptionCapture=RuntimeExceptionCapture|true
+detectorSerializableIdiom=SerializableIdiom|true
+detectorStartInConstructor=StartInConstructor|true
+detectorStaticCalendarDetector=StaticCalendarDetector|true
+detectorStringConcatenation=StringConcatenation|true
+detectorSuperfluousInstanceOf=SuperfluousInstanceOf|true
+detectorSuspiciousThreadInterrupted=SuspiciousThreadInterrupted|true
+detectorSwitchFallthrough=SwitchFallthrough|true
+detectorSynchronizationOnSharedBuiltinConstant=SynchronizationOnSharedBuiltinConstant|true
+detectorSynchronizeAndNullCheckField=SynchronizeAndNullCheckField|true
+detectorSynchronizeOnClassLiteralNotGetClass=SynchronizeOnClassLiteralNotGetClass|true
+detectorSynchronizingOnContentsOfFieldToProtectField=SynchronizingOnContentsOfFieldToProtectField|true
+detectorURLProblems=URLProblems|true
+detectorUncallableMethodOfAnonymousClass=UncallableMethodOfAnonymousClass|true
+detectorUnnecessaryMath=UnnecessaryMath|true
+detectorUnreadFields=UnreadFields|true
+detectorUselessSubclassMethod=UselessSubclassMethod|false
+detectorVarArgsProblems=VarArgsProblems|true
+detectorVolatileUsage=VolatileUsage|true
+detectorWaitInLoop=WaitInLoop|true
+detectorWrongMapIterator=WrongMapIterator|true
+detectorXMLFactoryBypass=XMLFactoryBypass|true
+detector_threshold=2
+effort=default
+filter_settings=Medium|BAD_PRACTICE,CORRECTNESS,EXPERIMENTAL,MALICIOUS_CODE,MT_CORRECTNESS,PERFORMANCE,SECURITY,STYLE|false|12
+filter_settings_neg=NOISE,I18N|
+run_at_full_build=false
diff --git a/BUCK b/BUCK
index 2cd3fa8..02ee883 100644
--- a/BUCK
+++ b/BUCK
@@ -1,6 +1,7 @@
include_defs('//tools/build.defs')
gerrit_war(name = 'gerrit')
+gerrit_war(name = 'headless', ui = None)
gerrit_war(name = 'chrome', ui = 'ui_chrome')
gerrit_war(name = 'firefox', ui = 'ui_firefox')
gerrit_war(name = 'safari', ui = 'ui_safari')
diff --git a/Documentation/cmd-gc.txt b/Documentation/cmd-gc.txt
index a890f1b..b7388a1 100644
--- a/Documentation/cmd-gc.txt
+++ b/Documentation/cmd-gc.txt
@@ -8,6 +8,7 @@
'ssh' -p <port> <host> 'gerrit gc'
[--all]
[--show-progress]
+ [--aggressive]
<NAME> ...
--
@@ -44,6 +45,9 @@
--show-progress::
If specified progress information is shown.
+--aggressive::
+ If an aggressive garbage collection should be done.
+
== EXAMPLES
Run the Git garbage collection for the projects 'myProject' and
diff --git a/Documentation/cmd-index.txt b/Documentation/cmd-index.txt
index 7c664ac..f3bff7d 100644
--- a/Documentation/cmd-index.txt
+++ b/Documentation/cmd-index.txt
@@ -75,6 +75,9 @@
link:cmd-review.html[gerrit review]::
Verify, approve and/or submit a patch set from the command line.
+link:cmd-set-head.html[gerrit set-head]::
+ Change the HEAD reference of a project.
+
link:cmd-set-reviewers.html[gerrit set-reviewers]::
Add or remove reviewers on a change.
diff --git a/Documentation/cmd-set-head.txt b/Documentation/cmd-set-head.txt
new file mode 100644
index 0000000..d74caaa
--- /dev/null
+++ b/Documentation/cmd-set-head.txt
@@ -0,0 +1,45 @@
+= gerrit set-head
+
+== NAME
+gerrit set-head - Change a project's HEAD.
+
+== SYNOPSIS
+--
+'ssh' -p <port> <host> 'gerrit set-head' <NAME>
+ --new-head <REF>
+--
+
+== DESCRIPTION
+Modifies a given project's HEAD reference.
+
+The command is argument-safe, that is, if no argument is given the
+previous settings are kept intact.
+
+== ACCESS
+Caller must be an owner of the given project.
+
+== SCRIPTING
+This command is intended to be used in scripts.
+
+== OPTIONS
+<NAME>::
+ Required; name of the project to change the HEAD. If name ends
+ with `.git` the suffix will be automatically removed.
+
+--new-head::
+ Required; name of the ref that should be set as new HEAD. The
+ 'refs/heads/' prefix can be omitted.
+
+== EXAMPLES
+Change HEAD of project `example` to `stable-2.11` branch:
+
+====
+ $ ssh -p 29418 review.example.com gerrit set-head example --new-head stable-2.11
+====
+
+GERRIT
+------
+Part of link:index.html[Gerrit Code Review]
+
+SEARCHBOX
+---------
diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt
index fb0fd8e..9f34b07 100644
--- a/Documentation/config-gerrit.txt
+++ b/Documentation/config-gerrit.txt
@@ -854,6 +854,30 @@
+
Default is "Submit patch set ${patchSet} into ${branch}".
+[[change.submitWholeTopic]]change.submitWholeTopic::
++
+Determines if the submit button submits the whole topic instead of
+just the current change.
++
+Default is false.
+
+[[change.submitTopicLabel]]change.submitTopicLabel::
++
+If `change.submitWholeTopic` is set and a change has a topic,
+the label name for the submit button is given here instead of
+the configuration `change.submitLabel`.
++
+Defaults to "Submit whole topic"
+
+[[change.submitTopicTooltip]]change.submitTopicTooltip::
++
+If `change.submitWholeTopic` is configuerd to true and a change has a
+topic, this configuration determines the tooltip for the submit button
+instead of `change.submitTooltip`. The variable `${topicSize}` is available
+for the number of changes to be submitted.
++
+Defaults to "Submit all ${topicSize} changes within the topic".
+
[[change.replyLabel]]change.replyLabel::
+
Label name for the reply button. In the user interface an ellipsis (…)
@@ -1429,6 +1453,15 @@
to run periodically. It will be triggered and executed sequentially for all
projects.
+[[gc.aggressive]]gc.aggressive::
++
+Determines if scheduled garbage collections and garbage collections triggered
+through Web-UI should run in aggressive mode or not. Aggressive garbage
+collections are more expensive but may lead to significantly smaller
+repositories.
++
+Valid values are "true" and "false," default is "false".
+
[[gc.startTime]]gc.startTime::
+
Start time to define the first execution of the git garbage collection.
@@ -2634,6 +2667,13 @@
and SSH. If set to true Administrators can install new plugins
remotely, or disable existing plugins. Defaults to false.
+[[plugins.jsLoadTimeout]]plugins.jsLoadTimeout::
++
+Set the timeout value for loading JavaScript plugins in Gerrit UI.
+Values can be specified using standard time unit abbreviations ('ms',
+'sec', 'min', etc.).
++
+Default is 5 seconds. Negative values will be converted to 0.
[[receive]]
=== Section receive
diff --git a/Documentation/dev-buck.txt b/Documentation/dev-buck.txt
index 6bd3905..c234651 100644
--- a/Documentation/dev-buck.txt
+++ b/Documentation/dev-buck.txt
@@ -116,6 +116,20 @@
----
+=== Headless Mode
+
+To build Gerrit in headless mode, i.e. without the GWT Web UI:
+
+----
+ buck build headless
+----
+
+The output executable WAR will be placed in:
+
+----
+ buck-out/gen/headless.war
+----
+
=== Extension and Plugin API JAR Files
To build the extension, plugin and GWT API JAR files:
diff --git a/Documentation/dev-plugins.txt b/Documentation/dev-plugins.txt
index 8bfac13..ebc59f4 100644
--- a/Documentation/dev-plugins.txt
+++ b/Documentation/dev-plugins.txt
@@ -36,7 +36,7 @@
----
mvn archetype:generate -DarchetypeGroupId=com.google.gerrit \
-DarchetypeArtifactId=gerrit-plugin-archetype \
- -DarchetypeVersion=2.10 \
+ -DarchetypeVersion=2.12-SNAPSHOT \
-DgroupId=com.googlesource.gerrit.plugins.testplugin \
-DartifactId=testplugin
----
@@ -1717,17 +1717,18 @@
[[data-directory]]
== Data Directory
-Plugins can request a data directory with a `@PluginData` File
-dependency. A data directory will be created automatically by the
-server in `$site_path/data/$plugin_name` and passed to the plugin.
+Plugins can request a data directory with a `@PluginData` Path (or File,
+deprecated) dependency. A data directory will be created automatically
+by the server in `$site_path/data/$plugin_name` and passed to the
+plugin.
Plugins can use this to store any data they want.
[source,java]
----
@Inject
-MyType(@PluginData java.io.File myDir) {
- new FileInputStream(new File(myDir, "my.config"));
+MyType(@PluginData java.nio.file.Path myDir) {
+ this.in = Files.newInputStream(myDir.resolve("my.config"));
}
----
diff --git a/Documentation/dev-readme.txt b/Documentation/dev-readme.txt
index bcf4a588..b64973a 100644
--- a/Documentation/dev-readme.txt
+++ b/Documentation/dev-readme.txt
@@ -56,6 +56,17 @@
Eclipse integration and then open it as Eclipse project in IDEA.
You need the Eclipse plugin activated in IntelliJ IDEA.
+Once you start compiling using both buck and your Gerrit project in
+IDEA, you will likely need to mark the below directories as generated
+sources roots. You can do so using the IDEA "Project" view. In the
+context menu of each one of these, use "Mark Directory As" to mark
+them as "Generated Sources Root":
+
+----
+ __auto_value_tests_gen__
+ __httpd_gen__
+ __server_gen__
+----
== Mac OS X
diff --git a/Documentation/rest-api-changes.txt b/Documentation/rest-api-changes.txt
index 49ebb49..640ed87 100644
--- a/Documentation/rest-api-changes.txt
+++ b/Documentation/rest-api-changes.txt
@@ -3918,7 +3918,6 @@
|===========================
|Field Name ||Description
|`change_id` |optional|The Change-Id of the change.
-|`status` |optional|The status of the change.
|`commit` ||The commit as a
link:#commit-info[CommitInfo] entity.
|`_change_number` |optional|The change number.
diff --git a/Documentation/rest-api-projects.txt b/Documentation/rest-api-projects.txt
index a909ab4..a25c7bb 100644
--- a/Documentation/rest-api-projects.txt
+++ b/Documentation/rest-api-projects.txt
@@ -2116,6 +2116,8 @@
|Field Name ||Description
|`show_progress` |`false` if not set|
Whether progress information should be shown.
+|`aggressive` |`false` if not set|
+Whether an aggressive garbage collection should be done.
|=============================
[[head-input]]
diff --git a/Documentation/user-review-ui.txt b/Documentation/user-review-ui.txt
index 309b61f..dddbadc 100644
--- a/Documentation/user-review-ui.txt
+++ b/Documentation/user-review-ui.txt
@@ -537,7 +537,7 @@
note that following the link to an indirect descendant change may
result in a completely different related changes listing.
-** [[merged-ancestor]]Black Dot:
+** [[closed-ancestor]]Black Dot:
+
Indicates a merged ancestor, e.g. the commit was directly pushed into
the repository bypassing code review, or the ancestor change was
@@ -546,10 +546,6 @@
the commit was done on `branch-a`, but was then pushed to
`refs/for/branch-b`.
-** [[abandoned-change]]Dark Red Dot:
-+
-Indicates an abandoned change.
-
+
image::images/user-review-ui-change-screen-related-changes-indicators.png[width=800, link="images/user-review-ui-change-screen-related-changes-indicators.png"]
diff --git a/ReleaseNotes/ReleaseNotes-2.12.txt b/ReleaseNotes/ReleaseNotes-2.12.txt
new file mode 100644
index 0000000..dfdcd37
--- /dev/null
+++ b/ReleaseNotes/ReleaseNotes-2.12.txt
@@ -0,0 +1,41 @@
+Release notes for Gerrit 2.12
+=============================
+
+
+Gerrit 2.12 is now available:
+
+link:https://gerrit-releases.storage.googleapis.com/gerrit-2.12.war[
+https://gerrit-releases.storage.googleapis.com/gerrit-2.12.war]
+
+Important Notes
+---------------
+
+
+*WARNING:* Upgrading to 2.12.x requires the server be first upgraded to 2.8 (or
+2.9) and then to 2.12.x. If you are upgrading from 2.8.x or later, you may ignore
+this warning and upgrade directly to 2.12.x.
+
+*WARNING:* When upgrading from version 2.8.4 or older with a site that uses
+Bouncy Castle Crypto, new versions of the libraries will be downloaded. The old
+libraries should be manually removed from site's `lib` folder to prevent the
+startup failure described in
+link:https://code.google.com/p/gerrit/issues/detail?id=3084[Issue 3084].
+
+
+Release Highlights
+------------------
+
+* TODO
+
+
+New Features
+------------
+
+* TODO
+
+
+Upgrades
+--------
+
+* Upgrade gson to 2.3.1
+
diff --git a/VERSION b/VERSION
index b05afb0..83d3d2a 100644
--- a/VERSION
+++ b/VERSION
@@ -2,4 +2,4 @@
# Used by :api_install and :api_deploy targets
# when talking to the destination repository.
#
-GERRIT_VERSION = '2.11-SNAPSHOT'
+GERRIT_VERSION = '2.12-SNAPSHOT'
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
index ff61899..3e31aa6 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
@@ -16,20 +16,24 @@
import static com.google.common.truth.Truth.assertThat;
import static com.google.gerrit.acceptance.GitUtil.cloneProject;
-import static com.google.gerrit.acceptance.GitUtil.createProject;
import static com.google.gerrit.acceptance.GitUtil.initSsh;
import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
import static com.google.gerrit.server.project.Util.block;
import com.google.common.base.Joiner;
+import com.google.common.base.Optional;
+import com.google.common.base.Strings;
import com.google.common.primitives.Chars;
import com.google.gerrit.acceptance.AcceptanceTestRequestScope.Context;
import com.google.gerrit.common.data.AccessSection;
import com.google.gerrit.common.data.Permission;
import com.google.gerrit.common.data.PermissionRule;
import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
import com.google.gerrit.extensions.api.changes.RevisionApi;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.common.ActionInfo;
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.EditInfo;
import com.google.gerrit.extensions.restapi.RestApiException;
@@ -58,10 +62,11 @@
import org.apache.http.HttpStatus;
import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
import org.junit.Rule;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
@@ -73,6 +78,7 @@
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
+import java.util.Map;
@RunWith(ConfigSuite.class)
public abstract class AbstractDaemonTest {
@@ -122,6 +128,7 @@
protected @GerritServerConfig Config cfg;
protected Git git;
+ protected TestRepository<?> testRepo;
protected GerritServer server;
protected TestAccount admin;
protected TestAccount user;
@@ -141,7 +148,7 @@
boolean mem = description.getAnnotation(UseLocalDisk.class) == null;
boolean enableHttpd = description.getAnnotation(NoHttpd.class) == null
&& description.getTestClass().getAnnotation(NoHttpd.class) == null;
- beforeTest(config(description), mem, enableHttpd);
+ beforeTest(description, mem, enableHttpd);
base.evaluate();
afterTest();
}
@@ -184,7 +191,9 @@
return cfg.getBoolean("change", null, "submitWholeTopic", false);
}
- private void beforeTest(Config cfg, boolean memory, boolean enableHttpd) throws Exception {
+ private void beforeTest(Description description, boolean memory,
+ boolean enableHttpd) throws Exception {
+ Config cfg = config(description);
server = startServer(cfg, memory, enableHttpd);
server.getTestInjector().injectMembers(this);
admin = accounts.admin();
@@ -196,9 +205,73 @@
Context ctx = newRequestContext(admin);
atrScope.set(ctx);
sshSession = ctx.getSession();
- project = new Project.NameKey("p");
- createProject(sshSession, project.get());
- git = cloneProject(sshSession.getUrl() + "/" + project.get());
+ sshSession.open();
+
+ ProjectInput projectInput = projectInput(description);
+ project = new Project.NameKey(projectInput.name);
+ createProject(projectInput);
+
+ setRepo(cloneProject(sshSession.getUrl() + "/" + project.get()));
+ }
+
+ private ProjectInput projectInput(Description description) {
+ ProjectInput in = new ProjectInput();
+ TestProjectInput ann = description.getAnnotation(TestProjectInput.class);
+ if (ann != null) {
+ in.name = ann.name();
+ in.parent = Strings.emptyToNull(ann.parent());
+ in.createEmptyCommit = ann.createEmptyCommit();
+ in.submitType = ann.submitType();
+ in.useContentMerge = ann.useContributorAgreements();
+ in.useSignedOffBy = ann.useSignedOffBy();
+ in.useContentMerge = ann.useContentMerge();
+ } else {
+ // Defaults should match TestProjectConfig, omitting nullable values.
+ in.createEmptyCommit = true;
+ }
+ if (Strings.isNullOrEmpty(in.name)) {
+ // TODO(dborowitz): Use different project names.
+ in.name = "p";
+ }
+ updateProjectInput(in);
+ return in;
+ }
+
+ protected void setRepo(Git git) throws Exception {
+ this.git = git;
+ testRepo = new TestRepository<>(git.getRepository());
+ }
+
+ protected void createProject(String name) throws RestApiException {
+ createProject(name, null);
+ }
+
+ protected void createProject(String name, Project.NameKey parent)
+ throws RestApiException {
+ // Default for createEmptyCommit should match TestProjectConfig.
+ createProject(name, parent, true);
+ }
+
+ protected void createProject(String name, Project.NameKey parent,
+ boolean createEmptyCommit) throws RestApiException {
+ ProjectInput in = new ProjectInput();
+ in.name = name;
+ in.parent = parent != null ? parent.get() : null;
+ in.createEmptyCommit = createEmptyCommit;
+ createProject(in);
+ }
+
+ protected void createProject(ProjectInput in) throws RestApiException {
+ gApi.projects().create(in);
+ }
+
+ /**
+ * Modify a project input before creating the initial test project.
+ *
+ * @param in input; may be modified in place.
+ */
+ protected void updateProjectInput(ProjectInput in) {
+ // Default implementation does nothing.
}
protected GerritServer startServer(Config cfg, boolean memory,
@@ -213,26 +286,43 @@
TempFileUtil.cleanup();
}
- protected PushOneCommit.Result createChange() throws GitAPIException,
- IOException {
- PushOneCommit push = pushFactory.create(db, admin.getIdent());
- return push.to(git, "refs/for/master");
+ protected TestRepository<?>.CommitBuilder commitBuilder() throws Exception {
+ return testRepo.branch("HEAD").commit().insertChangeId();
+ }
+
+ protected TestRepository<?>.CommitBuilder amendBuilder() throws Exception {
+ ObjectId head = testRepo.getRepository().getRef("HEAD").getObjectId();
+ TestRepository<?>.CommitBuilder b = testRepo.amendRef("HEAD");
+ Optional<String> id = GitUtil.getChangeId(testRepo, head);
+ // TestRepository behaves like "git commit --amend -m foo", which does not
+ // preserve an existing Change-Id. Tests probably want this.
+ if (id.isPresent()) {
+ b.insertChangeId(id.get().substring(1));
+ } else {
+ b.insertChangeId();
+ }
+ return b;
+ }
+
+ protected PushOneCommit.Result createChange() throws Exception {
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+ return push.to("refs/for/master");
}
private static final List<Character> RANDOM =
Chars.asList(new char[]{'a','b','c','d','e','f','g','h'});
protected PushOneCommit.Result amendChange(String changeId)
- throws GitAPIException, IOException {
+ throws Exception {
return amendChange(changeId, "refs/for/master");
}
protected PushOneCommit.Result amendChange(String changeId, String ref)
- throws GitAPIException, IOException {
+ throws Exception {
Collections.shuffle(RANDOM);
PushOneCommit push =
- pushFactory.create(db, admin.getIdent(), PushOneCommit.SUBJECT,
+ pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT,
PushOneCommit.FILE_NAME, new String(Chars.toArray(RANDOM)), changeId);
- return push.to(git, ref);
+ return push.to(ref);
}
protected ChangeInfo getChange(String changeId, ListChangesOption... options)
@@ -352,9 +442,22 @@
saveProjectConfig(project, cfg);
}
- protected PushOneCommit.Result pushTo(String ref) throws GitAPIException,
- IOException {
- PushOneCommit push = pushFactory.create(db, admin.getIdent());
- return push.to(git, ref);
+ protected PushOneCommit.Result pushTo(String ref) throws Exception {
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+ return push.to(ref);
+ }
+
+ protected void approve(String id) throws Exception {
+ gApi.changes()
+ .id(id)
+ .revision("current")
+ .review(ReviewInput.approve());
+ }
+
+ protected Map<String, ActionInfo> getActions(String id) throws Exception {
+ return gApi.changes()
+ .id(id)
+ .revision(1)
+ .actions();
}
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/GitUtil.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/GitUtil.java
index 494f094..e68279d 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/GitUtil.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/GitUtil.java
@@ -14,39 +14,31 @@
package com.google.gerrit.acceptance;
-import static com.google.common.base.Preconditions.checkState;
-
+import com.google.common.base.Optional;
import com.google.common.collect.Iterables;
import com.google.gerrit.common.FooterConstants;
-import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.testutil.TempFileUtil;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
-import org.eclipse.jgit.api.AddCommand;
-import org.eclipse.jgit.api.CheckoutCommand;
import org.eclipse.jgit.api.CloneCommand;
-import org.eclipse.jgit.api.CommitCommand;
import org.eclipse.jgit.api.FetchCommand;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.PushCommand;
import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.transport.JschConfigSessionFactory;
import org.eclipse.jgit.transport.OpenSshConfig.Host;
import org.eclipse.jgit.transport.PushResult;
import org.eclipse.jgit.transport.RefSpec;
import org.eclipse.jgit.transport.SshSessionFactory;
-import org.eclipse.jgit.util.ChangeIdUtil;
import org.eclipse.jgit.util.FS;
-import java.io.BufferedWriter;
import java.io.File;
-import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import java.util.Properties;
@@ -75,39 +67,6 @@
});
}
- public static void createProject(SshSession s, String name)
- throws JSchException, IOException {
- createProject(s, name, null);
- }
-
- public static void createProject(SshSession s, String name, Project.NameKey parent)
- throws JSchException, IOException {
- createProject(s, name, parent, true);
- }
-
- public static void createProject(SshSession s, String name,
- Project.NameKey parent, boolean emptyCommit)
- throws JSchException, IOException {
- StringBuilder b = new StringBuilder();
- b.append("gerrit create-project");
- if (emptyCommit) {
- b.append(" --empty-commit");
- }
- b.append(" --name \"");
- b.append(name);
- b.append("\"");
- if (parent != null) {
- b.append(" --parent \"");
- b.append(parent.get());
- b.append("\"");
- }
- s.exec(b.toString());
- if (s.hasError()) {
- throw new IllegalStateException(
- "gerrit create-project returned error: " + s.getError());
- }
- }
-
public static Git cloneProject(String url) throws GitAPIException, IOException {
return cloneProject(url, true);
}
@@ -121,76 +80,12 @@
return cloneCmd.call();
}
- public static void add(Git git, String path, String content)
- throws GitAPIException, IOException {
- File f = new File(git.getRepository().getDirectory().getParentFile(), path);
- File p = f.getParentFile();
- if (!p.exists() && !p.mkdirs()) {
- throw new IOException("failed to create dir: " + p.getAbsolutePath());
- }
- FileWriter w = new FileWriter(f);
- BufferedWriter out = new BufferedWriter(w);
- try {
- out.write(content);
- } finally {
- out.close();
- }
-
- final AddCommand addCmd = git.add();
- addCmd.addFilepattern(path);
- addCmd.call();
- }
-
- public static void rm(Git gApi, String path)
- throws GitAPIException {
- gApi.rm()
- .addFilepattern(path)
- .call();
- }
-
- public static Commit createCommit(Git git, PersonIdent i, String msg)
- throws GitAPIException {
- return createCommit(git, i, msg, null);
- }
-
- public static Commit amendCommit(Git git, PersonIdent i, String msg, String changeId)
- throws GitAPIException {
- msg = ChangeIdUtil.insertId(msg, ObjectId.fromString(changeId.substring(1)));
- return createCommit(git, i, msg, changeId);
- }
-
- private static Commit createCommit(Git git, PersonIdent i, String msg,
- String changeId) throws GitAPIException {
-
- final CommitCommand commitCmd = git.commit();
- commitCmd.setAmend(changeId != null);
- commitCmd.setAuthor(i);
- commitCmd.setCommitter(i);
- commitCmd.setMessage(msg);
- commitCmd.setInsertChangeId(changeId == null);
-
- RevCommit c = commitCmd.call();
-
- List<String> ids = c.getFooterLines(FooterConstants.CHANGE_ID);
- checkState(ids.size() >= 1,
- "No Change-Id found in new commit:\n%s", c.getFullMessage());
- changeId = ids.get(ids.size() - 1);
-
- return new Commit(c, changeId);
- }
-
public static void fetch(Git git, String spec) throws GitAPIException {
FetchCommand fetch = git.fetch();
fetch.setRefSpecs(new RefSpec(spec));
fetch.call();
}
- public static void checkout(Git git, String name) throws GitAPIException {
- CheckoutCommand checkout = git.checkout();
- checkout.setName(name);
- checkout.call();
- }
-
public static PushResult pushHead(Git git, String ref, boolean pushTags)
throws GitAPIException {
return pushHead(git, ref, pushTags, false);
@@ -225,4 +120,15 @@
return changeId;
}
}
+
+ public static Optional<String> getChangeId(TestRepository<?> tr, ObjectId id)
+ throws IOException {
+ RevCommit c = tr.getRevWalk().parseCommit(id);
+ tr.getRevWalk().parseBody(c);
+ List<String> ids = c.getFooterLines(FooterConstants.CHANGE_ID);
+ if (ids.isEmpty()) {
+ return Optional.absent();
+ }
+ return Optional.of(ids.get(ids.size() - 1));
+ }
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java
index 8548b5c..8f4c2d4 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java
@@ -43,7 +43,8 @@
import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
import org.eclipse.jgit.lib.Config;
-import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
class InMemoryTestingDatabaseModule extends LifecycleModule {
private final Config cfg;
@@ -58,9 +59,10 @@
.annotatedWith(GerritServerConfig.class)
.toInstance(cfg);
- bind(File.class)
+ // TODO(dborowitz): Use jimfs.
+ bind(Path.class)
.annotatedWith(SitePath.class)
- .toInstance(new File("UNIT_TEST_GERRIT_SITE"));
+ .toInstance(Paths.get("UNIT_TEST_GERRIT_SITE"));
bind(GitRepositoryManager.class)
.toInstance(new InMemoryRepositoryManager());
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/PushOneCommit.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/PushOneCommit.java
index 6cd8031..ad3469f 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/PushOneCommit.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/PushOneCommit.java
@@ -15,9 +15,6 @@
package com.google.gerrit.acceptance;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.add;
-import static com.google.gerrit.acceptance.GitUtil.amendCommit;
-import static com.google.gerrit.acceptance.GitUtil.createCommit;
import static com.google.gerrit.acceptance.GitUtil.pushHead;
import com.google.common.base.Function;
@@ -25,7 +22,6 @@
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
-import com.google.gerrit.acceptance.GitUtil.Commit;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
@@ -42,10 +38,7 @@
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.TagCommand;
-import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
-import org.eclipse.jgit.api.errors.GitAPIException;
-import org.eclipse.jgit.api.errors.InvalidTagNameException;
-import org.eclipse.jgit.api.errors.NoHeadException;
+import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.revwalk.RevCommit;
@@ -53,7 +46,6 @@
import org.eclipse.jgit.transport.RemoteRefUpdate;
import org.eclipse.jgit.transport.RemoteRefUpdate.Status;
-import java.io.IOException;
import java.util.Arrays;
import java.util.Set;
@@ -65,11 +57,13 @@
public interface Factory {
PushOneCommit create(
ReviewDb db,
- PersonIdent i);
+ PersonIdent i,
+ TestRepository<?> testRepo);
PushOneCommit create(
ReviewDb db,
PersonIdent i,
+ TestRepository<?> testRepo,
@Assisted("subject") String subject,
@Assisted("fileName") String fileName,
@Assisted("content") String content);
@@ -77,6 +71,7 @@
PushOneCommit create(
ReviewDb db,
PersonIdent i,
+ TestRepository<?> testRepo,
@Assisted("subject") String subject,
@Assisted("fileName") String fileName,
@Assisted("content") String content,
@@ -106,7 +101,7 @@
private final ApprovalsUtil approvalsUtil;
private final Provider<InternalChangeQuery> queryProvider;
private final ReviewDb db;
- private final PersonIdent i;
+ private final TestRepository<?> testRepo;
private final String subject;
private final String fileName;
@@ -115,14 +110,17 @@
private Tag tag;
private boolean force;
+ private final TestRepository<?>.CommitBuilder commitBuilder;
+
@AssistedInject
PushOneCommit(ChangeNotes.Factory notesFactory,
ApprovalsUtil approvalsUtil,
Provider<InternalChangeQuery> queryProvider,
@Assisted ReviewDb db,
- @Assisted PersonIdent i) {
+ @Assisted PersonIdent i,
+ @Assisted TestRepository<?> testRepo) throws Exception {
this(notesFactory, approvalsUtil, queryProvider,
- db, i, SUBJECT, FILE_NAME, FILE_CONTENT);
+ db, i, testRepo, SUBJECT, FILE_NAME, FILE_CONTENT);
}
@AssistedInject
@@ -131,11 +129,12 @@
Provider<InternalChangeQuery> queryProvider,
@Assisted ReviewDb db,
@Assisted PersonIdent i,
+ @Assisted TestRepository<?> testRepo,
@Assisted("subject") String subject,
@Assisted("fileName") String fileName,
- @Assisted("content") String content) {
+ @Assisted("content") String content) throws Exception {
this(notesFactory, approvalsUtil, queryProvider,
- db, i, subject, fileName, content, null);
+ db, i, testRepo, subject, fileName, content, null);
}
@AssistedInject
@@ -144,40 +143,45 @@
Provider<InternalChangeQuery> queryProvider,
@Assisted ReviewDb db,
@Assisted PersonIdent i,
+ @Assisted TestRepository<?> testRepo,
@Assisted("subject") String subject,
@Assisted("fileName") String fileName,
@Assisted("content") String content,
- @Nullable @Assisted("changeId") String changeId) {
+ @Nullable @Assisted("changeId") String changeId) throws Exception {
this.db = db;
+ this.testRepo = testRepo;
this.notesFactory = notesFactory;
this.approvalsUtil = approvalsUtil;
this.queryProvider = queryProvider;
- this.i = i;
this.subject = subject;
this.fileName = fileName;
this.content = content;
this.changeId = changeId;
- }
-
- public Result to(Git git, String ref) throws GitAPIException, IOException {
- add(git, fileName, content);
- return execute(git, ref);
- }
-
- public Result rm(Git git, String ref) throws GitAPIException {
- GitUtil.rm(git, fileName);
- return execute(git, ref);
- }
-
- private Result execute(Git git, String ref) throws GitAPIException,
- ConcurrentRefUpdateException, InvalidTagNameException, NoHeadException {
- Commit c;
if (changeId != null) {
- c = amendCommit(git, i, subject, changeId);
+ commitBuilder = testRepo.amendRef("HEAD")
+ .insertChangeId(changeId.substring(1));
} else {
- c = createCommit(git, i, subject);
- changeId = c.getChangeId();
+ commitBuilder = testRepo.branch("HEAD").commit().insertChangeId();
}
+ commitBuilder.message(subject).ident(i);
+ }
+
+ public Result to(String ref) throws Exception {
+ commitBuilder.add(fileName, content);
+ return execute(ref);
+ }
+
+ public Result rm(String ref) throws Exception {
+ commitBuilder.rm(fileName);
+ return execute(ref);
+ }
+
+ private Result execute(String ref) throws Exception {
+ RevCommit c = commitBuilder.create();
+ if (changeId == null) {
+ changeId = GitUtil.getChangeId(testRepo, c).get();
+ }
+ Git git = Git.wrap(testRepo.getRepository());
if (tag != null) {
TagCommand tagCommand = git.tag().setName(tag.name);
if (tag instanceof AnnotatedTag) {
@@ -204,10 +208,10 @@
public class Result {
private final String ref;
private final PushResult result;
- private final Commit commit;
+ private final RevCommit commit;
private final String resSubj;
- private Result(String ref, PushResult resSubj, Commit commit,
+ private Result(String ref, PushResult resSubj, RevCommit commit,
String subject) {
this.ref = ref;
this.result = resSubj;
@@ -217,7 +221,7 @@
public ChangeData getChange() throws OrmException {
return Iterables.getOnlyElement(
- queryProvider.get().byKeyPrefix(commit.getChangeId()));
+ queryProvider.get().byKeyPrefix(changeId));
}
public PatchSet getPatchSet() throws OrmException {
@@ -229,15 +233,15 @@
}
public String getChangeId() {
- return commit.getChangeId();
+ return changeId;
}
public ObjectId getCommitId() {
- return commit.getCommit().getId();
+ return commit;
}
public RevCommit getCommit() {
- return commit.getCommit();
+ return commit;
}
public void assertChange(Change.Status expectedStatus,
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/TestProjectInput.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/TestProjectInput.java
new file mode 100644
index 0000000..6be07c5
--- /dev/null
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/TestProjectInput.java
@@ -0,0 +1,41 @@
+// Copyright (C) 2015 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.
+
+package com.google.gerrit.acceptance;
+
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.SubmitType;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+@Target({METHOD})
+@Retention(RUNTIME)
+public @interface TestProjectInput {
+ String name() default "";
+ String parent() default "";
+ boolean createEmptyCommit() default true;
+
+ // These may be null in a ProjectInput, but annotations do not allow null
+ // default values. Thus these defaults should match ProjectConfig.
+ SubmitType submitType() default SubmitType.MERGE_IF_NECESSARY;
+ InheritableBoolean useContributorAgreements()
+ default InheritableBoolean.INHERIT;
+ InheritableBoolean useSignedOffBy() default InheritableBoolean.INHERIT;
+ InheritableBoolean useContentMerge() default InheritableBoolean.INHERIT;
+ InheritableBoolean requireChangeId() default InheritableBoolean.INHERIT;
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AccountIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AccountIT.java
index 8945a22d..7dffd5d 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AccountIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AccountIT.java
@@ -22,6 +22,8 @@
import org.junit.Test;
+import java.util.List;
+
public class AccountIT extends AbstractDaemonTest {
@Test
@@ -59,4 +61,21 @@
.unstarChange(triplet);
assertThat(getChange(triplet).starred).isNull();
}
+
+ @Test
+ public void suggestAccounts() throws Exception {
+ String adminUsername = "admin";
+ List<AccountInfo> result = gApi.accounts()
+ .suggestAccounts().withQuery(adminUsername).get();
+ assertThat(result.size()).is(1);
+ assertThat(result.get(0).username).isEqualTo(adminUsername);
+
+ List<AccountInfo> resultShortcutApi = gApi.accounts()
+ .suggestAccounts(adminUsername).get();
+ assertThat(resultShortcutApi.size()).is(result.size());
+
+ List<AccountInfo> emptyResult = gApi.accounts()
+ .suggestAccounts("unknown").get();
+ assertThat(emptyResult).isEmpty();
+ }
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java
index 7de4712..3772721 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java
@@ -22,6 +22,7 @@
import com.google.gerrit.common.data.Permission;
import com.google.gerrit.extensions.api.projects.BranchInput;
import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.api.projects.PutDescriptionInput;
import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.RestApiException;
@@ -38,8 +39,7 @@
String name = "foo";
assertThat(name).isEqualTo(
gApi.projects()
- .name(name)
- .create()
+ .create(name)
.get()
.name);
}
@@ -49,8 +49,7 @@
String name = "foo";
assertThat(name).isEqualTo(
gApi.projects()
- .name(name + ".git")
- .create()
+ .create(name + ".git")
.get()
.name);
}
@@ -69,10 +68,8 @@
ProjectInput in = new ProjectInput();
in.name = "baz";
gApi.projects()
- .name("baz")
.create(in);
gApi.projects()
- .name("baz")
.create(in);
}
@@ -86,11 +83,28 @@
}
@Test
+ public void description() throws Exception {
+ assertThat(gApi.projects()
+ .name(project.get())
+ .description())
+ .isEmpty();
+ PutDescriptionInput in = new PutDescriptionInput();
+ in.description = "new project description";
+ gApi.projects()
+ .name(project.get())
+ .description(in);
+ assertThat(gApi.projects()
+ .name(project.get())
+ .description())
+ .isEqualTo(in.description);
+ }
+
+ @Test
public void listProjects() throws Exception {
List<ProjectInfo> initialProjects = gApi.projects().list().get();
- gApi.projects().name("foo").create();
- gApi.projects().name("bar").create();
+ gApi.projects().create("foo");
+ gApi.projects().create("bar");
List<ProjectInfo> allProjects = gApi.projects().list().get();
assertThat(allProjects).hasSize(initialProjects.size() + 2);
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java
index 9cc8f9c..b74bf34 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java
@@ -46,14 +46,12 @@
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.Patch;
-import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.RefUpdate;
import org.junit.Before;
import org.junit.Test;
import java.io.ByteArrayOutputStream;
-import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.HashMap;
@@ -214,9 +212,9 @@
String subject = "Test change\n\n" +
"Change-Id: Ideadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
PushOneCommit push =
- pushFactory.create(db, admin.getIdent(), subject,
+ pushFactory.create(db, admin.getIdent(), testRepo, subject,
"another_file.txt", "another content");
- PushOneCommit.Result r2 = push.to(git, "refs/for/master");
+ PushOneCommit.Result r2 = push.to("refs/for/master");
// Change 2's parent should be change 1
assertThat(r2.getCommit().getParents()[0].name())
@@ -283,9 +281,9 @@
.create(new BranchInput());
PushOneCommit push =
- pushFactory.create(db, admin.getIdent(), PushOneCommit.SUBJECT,
+ pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT,
PushOneCommit.FILE_NAME, "another content");
- push.to(git, "refs/heads/foo");
+ push.to("refs/heads/foo");
ChangeApi orig = gApi.changes().id("p~master~" + r.getChangeId());
assertThat((Iterable<?>)orig.get().messages).hasSize(1);
@@ -300,12 +298,12 @@
@Test
public void canRebase() throws Exception {
- PushOneCommit push = pushFactory.create(db, admin.getIdent());
- PushOneCommit.Result r1 = push.to(git, "refs/for/master");
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+ PushOneCommit.Result r1 = push.to("refs/for/master");
merge(r1);
- push = pushFactory.create(db, admin.getIdent());
- PushOneCommit.Result r2 = push.to(git, "refs/for/master");
+ push = pushFactory.create(db, admin.getIdent(), testRepo);
+ PushOneCommit.Result r2 = push.to("refs/for/master");
boolean canRebase = gApi.changes()
.id(r2.getChangeId())
.revision(r2.getCommit().name())
@@ -314,8 +312,8 @@
merge(r2);
git.checkout().setName(r1.getCommit().name()).call();
- push = pushFactory.create(db, admin.getIdent());
- PushOneCommit.Result r3 = push.to(git, "refs/for/master");
+ push = pushFactory.create(db, admin.getIdent(), testRepo);
+ PushOneCommit.Result r3 = push.to("refs/for/master");
canRebase = gApi.changes()
.id(r3.getChangeId())
@@ -326,8 +324,8 @@
@Test
public void setUnsetReviewedFlag() throws Exception {
- PushOneCommit push = pushFactory.create(db, admin.getIdent());
- PushOneCommit.Result r = push.to(git, "refs/for/master");
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+ PushOneCommit.Result r = push.to("refs/for/master");
gApi.changes()
.id(r.getChangeId())
@@ -354,10 +352,10 @@
ObjectId initial = git.getRepository().getRef(HEAD).getLeaf().getObjectId();
PushOneCommit push1 =
- pushFactory.create(db, admin.getIdent(), PushOneCommit.SUBJECT,
+ pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT,
PushOneCommit.FILE_NAME, "push 1 content");
- PushOneCommit.Result r1 = push1.to(git, "refs/for/master");
+ PushOneCommit.Result r1 = push1.to("refs/for/master");
assertMergeable(r1.getChangeId(), true);
merge(r1);
@@ -367,9 +365,9 @@
assertThat(ru.forceUpdate()).isEqualTo(RefUpdate.Result.FORCED);
PushOneCommit push2 =
- pushFactory.create(db, admin.getIdent(), PushOneCommit.SUBJECT,
+ pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT,
PushOneCommit.FILE_NAME, "push 2 content");
- PushOneCommit.Result r2 = push2.to(git, "refs/for/master");
+ PushOneCommit.Result r2 = push2.to("refs/for/master");
assertMergeable(r2.getChangeId(), false);
// TODO(dborowitz): Test for other-branches.
}
@@ -521,15 +519,14 @@
}
private PushOneCommit.Result updateChange(PushOneCommit.Result r,
- String content) throws GitAPIException, IOException {
- PushOneCommit push = pushFactory.create(db, admin.getIdent(),
+ String content) throws Exception {
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo,
"test commit", "a.txt", content, r.getChangeId());
- return push.to(git, "refs/for/master");
+ return push.to("refs/for/master");
}
- private PushOneCommit.Result createDraft() throws GitAPIException,
- IOException {
- PushOneCommit push = pushFactory.create(db, admin.getIdent());
- return push.to(git, "refs/drafts/master");
+ private PushOneCommit.Result createDraft() throws Exception {
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+ return push.to("refs/drafts/master");
}
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java
index f16c677..126e2ff 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java
@@ -17,7 +17,6 @@
import static com.google.common.collect.Iterables.getOnlyElement;
import static com.google.common.truth.Truth.assertThat;
import static com.google.gerrit.acceptance.GitUtil.cloneProject;
-import static com.google.gerrit.acceptance.GitUtil.createProject;
import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.SECONDS;
@@ -34,6 +33,7 @@
import com.google.gerrit.acceptance.PushOneCommit;
import com.google.gerrit.acceptance.RestResponse;
import com.google.gerrit.acceptance.RestSession;
+import com.google.gerrit.acceptance.TestProjectInput;
import com.google.gerrit.extensions.api.changes.ReviewInput;
import com.google.gerrit.extensions.client.ListChangesOption;
import com.google.gerrit.extensions.common.ApprovalInfo;
@@ -59,7 +59,6 @@
import com.google.inject.Inject;
import org.apache.commons.codec.binary.StringUtils;
-import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.RefUpdate;
@@ -108,12 +107,12 @@
@Before
public void setUp() throws Exception {
db = reviewDbProvider.open();
- changeId = newChange(git, admin.getIdent());
+ changeId = newChange(admin.getIdent());
ps = getCurrentPatchSet(changeId);
- amendChange(git, admin.getIdent(), changeId);
+ amendChange(admin.getIdent(), changeId);
change = getChange(changeId);
assertThat(ps).isNotNull();
- changeId2 = newChange2(git, admin.getIdent());
+ changeId2 = newChange2(admin.getIdent());
change2 = getChange(changeId2);
assertThat(change2).isNotNull();
ps2 = getCurrentPatchSet(changeId2);
@@ -244,9 +243,9 @@
assertThat(edit.getBasePatchSet().getPatchSetId()).isEqualTo(
current.getPatchSetId());
PushOneCommit push =
- pushFactory.create(db, admin.getIdent(), PushOneCommit.SUBJECT, FILE_NAME,
+ pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, FILE_NAME,
new String(CONTENT_NEW2), changeId2);
- push.to(git, "refs/for/master").assertOkStatus();
+ push.to("refs/for/master").assertOkStatus();
RestResponse r = adminSession.post(urlRebase());
assertThat(r.getStatusCode()).isEqualTo(SC_CONFLICT);
}
@@ -266,10 +265,10 @@
}
@Test
+ @TestProjectInput(createEmptyCommit = false)
public void updateRootCommitMessage() throws Exception {
- createProject(sshSession, "root-msg-test", null, false);
- git = cloneProject(sshSession.getUrl() + "/root-msg-test");
- changeId = newChange(git, admin.getIdent());
+ setRepo(cloneProject(sshSession.getUrl() + "/" + project));
+ changeId = newChange(admin.getIdent());
change = getChange(changeId);
assertThat(modifier.createEdit(change, getCurrentPatchSet(changeId)))
@@ -653,25 +652,25 @@
assertThat(approvals.get(0).value).isEqualTo(1);
}
- private String newChange(Git git, PersonIdent ident) throws Exception {
+ private String newChange(PersonIdent ident) throws Exception {
PushOneCommit push =
- pushFactory.create(db, ident, PushOneCommit.SUBJECT, FILE_NAME,
+ pushFactory.create(db, ident, testRepo, PushOneCommit.SUBJECT, FILE_NAME,
new String(CONTENT_OLD));
- return push.to(git, "refs/for/master").getChangeId();
+ return push.to("refs/for/master").getChangeId();
}
- private String amendChange(Git git, PersonIdent ident, String changeId) throws Exception {
+ private String amendChange(PersonIdent ident, String changeId) throws Exception {
PushOneCommit push =
- pushFactory.create(db, ident, PushOneCommit.SUBJECT, FILE_NAME2,
+ pushFactory.create(db, ident, testRepo, PushOneCommit.SUBJECT, FILE_NAME2,
new String(CONTENT_NEW2), changeId);
- return push.to(git, "refs/for/master").getChangeId();
+ return push.to("refs/for/master").getChangeId();
}
- private String newChange2(Git git, PersonIdent ident) throws Exception {
+ private String newChange2(PersonIdent ident) throws Exception {
PushOneCommit push =
- pushFactory.create(db, ident, PushOneCommit.SUBJECT, FILE_NAME,
+ pushFactory.create(db, ident, testRepo, PushOneCommit.SUBJECT, FILE_NAME,
new String(CONTENT_OLD));
- return push.rm(git, "refs/for/master").getChangeId();
+ return push.rm("refs/for/master").getChangeId();
}
private Change getChange(String changeId) throws Exception {
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractPushForReview.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractPushForReview.java
index e65d51e..482a494 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractPushForReview.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractPushForReview.java
@@ -25,21 +25,15 @@
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.EditInfo;
import com.google.gerrit.extensions.common.LabelInfo;
-import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.server.notedb.NotesMigration;
import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
-import com.jcraft.jsch.JSchException;
-
-import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.Config;
import org.junit.Before;
import org.junit.Test;
-import java.io.IOException;
import java.util.Set;
public abstract class AbstractPushForReview extends AbstractDaemonTest {
@@ -62,7 +56,7 @@
sshUrl = sshSession.getUrl();
}
- protected void selectProtocol(Protocol p) throws GitAPIException, IOException {
+ protected void selectProtocol(Protocol p) throws Exception {
String url;
switch (p) {
case SSH:
@@ -74,20 +68,18 @@
default:
throw new IllegalArgumentException("unexpected protocol: " + p);
}
- git = cloneProject(url + "/" + project.get());
+ setRepo(cloneProject(url + "/" + project.get()));
}
@Test
- public void testPushForMaster() throws GitAPIException, OrmException,
- IOException {
+ public void testPushForMaster() throws Exception {
PushOneCommit.Result r = pushTo("refs/for/master");
r.assertOkStatus();
r.assertChange(Change.Status.NEW, null);
}
@Test
- public void testPushForMasterWithTopic() throws GitAPIException,
- OrmException, IOException {
+ public void testPushForMasterWithTopic() throws Exception {
// specify topic in ref
String topic = "my/topic";
PushOneCommit.Result r = pushTo("refs/for/master/" + topic);
@@ -101,8 +93,7 @@
}
@Test
- public void testPushForMasterWithCc() throws GitAPIException, OrmException,
- IOException, JSchException {
+ public void testPushForMasterWithCc() throws Exception {
// cc one user
String topic = "my/topic";
PushOneCommit.Result r = pushTo("refs/for/master/" + topic + "%cc=" + user.email);
@@ -125,8 +116,7 @@
}
@Test
- public void testPushForMasterWithReviewer() throws GitAPIException,
- OrmException, IOException, JSchException {
+ public void testPushForMasterWithReviewer() throws Exception {
// add one reviewer
String topic = "my/topic";
PushOneCommit.Result r = pushTo("refs/for/master/" + topic + "%r=" + user.email);
@@ -150,8 +140,7 @@
}
@Test
- public void testPushForMasterAsDraft() throws GitAPIException, OrmException,
- IOException {
+ public void testPushForMasterAsDraft() throws Exception {
// create draft by pushing to 'refs/drafts/'
PushOneCommit.Result r = pushTo("refs/drafts/master");
r.assertOkStatus();
@@ -164,8 +153,7 @@
}
@Test
- public void testPushForMasterAsEdit() throws GitAPIException,
- IOException, RestApiException {
+ public void testPushForMasterAsEdit() throws Exception {
PushOneCommit.Result r = pushTo("refs/for/master");
r.assertOkStatus();
EditInfo edit = getEdit(r.getChangeId());
@@ -179,65 +167,59 @@
}
@Test
- public void testPushForMasterWithApprovals() throws GitAPIException,
- IOException, RestApiException {
+ public void testPushForMasterWithApprovals() throws Exception {
PushOneCommit.Result r = pushTo("refs/for/master/%l=Code-Review");
r.assertOkStatus();
ChangeInfo ci = get(r.getChangeId());
LabelInfo cr = ci.labels.get("Code-Review");
assertThat(cr.all).hasSize(1);
assertThat(cr.all.get(0).name).isEqualTo("Administrator");
- assertThat(cr.all.get(0).value.intValue()).is(1);
+ assertThat(cr.all.get(0).value).is(1);
PushOneCommit push =
- pushFactory.create(db, admin.getIdent(), PushOneCommit.SUBJECT,
+ pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT,
"b.txt", "anotherContent", r.getChangeId());
- r = push.to(git, "refs/for/master/%l=Code-Review+2");
+ r = push.to("refs/for/master/%l=Code-Review+2");
ci = get(r.getChangeId());
cr = ci.labels.get("Code-Review");
assertThat(cr.all).hasSize(1);
assertThat(cr.all.get(0).name).isEqualTo("Administrator");
- assertThat(cr.all.get(0).value.intValue()).is(2);
+ assertThat(cr.all.get(0).value).is(2);
}
@Test
- public void testPushNewPatchsetToRefsChanges() throws GitAPIException,
- IOException, OrmException {
+ public void testPushNewPatchsetToRefsChanges() throws Exception {
PushOneCommit.Result r = pushTo("refs/for/master");
r.assertOkStatus();
PushOneCommit push =
- pushFactory.create(db, admin.getIdent(), PushOneCommit.SUBJECT,
+ pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT,
"b.txt", "anotherContent", r.getChangeId());
- r = push.to(git, "refs/changes/" + r.getChange().change().getId().get());
+ r = push.to("refs/changes/" + r.getChange().change().getId().get());
r.assertOkStatus();
}
@Test
- public void testPushForMasterWithApprovals_MissingLabel() throws GitAPIException,
- IOException {
+ public void testPushForMasterWithApprovals_MissingLabel() throws Exception {
PushOneCommit.Result r = pushTo("refs/for/master/%l=Verify");
r.assertErrorStatus("label \"Verify\" is not a configured label");
}
@Test
- public void testPushForMasterWithApprovals_ValueOutOfRange() throws GitAPIException,
- IOException {
+ public void testPushForMasterWithApprovals_ValueOutOfRange() throws Exception {
PushOneCommit.Result r = pushTo("refs/for/master/%l=Code-Review-3");
r.assertErrorStatus("label \"Code-Review\": -3 is not a valid value");
}
@Test
- public void testPushForNonExistingBranch() throws GitAPIException,
- IOException {
+ public void testPushForNonExistingBranch() throws Exception {
String branchName = "non-existing";
PushOneCommit.Result r = pushTo("refs/for/" + branchName);
r.assertErrorStatus("branch " + branchName + " not found");
}
@Test
- public void testPushForMasterWithHashtags() throws GitAPIException,
- OrmException, IOException, RestApiException {
+ public void testPushForMasterWithHashtags() throws Exception {
// Hashtags currently only work when noteDB is enabled
assume().that(notesMigration.enabled()).isTrue();
@@ -255,9 +237,9 @@
// specify a single hashtag as option in new patch set
String hashtag2 = "tag2";
PushOneCommit push =
- pushFactory.create(db, admin.getIdent(), PushOneCommit.SUBJECT,
+ pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT,
"b.txt", "anotherContent", r.getChangeId());
- r = push.to(git, "refs/for/master/%hashtag=" + hashtag2);
+ r = push.to("refs/for/master/%hashtag=" + hashtag2);
r.assertOkStatus();
expected = ImmutableSet.of(hashtag1, hashtag2);
hashtags = gApi.changes().id(r.getChangeId()).getHashtags();
@@ -265,8 +247,7 @@
}
@Test
- public void testPushForMasterWithMultipleHashtags() throws GitAPIException,
- OrmException, IOException, RestApiException {
+ public void testPushForMasterWithMultipleHashtags() throws Exception {
// Hashtags currently only work when noteDB is enabled
assume().that(notesMigration.enabled()).isTrue();
@@ -287,10 +268,9 @@
String hashtag3 = "tag3";
String hashtag4 = "tag4";
PushOneCommit push =
- pushFactory.create(db, admin.getIdent(), PushOneCommit.SUBJECT,
+ pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT,
"b.txt", "anotherContent", r.getChangeId());
- r = push.to(git,
- "refs/for/master%hashtag=" + hashtag3 + ",hashtag=" + hashtag4);
+ r = push.to("refs/for/master%hashtag=" + hashtag3 + ",hashtag=" + hashtag4);
r.assertOkStatus();
expected = ImmutableSet.of(hashtag1, hashtag2, hashtag3, hashtag4);
hashtags = gApi.changes().id(r.getChangeId()).getHashtags();
@@ -298,8 +278,7 @@
}
@Test
- public void testPushForMasterWithHashtagsNoteDbDisabled() throws GitAPIException,
- IOException {
+ public void testPushForMasterWithHashtagsNoteDbDisabled() throws Exception {
// push with hashtags should fail when noteDb is disabled
assume().that(notesMigration.enabled()).isFalse();
PushOneCommit.Result r = pushTo("refs/for/master%hashtag=tag1");
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ForcePushIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ForcePushIT.java
index 5da524e..44ddb94 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ForcePushIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ForcePushIT.java
@@ -31,8 +31,8 @@
public void forcePushNotAllowed() throws Exception {
ObjectId initial = git.getRepository().getRef(HEAD).getLeaf().getObjectId();
PushOneCommit push1 =
- pushFactory.create(db, admin.getIdent(), "change1", "a.txt", "content");
- PushOneCommit.Result r1 = push1.to(git, "refs/heads/master");
+ pushFactory.create(db, admin.getIdent(), testRepo, "change1", "a.txt", "content");
+ PushOneCommit.Result r1 = push1.to("refs/heads/master");
r1.assertOkStatus();
// Reset HEAD to initial so the new change is a non-fast forward
@@ -41,9 +41,9 @@
assertThat(ru.forceUpdate()).isEqualTo(RefUpdate.Result.FORCED);
PushOneCommit push2 =
- pushFactory.create(db, admin.getIdent(), "change2", "b.txt", "content");
+ pushFactory.create(db, admin.getIdent(), testRepo, "change2", "b.txt", "content");
push2.setForce(true);
- PushOneCommit.Result r2 = push2.to(git, "refs/heads/master");
+ PushOneCommit.Result r2 = push2.to("refs/heads/master");
r2.assertErrorStatus("non-fast forward");
}
@@ -52,8 +52,8 @@
ObjectId initial = git.getRepository().getRef(HEAD).getLeaf().getObjectId();
grant(Permission.PUSH, project, "refs/*", true);
PushOneCommit push1 =
- pushFactory.create(db, admin.getIdent(), "change1", "a.txt", "content");
- PushOneCommit.Result r1 = push1.to(git, "refs/heads/master");
+ pushFactory.create(db, admin.getIdent(), testRepo, "change1", "a.txt", "content");
+ PushOneCommit.Result r1 = push1.to("refs/heads/master");
r1.assertOkStatus();
// Reset HEAD to initial so the new change is a non-fast forward
@@ -62,9 +62,9 @@
assertThat(ru.forceUpdate()).isEqualTo(RefUpdate.Result.FORCED);
PushOneCommit push2 =
- pushFactory.create(db, admin.getIdent(), "change2", "b.txt", "content");
+ pushFactory.create(db, admin.getIdent(), testRepo, "change2", "b.txt", "content");
push2.setForce(true);
- PushOneCommit.Result r2 = push2.to(git, "refs/heads/master");
+ PushOneCommit.Result r2 = push2.to("refs/heads/master");
r2.assertOkStatus();
}
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmitOnPushIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmitOnPushIT.java
index 790d3c5..ed6e6e7 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmitOnPushIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmitOnPushIT.java
@@ -32,7 +32,6 @@
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
-import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Ref;
@@ -73,9 +72,9 @@
grant(Permission.CREATE, project, "refs/tags/*");
grant(Permission.PUSH, project, "refs/tags/*");
PushOneCommit.Tag tag = new PushOneCommit.Tag("v1.0");
- PushOneCommit push = pushFactory.create(db, admin.getIdent());
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
push.setTag(tag);
- PushOneCommit.Result r = push.to(git, "refs/for/master%submit");
+ PushOneCommit.Result r = push.to("refs/for/master%submit");
r.assertOkStatus();
r.assertChange(Change.Status.MERGED, null, admin);
assertSubmitApproval(r.getPatchSetId());
@@ -90,9 +89,9 @@
grant(Permission.PUSH, project, "refs/tags/*");
PushOneCommit.AnnotatedTag tag =
new PushOneCommit.AnnotatedTag("v1.0", "annotation", admin.getIdent());
- PushOneCommit push = pushFactory.create(db, admin.getIdent());
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
push.setTag(tag);
- PushOneCommit.Result r = push.to(git, "refs/for/master%submit");
+ PushOneCommit.Result r = push.to("refs/for/master%submit");
r.assertOkStatus();
r.assertChange(Change.Status.MERGED, null, admin);
assertSubmitApproval(r.getPatchSetId());
@@ -222,53 +221,37 @@
}
private void assertCommit(Project.NameKey project, String branch) throws IOException {
- Repository r = repoManager.openRepository(project);
- try {
- RevWalk rw = new RevWalk(r);
- try {
- RevCommit c = rw.parseCommit(r.getRef(branch).getObjectId());
- assertThat(c.getShortMessage()).isEqualTo(PushOneCommit.SUBJECT);
- assertThat(c.getAuthorIdent().getEmailAddress()).isEqualTo(admin.email);
- assertThat(c.getCommitterIdent().getEmailAddress()).isEqualTo(
- admin.email);
- } finally {
- rw.release();
- }
- } finally {
- r.close();
+ try (Repository r = repoManager.openRepository(project);
+ RevWalk rw = new RevWalk(r)) {
+ RevCommit c = rw.parseCommit(r.getRef(branch).getObjectId());
+ assertThat(c.getShortMessage()).isEqualTo(PushOneCommit.SUBJECT);
+ assertThat(c.getAuthorIdent().getEmailAddress()).isEqualTo(admin.email);
+ assertThat(c.getCommitterIdent().getEmailAddress()).isEqualTo(
+ admin.email);
}
}
private void assertMergeCommit(String branch, String subject) throws IOException {
- Repository r = repoManager.openRepository(project);
- try {
- RevWalk rw = new RevWalk(r);
- try {
- RevCommit c = rw.parseCommit(r.getRef(branch).getObjectId());
- assertThat(c.getParentCount()).is(2);
- assertThat(c.getShortMessage()).isEqualTo("Merge \"" + subject + "\"");
- assertThat(c.getAuthorIdent().getEmailAddress()).isEqualTo(admin.email);
- assertThat(c.getCommitterIdent().getEmailAddress()).isEqualTo(
- serverIdent.getEmailAddress());
- } finally {
- rw.release();
- }
- } finally {
- r.close();
+ try (Repository r = repoManager.openRepository(project);
+ RevWalk rw = new RevWalk(r)) {
+ RevCommit c = rw.parseCommit(r.getRef(branch).getObjectId());
+ assertThat(c.getParentCount()).is(2);
+ assertThat(c.getShortMessage()).isEqualTo("Merge \"" + subject + "\"");
+ assertThat(c.getAuthorIdent().getEmailAddress()).isEqualTo(admin.email);
+ assertThat(c.getCommitterIdent().getEmailAddress()).isEqualTo(
+ serverIdent.getEmailAddress());
}
}
private void assertTag(Project.NameKey project, String branch,
PushOneCommit.Tag tag) throws IOException {
- Repository repo = repoManager.openRepository(project);
- try {
+ try (Repository repo = repoManager.openRepository(project)) {
Ref tagRef = repo.getRef(tag.name);
assertThat(tagRef).isNotNull();
ObjectId taggedCommit = null;
if (tag instanceof PushOneCommit.AnnotatedTag) {
PushOneCommit.AnnotatedTag annotatedTag = (PushOneCommit.AnnotatedTag)tag;
- RevWalk rw = new RevWalk(repo);
- try {
+ try (RevWalk rw = new RevWalk(repo)) {
RevObject object = rw.parseAny(tagRef.getObjectId());
assertThat(object).isInstanceOf(RevTag.class);
RevTag tagObject = (RevTag) object;
@@ -276,8 +259,6 @@
.isEqualTo(annotatedTag.message);
assertThat(tagObject.getTaggerIdent()).isEqualTo(annotatedTag.tagger);
taggedCommit = tagObject.getObject();
- } finally {
- rw.dispose();
}
} else {
taggedCommit = tagRef.getObjectId();
@@ -285,23 +266,20 @@
ObjectId headCommit = repo.getRef(branch).getObjectId();
assertThat(taggedCommit).isNotNull();
assertThat(taggedCommit).isEqualTo(headCommit);
- } finally {
- repo.close();
}
}
private PushOneCommit.Result push(String ref, String subject,
- String fileName, String content) throws GitAPIException, IOException {
+ String fileName, String content) throws Exception {
PushOneCommit push =
- pushFactory.create(db, admin.getIdent(), subject, fileName, content);
- return push.to(git, ref);
+ pushFactory.create(db, admin.getIdent(), testRepo, subject, fileName, content);
+ return push.to(ref);
}
private PushOneCommit.Result push(String ref, String subject,
- String fileName, String content, String changeId) throws GitAPIException,
- IOException {
- PushOneCommit push = pushFactory.create(db, admin.getIdent(), subject,
+ String fileName, String content, String changeId) throws Exception {
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo, subject,
fileName, content, changeId);
- return push.to(git, ref);
+ return push.to(ref);
}
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/VisibleRefFilterIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/VisibleRefFilterIT.java
index 4a66a4169..e73d41f 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/VisibleRefFilterIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/VisibleRefFilterIT.java
@@ -91,11 +91,11 @@
.create(new BranchInput());
allow(Permission.SUBMIT, admins, "refs/for/refs/heads/*");
- PushOneCommit.Result mr = pushFactory.create(db, admin.getIdent())
- .to(git, "refs/for/master%submit");
+ PushOneCommit.Result mr = pushFactory.create(db, admin.getIdent(), testRepo)
+ .to("refs/for/master%submit");
mr.assertOkStatus();
- PushOneCommit.Result br = pushFactory.create(db, admin.getIdent())
- .to(git, "refs/for/branch%submit");
+ PushOneCommit.Result br = pushFactory.create(db, admin.getIdent(), testRepo)
+ .to("refs/for/branch%submit");
br.assertOkStatus();
Repository repo = repoManager.openRepository(project);
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
index 66911b8..ee930bb 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
@@ -18,23 +18,23 @@
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assert_;
import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.acceptance.GitUtil.cloneProject;
import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_REVISION;
import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
+import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GitUtil;
import com.google.gerrit.acceptance.PushOneCommit;
import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.acceptance.SshSession;
+import com.google.gerrit.acceptance.TestProjectInput;
import com.google.gerrit.common.EventListener;
import com.google.gerrit.common.EventSource;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
import com.google.gerrit.extensions.api.changes.SubmitInput;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
import com.google.gerrit.extensions.client.ChangeStatus;
import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.ListChangesOption;
import com.google.gerrit.extensions.client.SubmitType;
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.LabelInfo;
@@ -51,17 +51,13 @@
import com.google.gerrit.server.events.Event;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.project.ListBranches.BranchInfo;
-import com.google.gerrit.server.project.PutConfig;
import com.google.gerrit.testutil.ConfigSuite;
import com.google.gson.reflect.TypeToken;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
-import com.jcraft.jsch.JSchException;
-
import org.apache.http.HttpStatus;
import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.diff.DiffFormatter;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.ObjectId;
@@ -116,7 +112,6 @@
}
}, listenerUser);
- project = new Project.NameKey("p2");
}
@After
@@ -127,10 +122,9 @@
protected abstract SubmitType getSubmitType();
@Test
- public void submitToEmptyRepo() throws JSchException, IOException,
- GitAPIException {
- Git git = createProject(false);
- PushOneCommit.Result change = createChange(git);
+ @TestProjectInput(createEmptyCommit = false)
+ public void submitToEmptyRepo() throws Exception {
+ PushOneCommit.Result change = createChange();
submit(change.getChangeId());
assertThat(getRemoteHead().getId()).isEqualTo(change.getCommitId());
}
@@ -138,85 +132,69 @@
@Test
public void submitWholeTopic() throws Exception {
assume().that(isSubmitWholeTopicEnabled()).isTrue();
- Git git = createProject();
PushOneCommit.Result change1 =
- createChange(git, "Change 1", "a.txt", "content", "test-topic");
+ createChange("Change 1", "a.txt", "content", "test-topic");
PushOneCommit.Result change2 =
- createChange(git, "Change 2", "b.txt", "content", "test-topic");
+ createChange("Change 2", "b.txt", "content", "test-topic");
+ PushOneCommit.Result change3 =
+ createChange("Change 3", "c.txt", "content", "test-topic");
approve(change1.getChangeId());
approve(change2.getChangeId());
- submit(change2.getChangeId());
+ approve(change3.getChangeId());
+ submit(change3.getChangeId());
change1.assertChange(Change.Status.MERGED, "test-topic", admin);
change2.assertChange(Change.Status.MERGED, "test-topic", admin);
+ change3.assertChange(Change.Status.MERGED, "test-topic", admin);
+ assertSubmitter(change1);
+ assertSubmitter(change2);
+ assertSubmitter(change3);
}
- protected Git createProject() throws JSchException, IOException,
- GitAPIException {
- return createProject(true);
- }
-
- private Git createProject(boolean emptyCommit)
- throws JSchException, IOException, GitAPIException {
- SshSession sshSession = new SshSession(server, admin);
- try {
- GitUtil.createProject(sshSession, project.get(), null, emptyCommit);
- setSubmitType(getSubmitType());
- return cloneProject(sshSession.getUrl() + "/" + project.get());
- } finally {
- sshSession.close();
+ private void assertSubmitter(PushOneCommit.Result change) throws Exception {
+ ChangeInfo info = get(change.getChangeId(), ListChangesOption.MESSAGES);
+ assertThat((Iterable<?>)info.messages).isNotNull();
+ assertThat((Iterable<?>)info.messages).hasSize(3);
+ if (getSubmitType() == SubmitType.CHERRY_PICK) {
+ assertThat(Iterables.getLast(info.messages).message).startsWith(
+ "Change has been successfully cherry-picked as ");
+ } else {
+ assertThat(Iterables.getLast(info.messages).message).isEqualTo(
+ "Change has been successfully merged into the git repository by Administrator");
}
}
- private void setSubmitType(SubmitType submitType) throws IOException {
- PutConfig.Input in = new PutConfig.Input();
- in.submitType = submitType;
- in.useContentMerge = InheritableBoolean.FALSE;
- RestResponse r =
- adminSession.put("/projects/" + project.get() + "/config", in);
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- r.consume();
+ @Override
+ protected void updateProjectInput(ProjectInput in) {
+ in.submitType = getSubmitType();
+ if (in.useContentMerge == InheritableBoolean.INHERIT) {
+ in.useContentMerge = InheritableBoolean.FALSE;
+ }
}
- protected void setUseContentMerge() throws IOException {
- PutConfig.Input in = new PutConfig.Input();
- in.useContentMerge = InheritableBoolean.TRUE;
- RestResponse r =
- adminSession.put("/projects/" + project.get() + "/config", in);
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- r.consume();
- }
-
- protected PushOneCommit.Result createChange(Git git) throws GitAPIException,
- IOException {
- PushOneCommit push = pushFactory.create(db, admin.getIdent());
- return push.to(git, "refs/for/master");
- }
-
- protected PushOneCommit.Result createChange(Git git, String subject,
- String fileName, String content) throws GitAPIException, IOException {
+ protected PushOneCommit.Result createChange(String subject,
+ String fileName, String content) throws Exception {
PushOneCommit push =
- pushFactory.create(db, admin.getIdent(), subject, fileName, content);
- return push.to(git, "refs/for/master");
+ pushFactory.create(db, admin.getIdent(), testRepo, subject, fileName, content);
+ return push.to("refs/for/master");
}
- protected PushOneCommit.Result createChange(Git git, String subject,
+ protected PushOneCommit.Result createChange(String subject,
String fileName, String content, String topic)
- throws GitAPIException, IOException {
+ throws Exception {
PushOneCommit push =
- pushFactory.create(db, admin.getIdent(), subject, fileName, content);
- return push.to(git, "refs/for/master/" + topic);
+ pushFactory.create(db, admin.getIdent(), testRepo, subject, fileName, content);
+ return push.to("refs/for/master/" + topic);
}
- protected void submit(String changeId) throws IOException {
+ protected void submit(String changeId) throws Exception {
submit(changeId, HttpStatus.SC_OK);
}
- protected void submitWithConflict(String changeId) throws IOException {
+ protected void submitWithConflict(String changeId) throws Exception {
submit(changeId, HttpStatus.SC_CONFLICT);
}
- protected void submitStatusOnly(String changeId)
- throws IOException, OrmException {
+ protected void submitStatusOnly(String changeId) throws Exception {
approve(changeId);
Change c = queryProvider.get().byKeyPrefix(changeId).get(0).change();
c.setStatus(Change.Status.SUBMITTED);
@@ -232,7 +210,7 @@
indexer.index(db, c);
}
- private void submit(String changeId, int expectedStatus) throws IOException {
+ private void submit(String changeId, int expectedStatus) throws Exception {
approve(changeId);
SubmitInput subm = new SubmitInput();
subm.waitForMerge = true;
@@ -266,14 +244,6 @@
b.consume();
}
- private void approve(String changeId) throws IOException {
- RestResponse r = adminSession.post(
- "/changes/" + changeId + "/revisions/current/review",
- new ReviewInput().label("Code-Review", 2));
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- r.consume();
- }
-
protected void assertCurrentRevision(String changeId, int expectedNum,
ObjectId expectedId) throws IOException {
ChangeInfo c = getChange(changeId, CURRENT_REVISION);
@@ -295,7 +265,7 @@
ChangeInfo c = getChange(changeId, DETAILED_LABELS);
LabelInfo cr = c.labels.get("Code-Review");
assertThat(cr.all).hasSize(1);
- assertThat(cr.all.get(0).value.intValue()).isEqualTo(2);
+ assertThat(cr.all.get(0).value).isEqualTo(2);
assertThat(new Account.Id(cr.all.get(0)._accountId)).isEqualTo(admin.getId());
}
@@ -337,40 +307,23 @@
}
protected RevCommit getRemoteHead() throws IOException {
- Repository repo = repoManager.openRepository(project);
- try {
+ try (Repository repo = repoManager.openRepository(project)) {
return getHead(repo, "refs/heads/master");
- } finally {
- repo.close();
}
}
protected List<RevCommit> getRemoteLog() throws IOException {
- Repository repo = repoManager.openRepository(project);
- try {
- RevWalk rw = new RevWalk(repo);
- try {
- rw.markStart(rw.parseCommit(
- repo.getRef("refs/heads/master").getObjectId()));
- return Lists.newArrayList(rw);
- } finally {
- rw.release();
- }
- } finally {
- repo.close();
+ try (Repository repo = repoManager.openRepository(project);
+ RevWalk rw = new RevWalk(repo)) {
+ rw.markStart(rw.parseCommit(
+ repo.getRef("refs/heads/master").getObjectId()));
+ return Lists.newArrayList(rw);
}
}
private RevCommit getHead(Repository repo, String name) throws IOException {
- try {
- RevWalk rw = new RevWalk(repo);
- try {
- return rw.parseCommit(repo.getRef(name).getObjectId());
- } finally {
- rw.release();
- }
- } finally {
- repo.close();
+ try (RevWalk rw = new RevWalk(repo)) {
+ return rw.parseCommit(repo.getRef(name).getObjectId());
}
}
@@ -381,28 +334,22 @@
}
private String getLatestRemoteDiff() throws IOException {
- Repository repo = repoManager.openRepository(project);
- try {
- RevWalk rw = new RevWalk(repo);
- try {
- ObjectId oldTreeId = repo.resolve("refs/heads/master~1^{tree}");
- ObjectId newTreeId = repo.resolve("refs/heads/master^{tree}");
- return getLatestDiff(repo, oldTreeId, newTreeId);
- } finally {
- rw.release();
- }
- } finally {
- repo.close();
+ try (Repository repo = repoManager.openRepository(project);
+ RevWalk rw = new RevWalk(repo)) {
+ ObjectId oldTreeId = repo.resolve("refs/heads/master~1^{tree}");
+ ObjectId newTreeId = repo.resolve("refs/heads/master^{tree}");
+ return getLatestDiff(repo, oldTreeId, newTreeId);
}
}
private String getLatestDiff(Repository repo, ObjectId oldTreeId,
ObjectId newTreeId) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
- DiffFormatter fmt = new DiffFormatter(out);
- fmt.setRepository(repo);
- fmt.format(oldTreeId, newTreeId);
- fmt.flush();
- return out.toString();
+ try (DiffFormatter fmt = new DiffFormatter(out)) {
+ fmt.setRepository(repo);
+ fmt.format(oldTreeId, newTreeId);
+ fmt.flush();
+ return out.toString();
+ }
}
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmitByMerge.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmitByMerge.java
index 1d60607..98aae37 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmitByMerge.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmitByMerge.java
@@ -15,34 +15,27 @@
package com.google.gerrit.acceptance.rest.change;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.checkout;
import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.TestProjectInput;
+import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.jcraft.jsch.JSchException;
-
-import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.Test;
-import java.io.IOException;
-
public abstract class AbstractSubmitByMerge extends AbstractSubmit {
@Test
- public void submitWithMerge() throws JSchException, IOException,
- GitAPIException {
- Git git = createProject();
+ public void submitWithMerge() throws Exception {
RevCommit initialHead = getRemoteHead();
PushOneCommit.Result change =
- createChange(git, "Change 1", "a.txt", "content");
+ createChange("Change 1", "a.txt", "content");
submit(change.getChangeId());
RevCommit oldHead = getRemoteHead();
- checkout(git, initialHead.getId().getName());
+ testRepo.reset(initialHead);
PushOneCommit.Result change2 =
- createChange(git, "Change 2", "b.txt", "other content");
+ createChange("Change 2", "b.txt", "other content");
submit(change2.getChangeId());
RevCommit head = getRemoteHead();
assertThat(head.getParentCount()).isEqualTo(2);
@@ -51,21 +44,19 @@
}
@Test
- public void submitWithContentMerge() throws JSchException, IOException,
- GitAPIException {
- Git git = createProject();
- setUseContentMerge();
+ @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
+ public void submitWithContentMerge() throws Exception {
PushOneCommit.Result change =
- createChange(git, "Change 1", "a.txt", "aaa\nbbb\nccc\n");
+ createChange("Change 1", "a.txt", "aaa\nbbb\nccc\n");
submit(change.getChangeId());
PushOneCommit.Result change2 =
- createChange(git, "Change 2", "a.txt", "aaa\nbbb\nccc\nddd\n");
+ createChange("Change 2", "a.txt", "aaa\nbbb\nccc\nddd\n");
submit(change2.getChangeId());
RevCommit oldHead = getRemoteHead();
- checkout(git, change.getCommitId().getName());
+ testRepo.reset(change.getCommitId());
PushOneCommit.Result change3 =
- createChange(git, "Change 3", "a.txt", "bbb\nccc\n");
+ createChange("Change 3", "a.txt", "bbb\nccc\n");
submit(change3.getChangeId());
RevCommit head = getRemoteHead();
assertThat(head.getParentCount()).isEqualTo(2);
@@ -74,19 +65,17 @@
}
@Test
- public void submitWithContentMerge_Conflict() throws JSchException,
- IOException, GitAPIException {
- Git git = createProject();
- setUseContentMerge();
+ @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
+ public void submitWithContentMerge_Conflict() throws Exception {
RevCommit initialHead = getRemoteHead();
PushOneCommit.Result change =
- createChange(git, "Change 1", "a.txt", "content");
+ createChange("Change 1", "a.txt", "content");
submit(change.getChangeId());
RevCommit oldHead = getRemoteHead();
- checkout(git, initialHead.getId().getName());
+ testRepo.reset(initialHead);
PushOneCommit.Result change2 =
- createChange(git, "Change 2", "a.txt", "other content");
+ createChange("Change 2", "a.txt", "other content");
submitWithConflict(change2.getChangeId());
assertThat(getRemoteHead()).isEqualTo(oldHead);
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ActionsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ActionsIT.java
index afcd5d0..6d7e0d6 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ActionsIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ActionsIT.java
@@ -18,18 +18,12 @@
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
import com.google.gerrit.extensions.common.ActionInfo;
import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gson.reflect.TypeToken;
-import org.apache.http.HttpStatus;
-import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.Config;
import org.junit.Test;
-import java.io.IOException;
import java.util.Map;
public class ActionsIT extends AbstractDaemonTest {
@@ -53,15 +47,9 @@
approve(changeId);
Map<String, ActionInfo> actions = getActions(changeId);
commonActionsAssertions(actions);
- if (isSubmitWholeTopicEnabled()) {
- ActionInfo info = actions.get("submit");
- assertThat(info.enabled).isTrue();
- assertThat(info.label).isEqualTo("Submit whole topic");
- assertThat(info.method).isEqualTo("POST");
- assertThat(info.title).isEqualTo("Submit all 1 changes of the same topic");
- } else {
- noSubmitWholeTopicAssertions(actions);
- }
+ // We want to treat a single change in a topic not as a whole topic,
+ // so regardless of how submitWholeTopic is configured:
+ noSubmitWholeTopicAssertions(actions);
}
@Test
@@ -103,15 +91,6 @@
}
}
- private Map<String, ActionInfo> getActions(String changeId)
- throws IOException {
- return newGson().fromJson(
- adminSession.get("/changes/"
- + changeId
- + "/revisions/1/actions").getReader(),
- new TypeToken<Map<String, ActionInfo>>() {}.getType());
- }
-
private void noSubmitWholeTopicAssertions(Map<String, ActionInfo> actions) {
ActionInfo info = actions.get("submit");
assertThat(info.enabled).isTrue();
@@ -127,18 +106,10 @@
assertThat(actions).containsKey("rebase");
}
- private PushOneCommit.Result createChangeWithTopic(String topic) throws GitAPIException,
- IOException {
- PushOneCommit push = pushFactory.create(db, admin.getIdent());
+ private PushOneCommit.Result createChangeWithTopic(String topic)
+ throws Exception {
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
assertThat(topic).isNotEmpty();
- return push.to(git, "refs/for/master/" + topic);
- }
-
- private void approve(String changeId) throws IOException {
- RestResponse r = adminSession.post(
- "/changes/" + changeId + "/revisions/current/review",
- new ReviewInput().label("Code-Review", 2));
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- r.consume();
+ return push.to("refs/for/master/" + topic);
}
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeOwnerIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeOwnerIT.java
index 8e7daec..65fdd0f 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeOwnerIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeOwnerIT.java
@@ -34,7 +34,6 @@
import com.google.gerrit.server.group.SystemGroupBackend;
import org.apache.http.HttpStatus;
-import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.junit.Before;
import org.junit.Test;
@@ -54,7 +53,7 @@
SshSession sshSession = new SshSession(server, user);
initSsh(user);
sshSession.open();
- git = cloneProject(sshSession.getUrl() + "/" + project.get());
+ setRepo(cloneProject(sshSession.getUrl() + "/" + project.get()));
sshSession.close();
user2 = accounts.user2();
sessionDev = new RestSession(server, user2);
@@ -102,9 +101,8 @@
projectCache.evict(config.getProject());
}
- private String createMyChange() throws GitAPIException,
- IOException {
- PushOneCommit push = pushFactory.create(db, user.getIdent());
- return push.to(git, "refs/for/master").getChangeId();
+ private String createMyChange() throws Exception {
+ PushOneCommit push = pushFactory.create(db, user.getIdent(), testRepo);
+ return push.to("refs/for/master").getChangeId();
}
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ConflictsOperatorIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ConflictsOperatorIT.java
index 6a1c0a6..7237185 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ConflictsOperatorIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ConflictsOperatorIT.java
@@ -15,7 +15,6 @@
package com.google.gerrit.acceptance.rest.change;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.checkout;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableSet;
@@ -27,8 +26,6 @@
import com.google.gson.reflect.TypeToken;
import org.apache.http.HttpStatus;
-import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.api.errors.GitAPIException;
import org.junit.Test;
import java.io.IOException;
@@ -40,8 +37,8 @@
@Test
public void noConflictingChanges() throws Exception {
- PushOneCommit.Result change = createChange(git, true);
- createChange(git, false);
+ PushOneCommit.Result change = createChange(true);
+ createChange(false);
Set<String> changes = queryConflictingChanges(change);
assertThat((Iterable<?>)changes).isEmpty();
@@ -49,24 +46,24 @@
@Test
public void conflictingChanges() throws Exception {
- PushOneCommit.Result change = createChange(git, true);
- PushOneCommit.Result conflictingChange1 = createChange(git, true);
- PushOneCommit.Result conflictingChange2 = createChange(git, true);
- createChange(git, false);
+ PushOneCommit.Result change = createChange(true);
+ PushOneCommit.Result conflictingChange1 = createChange(true);
+ PushOneCommit.Result conflictingChange2 = createChange(true);
+ createChange(false);
Set<String> changes = queryConflictingChanges(change);
assertChanges(changes, conflictingChange1, conflictingChange2);
}
- private PushOneCommit.Result createChange(Git git, boolean conflicting)
- throws GitAPIException, IOException {
- checkout(git, "origin/master");
+ private PushOneCommit.Result createChange(boolean conflicting)
+ throws Exception {
+ testRepo.reset("origin/master");
String file = conflicting ? "test.txt" : "test-" + count + ".txt";
PushOneCommit push =
- pushFactory.create(db, admin.getIdent(), "Change " + count, file,
+ pushFactory.create(db, admin.getIdent(), testRepo, "Change " + count, file,
"content " + count);
count++;
- return push.to(git, "refs/for/master");
+ return push.to("refs/for/master");
}
private Set<String> queryConflictingChanges(PushOneCommit.Result change)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DeleteDraftPatchSetIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DeleteDraftPatchSetIT.java
index 871b1cc..98810dc 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DeleteDraftPatchSetIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DeleteDraftPatchSetIT.java
@@ -29,7 +29,6 @@
import com.google.gwtorm.server.OrmException;
import org.apache.http.HttpStatus;
-import org.eclipse.jgit.api.errors.GitAPIException;
import org.junit.Test;
import java.io.IOException;
@@ -79,13 +78,12 @@
assertThat(queryProvider.get().byKeyPrefix(changeId)).isEmpty();
}
- private String createDraftChangeWith2PS() throws GitAPIException,
- IOException {
- PushOneCommit push = pushFactory.create(db, admin.getIdent());
- Result result = push.to(git, "refs/drafts/master");
- push = pushFactory.create(db, admin.getIdent(), PushOneCommit.SUBJECT,
+ private String createDraftChangeWith2PS() throws Exception {
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+ Result result = push.to("refs/drafts/master");
+ push = pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT,
"b.txt", "4711", result.getChangeId());
- return push.to(git, "refs/drafts/master").getChangeId();
+ return push.to("refs/drafts/master").getChangeId();
}
private PatchSet getCurrentPatchSet(String changeId) throws OrmException {
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ListChangesOptionsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ListChangesOptionsIT.java
index e649415..63e5627 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ListChangesOptionsIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ListChangesOptionsIT.java
@@ -51,8 +51,8 @@
String subject = "Change subject";
String fileName = "a.txt";
PushOneCommit push = pushFactory.create(
- db, admin.getIdent(), subject, fileName, content, baseChangeId);
- PushOneCommit.Result r = push.to(git, "refs/for/master");
+ db, admin.getIdent(), testRepo, subject, fileName, content, baseChangeId);
+ PushOneCommit.Result r = push.to("refs/for/master");
r.assertOkStatus();
return r;
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java
index 4863c3e..3152139 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java
@@ -15,16 +15,16 @@
package com.google.gerrit.acceptance.rest.change;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.checkout;
import com.google.common.collect.Iterables;
import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.TestProjectInput;
import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.client.InheritableBoolean;
import com.google.gerrit.extensions.client.ListChangesOption;
import com.google.gerrit.extensions.client.SubmitType;
import com.google.gerrit.extensions.common.ChangeInfo;
-import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.Test;
@@ -39,8 +39,7 @@
@Test
public void submitWithCherryPickIfFastForwardPossible() throws Exception {
- Git git = createProject();
- PushOneCommit.Result change = createChange(git);
+ PushOneCommit.Result change = createChange();
submit(change.getChangeId());
assertCherryPick(git, false);
assertThat(getRemoteHead().getParent(0))
@@ -49,16 +48,15 @@
@Test
public void submitWithCherryPick() throws Exception {
- Git git = createProject();
RevCommit initialHead = getRemoteHead();
PushOneCommit.Result change =
- createChange(git, "Change 1", "a.txt", "content");
+ createChange("Change 1", "a.txt", "content");
submit(change.getChangeId());
RevCommit oldHead = getRemoteHead();
- checkout(git, initialHead.getId().getName());
+ testRepo.reset(initialHead);
PushOneCommit.Result change2 =
- createChange(git, "Change 2", "b.txt", "other content");
+ createChange("Change 2", "b.txt", "other content");
submit(change2.getChangeId());
assertCherryPick(git, false);
RevCommit newHead = getRemoteHead();
@@ -70,20 +68,19 @@
}
@Test
+ @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
public void submitWithContentMerge() throws Exception {
- Git git = createProject();
- setUseContentMerge();
PushOneCommit.Result change =
- createChange(git, "Change 1", "a.txt", "aaa\nbbb\nccc\n");
+ createChange("Change 1", "a.txt", "aaa\nbbb\nccc\n");
submit(change.getChangeId());
PushOneCommit.Result change2 =
- createChange(git, "Change 2", "a.txt", "aaa\nbbb\nccc\nddd\n");
+ createChange("Change 2", "a.txt", "aaa\nbbb\nccc\nddd\n");
submit(change2.getChangeId());
RevCommit oldHead = getRemoteHead();
- checkout(git, change.getCommitId().getName());
+ testRepo.reset(change.getCommitId());
PushOneCommit.Result change3 =
- createChange(git, "Change 3", "a.txt", "bbb\nccc\n");
+ createChange("Change 3", "a.txt", "bbb\nccc\n");
submit(change3.getChangeId());
assertCherryPick(git, true);
RevCommit newHead = getRemoteHead();
@@ -95,18 +92,17 @@
}
@Test
+ @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
public void submitWithContentMerge_Conflict() throws Exception {
- Git git = createProject();
- setUseContentMerge();
RevCommit initialHead = getRemoteHead();
PushOneCommit.Result change =
- createChange(git, "Change 1", "a.txt", "content");
+ createChange("Change 1", "a.txt", "content");
submit(change.getChangeId());
RevCommit oldHead = getRemoteHead();
- checkout(git, initialHead.getId().getName());
+ testRepo.reset(initialHead);
PushOneCommit.Result change2 =
- createChange(git, "Change 2", "a.txt", "other content");
+ createChange("Change 2", "a.txt", "other content");
submitWithConflict(change2.getChangeId());
assertThat(getRemoteHead()).isEqualTo(oldHead);
assertCurrentRevision(change2.getChangeId(), 1, change2.getCommitId());
@@ -115,17 +111,16 @@
@Test
public void submitOutOfOrder() throws Exception {
- Git git = createProject();
RevCommit initialHead = getRemoteHead();
PushOneCommit.Result change =
- createChange(git, "Change 1", "a.txt", "content");
+ createChange("Change 1", "a.txt", "content");
submit(change.getChangeId());
RevCommit oldHead = getRemoteHead();
- checkout(git, initialHead.getId().getName());
- createChange(git, "Change 2", "b.txt", "other content");
+ testRepo.reset(initialHead);
+ createChange("Change 2", "b.txt", "other content");
PushOneCommit.Result change3 =
- createChange(git, "Change 3", "c.txt", "different content");
+ createChange("Change 3", "c.txt", "different content");
submit(change3.getChangeId());
assertCherryPick(git, false);
RevCommit newHead = getRemoteHead();
@@ -138,17 +133,16 @@
@Test
public void submitOutOfOrder_Conflict() throws Exception {
- Git git = createProject();
RevCommit initialHead = getRemoteHead();
PushOneCommit.Result change =
- createChange(git, "Change 1", "a.txt", "content");
+ createChange("Change 1", "a.txt", "content");
submit(change.getChangeId());
RevCommit oldHead = getRemoteHead();
- checkout(git, initialHead.getId().getName());
- createChange(git, "Change 2", "b.txt", "other content");
+ testRepo.reset(initialHead);
+ createChange("Change 2", "b.txt", "other content");
PushOneCommit.Result change3 =
- createChange(git, "Change 3", "b.txt", "different content");
+ createChange("Change 3", "b.txt", "different content");
submitWithConflict(change3.getChangeId());
assertThat(getRemoteHead()).isEqualTo(oldHead);
assertCurrentRevision(change3.getChangeId(), 1, change3.getCommitId());
@@ -157,17 +151,16 @@
@Test
public void submitMultipleChanges() throws Exception {
- Git git = createProject();
RevCommit initialHead = getRemoteHead();
- checkout(git, initialHead.getId().getName());
- PushOneCommit.Result change2 = createChange(git, "Change 2", "b", "b");
+ testRepo.reset(initialHead);
+ PushOneCommit.Result change2 = createChange("Change 2", "b", "b");
- checkout(git, initialHead.getId().getName());
- PushOneCommit.Result change3 = createChange(git, "Change 3", "c", "c");
+ testRepo.reset(initialHead);
+ PushOneCommit.Result change3 = createChange("Change 3", "c", "c");
- checkout(git, initialHead.getId().getName());
- PushOneCommit.Result change4 = createChange(git, "Change 4", "d", "d");
+ testRepo.reset(initialHead);
+ PushOneCommit.Result change4 = createChange("Change 4", "d", "d");
submitStatusOnly(change2.getChangeId());
submitStatusOnly(change3.getChangeId());
@@ -191,12 +184,11 @@
@Test
public void submitDependentNonConflictingChangesOutOfOrder() throws Exception {
- Git git = createProject();
RevCommit initialHead = getRemoteHead();
- checkout(git, initialHead.getId().getName());
- PushOneCommit.Result change2 = createChange(git, "Change 2", "b", "b");
- PushOneCommit.Result change3 = createChange(git, "Change 3", "c", "c");
+ testRepo.reset(initialHead);
+ PushOneCommit.Result change2 = createChange("Change 2", "b", "b");
+ PushOneCommit.Result change3 = createChange("Change 3", "c", "c");
assertThat(change3.getCommit().getParent(0)).isEqualTo(change2.getCommit());
// Submit succeeds; change3 is successfully cherry-picked onto head.
@@ -220,12 +212,11 @@
@Test
public void submitDependentConflictingChangesOutOfOrder() throws Exception {
- Git git = createProject();
RevCommit initialHead = getRemoteHead();
- checkout(git, initialHead.getId().getName());
- PushOneCommit.Result change2 = createChange(git, "Change 2", "b", "b1");
- PushOneCommit.Result change3 = createChange(git, "Change 3", "b", "b2");
+ testRepo.reset(initialHead);
+ PushOneCommit.Result change2 = createChange("Change 2", "b", "b1");
+ PushOneCommit.Result change3 = createChange("Change 3", "b", "b2");
assertThat(change3.getCommit().getParent(0)).isEqualTo(change2.getCommit());
// Submit fails; change3 contains the delta "b1" -> "b2", which cannot be
@@ -244,14 +235,13 @@
@Test
public void submitSubsetOfDependentChanges() throws Exception {
- Git git = createProject();
RevCommit initialHead = getRemoteHead();
- checkout(git, initialHead.getId().getName());
- createChange(git, "Change 2", "b", "b");
- PushOneCommit.Result change3 = createChange(git, "Change 3", "c", "c");
- createChange(git, "Change 4", "d", "d");
- PushOneCommit.Result change5 = createChange(git, "Change 5", "e", "e");
+ testRepo.reset(initialHead);
+ createChange("Change 2", "b", "b");
+ PushOneCommit.Result change3 = createChange("Change 3", "c", "c");
+ createChange("Change 4", "d", "d");
+ PushOneCommit.Result change5 = createChange("Change 5", "e", "e");
// Out of the above, only submit 3 and 5.
submitStatusOnly(change3.getChangeId());
@@ -271,17 +261,16 @@
@Test
public void submitChangeAfterParentFailsDueToConflict() throws Exception {
- Git git = createProject();
RevCommit initialHead = getRemoteHead();
- checkout(git, initialHead.getId().getName());
- PushOneCommit.Result change2 = createChange(git, "Change 2", "b", "b1");
+ testRepo.reset(initialHead);
+ PushOneCommit.Result change2 = createChange("Change 2", "b", "b1");
submit(change2.getChangeId());
- checkout(git, initialHead.getId().getName());
- PushOneCommit.Result change3 = createChange(git, "Change 3", "b", "b2");
+ testRepo.reset(initialHead);
+ PushOneCommit.Result change3 = createChange("Change 3", "b", "b2");
assertThat(change3.getCommit().getParent(0)).isEqualTo(initialHead);
- PushOneCommit.Result change4 = createChange(git, "Change 3", "c", "c3");
+ PushOneCommit.Result change4 = createChange("Change 3", "c", "c3");
submitStatusOnly(change3.getChangeId());
submitStatusOnly(change4.getChangeId());
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByFastForwardIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByFastForwardIT.java
index d4e7e849..12df6fc 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByFastForwardIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByFastForwardIT.java
@@ -15,15 +15,16 @@
package com.google.gerrit.acceptance.rest.change;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.checkout;
import com.google.gerrit.acceptance.PushOneCommit;
import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.common.ActionInfo;
-import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.Test;
+import java.util.Map;
+
public class SubmitByFastForwardIT extends AbstractSubmit {
@Override
@@ -33,9 +34,8 @@
@Test
public void submitWithFastForward() throws Exception {
- Git git = createProject();
RevCommit oldHead = getRemoteHead();
- PushOneCommit.Result change = createChange(git);
+ PushOneCommit.Result change = createChange();
submit(change.getChangeId());
RevCommit head = getRemoteHead();
assertThat(head.getId()).isEqualTo(change.getCommitId());
@@ -45,16 +45,23 @@
@Test
public void submitFastForwardNotPossible_Conflict() throws Exception {
- Git git = createProject();
RevCommit initialHead = getRemoteHead();
PushOneCommit.Result change =
- createChange(git, "Change 1", "a.txt", "content");
+ createChange("Change 1", "a.txt", "content");
submit(change.getChangeId());
RevCommit oldHead = getRemoteHead();
- checkout(git, initialHead.getId().getName());
+ testRepo.reset(initialHead);
PushOneCommit.Result change2 =
- createChange(git, "Change 2", "b.txt", "other content");
+ createChange("Change 2", "b.txt", "other content");
+
+ approve(change2.getChangeId());
+ Map<String, ActionInfo> actions = getActions(change2.getChangeId());
+
+ assertThat(actions).containsKey("submit");
+ ActionInfo info = actions.get("submit");
+ assertThat(info.enabled).isNull();
+
submitWithConflict(change2.getChangeId());
assertThat(getRemoteHead()).isEqualTo(oldHead);
assertSubmitter(change.getChangeId(), 1);
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeAlwaysIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeAlwaysIT.java
index fa913d9..ebd3d3c 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeAlwaysIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeAlwaysIT.java
@@ -15,12 +15,10 @@
package com.google.gerrit.acceptance.rest.change;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.checkout;
import com.google.gerrit.acceptance.PushOneCommit;
import com.google.gerrit.extensions.client.SubmitType;
-import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.Test;
@@ -35,9 +33,8 @@
@Test
public void submitWithMergeIfFastForwardPossible() throws Exception {
- Git git = createProject();
RevCommit oldHead = getRemoteHead();
- PushOneCommit.Result change = createChange(git);
+ PushOneCommit.Result change = createChange();
submit(change.getChangeId());
RevCommit head = getRemoteHead();
assertThat(head.getParentCount()).isEqualTo(2);
@@ -48,17 +45,16 @@
@Test
public void submitMultipleChanges() throws Exception {
- Git git = createProject();
RevCommit initialHead = getRemoteHead();
- checkout(git, initialHead.getId().getName());
- PushOneCommit.Result change2 = createChange(git, "Change 2", "b", "b");
+ testRepo.reset(initialHead);
+ PushOneCommit.Result change2 = createChange("Change 2", "b", "b");
- checkout(git, initialHead.getId().getName());
- PushOneCommit.Result change3 = createChange(git, "Change 3", "c", "c");
+ testRepo.reset(initialHead);
+ PushOneCommit.Result change3 = createChange("Change 3", "c", "c");
- checkout(git, initialHead.getId().getName());
- PushOneCommit.Result change4 = createChange(git, "Change 4", "d", "d");
+ testRepo.reset(initialHead);
+ PushOneCommit.Result change4 = createChange("Change 4", "d", "d");
submitStatusOnly(change2.getChangeId());
submitStatusOnly(change3.getChangeId());
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java
index c1ece45..95aef9e 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java
@@ -1,12 +1,10 @@
package com.google.gerrit.acceptance.rest.change;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.checkout;
import com.google.gerrit.acceptance.PushOneCommit;
import com.google.gerrit.extensions.client.SubmitType;
-import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.Test;
@@ -21,9 +19,8 @@
@Test
public void submitWithFastForward() throws Exception {
- Git git = createProject();
RevCommit oldHead = getRemoteHead();
- PushOneCommit.Result change = createChange(git);
+ PushOneCommit.Result change = createChange();
submit(change.getChangeId());
RevCommit head = getRemoteHead();
assertThat(head.getId()).isEqualTo(change.getCommitId());
@@ -33,17 +30,16 @@
@Test
public void submitMultipleChanges() throws Exception {
- Git git = createProject();
RevCommit initialHead = getRemoteHead();
- checkout(git, initialHead.getId().getName());
- PushOneCommit.Result change2 = createChange(git, "Change 2", "b", "b");
+ testRepo.reset(initialHead);
+ PushOneCommit.Result change2 = createChange("Change 2", "b", "b");
- checkout(git, initialHead.getId().getName());
- PushOneCommit.Result change3 = createChange(git, "Change 3", "c", "c");
+ testRepo.reset(initialHead);
+ PushOneCommit.Result change3 = createChange("Change 3", "c", "c");
- checkout(git, initialHead.getId().getName());
- PushOneCommit.Result change4 = createChange(git, "Change 4", "d", "d");
+ testRepo.reset(initialHead);
+ PushOneCommit.Result change4 = createChange("Change 4", "d", "d");
submitStatusOnly(change2.getChangeId());
submitStatusOnly(change3.getChangeId());
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseIfNecessaryIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseIfNecessaryIT.java
index d3e8cb5..6d5db92 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseIfNecessaryIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseIfNecessaryIT.java
@@ -15,12 +15,12 @@
package com.google.gerrit.acceptance.rest.change;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.checkout;
import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.TestProjectInput;
+import com.google.gerrit.extensions.client.InheritableBoolean;
import com.google.gerrit.extensions.client.SubmitType;
-import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.Test;
@@ -32,10 +32,10 @@
}
@Test
+ @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
public void submitWithFastForward() throws Exception {
- Git git = createProject();
RevCommit oldHead = getRemoteHead();
- PushOneCommit.Result change = createChange(git);
+ PushOneCommit.Result change = createChange();
submit(change.getChangeId());
RevCommit head = getRemoteHead();
assertThat(head.getId()).isEqualTo(change.getCommitId());
@@ -46,17 +46,17 @@
}
@Test
+ @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
public void submitWithRebase() throws Exception {
- Git git = createProject();
RevCommit initialHead = getRemoteHead();
PushOneCommit.Result change =
- createChange(git, "Change 1", "a.txt", "content");
+ createChange("Change 1", "a.txt", "content");
submit(change.getChangeId());
RevCommit oldHead = getRemoteHead();
- checkout(git, initialHead.getId().getName());
+ testRepo.reset(initialHead);
PushOneCommit.Result change2 =
- createChange(git, "Change 2", "b.txt", "other content");
+ createChange("Change 2", "b.txt", "other content");
submit(change2.getChangeId());
assertRebase(git, false);
RevCommit head = getRemoteHead();
@@ -68,20 +68,19 @@
}
@Test
+ @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
public void submitWithContentMerge() throws Exception {
- Git git = createProject();
- setUseContentMerge();
PushOneCommit.Result change =
- createChange(git, "Change 1", "a.txt", "aaa\nbbb\nccc\n");
+ createChange("Change 1", "a.txt", "aaa\nbbb\nccc\n");
submit(change.getChangeId());
PushOneCommit.Result change2 =
- createChange(git, "Change 2", "a.txt", "aaa\nbbb\nccc\nddd\n");
+ createChange("Change 2", "a.txt", "aaa\nbbb\nccc\nddd\n");
submit(change2.getChangeId());
RevCommit oldHead = getRemoteHead();
- checkout(git, change.getCommitId().getName());
+ testRepo.reset(change.getCommitId());
PushOneCommit.Result change3 =
- createChange(git, "Change 3", "a.txt", "bbb\nccc\n");
+ createChange("Change 3", "a.txt", "bbb\nccc\n");
submit(change3.getChangeId());
assertRebase(git, true);
RevCommit head = getRemoteHead();
@@ -93,18 +92,17 @@
}
@Test
+ @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
public void submitWithContentMerge_Conflict() throws Exception {
- Git git = createProject();
- setUseContentMerge();
RevCommit initialHead = getRemoteHead();
PushOneCommit.Result change =
- createChange(git, "Change 1", "a.txt", "content");
+ createChange("Change 1", "a.txt", "content");
submit(change.getChangeId());
RevCommit oldHead = getRemoteHead();
- checkout(git, initialHead.getId().getName());
+ testRepo.reset(initialHead);
PushOneCommit.Result change2 =
- createChange(git, "Change 2", "a.txt", "other content");
+ createChange("Change 2", "a.txt", "other content");
submitWithConflict(change2.getChangeId());
RevCommit head = getRemoteHead();
assertThat(head).isEqualTo(oldHead);
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/CacheOperationsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/CacheOperationsIT.java
index 304abc8..06f2426 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/CacheOperationsIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/CacheOperationsIT.java
@@ -42,7 +42,7 @@
public void flushAll() throws Exception {
RestResponse r = adminSession.get("/config/server/caches/project_list");
CacheInfo cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
- assertThat(cacheInfo.entries.mem.longValue()).isGreaterThan((long) 0);
+ assertThat(cacheInfo.entries.mem).isGreaterThan((long) 0);
r = adminSession.post("/config/server/caches/", new PostCaches.Input(FLUSH_ALL));
assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
@@ -71,11 +71,11 @@
public void flush() throws Exception {
RestResponse r = adminSession.get("/config/server/caches/project_list");
CacheInfo cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
- assertThat(cacheInfo.entries.mem.longValue()).isGreaterThan((long)0);
+ assertThat(cacheInfo.entries.mem).isGreaterThan((long)0);
r = adminSession.get("/config/server/caches/projects");
cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
- assertThat(cacheInfo.entries.mem.longValue()).isGreaterThan((long)1);
+ assertThat(cacheInfo.entries.mem).isGreaterThan((long)1);
r = adminSession.post("/config/server/caches/",
new PostCaches.Input(FLUSH, Arrays.asList("accounts", "project_list")));
@@ -88,7 +88,7 @@
r = adminSession.get("/config/server/caches/projects");
cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
- assertThat(cacheInfo.entries.mem.longValue()).isGreaterThan((long)1);
+ assertThat(cacheInfo.entries.mem).isGreaterThan((long)1);
}
@Test
@@ -109,7 +109,7 @@
public void flush_UnprocessableEntity() throws Exception {
RestResponse r = adminSession.get("/config/server/caches/projects");
CacheInfo cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
- assertThat(cacheInfo.entries.mem.longValue()).isGreaterThan((long)0);
+ assertThat(cacheInfo.entries.mem).isGreaterThan((long)0);
r = adminSession.post("/config/server/caches/",
new PostCaches.Input(FLUSH, Arrays.asList("projects", "unprocessable")));
@@ -118,7 +118,7 @@
r = adminSession.get("/config/server/caches/projects");
cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
- assertThat(cacheInfo.entries.mem.longValue()).isGreaterThan((long)0);
+ assertThat(cacheInfo.entries.mem).isGreaterThan((long)0);
}
@Test
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/FlushCacheIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/FlushCacheIT.java
index 9f7b419..bfb93f1 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/FlushCacheIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/FlushCacheIT.java
@@ -38,7 +38,7 @@
public void flushCache() throws Exception {
RestResponse r = adminSession.get("/config/server/caches/groups");
CacheInfo result = newGson().fromJson(r.getReader(), CacheInfo.class);
- assertThat(result.entries.mem.longValue()).isGreaterThan((long)0);
+ assertThat(result.entries.mem).isGreaterThan((long)0);
r = adminSession.post("/config/server/caches/groups/flush");
assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/GetCacheIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/GetCacheIT.java
index f59752c..7280d91 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/GetCacheIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/GetCacheIT.java
@@ -34,7 +34,7 @@
assertThat(result.name).isEqualTo("accounts");
assertThat(result.type).isEqualTo(CacheType.MEM);
- assertThat(result.entries.mem.longValue()).isEqualTo(1);
+ assertThat(result.entries.mem).isEqualTo(1);
assertThat(result.averageGet).isNotNull();
assertThat(result.averageGet).endsWith("s");
assertThat(result.entries.disk).isNull();
@@ -47,7 +47,7 @@
r = adminSession.get("/config/server/caches/accounts");
assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
result = newGson().fromJson(r.getReader(), CacheInfo.class);
- assertThat(result.entries.mem.longValue()).isEqualTo(2);
+ assertThat(result.entries.mem).isEqualTo(2);
}
@Test
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ListCachesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ListCachesIT.java
index 0d0a94e..2ef4442 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ListCachesIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ListCachesIT.java
@@ -45,7 +45,7 @@
assertThat(result).containsKey("accounts");
CacheInfo accountsCacheInfo = result.get("accounts");
assertThat(accountsCacheInfo.type).isEqualTo(CacheType.MEM);
- assertThat(accountsCacheInfo.entries.mem.longValue()).isEqualTo(1);
+ assertThat(accountsCacheInfo.entries.mem).isEqualTo(1);
assertThat(accountsCacheInfo.averageGet).isNotNull();
assertThat(accountsCacheInfo.averageGet).endsWith("s");
assertThat(accountsCacheInfo.entries.disk).isNull();
@@ -59,7 +59,7 @@
assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
result = newGson().fromJson(r.getReader(),
new TypeToken<Map<String, CacheInfo>>() {}.getType());
- assertThat(result.get("accounts").entries.mem.longValue()).isEqualTo(2);
+ assertThat(result.get("accounts").entries.mem).isEqualTo(2);
}
@Test
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BanCommitIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BanCommitIT.java
index ceed9b6..f59004a 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BanCommitIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BanCommitIT.java
@@ -15,18 +15,16 @@
package com.google.gerrit.acceptance.rest.project;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.add;
-import static com.google.gerrit.acceptance.GitUtil.createCommit;
import static com.google.gerrit.acceptance.GitUtil.pushHead;
import com.google.common.collect.Iterables;
import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GitUtil.Commit;
import com.google.gerrit.acceptance.RestResponse;
import com.google.gerrit.server.project.BanCommit;
import com.google.gerrit.server.project.BanCommit.BanResultInfo;
import org.apache.http.HttpStatus;
+import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.transport.PushResult;
import org.junit.Test;
@@ -34,16 +32,16 @@
@Test
public void banCommit() throws Exception {
- add(git, "a.txt", "some content");
- Commit c = createCommit(git, admin.getIdent(), "subject");
+ RevCommit c = commitBuilder()
+ .add("a.txt", "some content")
+ .create();
RestResponse r =
adminSession.put("/projects/" + project.get() + "/ban/",
- BanCommit.Input.fromCommits(c.getCommit().getName()));
+ BanCommit.Input.fromCommits(c.name()));
assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
BanResultInfo info = newGson().fromJson(r.getReader(), BanResultInfo.class);
- assertThat(Iterables.getOnlyElement(info.newlyBanned))
- .isEqualTo(c.getCommit().getName());
+ assertThat(Iterables.getOnlyElement(info.newlyBanned)).isEqualTo(c.name());
assertThat(info.alreadyBanned).isNull();
assertThat(info.ignored).isNull();
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
index 998c5ea..78132a9 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
@@ -49,7 +49,7 @@
@Test
public void testCreateProjectApi() throws Exception {
final String newProjectName = "newProject";
- ProjectInfo p = gApi.projects().name(newProjectName).create().get();
+ ProjectInfo p = gApi.projects().create(newProjectName).get();
assertThat(p.name).isEqualTo(newProjectName);
ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
assertThat(projectState).isNotNull();
@@ -60,7 +60,7 @@
@Test
public void testCreateProjectApiWithGitSuffix() throws Exception {
final String newProjectName = "newProject";
- ProjectInfo p = gApi.projects().name(newProjectName + ".git").create().get();
+ ProjectInfo p = gApi.projects().create(newProjectName + ".git").get();
assertThat(p.name).isEqualTo(newProjectName);
ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
assertThat(projectState).isNotNull();
@@ -238,11 +238,10 @@
private void assertEmptyCommit(String projectName, String... refs)
throws RepositoryNotFoundException, IOException {
- Repository repo =
- repoManager.openRepository(new Project.NameKey(projectName));
- RevWalk rw = new RevWalk(repo);
- TreeWalk tw = new TreeWalk(repo);
- try {
+ Project.NameKey projectKey = new Project.NameKey(projectName);
+ try (Repository repo = repoManager.openRepository(projectKey);
+ RevWalk rw = new RevWalk(repo);
+ TreeWalk tw = new TreeWalk(rw.getObjectReader())) {
for (String ref : refs) {
RevCommit commit = rw.lookupCommit(repo.getRef(ref).getObjectId());
rw.parseBody(commit);
@@ -250,9 +249,6 @@
assertThat(tw.next()).isFalse();
tw.reset();
}
- } finally {
- rw.release();
- repo.close();
}
}
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GarbageCollectionIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GarbageCollectionIT.java
index 6aa3af6..c9293343 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GarbageCollectionIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GarbageCollectionIT.java
@@ -15,7 +15,6 @@
package com.google.gerrit.acceptance.rest.project;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.createProject;
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.GcAssert;
@@ -40,7 +39,7 @@
@Before
public void setUp() throws Exception {
project2 = new Project.NameKey("p2");
- createProject(sshSession, project2.get());
+ createProject(project2.get());
}
@Test
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetChildProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetChildProjectIT.java
index f49408e..410b5b0 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetChildProjectIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetChildProjectIT.java
@@ -15,53 +15,46 @@
package com.google.gerrit.acceptance.rest.project;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.createProject;
import static com.google.gerrit.acceptance.rest.project.ProjectAssert.assertProjectInfo;
import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.acceptance.NoHttpd;
import com.google.gerrit.acceptance.SshSession;
import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.reviewdb.client.Project;
-import org.apache.http.HttpStatus;
import org.junit.Test;
-import java.io.IOException;
-
+@NoHttpd
public class GetChildProjectIT extends AbstractDaemonTest {
@Test
public void getNonExistingChildProject_NotFound() throws Exception {
- assertThat(
- GET("/projects/" + allProjects.get() + "/children/non-existing")
- .getStatusCode()).isEqualTo(HttpStatus.SC_NOT_FOUND);
+ assertChildNotFound(allProjects, "non-existing");
}
@Test
public void getNonChildProject_NotFound() throws Exception {
SshSession sshSession = new SshSession(server, admin);
Project.NameKey p1 = new Project.NameKey("p1");
- createProject(sshSession, p1.get());
+ createProject(p1.get());
Project.NameKey p2 = new Project.NameKey("p2");
- createProject(sshSession, p2.get());
+ createProject(p2.get());
sshSession.close();
- assertThat(
- GET("/projects/" + p1.get() + "/children/" + p2.get()).getStatusCode())
- .isEqualTo(HttpStatus.SC_NOT_FOUND);
+
+ assertChildNotFound(p1, p2.get());
}
@Test
public void getChildProject() throws Exception {
SshSession sshSession = new SshSession(server, admin);
Project.NameKey child = new Project.NameKey("p1");
- createProject(sshSession, child.get());
+ createProject(child.get());
sshSession.close();
- RestResponse r =
- GET("/projects/" + allProjects.get() + "/children/" + child.get());
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- ProjectInfo childInfo =
- newGson().fromJson(r.getReader(), ProjectInfo.class);
+
+ ProjectInfo childInfo = gApi.projects().name(allProjects.get())
+ .child(child.get()).get();
assertProjectInfo(projectCache.get(child).getProject(), childInfo);
}
@@ -69,33 +62,36 @@
public void getGrandChildProject_NotFound() throws Exception {
SshSession sshSession = new SshSession(server, admin);
Project.NameKey child = new Project.NameKey("p1");
- createProject(sshSession, child.get());
+ createProject(child.get());
Project.NameKey grandChild = new Project.NameKey("p1.1");
- createProject(sshSession, grandChild.get(), child);
+ createProject(grandChild.get(), child);
sshSession.close();
- assertThat(
- GET("/projects/" + allProjects.get() + "/children/" + grandChild.get())
- .getStatusCode()).isEqualTo(HttpStatus.SC_NOT_FOUND);
+
+ assertChildNotFound(allProjects, grandChild.get());
}
@Test
public void getGrandChildProjectWithRecursiveFlag() throws Exception {
SshSession sshSession = new SshSession(server, admin);
Project.NameKey child = new Project.NameKey("p1");
- createProject(sshSession, child.get());
+ createProject(child.get());
Project.NameKey grandChild = new Project.NameKey("p1.1");
- createProject(sshSession, grandChild.get(), child);
+ createProject(grandChild.get(), child);
sshSession.close();
- RestResponse r =
- GET("/projects/" + allProjects.get() + "/children/" + grandChild.get()
- + "?recursive");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- ProjectInfo grandChildInfo =
- newGson().fromJson(r.getReader(), ProjectInfo.class);
- assertProjectInfo(projectCache.get(grandChild).getProject(), grandChildInfo);
+
+ ProjectInfo grandChildInfo = gApi.projects().name(allProjects.get())
+ .child(grandChild.get()).get(true);
+ assertProjectInfo(
+ projectCache.get(grandChild).getProject(), grandChildInfo);
}
- private RestResponse GET(String endpoint) throws IOException {
- return adminSession.get(endpoint);
+ private void assertChildNotFound(Project.NameKey parent, String child)
+ throws Exception {
+ try {
+ gApi.projects().name(parent.get()).child(child);
+ } catch (ResourceNotFoundException e) {
+ e.printStackTrace();
+ assertThat(e.getMessage()).contains(child);
+ }
}
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetCommitIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetCommitIT.java
index 4a20957..8e627c4 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetCommitIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetCommitIT.java
@@ -99,8 +99,8 @@
@Test
public void getOpenChange_Found() throws Exception {
allow(Permission.READ, REGISTERED_USERS, "refs/heads/*");
- PushOneCommit.Result r = pushFactory.create(db, admin.getIdent())
- .to(git, "refs/for/master");
+ PushOneCommit.Result r = pushFactory.create(db, admin.getIdent(), testRepo)
+ .to("refs/for/master");
r.assertOkStatus();
CommitInfo info = getCommit(r.getCommitId());
@@ -123,8 +123,8 @@
@Test
public void getOpenChange_NotFound() throws Exception {
- PushOneCommit.Result r = pushFactory.create(db, admin.getIdent())
- .to(git, "refs/for/master");
+ PushOneCommit.Result r = pushFactory.create(db, admin.getIdent(), testRepo)
+ .to("refs/for/master");
r.assertOkStatus();
assertNotFound(r.getCommitId());
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetProjectIT.java
index 761e282..24b1770 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetProjectIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetProjectIT.java
@@ -17,35 +17,31 @@
import static com.google.common.truth.Truth.assertThat;
import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.acceptance.NoHttpd;
import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import org.apache.http.HttpStatus;
import org.junit.Test;
+@NoHttpd
public class GetProjectIT extends AbstractDaemonTest {
@Test
public void getProject() throws Exception {
String name = project.get();
- RestResponse r = adminSession.get("/projects/" + name);
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- ProjectInfo p = newGson().fromJson(r.getReader(), ProjectInfo.class);
+ ProjectInfo p = gApi.projects().name(name).get();
assertThat(p.name).isEqualTo(name);
}
@Test
public void getProjectWithGitSuffix() throws Exception {
String name = project.get();
- RestResponse r = adminSession.get("/projects/" + name + ".git");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- ProjectInfo p = newGson().fromJson(r.getReader(), ProjectInfo.class);
+ ProjectInfo p = gApi.projects().name(name).get();
assertThat(p.name).isEqualTo(name);
}
- @Test
+ @Test(expected = ResourceNotFoundException.class)
public void getProjectNotExisting() throws Exception {
- RestResponse r = adminSession.get("/projects/does-not-exist");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_NOT_FOUND);
+ gApi.projects().name("does-not-exist").get();
}
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java
index 48f9ad89..0153666 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java
@@ -15,13 +15,12 @@
package com.google.gerrit.acceptance.rest.project;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.createProject;
import static com.google.gerrit.acceptance.rest.project.BranchAssert.assertBranches;
import com.google.common.collect.Lists;
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.acceptance.TestProjectInput;
import com.google.gerrit.server.project.ListBranches.BranchInfo;
import com.google.gson.reflect.TypeToken;
@@ -48,10 +47,9 @@
}
@Test
+ @TestProjectInput(createEmptyCommit = false)
public void listBranchesOfEmptyProject() throws Exception {
- Project.NameKey emptyProject = new Project.NameKey("empty");
- createProject(sshSession, emptyProject.get(), null, false);
- RestResponse r = adminSession.get("/projects/" + emptyProject.get() + "/branches");
+ RestResponse r = adminSession.get("/projects/" + project + "/branches");
List<BranchInfo> expected = Lists.asList(
new BranchInfo("refs/meta/config", null, false),
new BranchInfo[] {
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java
index 0d3b467..384991d 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java
@@ -15,84 +15,69 @@
package com.google.gerrit.acceptance.rest.project;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.createProject;
-import static com.google.gerrit.acceptance.rest.project.ProjectAssert.assertProjects;
+import static com.google.gerrit.acceptance.rest.project.ProjectAssert.assertThatNameList;
import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gson.reflect.TypeToken;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.inject.Inject;
-import org.apache.http.HttpStatus;
import org.junit.Test;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.List;
-
+@NoHttpd
public class ListChildProjectsIT extends AbstractDaemonTest {
+ @Inject
+ private AllUsersName allUsers;
+
@Test
public void listChildrenOfNonExistingProject_NotFound() throws Exception {
- assertThat(GET("/projects/non-existing/children/").getStatusCode())
- .isEqualTo(HttpStatus.SC_NOT_FOUND);
+ try {
+ gApi.projects().name("non-existing").child("children");
+ } catch (ResourceNotFoundException e) {
+ assertThat(e.getMessage()).contains("non-existing");
+ }
}
@Test
public void listNoChildren() throws Exception {
- RestResponse r = GET("/projects/" + allProjects.get() + "/children/");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- List<ProjectInfo> projectInfoList = toProjectInfoList(r);
- // Project 'p' was already created in the base class
- assertThat(projectInfoList).hasSize(2);
+ assertThatNameList(gApi.projects().name(allProjects.get()).children())
+ .containsExactly(allUsers, project).inOrder();
}
@Test
public void listChildren() throws Exception {
- Project.NameKey existingProject = new Project.NameKey("p");
Project.NameKey child1 = new Project.NameKey("p1");
- createProject(sshSession, child1.get());
+ createProject(child1.get());
Project.NameKey child2 = new Project.NameKey("p2");
- createProject(sshSession, child2.get());
- createProject(sshSession, "p1.1", child1);
+ createProject(child2.get());
+ Project.NameKey child1_1 = new Project.NameKey("p1.1");
+ createProject(child1_1.get(), child1);
- RestResponse r = GET("/projects/" + allProjects.get() + "/children/");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- assertProjects(
- Arrays.asList(
- new Project.NameKey("All-Users"),
- existingProject, child1, child2),
- toProjectInfoList(r));
+ assertThatNameList(gApi.projects().name(allProjects.get()).children())
+ .containsExactly(allUsers, project, child1, child2).inOrder();
+ assertThatNameList(gApi.projects().name(child1.get()).children())
+ .containsExactly(child1_1);
}
@Test
public void listChildrenRecursively() throws Exception {
Project.NameKey child1 = new Project.NameKey("p1");
- createProject(sshSession, child1.get());
- createProject(sshSession, "p2");
+ createProject(child1.get());
+ createProject("p2");
Project.NameKey child1_1 = new Project.NameKey("p1.1");
- createProject(sshSession, child1_1.get(), child1);
+ createProject(child1_1.get(), child1);
Project.NameKey child1_2 = new Project.NameKey("p1.2");
- createProject(sshSession, child1_2.get(), child1);
+ createProject(child1_2.get(), child1);
Project.NameKey child1_1_1 = new Project.NameKey("p1.1.1");
- createProject(sshSession, child1_1_1.get(), child1_1);
+ createProject(child1_1_1.get(), child1_1);
Project.NameKey child1_1_1_1 = new Project.NameKey("p1.1.1.1");
- createProject(sshSession, child1_1_1_1.get(), child1_1_1);
+ createProject(child1_1_1_1.get(), child1_1_1);
- RestResponse r = GET("/projects/" + child1.get() + "/children/?recursive");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- assertProjects(Arrays.asList(child1_1, child1_2,
- child1_1_1, child1_1_1_1), toProjectInfoList(r));
- }
-
- private static List<ProjectInfo> toProjectInfoList(RestResponse r)
- throws IOException {
- return newGson().fromJson(r.getReader(),
- new TypeToken<List<ProjectInfo>>() {}.getType());
- }
-
- private RestResponse GET(String endpoint) throws IOException {
- return adminSession.get(endpoint);
+ assertThatNameList(gApi.projects().name(child1.get()).children(true))
+ .containsExactly(child1_1, child1_1_1, child1_1_1_1, child1_2)
+ .inOrder();
}
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java
index 0f5bed1..f04f471 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java
@@ -15,25 +15,30 @@
package com.google.gerrit.acceptance.rest.project;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.createProject;
-import static com.google.gerrit.acceptance.rest.project.ProjectAssert.assertProjects;
+import static com.google.gerrit.acceptance.rest.project.ProjectAssert.assertThatNameList;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import com.google.common.collect.Iterables;
import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.common.data.Permission;
import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.api.projects.Projects.ListRequest;
+import com.google.gerrit.extensions.api.projects.Projects.ListRequest.FilterType;
import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.config.AllUsersName;
-import com.google.gson.reflect.TypeToken;
+import com.google.gerrit.server.git.ProjectConfig;
+import com.google.gerrit.server.project.Util;
import com.google.inject.Inject;
-import org.apache.http.HttpStatus;
import org.junit.Test;
-import java.io.IOException;
-import java.util.Arrays;
+import java.util.List;
import java.util.Map;
+@NoHttpd
public class ListProjectsIT extends AbstractDaemonTest {
@Inject
@@ -42,24 +47,32 @@
@Test
public void listProjects() throws Exception {
Project.NameKey someProject = new Project.NameKey("some-project");
- createProject(sshSession, someProject.get());
+ createProject(someProject.get());
+ assertThatNameList(gApi.projects().list().get())
+ .containsExactly(allProjects, allUsers, project, someProject).inOrder();
+ }
- RestResponse r = GET("/projects/");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- Map<String, ProjectInfo> result = toProjectInfoMap(r);
- assertProjects(Arrays.asList(allUsers, someProject, project),
- result.values());
+ @Test
+ public void listProjectsFiltersInvisibleProjects() throws Exception {
+ setApiUser(user);
+ assertThatNameList(gApi.projects().list().get()).contains(project);
+
+ ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
+ Util.block(cfg, Permission.READ, REGISTERED_USERS, "refs/*");
+ saveProjectConfig(project, cfg);
+
+ assertThatNameList(gApi.projects().list().get()).doesNotContain(project);
}
@Test
public void listProjectsWithBranch() throws Exception {
- RestResponse r = GET("/projects/?b=master");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- Map<String, ProjectInfo> result = toProjectInfoMap(r);
- assertThat(result.get(project.get())).isNotNull();
- assertThat(result.get(project.get()).branches).isNotNull();
- assertThat(result.get(project.get()).branches).hasSize(1);
- assertThat(result.get(project.get()).branches.get("master")).isNotNull();
+ Map<String, ProjectInfo> result = gApi.projects().list()
+ .addShowBranch("master").getAsMap();
+ assertThat(result).containsKey(project.get());
+ ProjectInfo info = result.get(project.get());
+ assertThat(info.branches).isNotNull();
+ assertThat(info.branches).hasSize(1);
+ assertThat(info.branches.get("master")).isNotNull();
}
@Test
@@ -67,19 +80,15 @@
ProjectInput projectInput = new ProjectInput();
projectInput.name = "some-project";
projectInput.description = "Description of some-project";
- gApi.projects().name(projectInput.name).create(projectInput);
+ gApi.projects().create(projectInput);
// description not be included in the results by default.
- RestResponse r = GET("/projects/");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- Map<String, ProjectInfo> result = toProjectInfoMap(r);
- assertThat(result.get(projectInput.name)).isNotNull();
+ Map<String, ProjectInfo> result = gApi.projects().list().getAsMap();
+ assertThat(result).containsKey(projectInput.name);
assertThat(result.get(projectInput.name).description).isNull();
- r = GET("/projects/?d");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- result = toProjectInfoMap(r);
- assertThat(result.get(projectInput.name)).isNotNull();
+ result = gApi.projects().list().withDescription(true).getAsMap();
+ assertThat(result).containsKey(projectInput.name);
assertThat(result.get(projectInput.name).description).isEqualTo(
projectInput.description);
}
@@ -87,160 +96,123 @@
@Test
public void listProjectsWithLimit() throws Exception {
for (int i = 0; i < 5; i++) {
- createProject(sshSession, new Project.NameKey("someProject" + i).get());
+ createProject(new Project.NameKey("someProject" + i).get());
}
- RestResponse r = GET("/projects/");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- Map<String, ProjectInfo> result = toProjectInfoMap(r);
- assertThat(result).hasSize(7); // 5 plus 2 existing projects: p and
- // All-Users
-
- r = GET("/projects/?n=2");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- result = toProjectInfoMap(r);
- assertThat(result).hasSize(2);
+ // 5 plus All-Projects, All-Users, and p.
+ int n = 8;
+ for (int i = 1; i <= n + 2; i++) {
+ assertThat(gApi.projects().list().withLimit(i).get())
+ .hasSize(Math.min(i, n));
+ }
}
@Test
public void listProjectsWithPrefix() throws Exception {
Project.NameKey someProject = new Project.NameKey("some-project");
- createProject(sshSession, someProject.get());
+ createProject(someProject.get());
Project.NameKey someOtherProject =
new Project.NameKey("some-other-project");
- createProject(sshSession, someOtherProject.get());
+ createProject(someOtherProject.get());
Project.NameKey projectAwesome = new Project.NameKey("project-awesome");
- createProject(sshSession, projectAwesome.get());
+ createProject(projectAwesome.get());
- assertThat(GET("/projects/?p=some&r=.*").getStatusCode()).isEqualTo(
- HttpStatus.SC_BAD_REQUEST);
- assertThat(GET("/projects/?p=some&m=some").getStatusCode()).isEqualTo(
- HttpStatus.SC_BAD_REQUEST);
-
- RestResponse r = GET("/projects/?p=some");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- Map<String, ProjectInfo> result = toProjectInfoMap(r);
- assertProjects(Arrays.asList(someProject, someOtherProject),
- result.values());
+ assertBadRequest(gApi.projects().list().withPrefix("some").withRegex(".*"));
+ assertBadRequest(gApi.projects().list().withPrefix("some")
+ .withSubstring("some"));
+ assertThatNameList(gApi.projects().list().withPrefix("some").get())
+ .containsExactly(someOtherProject, someProject).inOrder();
}
@Test
public void listProjectsWithRegex() throws Exception {
Project.NameKey someProject = new Project.NameKey("some-project");
- createProject(sshSession, someProject.get());
+ createProject(someProject.get());
Project.NameKey someOtherProject =
new Project.NameKey("some-other-project");
- createProject(sshSession, someOtherProject.get());
+ createProject(someOtherProject.get());
Project.NameKey projectAwesome = new Project.NameKey("project-awesome");
- createProject(sshSession, projectAwesome.get());
+ createProject(projectAwesome.get());
- assertThat(GET("/projects/?r=[.*some").getStatusCode()).isEqualTo(
- HttpStatus.SC_BAD_REQUEST);
- assertThat(GET("/projects/?r=.*&p=s").getStatusCode()).isEqualTo(
- HttpStatus.SC_BAD_REQUEST);
- assertThat(GET("/projects/?r=.*&m=s").getStatusCode()).isEqualTo(
- HttpStatus.SC_BAD_REQUEST);
+ assertBadRequest(gApi.projects().list().withRegex("[.*"));
+ assertBadRequest(gApi.projects().list().withRegex(".*").withPrefix("p"));
+ assertBadRequest(gApi.projects().list().withRegex(".*").withSubstring("p"));
- RestResponse r = GET("/projects/?r=.*some");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- Map<String, ProjectInfo> result = toProjectInfoMap(r);
- assertProjects(Arrays.asList(projectAwesome), result.values());
-
- r = GET("/projects/?r=some-project$");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- result = toProjectInfoMap(r);
- assertProjects(Arrays.asList(someProject), result.values());
-
- r = GET("/projects/?r=.*");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- result = toProjectInfoMap(r);
- assertProjects(Arrays.asList(someProject, someOtherProject, projectAwesome,
- project, allUsers), result.values());
+ assertThatNameList(gApi.projects().list().withRegex(".*some").get())
+ .containsExactly(projectAwesome);
+ assertThatNameList(gApi.projects().list().withRegex("some-project$").get())
+ .containsExactly(someProject);
+ assertThatNameList(gApi.projects().list().withRegex(".*").get())
+ .containsExactly(allProjects, allUsers, project, projectAwesome,
+ someOtherProject, someProject)
+ .inOrder();
}
@Test
- public void listProjectsWithSkip() throws Exception {
+ public void listProjectsWithStart() throws Exception {
for (int i = 0; i < 5; i++) {
- createProject(sshSession, new Project.NameKey("someProject" + i).get());
+ createProject(new Project.NameKey("someProject" + i).get());
}
- RestResponse r = GET("/projects/");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- Map<String, ProjectInfo> result = toProjectInfoMap(r);
- assertThat(result).hasSize(7); // 5 plus 2 existing projects: p and
- // All-Users
-
- r = GET("/projects/?S=6");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- result = toProjectInfoMap(r);
- assertThat(result).hasSize(1);
+ List<ProjectInfo> all = gApi.projects().list().get();
+ // 5 plus All-Projects, All-Users, and p.
+ int n = 8;
+ assertThat(all).hasSize(n);
+ assertThatNameList(gApi.projects().list().withStart(n - 1).get())
+ .containsExactly(new Project.NameKey(Iterables.getLast(all).name));
}
@Test
public void listProjectsWithSubstring() throws Exception {
Project.NameKey someProject = new Project.NameKey("some-project");
- createProject(sshSession, someProject.get());
+ createProject(someProject.get());
Project.NameKey someOtherProject =
new Project.NameKey("some-other-project");
- createProject(sshSession, someOtherProject.get());
+ createProject(someOtherProject.get());
Project.NameKey projectAwesome = new Project.NameKey("project-awesome");
- createProject(sshSession, projectAwesome.get());
+ createProject(projectAwesome.get());
- assertThat(GET("/projects/?m=some&r=.*").getStatusCode()).isEqualTo(
- HttpStatus.SC_BAD_REQUEST);
- assertThat(GET("/projects/?m=some&p=some").getStatusCode()).isEqualTo(
- HttpStatus.SC_BAD_REQUEST);
-
- RestResponse r = GET("/projects/?m=some");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- Map<String, ProjectInfo> result = toProjectInfoMap(r);
- assertProjects(
- Arrays.asList(someProject, someOtherProject, projectAwesome),
- result.values());
+ assertBadRequest(gApi.projects().list().withSubstring("some")
+ .withRegex(".*"));
+ assertBadRequest(gApi.projects().list().withSubstring("some")
+ .withPrefix("some"));
+ assertThatNameList(gApi.projects().list().withSubstring("some").get())
+ .containsExactly(projectAwesome, someOtherProject, someProject)
+ .inOrder();
}
@Test
public void listProjectsWithTree() throws Exception {
Project.NameKey someParentProject =
new Project.NameKey("some-parent-project");
- createProject(sshSession, someParentProject.get());
+ createProject(someParentProject.get());
Project.NameKey someChildProject =
new Project.NameKey("some-child-project");
- createProject(sshSession, someChildProject.get(), someParentProject);
+ createProject(someChildProject.get(), someParentProject);
- RestResponse r = GET("/projects/?tree");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- Map<String, ProjectInfo> result = toProjectInfoMap(r);
- assertThat(result.get(someChildProject.get())).isNotNull();
- assertThat(result.get(someChildProject.get()).parent).isEqualTo(
- someParentProject.get());
+ Map<String, ProjectInfo> result = gApi.projects().list().withTree(true)
+ .getAsMap();
+ assertThat(result).containsKey(someChildProject.get());
+ assertThat(result.get(someChildProject.get()).parent)
+ .isEqualTo(someParentProject.get());
}
@Test
public void listProjectWithType() throws Exception {
- RestResponse r = GET("/projects/?type=PERMISSIONS");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- Map<String, ProjectInfo> result = toProjectInfoMap(r);
+ Map<String, ProjectInfo> result = gApi.projects().list()
+ .withType(FilterType.PERMISSIONS).getAsMap();
assertThat(result).hasSize(1);
- assertThat(result.get(allProjects.get())).isNotNull();
+ assertThat(result).containsKey(allProjects.get());
- r = GET("/projects/?type=ALL");
- assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
- result = toProjectInfoMap(r);
- assertThat(result).hasSize(3);
- assertProjects(Arrays.asList(allProjects, allUsers, project),
- result.values());
+ assertThatNameList(gApi.projects().list().withType(FilterType.ALL).get())
+ .containsExactly(allProjects, allUsers, project).inOrder();
}
- private static Map<String, ProjectInfo> toProjectInfoMap(RestResponse r)
- throws IOException {
- Map<String, ProjectInfo> result =
- newGson().fromJson(r.getReader(),
- new TypeToken<Map<String, ProjectInfo>>() {}.getType());
- return result;
- }
-
- private RestResponse GET(String endpoint) throws IOException {
- return adminSession.get(endpoint);
+ private static void assertBadRequest(ListRequest req) throws Exception {
+ try {
+ req.get();
+ } catch (BadRequestException expected) {
+ // Expected.
+ }
}
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectAssert.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectAssert.java
index 95f46e8..504f5d7 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectAssert.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectAssert.java
@@ -15,35 +15,43 @@
package com.google.gerrit.acceptance.rest.project;
import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
-import com.google.common.base.Predicate;
+import com.google.common.base.Function;
import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
+import com.google.common.truth.IterableSubject;
import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.extensions.restapi.Url;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.project.ProjectState;
-import java.util.Collection;
+import java.util.List;
import java.util.Set;
public class ProjectAssert {
-
- public static void assertProjects(Iterable<Project.NameKey> expected,
- Collection<ProjectInfo> actual) {
- for (final Project.NameKey p : expected) {
- ProjectInfo info = Iterables.find(actual, new Predicate<ProjectInfo>() {
- @Override
- public boolean apply(ProjectInfo info) {
- // 'name' is not set if returned in a map, use the id instead.
- return new Project.NameKey(info.name != null ? info.name : Url
- .decode(info.id)).equals(p);
- }}, null);
- assertThat(info).isNotNull();
- actual.remove(info);
+ public static IterableSubject<
+ ? extends IterableSubject<
+ ?, Project.NameKey, Iterable<Project.NameKey>>,
+ Project.NameKey,
+ Iterable<Project.NameKey>>
+ assertThatNameList(Iterable<ProjectInfo> actualIt) {
+ List<ProjectInfo> actual = ImmutableList.copyOf(actualIt);
+ for (ProjectInfo info : actual) {
+ assertWithMessage("missing project name").that(info.name).isNotNull();
+ assertWithMessage("project name does not match id")
+ .that(Url.decode(info.id))
+ .isEqualTo(info.name);
}
- assertThat((Iterable<?>)actual).isEmpty();
+ return assertThat(Iterables.transform(actual,
+ new Function<ProjectInfo, Project.NameKey>() {
+ @Override
+ public Project.NameKey apply(ProjectInfo in) {
+ return new Project.NameKey(in.name);
+ }
+ }));
}
public static void assertProjectInfo(Project project, ProjectInfo info) {
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java
index 7e2af65..ceca9d9 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java
@@ -15,7 +15,6 @@
package com.google.gerrit.acceptance.rest.project;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.checkout;
import static com.google.gerrit.acceptance.GitUtil.cloneProject;
import static com.google.gerrit.acceptance.GitUtil.fetch;
@@ -25,6 +24,7 @@
import com.google.gerrit.server.project.ProjectState;
import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.lib.Config;
import org.junit.Before;
import org.junit.Test;
@@ -33,7 +33,7 @@
@Before
public void setUp() throws Exception {
fetch(git, RefNames.REFS_CONFIG + ":refs/heads/config");
- checkout(git, "refs/heads/config");
+ testRepo.reset("refs/heads/config");
}
@Test
@@ -43,9 +43,9 @@
cfg.setString("s1", null, "k1", "v1");
cfg.setString("s2", "ss", "k2", "v2");
PushOneCommit push =
- pushFactory.create(db, admin.getIdent(), "Create Project Level Config",
+ pushFactory.create(db, admin.getIdent(), testRepo, "Create Project Level Config",
configName, cfg.toText());
- push.to(git, RefNames.REFS_CONFIG);
+ push.to(RefNames.REFS_CONFIG);
ProjectState state = projectCache.get(project);
assertThat(state.getConfig(configName).get().toText()).isEqualTo(
@@ -70,19 +70,21 @@
Git parentGit =
cloneProject(sshSession.getUrl() + "/" + allProjects.get(), false);
+ TestRepository<?> parentTestRepo =
+ new TestRepository<>(parentGit.getRepository());
fetch(parentGit, RefNames.REFS_CONFIG + ":refs/heads/config");
- checkout(parentGit, "refs/heads/config");
+ parentTestRepo.reset("refs/heads/config");
PushOneCommit push =
- pushFactory.create(db, admin.getIdent(), "Create Project Level Config",
+ pushFactory.create(db, admin.getIdent(), parentTestRepo, "Create Project Level Config",
configName, parentCfg.toText());
- push.to(parentGit, RefNames.REFS_CONFIG);
+ push.to(RefNames.REFS_CONFIG);
Config cfg = new Config();
cfg.setString("s1", null, "k1", "childValue1");
cfg.setString("s2", "ss", "k3", "childValue2");
- push = pushFactory.create(db, admin.getIdent(), "Create Project Level Config",
+ push = pushFactory.create(db, admin.getIdent(), testRepo, "Create Project Level Config",
configName, cfg.toText());
- push.to(git, RefNames.REFS_CONFIG);
+ push.to(RefNames.REFS_CONFIG);
ProjectState state = projectCache.get(project);
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/SetParentIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/SetParentIT.java
index ac90ac0..4ff1f0e 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/SetParentIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/SetParentIT.java
@@ -15,7 +15,6 @@
package com.google.gerrit.acceptance.rest.project;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.createProject;
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.RestResponse;
@@ -29,7 +28,7 @@
@Test
public void setParent_Forbidden() throws Exception {
String parent = "parent";
- createProject(sshSession, parent, null, true);
+ createProject(parent, null, true);
RestResponse r =
userSession.put("/projects/" + project.get() + "/parent",
newParentInput(parent));
@@ -40,7 +39,7 @@
@Test
public void setParent() throws Exception {
String parent = "parent";
- createProject(sshSession, parent, null, true);
+ createProject(parent, null, true);
RestResponse r =
adminSession.put("/projects/" + project.get() + "/parent",
newParentInput(parent));
@@ -73,14 +72,14 @@
r.consume();
String child = "child";
- createProject(sshSession, child, project, true);
+ createProject(child, project, true);
r = adminSession.put("/projects/" + project.get() + "/parent",
newParentInput(child));
assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_CONFLICT);
r.consume();
String grandchild = "grandchild";
- createProject(sshSession, grandchild, new Project.NameKey(child), true);
+ createProject(grandchild, new Project.NameKey(child), true);
r = adminSession.put("/projects/" + project.get() + "/parent",
newParentInput(grandchild));
assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_CONFLICT);
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/TagsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/TagsIT.java
index c6cf647..7efefa7 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/TagsIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/TagsIT.java
@@ -50,16 +50,16 @@
grant(Permission.PUSH, project, "refs/tags/*");
PushOneCommit.Tag tag1 = new PushOneCommit.Tag("v1.0");
- PushOneCommit push1 = pushFactory.create(db, admin.getIdent());
+ PushOneCommit push1 = pushFactory.create(db, admin.getIdent(), testRepo);
push1.setTag(tag1);
- PushOneCommit.Result r1 = push1.to(git, "refs/for/master%submit");
+ PushOneCommit.Result r1 = push1.to("refs/for/master%submit");
r1.assertOkStatus();
PushOneCommit.AnnotatedTag tag2 =
new PushOneCommit.AnnotatedTag("v2.0", "annotation", admin.getIdent());
- PushOneCommit push2 = pushFactory.create(db, admin.getIdent());
+ PushOneCommit push2 = pushFactory.create(db, admin.getIdent(), testRepo);
push2.setTag(tag2);
- PushOneCommit.Result r2 = push2.to(git, "refs/for/master%submit");
+ PushOneCommit.Result r2 = push2.to("refs/for/master%submit");
r2.assertOkStatus();
List<TagInfo> result =
@@ -86,16 +86,16 @@
grant(Permission.PUSH, project, "refs/tags/*");
PushOneCommit.Tag tag1 = new PushOneCommit.Tag("v1.0");
- PushOneCommit push1 = pushFactory.create(db, admin.getIdent());
+ PushOneCommit push1 = pushFactory.create(db, admin.getIdent(), testRepo);
push1.setTag(tag1);
- PushOneCommit.Result r1 = push1.to(git, "refs/for/master%submit");
+ PushOneCommit.Result r1 = push1.to("refs/for/master%submit");
r1.assertOkStatus();
pushTo("refs/heads/hidden");
PushOneCommit.Tag tag2 = new PushOneCommit.Tag("v2.0");
- PushOneCommit push2 = pushFactory.create(db, admin.getIdent());
+ PushOneCommit push2 = pushFactory.create(db, admin.getIdent(), testRepo);
push2.setTag(tag2);
- PushOneCommit.Result r2 = push2.to(git, "refs/for/hidden%submit");
+ PushOneCommit.Result r2 = push2.to("refs/for/hidden%submit");
r2.assertOkStatus();
List<TagInfo> result =
@@ -121,9 +121,9 @@
grant(Permission.PUSH, project, "refs/tags/*");
PushOneCommit.Tag tag1 = new PushOneCommit.Tag("v1.0");
- PushOneCommit push1 = pushFactory.create(db, admin.getIdent());
+ PushOneCommit push1 = pushFactory.create(db, admin.getIdent(), testRepo);
push1.setTag(tag1);
- PushOneCommit.Result r1 = push1.to(git, "refs/for/master%submit");
+ PushOneCommit.Result r1 = push1.to("refs/for/master%submit");
r1.assertOkStatus();
RestResponse response =
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/CommentsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/CommentsIT.java
index 541d1b8..d759ae3 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/CommentsIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/CommentsIT.java
@@ -64,7 +64,7 @@
@Inject
private Provider<PostReview> postReview;
- private final Integer lines[] = {0, 1};
+ private final Integer[] lines = {0, 1};
@Test
public void createDraft() throws Exception {
@@ -87,9 +87,9 @@
for (Integer line : lines) {
String file = "file";
String contents = "contents " + line;
- PushOneCommit push = pushFactory.create(db, admin.getIdent(),
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo,
"first subject", file, contents);
- PushOneCommit.Result r = push.to(git, "refs/for/master");
+ PushOneCommit.Result r = push.to("refs/for/master");
String changeId = r.getChangeId();
String revId = r.getCommit().getName();
ReviewInput input = new ReviewInput();
@@ -161,9 +161,9 @@
for (Integer line : lines) {
String file = "file";
String contents = "contents " + line;
- PushOneCommit push = pushFactory.create(db, admin.getIdent(),
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo,
"first subject", file, contents);
- PushOneCommit.Result r = push.to(git, "refs/for/master");
+ PushOneCommit.Result r = push.to("refs/for/master");
String changeId = r.getChangeId();
String revId = r.getCommit().getName();
ReviewInput input = new ReviewInput();
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/GetRelatedIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/GetRelatedIT.java
index 6cd39ab..4b05d79 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/GetRelatedIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/GetRelatedIT.java
@@ -15,14 +15,12 @@
package com.google.gerrit.acceptance.server.change;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.add;
-import static com.google.gerrit.acceptance.GitUtil.createCommit;
+import static com.google.gerrit.acceptance.GitUtil.getChangeId;
import static com.google.gerrit.acceptance.GitUtil.pushHead;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GitUtil.Commit;
import com.google.gerrit.acceptance.PushOneCommit;
import com.google.gerrit.acceptance.RestSession;
import com.google.gerrit.reviewdb.client.Change;
@@ -35,7 +33,8 @@
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
-import org.eclipse.jgit.api.ResetCommand.ResetType;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.Test;
import java.io.IOException;
@@ -50,44 +49,57 @@
@Test
public void getRelatedNoResult() throws Exception {
- PushOneCommit push = pushFactory.create(db, admin.getIdent());
- PatchSet.Id ps = push.to(git, "refs/for/master").getPatchSetId();
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+ PatchSet.Id ps = push.to("refs/for/master").getPatchSetId();
List<ChangeAndCommit> related = getRelated(ps);
assertThat(related).isEmpty();
}
@Test
public void getRelatedLinear() throws Exception {
- add(git, "a.txt", "1");
- Commit c1 = createCommit(git, admin.getIdent(), "subject: 1");
- add(git, "b.txt", "2");
- Commit c2 = createCommit(git, admin.getIdent(), "subject: 2");
+ RevCommit c1 = commitBuilder()
+ .add("a.txt", "1")
+ .message("subject: 1")
+ .create();
+ String id1 = getChangeId(testRepo, c1).get();
+ RevCommit c2 = commitBuilder()
+ .add("b.txt", "2")
+ .message("subject: 2")
+ .create();
+ String id2 = getChangeId(testRepo, c2).get();
pushHead(git, "refs/for/master", false);
- for (Commit c : ImmutableList.of(c2, c1)) {
+ for (RevCommit c : ImmutableList.of(c2, c1)) {
List<ChangeAndCommit> related = getRelated(getPatchSetId(c));
+ String id = getChangeId(testRepo, c).get();
assertThat(related).hasSize(2);
assertThat(related.get(0).changeId)
- .named("related to " + c.getChangeId()).isEqualTo(c2.getChangeId());
+ .named("related to " + id).isEqualTo(id2);
assertThat(related.get(1).changeId)
- .named("related to " + c.getChangeId()).isEqualTo(c1.getChangeId());
+ .named("related to " + id).isEqualTo(id1);
}
}
@Test
public void getRelatedReorder() throws Exception {
// Create two commits and push.
- add(git, "a.txt", "1");
- Commit c1 = createCommit(git, admin.getIdent(), "subject: 1");
- add(git, "b.txt", "2");
- Commit c2 = createCommit(git, admin.getIdent(), "subject: 2");
+ RevCommit c1 = commitBuilder()
+ .add("a.txt", "1")
+ .message("subject: 1")
+ .create();
+ String id1 = getChangeId(testRepo, c1).get();
+ RevCommit c2 = commitBuilder()
+ .add("b.txt", "2")
+ .message("subject: 2")
+ .create();
+ String id2 = getChangeId(testRepo, c2).get();
pushHead(git, "refs/for/master", false);
PatchSet.Id c1ps1 = getPatchSetId(c1);
PatchSet.Id c2ps1 = getPatchSetId(c2);
// Swap the order of commits and push again.
- git.reset().setMode(ResetType.HARD).setRef("HEAD^^").call();
- git.cherryPick().include(c2.getCommit()).include(c1.getCommit()).call();
+ testRepo.reset("HEAD~2");
+ git.cherryPick().include(c2).include(c1).call();
pushHead(git, "refs/for/master", false);
PatchSet.Id c1ps2 = getPatchSetId(c1);
PatchSet.Id c2ps2 = getPatchSetId(c2);
@@ -95,38 +107,48 @@
for (PatchSet.Id ps : ImmutableList.of(c2ps2, c1ps2)) {
List<ChangeAndCommit> related = getRelated(ps);
assertThat(related).hasSize(2);
- assertThat(related.get(0).changeId).named("related to " + ps).isEqualTo(
- c1.getChangeId());
- assertThat(related.get(1).changeId).named("related to " + ps).isEqualTo(
- c2.getChangeId());
+ assertThat(related.get(0).changeId).named("related to " + ps)
+ .isEqualTo(id1);
+ assertThat(related.get(1).changeId).named("related to " + ps)
+ .isEqualTo(id2);
}
for (PatchSet.Id ps : ImmutableList.of(c2ps1, c1ps1)) {
List<ChangeAndCommit> related = getRelated(ps);
assertThat(related).hasSize(2);
- assertThat(related.get(0).changeId).named("related to " + ps).isEqualTo(
- c2.getChangeId());
- assertThat(related.get(1).changeId).named("related to " + ps).isEqualTo(
- c1.getChangeId());
+ assertThat(related.get(0).changeId).named("related to " + ps)
+ .isEqualTo(id2);
+ assertThat(related.get(1).changeId).named("related to " + ps)
+ .isEqualTo(id1);
}
}
@Test
public void getRelatedReorderAndExtend() throws Exception {
// Create two commits and push.
- add(git, "a.txt", "1");
- Commit c1 = createCommit(git, admin.getIdent(), "subject: 1");
- add(git, "b.txt", "2");
- Commit c2 = createCommit(git, admin.getIdent(), "subject: 2");
+ ObjectId initial = testRepo.getRepository().getRef("HEAD").getObjectId();
+ RevCommit c1 = commitBuilder()
+ .add("a.txt", "1")
+ .message("subject: 1")
+ .create();
+ String id1 = getChangeId(testRepo, c1).get();
+ RevCommit c2 = commitBuilder()
+ .add("b.txt", "2")
+ .message("subject: 2")
+ .create();
+ String id2 = getChangeId(testRepo, c2).get();
pushHead(git, "refs/for/master", false);
PatchSet.Id c1ps1 = getPatchSetId(c1);
PatchSet.Id c2ps1 = getPatchSetId(c2);
// Swap the order of commits, create a new commit on top, and push again.
- git.reset().setMode(ResetType.HARD).setRef("HEAD^^").call();
- git.cherryPick().include(c2.getCommit()).include(c1.getCommit()).call();
- add(git, "c.txt", "3");
- Commit c3 = createCommit(git, admin.getIdent(), "subject: 3");
+ testRepo.reset(initial);
+ git.cherryPick().include(c2).include(c1).call();
+ RevCommit c3 = commitBuilder()
+ .add("c.txt", "3")
+ .message("subject: 3")
+ .create();
+ String id3 = getChangeId(testRepo, c3).get();
pushHead(git, "refs/for/master", false);
PatchSet.Id c1ps2 = getPatchSetId(c1);
PatchSet.Id c2ps2 = getPatchSetId(c2);
@@ -136,34 +158,43 @@
for (PatchSet.Id ps : ImmutableList.of(c3ps1, c2ps2, c1ps2)) {
List<ChangeAndCommit> related = getRelated(ps);
assertThat(related).hasSize(3);
- assertThat(related.get(0).changeId).named("related to " + ps).isEqualTo(
- c3.getChangeId());
- assertThat(related.get(1).changeId).named("related to " + ps).isEqualTo(
- c1.getChangeId());
- assertThat(related.get(2).changeId).named("related to " + ps).isEqualTo(
- c2.getChangeId());
+ assertThat(related.get(0).changeId).named("related to " + ps)
+ .isEqualTo(id3);
+ assertThat(related.get(1).changeId).named("related to " + ps)
+ .isEqualTo(id1);
+ assertThat(related.get(2).changeId).named("related to " + ps)
+ .isEqualTo(id2);
}
for (PatchSet.Id ps : ImmutableList.of(c2ps1, c1ps1)) {
List<ChangeAndCommit> related = getRelated(ps);
assertThat(related).hasSize(3);
- assertThat(related.get(0).changeId).named("related to " + ps).isEqualTo(
- c3.getChangeId());
- assertThat(related.get(1).changeId).named("related to " + ps).isEqualTo(
- c2.getChangeId());
- assertThat(related.get(2).changeId).named("related to " + ps).isEqualTo(
- c1.getChangeId());
+ assertThat(related.get(0).changeId).named("related to " + ps)
+ .isEqualTo(id3);
+ assertThat(related.get(1).changeId).named("related to " + ps)
+ .isEqualTo(id2);
+ assertThat(related.get(2).changeId).named("related to " + ps)
+ .isEqualTo(id1);
}
}
@Test
public void getRelatedEdit() throws Exception {
- add(git, "a.txt", "1");
- Commit c1 = createCommit(git, admin.getIdent(), "subject: 1");
- add(git, "b.txt", "2");
- Commit c2 = createCommit(git, admin.getIdent(), "subject: 2");
- add(git, "b.txt", "3");
- Commit c3 = createCommit(git, admin.getIdent(), "subject: 3");
+ RevCommit c1 = commitBuilder()
+ .add("a.txt", "1")
+ .message("subject: 1")
+ .create();
+ String id1 = getChangeId(testRepo, c1).get();
+ RevCommit c2 = commitBuilder()
+ .add("b.txt", "2")
+ .message("subject: 2")
+ .create();
+ String id2 = getChangeId(testRepo, c2).get();
+ RevCommit c3 = commitBuilder()
+ .add("c.txt", "3")
+ .message("subject: 3")
+ .create();
+ String id3 = getChangeId(testRepo, c3).get();
pushHead(git, "refs/for/master", false);
Change ch2 = getChange(c2).change();
@@ -174,16 +205,16 @@
List<ChangeAndCommit> related = getRelated(ch2.getId(), 0);
assertThat(related).hasSize(3);
- assertThat(related.get(0).changeId).named("related to " + c2.getChangeId())
- .isEqualTo(c3.getChangeId());
- assertThat(related.get(1).changeId).named("related to " + c2.getChangeId())
- .isEqualTo(c2.getChangeId());
- assertThat(related.get(1)._revisionNumber.intValue()).named(
+ assertThat(related.get(0).changeId).named("related to " + id2)
+ .isEqualTo(id3);
+ assertThat(related.get(1).changeId).named("related to " + id2)
+ .isEqualTo(id2);
+ assertThat(related.get(1)._revisionNumber).named(
"has edit revision number").isEqualTo(0);
assertThat(related.get(1).commit.commit).named(
"has edit revision " + editRev).isEqualTo(editRev);
- assertThat(related.get(2).changeId).named("related to " + c2.getChangeId())
- .isEqualTo(c1.getChangeId());
+ assertThat(related.get(2).changeId).named("related to " + id2)
+ .isEqualTo(id1);
}
private List<ChangeAndCommit> getRelated(PatchSet.Id ps) throws IOException {
@@ -198,7 +229,7 @@
RelatedInfo.class).changes;
}
- private PatchSet.Id getPatchSetId(Commit c) throws OrmException {
+ private PatchSet.Id getPatchSetId(ObjectId c) throws OrmException {
return getChange(c).change().currentPatchSetId();
}
@@ -206,8 +237,7 @@
return db.patchSets().get(c.currentPatchSetId());
}
- private ChangeData getChange(Commit c) throws OrmException {
- return Iterables.getOnlyElement(
- queryProvider.get().byKeyPrefix(c.getChangeId()));
+ private ChangeData getChange(ObjectId c) throws OrmException {
+ return Iterables.getOnlyElement(queryProvider.get().byCommit(c));
}
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java
index d598b06..cb0818f 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java
@@ -15,14 +15,10 @@
package com.google.gerrit.acceptance.server.change;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.add;
-import static com.google.gerrit.acceptance.GitUtil.amendCommit;
-import static com.google.gerrit.acceptance.GitUtil.createCommit;
+import static com.google.gerrit.acceptance.GitUtil.getChangeId;
import static com.google.gerrit.acceptance.GitUtil.pushHead;
-import static com.google.gerrit.acceptance.GitUtil.rm;
import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GitUtil.Commit;
import com.google.gerrit.acceptance.NoHttpd;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.AccountDiffPreference.Whitespace;
@@ -34,8 +30,8 @@
import com.google.gerrit.server.patch.PatchListNotAvailableException;
import com.google.inject.Inject;
-import org.eclipse.jgit.api.ResetCommand.ResetType;
import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.Test;
import java.util.List;
@@ -55,28 +51,35 @@
@Test
public void listPatchesAgainstBase() throws Exception {
- add(git, FILE_D, "4");
- createCommit(git, admin.getIdent(), SUBJECT_1);
+ commitBuilder()
+ .add(FILE_D, "4")
+ .message(SUBJECT_1)
+ .create();
pushHead(git, "refs/heads/master", false);
// Change 1, 1 (+FILE_A, -FILE_D)
- add(git, FILE_A, "1");
- rm(git, FILE_D);
- Commit c = createCommit(git, admin.getIdent(), SUBJECT_2);
+ RevCommit c = commitBuilder()
+ .add(FILE_A, "1")
+ .rm(FILE_D)
+ .message(SUBJECT_2)
+ .insertChangeId()
+ .create();
+ String id = getChangeId(testRepo, c).get();
pushHead(git, "refs/for/master", false);
// Compare Change 1,1 with Base (+FILE_A, -FILE_D)
- List<PatchListEntry> entries = getCurrentPatches(c.getChangeId());
+ List<PatchListEntry> entries = getCurrentPatches(id);
assertThat(entries).hasSize(3);
assertAdded(Patch.COMMIT_MSG, entries.get(0));
assertAdded(FILE_A, entries.get(1));
assertDeleted(FILE_D, entries.get(2));
// Change 1,2 (+FILE_A, +FILE_B, -FILE_D)
- add(git, FILE_B, "2");
- c = amendCommit(git, admin.getIdent(), SUBJECT_2, c.getChangeId());
+ c = amendBuilder()
+ .add(FILE_B, "2")
+ .create();
pushHead(git, "refs/for/master", false);
- entries = getCurrentPatches(c.getChangeId());
+ entries = getCurrentPatches(id);
// Compare Change 1,2 with Base (+FILE_A, +FILE_B, -FILE_D)
assertThat(entries).hasSize(4);
@@ -88,33 +91,40 @@
@Test
public void listPatchesAgainstBaseWithRebase() throws Exception {
- add(git, FILE_D, "4");
- createCommit(git, admin.getIdent(), SUBJECT_1);
+ commitBuilder()
+ .add(FILE_D, "4")
+ .message(SUBJECT_1)
+ .create();
pushHead(git, "refs/heads/master", false);
// Change 1,1 (+FILE_A, -FILE_D)
- add(git, FILE_A, "1");
- rm(git, FILE_D);
- Commit c = createCommit(git, admin.getIdent(), SUBJECT_2);
+ RevCommit c = commitBuilder()
+ .add(FILE_A, "1")
+ .rm(FILE_D)
+ .message(SUBJECT_2)
+ .create();
+ String id = getChangeId(testRepo, c).get();
pushHead(git, "refs/for/master", false);
- List<PatchListEntry> entries = getCurrentPatches(c.getChangeId());
+ List<PatchListEntry> entries = getCurrentPatches(id);
assertThat(entries).hasSize(3);
assertAdded(Patch.COMMIT_MSG, entries.get(0));
assertAdded(FILE_A, entries.get(1));
assertDeleted(FILE_D, entries.get(2));
// Change 2,1 (+FILE_B)
- git.reset().setMode(ResetType.HARD).setRef("HEAD~1").call();
- add(git, FILE_B, "2");
- createCommit(git, admin.getIdent(), SUBJECT_3);
+ testRepo.reset("HEAD~1");
+ commitBuilder()
+ .add(FILE_B, "2")
+ .message(SUBJECT_3)
+ .create();
pushHead(git, "refs/for/master", false);
// Change 1,2 (+FILE_A, -FILE_D))
- git.cherryPick().include(c.getCommit()).call();
+ git.cherryPick().include(c).call();
pushHead(git, "refs/for/master", false);
// Compare Change 1,2 with Base (+FILE_A, -FILE_D))
- entries = getCurrentPatches(c.getChangeId());
+ entries = getCurrentPatches(id);
assertThat(entries).hasSize(3);
assertAdded(Patch.COMMIT_MSG, entries.get(0));
assertAdded(FILE_A, entries.get(1));
@@ -123,24 +133,27 @@
@Test
public void listPatchesAgainstOtherPatchSet() throws Exception {
- add(git, FILE_D, "4");
- createCommit(git, admin.getIdent(), SUBJECT_1);
+ commitBuilder()
+ .add(FILE_D, "4")
+ .message(SUBJECT_1)
+ .create();
pushHead(git, "refs/heads/master", false);
// Change 1,1 (+FILE_A, +FILE_C, -FILE_D)
- add(git, FILE_A, "1");
- add(git, FILE_C, "3");
- rm(git, FILE_D);
- Commit c = createCommit(git, admin.getIdent(), SUBJECT_2);
+ RevCommit a = commitBuilder()
+ .add(FILE_A, "1")
+ .add(FILE_C, "3")
+ .rm(FILE_D)
+ .message(SUBJECT_2)
+ .create();
pushHead(git, "refs/for/master", false);
- ObjectId a = getCurrentRevisionId(c.getChangeId());
// Change 1,2 (+FILE_A, +FILE_B, -FILE_D)
- add(git, FILE_B, "2");
- rm(git, FILE_C);
- c = amendCommit(git, admin.getIdent(), SUBJECT_2, c.getChangeId());
+ RevCommit b = amendBuilder()
+ .add(FILE_B, "2")
+ .rm(FILE_C)
+ .create();
pushHead(git, "refs/for/master", false);
- ObjectId b = getCurrentRevisionId(c.getChangeId());
// Compare Change 1,1 with Change 1,2 (+FILE_B)
List<PatchListEntry> entries = getPatches(a, b);
@@ -151,29 +164,34 @@
@Test
public void listPatchesAgainstOtherPatchSetWithRebase() throws Exception {
- add(git, FILE_D, "4");
- createCommit(git, admin.getIdent(), SUBJECT_1);
+ commitBuilder()
+ .add(FILE_D, "4")
+ .message(SUBJECT_1)
+ .create();
pushHead(git, "refs/heads/master", false);
// Change 1,1 (+FILE_A, -FILE_D)
- add(git, FILE_A, "1");
- rm(git, FILE_D);
- Commit c = createCommit(git, admin.getIdent(), SUBJECT_2);
+ RevCommit a = commitBuilder()
+ .add(FILE_A, "1")
+ .rm(FILE_D)
+ .message(SUBJECT_2)
+ .create();
pushHead(git, "refs/for/master", false);
- ObjectId a = getCurrentRevisionId(c.getChangeId());
// Change 2,1 (+FILE_B)
- git.reset().setMode(ResetType.HARD).setRef("HEAD~1").call();
- add(git, FILE_B, "2");
- createCommit(git, admin.getIdent(), SUBJECT_3);
+ testRepo.reset("HEAD~1");
+ commitBuilder()
+ .add(FILE_B, "2")
+ .message(SUBJECT_3)
+ .create();
pushHead(git, "refs/for/master", false);
// Change 1,2 (+FILE_A, +FILE_C, -FILE_D)
- git.cherryPick().include(c.getCommit()).call();
- add(git, FILE_C, "2");
- c = amendCommit(git, admin.getIdent(), SUBJECT_2, c.getChangeId());
+ git.cherryPick().include(a).call();
+ RevCommit b = amendBuilder()
+ .add(FILE_C, "2")
+ .create();
pushHead(git, "refs/for/master", false);
- ObjectId b = getCurrentRevisionId(c.getChangeId());
// Compare Change 1,1 with Change 1,2 (+FILE_C)
List<PatchListEntry> entries = getPatches(a, b);
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/LabelTypeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/LabelTypeIT.java
index efb4615..4060489 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/LabelTypeIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/LabelTypeIT.java
@@ -143,15 +143,15 @@
String file = "a.txt";
String contents = "contents";
- PushOneCommit push = pushFactory.create(db, admin.getIdent(),
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo,
"first subject", file, contents);
- PushOneCommit.Result r = push.to(git, "refs/for/master");
+ PushOneCommit.Result r = push.to("refs/for/master");
revision(r).review(ReviewInput.recommend());
assertApproval(r, 1);
- push = pushFactory.create(db, admin.getIdent(),
+ push = pushFactory.create(db, admin.getIdent(), testRepo,
"second subject", file, contents, r.getChangeId());
- r = push.to(git, "refs/for/master");
+ r = push.to("refs/for/master");
assertApproval(r, 0);
}
@@ -162,15 +162,15 @@
codeReview.setCopyAllScoresIfNoCodeChange(true);
saveLabelConfig();
- PushOneCommit push = pushFactory.create(db, admin.getIdent(),
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo,
"first subject", file, contents);
- PushOneCommit.Result r = push.to(git, "refs/for/master");
+ PushOneCommit.Result r = push.to("refs/for/master");
revision(r).review(ReviewInput.recommend());
assertApproval(r, 1);
- push = pushFactory.create(db, admin.getIdent(),
+ push = pushFactory.create(db, admin.getIdent(), testRepo,
"second subject", file, contents, r.getChangeId());
- r = push.to(git, "refs/for/master");
+ r = push.to("refs/for/master");
assertApproval(r, 1);
}
@@ -180,18 +180,18 @@
String file = "a.txt";
String contents = "contents";
- PushOneCommit push = pushFactory.create(db, admin.getIdent());
- PushOneCommit.Result r1 = push.to(git, "refs/for/master");
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+ PushOneCommit.Result r1 = push.to("refs/for/master");
merge(r1);
- push = pushFactory.create(db, admin.getIdent(),
+ push = pushFactory.create(db, admin.getIdent(), testRepo,
"non-conflicting", "b.txt", "other contents");
- PushOneCommit.Result r2 = push.to(git, "refs/for/master");
+ PushOneCommit.Result r2 = push.to("refs/for/master");
merge(r2);
git.checkout().setName(r1.getCommit().name()).call();
- push = pushFactory.create(db, admin.getIdent(), subject, file, contents);
- PushOneCommit.Result r3 = push.to(git, "refs/for/master");
+ push = pushFactory.create(db, admin.getIdent(), testRepo, subject, file, contents);
+ PushOneCommit.Result r3 = push.to("refs/for/master");
revision(r3).review(ReviewInput.recommend());
assertApproval(r3, 1);
@@ -207,18 +207,18 @@
codeReview.setCopyAllScoresOnTrivialRebase(true);
saveLabelConfig();
- PushOneCommit push = pushFactory.create(db, admin.getIdent());
- PushOneCommit.Result r1 = push.to(git, "refs/for/master");
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+ PushOneCommit.Result r1 = push.to("refs/for/master");
merge(r1);
- push = pushFactory.create(db, admin.getIdent(),
+ push = pushFactory.create(db, admin.getIdent(), testRepo,
"non-conflicting", "b.txt", "other contents");
- PushOneCommit.Result r2 = push.to(git, "refs/for/master");
+ PushOneCommit.Result r2 = push.to("refs/for/master");
merge(r2);
git.checkout().setName(r1.getCommit().name()).call();
- push = pushFactory.create(db, admin.getIdent(), subject, file, contents);
- PushOneCommit.Result r3 = push.to(git, "refs/for/master");
+ push = pushFactory.create(db, admin.getIdent(), testRepo, subject, file, contents);
+ PushOneCommit.Result r3 = push.to("refs/for/master");
revision(r3).review(ReviewInput.recommend());
assertApproval(r3, 1);
@@ -234,9 +234,9 @@
PushOneCommit.Result r1 = createChange();
git.checkout().setName(r1.getCommit().name()).call();
- PushOneCommit push = pushFactory.create(db, admin.getIdent(),
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo,
PushOneCommit.SUBJECT, "b.txt", "other contents");
- PushOneCommit.Result r2 = push.to(git, "refs/for/master");
+ PushOneCommit.Result r2 = push.to("refs/for/master");
revision(r2).review(ReviewInput.recommend());
@@ -264,9 +264,9 @@
git.checkout().setName(r1.getCommit().name()).call();
- PushOneCommit push = pushFactory.create(db, admin.getIdent(),
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo,
PushOneCommit.SUBJECT, "b.txt", "other contents");
- PushOneCommit.Result r2 = push.to(git, "refs/for/master");
+ PushOneCommit.Result r2 = push.to("refs/for/master");
revision(r2).review(ReviewInput.recommend());
@@ -356,6 +356,6 @@
assertThat((int) cr.defaultValue).isEqualTo(-1);
assertThat(cr.all).hasSize(1);
assertThat(cr.all.get(0).name).isEqualTo("Administrator");
- assertThat(cr.all.get(0).value.intValue()).isEqualTo(expected);
+ assertThat(cr.all.get(0).value).isEqualTo(expected);
}
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/BanCommitIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/BanCommitIT.java
index e483716..885b044 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/BanCommitIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/BanCommitIT.java
@@ -16,14 +16,12 @@
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assert_;
-import static com.google.gerrit.acceptance.GitUtil.add;
-import static com.google.gerrit.acceptance.GitUtil.createCommit;
import static com.google.gerrit.acceptance.GitUtil.pushHead;
import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GitUtil.Commit;
import com.google.gerrit.acceptance.NoHttpd;
+import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.transport.PushResult;
import org.junit.Test;
@@ -34,12 +32,12 @@
@Test
public void banCommit() throws Exception {
- add(git, "a.txt", "some content");
- Commit c = createCommit(git, admin.getIdent(), "subject");
+ RevCommit c = commitBuilder()
+ .add("a.txt", "some content")
+ .create();
String response =
- sshSession.exec("gerrit ban-commit " + project.get() + " "
- + c.getCommit().getName());
+ sshSession.exec("gerrit ban-commit " + project.get() + " " + c.name());
assert_().withFailureMessage(sshSession.getError())
.that(sshSession.hasError()).isFalse();
assertThat(response.toLowerCase(Locale.US)).doesNotContain("error");
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/GarbageCollectionIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/GarbageCollectionIT.java
index 2bdd894..8af4c3b 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/GarbageCollectionIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/GarbageCollectionIT.java
@@ -16,7 +16,6 @@
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assert_;
-import static com.google.gerrit.acceptance.GitUtil.createProject;
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.GcAssert;
@@ -53,10 +52,10 @@
@Before
public void setUp() throws Exception {
project2 = new Project.NameKey("p2");
- createProject(sshSession, project2.get());
+ createProject(project2.get());
project3 = new Project.NameKey("p3");
- createProject(sshSession, project3.get());
+ createProject(project3.get());
}
@Test
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/JschVerifyFalseBugIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/JschVerifyFalseBugIT.java
index c9e0a89..27a70b0 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/JschVerifyFalseBugIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/JschVerifyFalseBugIT.java
@@ -16,7 +16,6 @@
import static com.google.common.truth.Truth.assertThat;
import static com.google.gerrit.acceptance.GitUtil.cloneProject;
-import static com.google.gerrit.acceptance.GitUtil.createProject;
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.NoHttpd;
@@ -50,7 +49,7 @@
public Void call() throws Exception {
for (int i = 1; i < 100; i++) {
String p = "p" + i;
- createProject(sshSession, p);
+ createProject(p);
cloneProject(sshSession.getUrl() + "/" + p);
}
return null;
diff --git a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java
index 5870f91..fcacf78 100644
--- a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java
+++ b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java
@@ -37,7 +37,9 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
@@ -51,7 +53,7 @@
private final DefaultCacheFactory defaultFactory;
private final Config config;
- private final File cacheDir;
+ private final Path cacheDir;
private final List<H2CacheImpl<?, ?>> caches;
private final DynamicMap<Cache<?, ?>> cacheMap;
private final ExecutorService executor;
@@ -65,23 +67,7 @@
DynamicMap<Cache<?, ?>> cacheMap) {
defaultFactory = defaultCacheFactory;
config = cfg;
-
- File loc = site.resolve(cfg.getString("cache", null, "directory"));
- if (loc == null) {
- cacheDir = null;
- } else if (loc.exists() || loc.mkdirs()) {
- if (loc.canWrite()) {
- log.info("Enabling disk cache " + loc.getAbsolutePath());
- cacheDir = loc;
- } else {
- log.warn("Can't write to disk cache: " + loc.getAbsolutePath());
- cacheDir = null;
- }
- } else {
- log.warn("Can't create disk cache: " + loc.getAbsolutePath());
- cacheDir = null;
- }
-
+ cacheDir = getCacheDir(site, cfg.getString("cache", null, "directory"));
caches = Lists.newLinkedList();
this.cacheMap = cacheMap;
@@ -103,6 +89,27 @@
}
}
+ private static Path getCacheDir(SitePaths site, String name) {
+ if (name == null) {
+ return null;
+ }
+ Path loc = site.resolve(name);
+ if (!Files.exists(loc)) {
+ try {
+ Files.createDirectories(loc);
+ } catch (IOException e) {
+ log.warn("Can't create disk cache: " + loc.toAbsolutePath());
+ return null;
+ }
+ }
+ if (!Files.isWritable(loc)) {
+ log.warn("Can't write to disk cache: " + loc.toAbsolutePath());
+ return null;
+ }
+ log.info("Enabling disk cache " + loc.toAbsolutePath());
+ return loc;
+ }
+
@Override
public void start() {
if (executor != null) {
@@ -213,8 +220,7 @@
TypeLiteral<K> keyType,
long maxSize,
Long expireAfterWrite) {
- File db = new File(cacheDir, name).getAbsoluteFile();
- String url = "jdbc:h2:" + db.toURI().toString();
+ String url = "jdbc:h2:" + cacheDir.resolve(name).toUri();
return new SqlStore<>(url, keyType, maxSize,
expireAfterWrite == null ? 0 : expireAfterWrite.longValue());
}
diff --git a/gerrit-common/BUCK b/gerrit-common/BUCK
index 88e503e..484136a 100644
--- a/gerrit-common/BUCK
+++ b/gerrit-common/BUCK
@@ -51,6 +51,7 @@
'//lib:guava',
'//lib/jgit:jgit',
'//lib/joda:joda-time',
+ '//lib/log:api',
],
visibility = ['PUBLIC'],
)
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/FileUtil.java b/gerrit-common/src/main/java/com/google/gerrit/common/FileUtil.java
index bed10d6..2335b8d1 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/FileUtil.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/FileUtil.java
@@ -21,6 +21,8 @@
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.Arrays;
public class FileUtil {
@@ -42,6 +44,11 @@
}
}
+ public static void chmod(final int mode, final Path path) {
+ // TODO(dborowitz): Is there a portable way to do this with NIO?
+ chmod(mode, path.toFile());
+ }
+
public static void chmod(final int mode, final File path) {
path.setReadable(false, false /* all */);
path.setWritable(false, false /* all */);
@@ -61,6 +68,33 @@
}
}
+ /**
+ * Get the last modified time of a path.
+ * <p>
+ * Equivalent to {@code File#lastModified()}, returning 0 on errors, including
+ * file not found. Callers that prefer exceptions can use {@link
+ * Files#getLastModifiedTime(Path, java.nio.file.LinkOption...)}.
+ *
+ * @param p path.
+ * @return last modified time, in milliseconds since epoch.
+ */
+ public static long lastModified(Path p) {
+ try {
+ return Files.getLastModifiedTime(p).toMillis();
+ } catch (IOException e) {
+ return 0;
+ }
+ }
+
+ public static Path mkdirsOrDie(Path p, String errMsg) {
+ try {
+ Files.createDirectories(p);
+ return p;
+ } catch (IOException e) {
+ throw new Die(errMsg + ": " + p, e);
+ }
+ }
+
private FileUtil() {
}
-}
\ No newline at end of file
+}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/IoUtil.java b/gerrit-common/src/main/java/com/google/gerrit/common/IoUtil.java
index c45d9f9..9a30696 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/IoUtil.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/IoUtil.java
@@ -16,7 +16,6 @@
import com.google.common.collect.Sets;
-import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -25,6 +24,7 @@
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
+import java.nio.file.Path;
import java.util.Arrays;
import java.util.Set;
@@ -53,7 +53,7 @@
}.start();
}
- public static void loadJARs(File... jars) {
+ public static void loadJARs(Iterable<Path> jars) {
ClassLoader cl = IoUtil.class.getClassLoader();
if (!(cl instanceof URLClassLoader)) {
throw noAddURL("Not loaded by URLClassLoader", null);
@@ -71,9 +71,9 @@
}
Set<URL> have = Sets.newHashSet(Arrays.asList(urlClassLoader.getURLs()));
- for (File path : jars) {
+ for (Path path : jars) {
try {
- URL url = path.toURI().toURL();
+ URL url = path.toUri().toURL();
if (have.add(url)) {
addURL.invoke(cl, url);
}
@@ -86,6 +86,10 @@
}
}
+ public static void loadJARs(Path... jars) {
+ loadJARs(Arrays.asList(jars));
+ }
+
private static UnsupportedOperationException noAddURL(String m, Throwable why) {
String prefix = "Cannot extend classpath: ";
return new UnsupportedOperationException(prefix + m, why);
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/PluginData.java b/gerrit-common/src/main/java/com/google/gerrit/common/PluginData.java
index ffdae9d..27dc639 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/PluginData.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/PluginData.java
@@ -14,18 +14,18 @@
package com.google.gerrit.common;
-import java.io.File;
+import java.nio.file.Path;
import java.util.Objects;
public class PluginData {
public final String name;
public final String version;
- public final File pluginFile;
+ public final Path pluginPath;
- public PluginData(String name, String version, File pluginFile) {
+ public PluginData(String name, String version, Path pluginPath) {
this.name = name;
this.version = version;
- this.pluginFile = pluginFile;
+ this.pluginPath = pluginPath;
}
@Override
@@ -33,13 +33,13 @@
if (obj instanceof PluginData) {
PluginData o = (PluginData) obj;
return Objects.equals(name, o.name) && Objects.equals(version, o.version)
- && Objects.equals(pluginFile, o.pluginFile);
+ && Objects.equals(pluginPath, o.pluginPath);
}
return super.equals(obj);
}
@Override
public int hashCode() {
- return Objects.hash(name, version, pluginFile);
+ return Objects.hash(name, version, pluginPath);
}
-}
\ No newline at end of file
+}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java b/gerrit-common/src/main/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java
index a98e0a5..2511a51 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java
@@ -14,41 +14,57 @@
package com.google.gerrit.common;
-import java.io.File;
-import java.io.FileFilter;
-import java.util.Arrays;
-import java.util.Comparator;
+import static com.google.gerrit.common.FileUtil.lastModified;
+
+import com.google.common.collect.ComparisonChain;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Ordering;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
+import java.util.List;
public final class SiteLibraryLoaderUtil {
+ private static final Logger log =
+ LoggerFactory.getLogger(SiteLibraryLoaderUtil.class);
- public static void loadSiteLib(File libdir) {
- File[] jars = listJars(libdir);
- if (jars != null && 0 < jars.length) {
- Arrays.sort(jars, new Comparator<File>() {
- @Override
- public int compare(File a, File b) {
- // Sort by reverse last-modified time so newer JARs are first.
- int cmp = Long.compare(b.lastModified(), a.lastModified());
- if (cmp != 0) {
- return cmp;
- }
- return a.getName().compareTo(b.getName());
- }
- });
- IoUtil.loadJARs(jars);
+ public static void loadSiteLib(Path libdir) {
+ try {
+ IoUtil.loadJARs(listJars(libdir));
+ } catch (IOException e) {
+ log.error("Error scanning lib directory " + libdir, e);
}
}
- public static File[] listJars(File libdir) {
- File[] jars = libdir.listFiles(new FileFilter() {
+ public static List<Path> listJars(Path dir) throws IOException {
+ DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
@Override
- public boolean accept(File path) {
- String name = path.getName();
- return (name.endsWith(".jar") || name.endsWith(".zip"))
- && path.isFile();
+ public boolean accept(Path entry) throws IOException {
+ String name = entry.getFileName().toString();
+ return (name.endsWith(".jar") || name.endsWith(".zip"))
+ && Files.isRegularFile(entry);
}
- });
- return jars;
+ };
+ try (DirectoryStream<Path> jars = Files.newDirectoryStream(dir, filter)) {
+ return new Ordering<Path>() {
+ @Override
+ public int compare(Path a, Path b) {
+ // Sort by reverse last-modified time so newer JARs are first.
+ return ComparisonChain.start()
+ .compare(lastModified(b), lastModified(a))
+ .compare(a, b)
+ .result();
+ }
+ }.sortedCopy(jars);
+ } catch (NoSuchFileException nsfe) {
+ return ImmutableList.of();
+ }
}
private SiteLibraryLoaderUtil() {
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/ChangeInfo.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/ChangeInfo.java
index a744122..d0f8cd3 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/ChangeInfo.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/ChangeInfo.java
@@ -107,7 +107,7 @@
return latest;
}
- public java.sql.Timestamp getLastUpdatedOn() {
+ public Timestamp getLastUpdatedOn() {
return lastUpdatedOn;
}
}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/CommentDetail.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/CommentDetail.java
index db78c4d..1b98b09 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/CommentDetail.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/CommentDetail.java
@@ -136,7 +136,9 @@
parentMap.put(parentUuid, l);
}
l.add(c);
- if (parentUuid == null) rootComments.add(c);
+ if (parentUuid == null) {
+ rootComments.add(c);
+ }
}
// Add the comments in the list, starting with the head and then going through all the
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/GitWebType.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/GitWebType.java
index 8219d27..0aff539 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/GitWebType.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/GitWebType.java
@@ -47,10 +47,6 @@
type = new GitWebType();
// The custom name is not defined, let's keep the old style of using GitWeb
type.setLinkName("gitweb");
-
- } else if (name.equalsIgnoreCase("disabled")) {
- type = null;
-
} else {
type = null;
}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/HostPageData.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/HostPageData.java
index 430c23c..fa3d7a8 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/HostPageData.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/HostPageData.java
@@ -30,6 +30,7 @@
public Theme theme;
public List<String> plugins;
public List<Message> messages;
+ public Integer pluginsLoadTimeout;
public boolean isNoteDbEnabled;
public static class Theme {
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRange.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRange.java
index 7be8e4e..8d09b88 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRange.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRange.java
@@ -125,11 +125,15 @@
r.append(' ');
} else {
if (getMin() != getMax()) {
- if (0 <= getMin()) r.append('+');
+ if (0 <= getMin()) {
+ r.append('+');
+ }
r.append(getMin());
r.append("..");
}
- if (0 <= getMax()) r.append('+');
+ if (0 <= getMax()) {
+ r.append('+');
+ }
r.append(getMax());
r.append(' ');
}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRule.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRule.java
index 3ba7adf..ec5ca06 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRule.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRule.java
@@ -126,8 +126,12 @@
@Override
public int compareTo(PermissionRule o) {
int cmp = action(this) - action(o);
- if (cmp == 0) cmp = range(o) - range(this);
- if (cmp == 0) cmp = group(this).compareTo(group(o));
+ if (cmp == 0) {
+ cmp = range(o) - range(this);
+ }
+ if (cmp == 0) {
+ cmp = group(this).compareTo(group(o));
+ }
return cmp;
}
diff --git a/gerrit-extension-api/pom.xml b/gerrit-extension-api/pom.xml
index a0d9455..d0204e4 100644
--- a/gerrit-extension-api/pom.xml
+++ b/gerrit-extension-api/pom.xml
@@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.google.gerrit</groupId>
<artifactId>gerrit-extension-api</artifactId>
- <version>2.11-SNAPSHOT</version>
+ <version>2.12-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Gerrit Code Review - Extension API</name>
<description>API for Gerrit Extensions</description>
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginData.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginData.java
index 75238a8..4893beff 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginData.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginData.java
@@ -18,24 +18,25 @@
import com.google.inject.BindingAnnotation;
-import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
/**
* Local path where a plugin can store its own private data.
* <p>
* A plugin or extension may receive this string by Guice injection to discover
* a directory where it can store configuration or other data that is private:
+ * <p>
+ * This binding is on both {@link java.io.File} and {@link java.nio.file.Path},
+ * pointing to the same location. The {@code File} version should be considered
+ * deprecated and may be removed in a future version.
*
* <pre>
* {@literal @Inject}
- * MyType(@PluginData java.io.File myDir) {
- * new FileInputStream(new File(myDir, "my.config"));
+ * MyType(@PluginData java.nio.file.Path myDir) {
+ * this.in = Files.newInputStream(myDir.resolve("my.config"));
* }
* </pre>
*/
-@Target({ElementType.PARAMETER, ElementType.FIELD})
@Retention(RUNTIME)
@BindingAnnotation
public @interface PluginData {
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/Accounts.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/Accounts.java
index 71a93d3..32f8488 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/Accounts.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/Accounts.java
@@ -14,9 +14,12 @@
package com.google.gerrit.extensions.api.accounts;
+import com.google.gerrit.extensions.common.AccountInfo;
import com.google.gerrit.extensions.restapi.NotImplementedException;
import com.google.gerrit.extensions.restapi.RestApiException;
+import java.util.List;
+
public interface Accounts {
/**
* Look up an account by ID.
@@ -42,6 +45,69 @@
AccountApi self() throws RestApiException;
/**
+ * Suggest users for a given query.
+ * <p>
+ * Example code:
+ * {@code suggestAccounts().withQuery("Reviewer").withLimit(5).get()}
+ *
+ * @return API for setting parameters and getting result.
+ */
+ SuggestAccountsRequest suggestAccounts() throws RestApiException;
+
+ /**
+ * Suggest users for a given query.
+ * <p>
+ * Shortcut API for {@code suggestAccounts().withQuery(String)}.
+ *
+ * @see #suggestAccounts()
+ */
+ SuggestAccountsRequest suggestAccounts(String query)
+ throws RestApiException;
+
+ /**
+ * API for setting parameters and getting result.
+ * Used for {@code suggestAccounts()}.
+ *
+ * @see #suggestAccounts()
+ */
+ public abstract class SuggestAccountsRequest {
+ private String query;
+ private int limit;
+
+ /**
+ * Executes query and returns a list of accounts.
+ */
+ public abstract List<AccountInfo> get() throws RestApiException;
+
+ /**
+ * Set query.
+ *
+ * @param query needs to be in human-readable form.
+ */
+ public SuggestAccountsRequest withQuery(String query) {
+ this.query = query;
+ return this;
+ }
+
+ /**
+ * Set limit for returned list of accounts.
+ * Optional; server-default is used when not provided.
+ */
+ public SuggestAccountsRequest withLimit(int limit) {
+ this.limit = limit;
+ return this;
+ }
+
+ public String getQuery() {
+ return query;
+ }
+
+ public int getLimit() {
+ return limit;
+ }
+ }
+
+ /**
* A default implementation which allows source compatibility
* when adding new methods to the interface.
**/
@@ -55,5 +121,16 @@
public AccountApi self() throws RestApiException {
throw new NotImplementedException();
}
+
+ @Override
+ public SuggestAccountsRequest suggestAccounts() throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public SuggestAccountsRequest suggestAccounts(String query)
+ throws RestApiException {
+ throw new NotImplementedException();
+ }
}
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionApi.java
index b940cc9..3e7a207 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionApi.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionApi.java
@@ -14,6 +14,7 @@
package com.google.gerrit.extensions.api.changes;
+import com.google.gerrit.extensions.common.ActionInfo;
import com.google.gerrit.extensions.common.CommentInfo;
import com.google.gerrit.extensions.common.FileInfo;
import com.google.gerrit.extensions.common.MergeableInfo;
@@ -54,6 +55,8 @@
CommentApi comment(String id) throws RestApiException;
+ Map<String, ActionInfo> actions() throws RestApiException;
+
/**
* A default implementation which allows source compatibility
* when adding new methods to the interface.
@@ -163,5 +166,10 @@
public CommentApi comment(String id) throws RestApiException {
throw new NotImplementedException();
}
+
+ @Override
+ public Map<String, ActionInfo> actions() throws RestApiException {
+ throw new NotImplementedException();
+ }
}
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ChildProjectApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ChildProjectApi.java
new file mode 100644
index 0000000..a930f0d
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ChildProjectApi.java
@@ -0,0 +1,40 @@
+// Copyright (C) 2015 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.
+
+package com.google.gerrit.extensions.api.projects;
+
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+
+public interface ChildProjectApi {
+ ProjectInfo get() throws RestApiException;
+ ProjectInfo get(boolean recursive) throws RestApiException;
+
+ /**
+ * A default implementation which allows source compatibility
+ * when adding new methods to the interface.
+ **/
+ public class NotImplemented implements ChildProjectApi {
+ @Override
+ public ProjectInfo get() throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public ProjectInfo get(boolean recursive) throws RestApiException {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java
index 07a48a1..a8e1efe 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java
@@ -18,10 +18,19 @@
import com.google.gerrit.extensions.restapi.NotImplementedException;
import com.google.gerrit.extensions.restapi.RestApiException;
+import java.util.List;
+
public interface ProjectApi {
ProjectApi create() throws RestApiException;
ProjectApi create(ProjectInput in) throws RestApiException;
- ProjectInfo get();
+ ProjectInfo get() throws RestApiException;
+
+ String description() throws RestApiException;
+ void description(PutDescriptionInput in) throws RestApiException;
+
+ List<ProjectInfo> children() throws RestApiException;
+ List<ProjectInfo> children(boolean recursive) throws RestApiException;
+ ChildProjectApi child(String name) throws RestApiException;
/**
* Look up a branch by refname.
@@ -33,9 +42,10 @@
* to store references to {@code BranchApi} instances.
*
* @param ref branch name, with or without "refs/heads/" prefix.
+ * @throws RestApiException if a problem occurred reading the project.
* @return API for accessing the branch.
*/
- BranchApi branch(String ref);
+ BranchApi branch(String ref) throws RestApiException;
/**
* A default implementation which allows source compatibility
@@ -53,12 +63,38 @@
}
@Override
- public ProjectInfo get() {
+ public ProjectInfo get() throws RestApiException {
throw new NotImplementedException();
}
@Override
- public BranchApi branch(String ref) {
+ public String description() throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public void description(PutDescriptionInput in)
+ throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public List<ProjectInfo> children() {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public List<ProjectInfo> children(boolean recursive) throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public ChildProjectApi child(String name) throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public BranchApi branch(String ref) throws RestApiException {
throw new NotImplementedException();
}
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/Projects.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/Projects.java
index 736d375..7a626f1 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/Projects.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/Projects.java
@@ -18,7 +18,11 @@
import com.google.gerrit.extensions.restapi.NotImplementedException;
import com.google.gerrit.extensions.restapi.RestApiException;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
public interface Projects {
/**
@@ -36,15 +40,54 @@
*/
ProjectApi name(String name) throws RestApiException;
+ /**
+ * Create a project using the default configuration.
+ *
+ * @param name project name.
+ * @return API for accessing the newly-created project.
+ * @throws RestApiException if an error occurred.
+ */
+ ProjectApi create(String name) throws RestApiException;
+
+ /**
+ * Create a project.
+ *
+ * @param in project creation input; name must be set.
+ * @return API for accessing the newly-created project.
+ * @throws RestApiException if an error occurred.
+ */
+ ProjectApi create(ProjectInput in) throws RestApiException;
+
ListRequest list();
public abstract class ListRequest {
+ public static enum FilterType {
+ CODE, PARENT_CANDIDATES, PERMISSIONS, ALL;
+ }
+
+ private final List<String> branches = new ArrayList<>();
private boolean description;
private String prefix;
+ private String substring;
+ private String regex;
private int limit;
private int start;
+ private boolean showTree;
+ private FilterType type = FilterType.ALL;
- public abstract List<ProjectInfo> get() throws RestApiException;
+ public List<ProjectInfo> get() throws RestApiException {
+ Map<String, ProjectInfo> map = getAsMap();
+ List<ProjectInfo> result = new ArrayList<>(map.size());
+ for (Map.Entry<String, ProjectInfo> e : map.entrySet()) {
+ // ListProjects "helpfully" nulls out names when converting to a map.
+ e.getValue().name = e.getKey();
+ result.add(e.getValue());
+ }
+ return Collections.unmodifiableList(result);
+ }
+
+ public abstract SortedMap<String, ProjectInfo> getAsMap()
+ throws RestApiException;
public ListRequest withDescription(boolean description) {
this.description = description;
@@ -56,6 +99,16 @@
return this;
}
+ public ListRequest withSubstring(String substring) {
+ this.substring = substring;
+ return this;
+ }
+
+ public ListRequest withRegex(String regex) {
+ this.regex = regex;
+ return this;
+ }
+
public ListRequest withLimit(int limit) {
this.limit = limit;
return this;
@@ -66,6 +119,21 @@
return this;
}
+ public ListRequest addShowBranch(String branch) {
+ branches.add(branch);
+ return this;
+ }
+
+ public ListRequest withTree(boolean show) {
+ showTree = show;
+ return this;
+ }
+
+ public ListRequest withType(FilterType type) {
+ this.type = type != null ? type : FilterType.ALL;
+ return this;
+ }
+
public boolean getDescription() {
return description;
}
@@ -74,6 +142,14 @@
return prefix;
}
+ public String getSubstring() {
+ return substring;
+ }
+
+ public String getRegex() {
+ return regex;
+ }
+
public int getLimit() {
return limit;
}
@@ -81,6 +157,18 @@
public int getStart() {
return start;
}
+
+ public List<String> getBranches() {
+ return Collections.unmodifiableList(branches);
+ }
+
+ public boolean getShowTree() {
+ return showTree;
+ }
+
+ public FilterType getFilterType() {
+ return type;
+ }
}
/**
@@ -94,6 +182,16 @@
}
@Override
+ public ProjectApi create(ProjectInput in) throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public ProjectApi create(String name) throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
public ListRequest list() {
throw new NotImplementedException();
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/PutDescriptionInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/PutDescriptionInput.java
new file mode 100644
index 0000000..7ea9fb6
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/PutDescriptionInput.java
@@ -0,0 +1,23 @@
+// Copyright (C) 2015 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.
+
+package com.google.gerrit.extensions.api.projects;
+
+import com.google.gerrit.extensions.restapi.DefaultInput;
+
+public class PutDescriptionInput {
+ @DefaultInput
+ public String description;
+ public String commitMessage;
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/BinaryResult.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/BinaryResult.java
index 18f356b..92fefed 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/BinaryResult.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/BinaryResult.java
@@ -196,8 +196,9 @@
} catch (UnsupportedCharsetException | CharacterCodingException e) {
// Fallback to ISO-8850-1 style encoding.
StringBuilder r = new StringBuilder(data.length);
- for (byte b : data)
- r.append((char) (b & 0xff));
+ for (byte b : data) {
+ r.append((char) (b & 0xff));
+ }
return r.toString();
}
}
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyHelpPopup.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyHelpPopup.java
index b015274..191ffd7 100644
--- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyHelpPopup.java
+++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyHelpPopup.java
@@ -114,7 +114,7 @@
}
private void populate(final Grid lists) {
- int end[] = new int[5];
+ int[] end = new int[5];
int column = 0;
for (final KeyCommandSet set : combinedSetsByName()) {
int row = end[column];
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/linker/server/UserAgentRule.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/linker/server/UserAgentRule.java
index eb87e7f..6c820a8 100644
--- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/linker/server/UserAgentRule.java
+++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/linker/server/UserAgentRule.java
@@ -67,9 +67,6 @@
if (v >= 8000) {
return "ie8";
}
- if (v >= 6000) {
- return "ie6";
- }
}
return null;
diff --git a/gerrit-gwtui/gwt.defs b/gerrit-gwtui/gwt.defs
index cd206c0..0e5928d 100644
--- a/gerrit-gwtui/gwt.defs
+++ b/gerrit-gwtui/gwt.defs
@@ -17,7 +17,7 @@
'firefox',
'gecko1_8',
'safari',
- 'msie', 'ie6', 'ie8', 'ie9',
+ 'msie', 'ie8', 'ie9',
]
ALIASES = {
'chrome': 'safari',
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/UserAgent.gwt.xml b/gerrit-gwtui/src/main/java/com/google/gerrit/UserAgent.gwt.xml
index e6f3acb..c02518b 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/UserAgent.gwt.xml
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/UserAgent.gwt.xml
@@ -21,10 +21,9 @@
<when-property-is name="user.agent" value="gecko1_8" />
</replace-with>
- <replace-with class="com.google.gerrit.client.ui.FancyFlexTableImplIE6">
+ <replace-with class="com.google.gerrit.client.ui.FancyFlexTableImplIE8">
<when-type-is class="com.google.gerrit.client.ui.FancyFlexTableImpl" />
<any>
- <when-property-is name="user.agent" value="ie6"/>
<when-property-is name="user.agent" value="ie8"/>
</any>
</replace-with>
@@ -32,7 +31,6 @@
<replace-with class="com.google.gerrit.client.Themer.ThemerIE">
<when-type-is class="com.google.gerrit.client.Themer" />
<any>
- <when-property-is name="user.agent" value="ie6"/>
<when-property-is name="user.agent" value="ie8"/>
<when-property-is name="user.agent" value="ie9"/>
<when-property-is name="user.agent" value="ie10"/>
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java
index e2bf142..000f9e6 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java
@@ -341,7 +341,7 @@
private static String legacyChange(final String token) {
final String s = skip(token);
- final String t[] = s.split(",", 2);
+ final String[] t = s.split(",", 2);
if (t.length > 1 && matchPrefix("patchset=", t[1])) {
return PageLinks.toChange(PatchSet.Id.parse(t[0] + "," + skip(t[1])));
}
@@ -707,11 +707,13 @@
return new RegisterScreen("/" + skip(token));
}
- if (matchPrefix("/VE/", token) || matchPrefix("VE,", token))
+ if (matchPrefix("/VE/", token) || matchPrefix("VE,", token)) {
return new ValidateEmailScreen(skip(token));
+ }
- if (matchExact(SETTINGS_NEW_AGREEMENT, token))
+ if (matchExact(SETTINGS_NEW_AGREEMENT, token)) {
return new NewAgreementScreen();
+ }
if (matchPrefix(SETTINGS_NEW_AGREEMENT + "/", token)) {
return new NewAgreementScreen(skip(token));
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java
index 296f93f..65e2858 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java
@@ -101,7 +101,7 @@
GWT.create(GerritResources.class);
public static final SystemInfoService SYSTEM_SVC;
public static final EventBus EVENT_BUS = GWT.create(SimpleEventBus.class);
- public static Themer THEMER = GWT.create(Themer.class);
+ public static final Themer THEMER = GWT.create(Themer.class);
public static final String PROJECT_NAME_MENU_VAR = "${projectName}";
private static String myHost;
@@ -579,6 +579,7 @@
AccountApi.self().view("preferences").get(cbg.add(createMyMenuBarCallback()));
}
PluginLoader.load(hpd.plugins,
+ hpd.pluginsLoadTimeout,
cbg.addFinal(new GerritCallback<VoidResult>() {
@Override
public void onSuccess(VoidResult result) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/RelativeDateFormatter.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/RelativeDateFormatter.java
index 5fc8cb3..443a6a8 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/RelativeDateFormatter.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/RelativeDateFormatter.java
@@ -47,7 +47,9 @@
long ageMillis = (new Date()).getTime() - when.getTime();
// shouldn't happen in a perfect world
- if (ageMillis < 0) return Util.C.inTheFuture();
+ if (ageMillis < 0) {
+ return Util.C.inTheFuture();
+ }
// seconds
if (ageMillis < upperLimit(MINUTE_IN_MILLIS)) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/SearchPanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/SearchPanel.java
index d5805ef..94198cb 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/SearchPanel.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/SearchPanel.java
@@ -58,11 +58,12 @@
final SuggestBox suggestBox = new SuggestBox(
new RemoteSuggestOracle(new SearchSuggestOracle()),
searchBox, suggestionDisplay);
- searchBox.setStyleName("gwt-TextBox");
+ searchBox.setStyleName("searchTextBox");
searchBox.setVisibleLength(70);
searchBox.setHintText(Gerrit.C.searchHint());
final Button searchButton = new Button(Gerrit.C.searchButton());
+ searchButton.setStyleName("searchButton");
searchButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ContactPanelShort.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ContactPanelShort.java
index b5fe70f..405adcf 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ContactPanelShort.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ContactPanelShort.java
@@ -48,7 +48,8 @@
class ContactPanelShort extends Composite {
protected final FlowPanel body;
- protected int labelIdx, fieldIdx;
+ protected int labelIdx;
+ protected int fieldIdx;
protected Button save;
private String currentEmail;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyAgreementsScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyAgreementsScreen.java
index 0908f6b..b60e5d7 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyAgreementsScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyAgreementsScreen.java
@@ -61,8 +61,9 @@
}
void display(final AgreementInfo result) {
- while (1 < table.getRowCount())
+ while (1 < table.getRowCount()) {
table.removeRow(table.getRowCount() - 1);
+ }
for (final String k : result.accepted) {
addOne(result, k);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyIdentitiesScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyIdentitiesScreen.java
index 98f083c..af70fac 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyIdentitiesScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyIdentitiesScreen.java
@@ -179,8 +179,9 @@
}
});
- while (1 < table.getRowCount())
+ while (1 < table.getRowCount()) {
table.removeRow(table.getRowCount() - 1);
+ }
for (final AccountExternalId k : result) {
addOneId(k);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyPreferencesScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyPreferencesScreen.java
index 5cee767..1c57d38 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyPreferencesScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyPreferencesScreen.java
@@ -117,7 +117,8 @@
FlowPanel dateTimePanel = new FlowPanel();
- final int labelIdx, fieldIdx;
+ final int labelIdx;
+ final int fieldIdx;
if (LocaleInfo.getCurrentLocale().isRTL()) {
labelIdx = 1;
fieldIdx = 0;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyProfileScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyProfileScreen.java
index 52246b2..ff6fffb 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyProfileScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyProfileScreen.java
@@ -33,7 +33,8 @@
public class MyProfileScreen extends SettingsScreen {
private AvatarImage avatar;
private Anchor changeAvatar;
- private int labelIdx, fieldIdx;
+ private int labelIdx;
+ private int fieldIdx;
private Grid info;
@Override
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchesTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchesTable.java
index 67f5b4a..08effdc 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchesTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchesTable.java
@@ -113,8 +113,9 @@
}
public void display(final List<AccountProjectWatchInfo> result) {
- while (2 < table.getRowCount())
+ while (2 < table.getRowCount()) {
table.removeRow(table.getRowCount() - 1);
+ }
for (final AccountProjectWatchInfo k : result) {
final int row = table.getRowCount();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/SshPanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/SshPanel.java
index 0cfc0984..37ad764 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/SshPanel.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/SshPanel.java
@@ -306,8 +306,9 @@
setKeyTableVisible(false);
showAddKeyBlock(true);
} else {
- while (1 < table.getRowCount())
+ while (1 < table.getRowCount()) {
table.removeRow(table.getRowCount() - 1);
+ }
for (final SshKeyInfo k : result) {
addOneKey(k);
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/UsernameField.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/UsernameField.java
index 9975887..eea7c6a 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/UsernameField.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/UsernameField.java
@@ -178,10 +178,11 @@
default:
final TextBox box = (TextBox) event.getSource();
final String re;
- if (box.getCursorPos() == 0)
+ if (box.getCursorPos() == 0) {
re = Account.USER_NAME_PATTERN_FIRST;
- else
+ } else {
re = Account.USER_NAME_PATTERN_REST;
+ }
if (!String.valueOf(code).matches("^" + re + "$")) {
event.preventDefault();
event.stopPropagation();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java
index cf3e940..d3f659e 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java
@@ -270,8 +270,9 @@
}
void display(final List<AccountInfo> result) {
- while (1 < table.getRowCount())
+ while (1 < table.getRowCount()) {
table.removeRow(table.getRowCount() - 1);
+ }
for (final AccountInfo i : result) {
final int row = table.getRowCount();
@@ -376,8 +377,9 @@
}
void display(List<GroupInfo> list) {
- while (1 < table.getRowCount())
+ while (1 < table.getRowCount()) {
table.removeRow(table.getRowCount() - 1);
+ }
for (final GroupInfo i : list) {
final int row = table.getRowCount();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java
index 1b420b4..aed1dc2 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java
@@ -103,8 +103,9 @@
}
public void displaySubset(List<GroupInfo> list, String toHighlight, int fromIndex, int toIndex) {
- while (1 < table.getRowCount())
+ while (1 < table.getRowCount()) {
table.removeRow(table.getRowCount() - 1);
+ }
Collections.sort(list, new Comparator<GroupInfo>() {
@Override
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectBranchesScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectBranchesScreen.java
index c5f7225..a7799ab 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectBranchesScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectBranchesScreen.java
@@ -444,8 +444,9 @@
void displaySubset(List<BranchInfo> branches, int fromIndex, int toIndex) {
canDelete = false;
- while (1 < table.getRowCount())
+ while (1 < table.getRowCount()) {
table.removeRow(table.getRowCount() - 1);
+ }
for (BranchInfo k : branches.subList(fromIndex, toIndex)) {
final int row = table.getRowCount();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ActionContext.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ActionContext.java
index 2b40954..b7307be 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ActionContext.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ActionContext.java
@@ -114,7 +114,9 @@
return e.options[e.selectedIndex].text;
},
- popup: function(e){this._p=@com.google.gerrit.client.api.PopupHelper::popup(Lcom/google/gerrit/client/api/ActionContext;Lcom/google/gwt/dom/client/Element;)(this,e)},
+ popup: function(e){
+ this._p=@com.google.gerrit.client.api.PopupHelper::popup(
+ Lcom/google/gerrit/client/api/ActionContext;Lcom/google/gwt/dom/client/Element;)(this,e)},
hide: function() {
this._p.@com.google.gerrit.client.api.PopupHelper::hide()();
delete this['_p'];
@@ -125,11 +127,18 @@
if (m == 'get' || m == 'delete' || i==null) this[m](b);
else this[m](i,b);
},
- get: function(b){@com.google.gerrit.client.api.ActionContext::get(Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;)(this._u,b)},
- post: function(i,b){@com.google.gerrit.client.api.ActionContext::post(Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;Lcom/google/gwt/core/client/JavaScriptObject;)(this._u,i,b)},
- put: function(i,b){@com.google.gerrit.client.api.ActionContext::put(Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;Lcom/google/gwt/core/client/JavaScriptObject;)(this._u,i,b)},
- 'delete': function(b){@com.google.gerrit.client.api.ActionContext::delete(Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;)(this._u,b)},
- del: function(b){@com.google.gerrit.client.api.ActionContext::delete(Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;)(this._u,b)},
+ get: function(b){@com.google.gerrit.client.api.ActionContext::get(
+ Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;)(this._u,b)},
+ post: function(i,b){@com.google.gerrit.client.api.ActionContext::post(
+ Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;Lcom/google/gwt/core/client/JavaScriptObject;)(
+ this._u,i,b)},
+ put: function(i,b){@com.google.gerrit.client.api.ActionContext::put(
+ Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;Lcom/google/gwt/core/client/JavaScriptObject;)(
+ this._u,i,b)},
+ 'delete': function(b){@com.google.gerrit.client.api.ActionContext::delete(
+ Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;)(this._u,b)},
+ del: function(b){@com.google.gerrit.client.api.ActionContext::delete(
+ Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;)(this._u,b)},
};
}-*/;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/Plugin.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/Plugin.java
index 931a04d..6acb420 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/Plugin.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/Plugin.java
@@ -61,11 +61,18 @@
screen: function(p,c){G._screen(this.name,p,c)},
url: function (u){return G.url(this._url(u))},
- get: function(u,b){@com.google.gerrit.client.api.ActionContext::get(Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;)(this._api(u),b)},
- post: function(u,i,b){@com.google.gerrit.client.api.ActionContext::post(Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;Lcom/google/gwt/core/client/JavaScriptObject;)(this._api(u),i,b)},
- put: function(u,i,b){@com.google.gerrit.client.api.ActionContext::put(Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;Lcom/google/gwt/core/client/JavaScriptObject;)(this._api(u),i,b)},
- 'delete': function(u,b){@com.google.gerrit.client.api.ActionContext::delete(Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;)(this._api(u),b)},
- del: function(u,b){@com.google.gerrit.client.api.ActionContext::delete(Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;)(this._api(u),b)},
+ get: function(u,b){@com.google.gerrit.client.api.ActionContext::get(
+ Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;)(this._api(u),b)},
+ post: function(u,i,b){@com.google.gerrit.client.api.ActionContext::post(
+ Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;Lcom/google/gwt/core/client/JavaScriptObject;)(
+ this._api(u),i,b)},
+ put: function(u,i,b){@com.google.gerrit.client.api.ActionContext::put(
+ Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;Lcom/google/gwt/core/client/JavaScriptObject;)(
+ this._api(u),i,b)},
+ 'delete': function(u,b){@com.google.gerrit.client.api.ActionContext::delete(
+ Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;)(this._api(u),b)},
+ del: function(u,b){@com.google.gerrit.client.api.ActionContext::delete(
+ Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;)(this._api(u),b)},
_loadedGwt: function(){@com.google.gerrit.client.api.PluginLoader::loaded()()},
_api: function(u){return @com.google.gerrit.client.rpc.RestApi::new(Ljava/lang/String;)(this._url(u))},
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PluginLoader.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PluginLoader.java
index f0fb436..ceb0eee 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PluginLoader.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PluginLoader.java
@@ -32,15 +32,14 @@
/** Loads JavaScript plugins with a progress meter visible. */
public class PluginLoader extends DialogBox {
- private static final int MAX_LOAD_TIME_MILLIS = 5000;
private static PluginLoader self;
public static void load(List<String> plugins,
- AsyncCallback<VoidResult> callback) {
+ int loadTimeout, AsyncCallback<VoidResult> callback) {
if (plugins == null || plugins.isEmpty()) {
callback.onSuccess(VoidResult.create());
} else {
- self = new PluginLoader(callback);
+ self = new PluginLoader(loadTimeout, callback);
self.load(plugins);
self.startTimers();
self.center();
@@ -51,6 +50,7 @@
self.loadedOne();
}
+ private final int loadTimeout;
private final AsyncCallback<VoidResult> callback;
private ProgressBar progress;
private Timer show;
@@ -58,9 +58,10 @@
private Timer timeout;
private boolean visible;
- private PluginLoader(AsyncCallback<VoidResult> cb) {
+ private PluginLoader(int loadTimeout, AsyncCallback<VoidResult> cb) {
super(/* auto hide */false, /* modal */true);
callback = cb;
+ this.loadTimeout = loadTimeout;
progress = new ProgressBar(Gerrit.C.loadingPlugins());
setStyleName(Gerrit.RESOURCES.css().errorDialog());
@@ -98,7 +99,7 @@
@Override
public void run() {
- progress.setValue(100 * ++cycle * 250 / MAX_LOAD_TIME_MILLIS);
+ progress.setValue(100 * ++cycle * 250 / loadTimeout);
}
};
update.scheduleRepeating(250);
@@ -109,7 +110,7 @@
finish();
}
};
- timeout.schedule(MAX_LOAD_TIME_MILLIS);
+ timeout.schedule(loadTimeout);
}
private void loadedOne() {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Actions.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Actions.java
index 525684d..37b90c4 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Actions.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Actions.java
@@ -65,7 +65,6 @@
private String message;
private String branch;
private String key;
- private boolean canSubmit;
Actions() {
initWidget(uiBinder.createAndBindUi(this));
@@ -87,7 +86,12 @@
changeInfo = info;
initChangeActions(info, hasUser);
- initRevisionActions(info, revInfo, hasUser);
+
+ NativeMap<ActionInfo> actionMap = revInfo.has_actions()
+ ? revInfo.actions()
+ : NativeMap.<ActionInfo> create();
+ actionMap.copyKeysIntoChildren("id");
+ reloadRevisionActions(actionMap);
}
private void initChangeActions(ChangeInfo info, boolean hasUser) {
@@ -107,30 +111,29 @@
}
}
- private void initRevisionActions(ChangeInfo info, RevisionInfo revInfo,
- boolean hasUser) {
- NativeMap<ActionInfo> actions = revInfo.has_actions()
- ? revInfo.actions()
- : NativeMap.<ActionInfo> create();
- actions.copyKeysIntoChildren("id");
+ void reloadRevisionActions(NativeMap<ActionInfo> actions) {
+ if (!Gerrit.isSignedIn()) {
+ return;
+ }
+ boolean canSubmit = actions.containsKey("submit");
+ if (canSubmit) {
+ ActionInfo action = actions.get("submit");
+ submit.setTitle(action.title());
+ submit.setEnabled(action.enabled());
+ submit.setHTML(new SafeHtmlBuilder()
+ .openDiv()
+ .append(action.label())
+ .closeDiv());
+ submit.setEnabled(action.enabled());
+ }
+ submit.setVisible(canSubmit);
- canSubmit = false;
- if (hasUser) {
- canSubmit = actions.containsKey("submit");
- if (canSubmit) {
- ActionInfo action = actions.get("submit");
- submit.setTitle(action.title());
- submit.setEnabled(action.enabled());
- submit.setHTML(new SafeHtmlBuilder()
- .openDiv()
- .append(action.label())
- .closeDiv());
- }
- a2b(actions, "cherrypick", cherrypick);
- a2b(actions, "rebase", rebase);
- for (String id : filterNonCore(actions)) {
- add(new ActionButton(info, revInfo, actions.get(id)));
- }
+ a2b(actions, "cherrypick", cherrypick);
+ a2b(actions, "rebase", rebase);
+
+ RevisionInfo revInfo = changeInfo.revision(revision);
+ for (String id : filterNonCore(actions)) {
+ add(new ActionButton(changeInfo, revInfo, actions.get(id)));
}
}
@@ -146,10 +149,6 @@
return ids;
}
- void setSubmitEnabled() {
- submit.setVisible(canSubmit);
- }
-
@UiHandler("followUp")
void onFollowUp(@SuppressWarnings("unused") ClickEvent e) {
if (followUpAction == null) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AddFileAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AddFileAction.java
index d08d09c..5c44a14 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AddFileAction.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AddFileAction.java
@@ -1,16 +1,16 @@
-//Copyright (C) 2013 The Android Open Source Project
+// Copyright (C) 2013 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
+// 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
+// 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.
+// 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.
package com.google.gerrit.client.change;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AddFileBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AddFileBox.java
index b63718f..82fe806 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AddFileBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AddFileBox.java
@@ -1,16 +1,16 @@
-//Copyright (C) 2013 The Android Open Source Project
+// Copyright (C) 2013 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
+// 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
+// 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.
+// 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.
package com.google.gerrit.client.change;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen.java
index 8a27fd0..a6635f3 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen.java
@@ -134,8 +134,6 @@
private CommentLinkProcessor commentLinkProcessor;
private EditInfo edit;
- private KeyCommandSet keysNavigation;
- private KeyCommandSet keysAction;
private List<HandlerRegistration> handlers = new ArrayList<>(4);
private UpdateCheckTimer updateCheck;
private Timestamp lastDisplayedUpdate;
@@ -248,7 +246,7 @@
void loadChangeInfo(boolean fg, AsyncCallback<ChangeInfo> cb) {
RestApi call = ChangeApi.detail(changeId.get());
ChangeList.addOptions(call, EnumSet.of(
- ListChangesOption.CURRENT_ACTIONS,
+ ListChangesOption.CHANGE_ACTIONS,
ListChangesOption.ALL_REVISIONS));
if (!fg) {
call.background();
@@ -256,6 +254,18 @@
call.get(cb);
}
+ void loadRevisionInfo() {
+ RestApi call = ChangeApi.actions(changeId.get(), revision);
+ call.background();
+ call.get(new GerritCallback<NativeMap<ActionInfo>>() {
+ @Override
+ public void onSuccess(NativeMap<ActionInfo> actionMap) {
+ actionMap.copyKeysIntoChildren("id");
+ renderRevisionInfo(changeInfo, actionMap);
+ }
+ });
+ }
+
@Override
protected void onUnload() {
if (replyAction != null) {
@@ -281,69 +291,6 @@
labels.init(style);
reviewers.init(style, ccText);
hashtags.init(style);
-
- keysNavigation = new KeyCommandSet(Gerrit.C.sectionNavigation());
- keysNavigation.add(new KeyCommand(0, 'u', Util.C.upToChangeList()) {
- @Override
- public void onKeyPress(final KeyPressEvent event) {
- Gerrit.displayLastChangeList();
- }
- });
- keysNavigation.add(new KeyCommand(0, 'R', Util.C.keyReloadChange()) {
- @Override
- public void onKeyPress(final KeyPressEvent event) {
- Gerrit.display(PageLinks.toChange(changeId));
- }
- });
- keysNavigation.add(new KeyCommand(0, 'n', Util.C.keyNextPatchSet()) {
- @Override
- public void onKeyPress(final KeyPressEvent event) {
- gotoSibling(1);
- }
- }, new KeyCommand(0, 'p', Util.C.keyPreviousPatchSet()) {
- @Override
- public void onKeyPress(final KeyPressEvent event) {
- gotoSibling(-1);
- }
- });
-
- keysAction = new KeyCommandSet(Gerrit.C.sectionActions());
- keysAction.add(new KeyCommand(0, 'a', Util.C.keyPublishComments()) {
- @Override
- public void onKeyPress(KeyPressEvent event) {
- if (Gerrit.isSignedIn()) {
- onReply(null);
- } else {
- Gerrit.doSignIn(getToken());
- }
- }
- });
- keysAction.add(new KeyCommand(0, 'x', Util.C.keyExpandAllMessages()) {
- @Override
- public void onKeyPress(KeyPressEvent event) {
- onExpandAll(null);
- }
- });
- keysAction.add(new KeyCommand(0, 'z', Util.C.keyCollapseAllMessages()) {
- @Override
- public void onKeyPress(KeyPressEvent event) {
- onCollapseAll(null);
- }
- });
- if (Gerrit.isSignedIn()) {
- keysAction.add(new KeyCommand(0, 's', Util.C.changeTableStar()) {
- @Override
- public void onKeyPress(KeyPressEvent event) {
- star.setValue(!star.getValue(), true);
- }
- });
- keysAction.add(new KeyCommand(0, 'c', Util.C.keyAddReviewers()) {
- @Override
- public void onKeyPress(KeyPressEvent event) {
- reviewers.onOpenForm();
- }
- });
- }
}
private void initReplyButton(ChangeInfo info, String revision) {
@@ -403,7 +350,8 @@
}
}
- private void initRevisionsAction(ChangeInfo info, String revision) {
+ private void initRevisionsAction(ChangeInfo info, String revision,
+ NativeMap<ActionInfo> actions) {
int currentPatchSet;
if (info.current_revision() != null
&& info.revisions().containsKey(info.current_revision())) {
@@ -431,11 +379,6 @@
RevisionInfo revInfo = info.revision(revision);
if (revInfo.draft()) {
- NativeMap<ActionInfo> actions = revInfo.has_actions()
- ? revInfo.actions()
- : NativeMap.<ActionInfo> create();
- actions.copyKeysIntoChildren("id");
-
if (actions.containsKey("publish")) {
publish.setVisible(true);
publish.setTitle(actions.get("publish").title());
@@ -566,7 +509,88 @@
@Override
public void registerKeys() {
super.registerKeys();
+
+ KeyCommandSet keysNavigation = new KeyCommandSet(Gerrit.C.sectionNavigation());
+ keysNavigation.add(new KeyCommand(0, 'u', Util.C.upToChangeList()) {
+ @Override
+ public void onKeyPress(final KeyPressEvent event) {
+ Gerrit.displayLastChangeList();
+ }
+ });
+ keysNavigation.add(new KeyCommand(0, 'R', Util.C.keyReloadChange()) {
+ @Override
+ public void onKeyPress(final KeyPressEvent event) {
+ Gerrit.display(PageLinks.toChange(changeId));
+ }
+ });
+ keysNavigation.add(new KeyCommand(0, 'n', Util.C.keyNextPatchSet()) {
+ @Override
+ public void onKeyPress(final KeyPressEvent event) {
+ gotoSibling(1);
+ }
+ }, new KeyCommand(0, 'p', Util.C.keyPreviousPatchSet()) {
+ @Override
+ public void onKeyPress(final KeyPressEvent event) {
+ gotoSibling(-1);
+ }
+ });
handlers.add(GlobalKey.add(this, keysNavigation));
+
+ KeyCommandSet keysAction = new KeyCommandSet(Gerrit.C.sectionActions());
+ keysAction.add(new KeyCommand(0, 'a', Util.C.keyPublishComments()) {
+ @Override
+ public void onKeyPress(KeyPressEvent event) {
+ if (Gerrit.isSignedIn()) {
+ onReply(null);
+ } else {
+ Gerrit.doSignIn(getToken());
+ }
+ }
+ });
+ keysAction.add(new KeyCommand(0, 'x', Util.C.keyExpandAllMessages()) {
+ @Override
+ public void onKeyPress(KeyPressEvent event) {
+ onExpandAll(null);
+ }
+ });
+ keysAction.add(new KeyCommand(0, 'z', Util.C.keyCollapseAllMessages()) {
+ @Override
+ public void onKeyPress(KeyPressEvent event) {
+ onCollapseAll(null);
+ }
+ });
+ keysAction.add(new KeyCommand(0, 's', Util.C.changeTableStar()) {
+ @Override
+ public void onKeyPress(KeyPressEvent event) {
+ if (Gerrit.isSignedIn()) {
+ star.setValue(!star.getValue(), true);
+ } else {
+ Gerrit.doSignIn(getToken());
+ }
+ }
+ });
+ keysAction.add(new KeyCommand(0, 'c', Util.C.keyAddReviewers()) {
+ @Override
+ public void onKeyPress(KeyPressEvent event) {
+ if (Gerrit.isSignedIn()) {
+ reviewers.onOpenForm();
+ } else {
+ Gerrit.doSignIn(getToken());
+ }
+ }
+ });
+ keysAction.add(new KeyCommand(0, 't', Util.C.keyEditTopic()) {
+ @Override
+ public void onKeyPress(KeyPressEvent event) {
+ if (Gerrit.isSignedIn()) {
+ if (topic.canEdit()) {
+ topic.onEdit();
+ }
+ } else {
+ Gerrit.doSignIn(getToken());
+ }
+ }
+ });
handlers.add(GlobalKey.add(this, keysAction));
files.registerKeys();
}
@@ -806,6 +830,7 @@
commentLinkProcessor = result.getCommentLinkProcessor();
setTheme(result.getTheme());
renderChangeInfo(info);
+ loadRevisionInfo();
}
}));
}
@@ -933,7 +958,6 @@
private void loadSubmitType(final Change.Status status, final boolean canSubmit) {
if (canSubmit) {
- actions.setSubmitEnabled();
if (status == Change.Status.NEW) {
statusText.setInnerText(Util.C.readyToSubmit());
}
@@ -1043,19 +1067,7 @@
private void renderChangeInfo(ChangeInfo info) {
changeInfo = info;
lastDisplayedUpdate = info.updated();
- RevisionInfo revisionInfo = info.revision(revision);
- boolean current = info.status().isOpen()
- && revision.equals(info.current_revision())
- && !revisionInfo.is_edit();
- if (revisionInfo.is_edit()) {
- statusText.setInnerText(Util.C.changeEdit());
- } else if (!current && info.status() == Change.Status.NEW) {
- statusText.setInnerText(Util.C.notCurrent());
- labels.setVisible(false);
- } else {
- statusText.setInnerText(Util.toLongString(info.status()));
- }
labels.set(info);
renderOwner(info);
@@ -1064,7 +1076,6 @@
initReplyButton(info, revision);
initIncludedInAction(info);
initChangeAction(info);
- initRevisionsAction(info, revision);
initDownloadAction(info, revision);
initProjectLinks(info);
initBranchLink(info);
@@ -1084,17 +1095,44 @@
setVisible(hashtagTableRow, false);
}
+ StringBuilder sb = new StringBuilder();
+ sb.append(Util.M.changeScreenTitleId(info.id_abbreviated()));
+ if (info.subject() != null) {
+ sb.append(": ");
+ sb.append(info.subject());
+ }
+ setWindowTitle(sb.toString());
+
+ // Properly render revision actions initially while waiting for
+ // the callback to populate them correctly.
+ NativeMap<ActionInfo> emptyMap = NativeMap.<ActionInfo> create();
+ initRevisionsAction(info, revision, emptyMap);
+ quickApprove.setVisible(false);
+ setVisible(strategy, false);
+ actions.reloadRevisionActions(emptyMap);
+ }
+
+ private void renderRevisionInfo(ChangeInfo info,
+ NativeMap<ActionInfo> actionMap) {
+ RevisionInfo revisionInfo = info.revision(revision);
+ boolean current = info.status().isOpen()
+ && revision.equals(info.current_revision())
+ && !revisionInfo.is_edit();
+
+ if (revisionInfo.is_edit()) {
+ statusText.setInnerText(Util.C.changeEdit());
+ } else if (!current && info.status() == Change.Status.NEW) {
+ statusText.setInnerText(Util.C.notCurrent());
+ labels.setVisible(false);
+ } else {
+ statusText.setInnerText(Util.toLongString(info.status()));
+ }
+
+ initRevisionsAction(info, revision, actionMap);
+
if (Gerrit.isSignedIn()) {
replyAction = new ReplyAction(info, revision,
style, commentLinkProcessor, reply, quickApprove);
- if (topic.canEdit()) {
- keysAction.add(new KeyCommand(0, 't', Util.C.keyEditTopic()) {
- @Override
- public void onKeyPress(KeyPressEvent event) {
- topic.onEdit();
- }
- });
- }
}
history.set(commentLinkProcessor, replyAction, changeId, info);
@@ -1105,14 +1143,7 @@
quickApprove.setVisible(false);
setVisible(strategy, false);
}
-
- StringBuilder sb = new StringBuilder();
- sb.append(Util.M.changeScreenTitleId(info.id_abbreviated()));
- if (info.subject() != null) {
- sb.append(": ");
- sb.append(info.subject());
- }
- setWindowTitle(sb.toString());
+ actions.reloadRevisionActions(actionMap);
}
private void renderOwner(ChangeInfo info) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DeleteFileAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DeleteFileAction.java
index ee94564..ce17013 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DeleteFileAction.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DeleteFileAction.java
@@ -1,16 +1,16 @@
-//Copyright (C) 2015 The Android Open Source Project
+// Copyright (C) 2015 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
+// 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
+// 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.
+// 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.
package com.google.gerrit.client.change;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DeleteFileBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DeleteFileBox.java
index e55b7ed..aa2b6f0 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DeleteFileBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DeleteFileBox.java
@@ -1,16 +1,16 @@
-//Copyright (C) 2015 The Android Open Source Project
+// Copyright (C) 2015 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
+// 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
+// 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.
+// 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.
package com.google.gerrit.client.change;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Labels.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Labels.java
index a416894..0a02b48 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Labels.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Labels.java
@@ -115,7 +115,8 @@
private Widget renderUsers(LabelInfo label) {
Map<Integer, List<ApprovalInfo>> m = new HashMap<>(4);
- int approved = 0, rejected = 0;
+ int approved = 0;
+ int rejected = 0;
for (ApprovalInfo ai : Natives.asList(label.all())) {
if (ai.value() != 0) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/QuickApprove.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/QuickApprove.java
index 6638dbe..d66b84d 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/QuickApprove.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/QuickApprove.java
@@ -101,6 +101,7 @@
input.label(qName, qValue);
replyAction = action;
setText(qName + qValueStr);
+ setVisible(true);
} else {
setVisible(false);
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChanges.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChanges.java
index 0c91abc..0c78a67 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChanges.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChanges.java
@@ -55,8 +55,6 @@
String current();
String gitweb();
String indirect();
- String abandoned();
- String merged();
String notCurrent();
String pointer();
String row();
@@ -349,13 +347,6 @@
}
public final native String id() /*-{ return this.change_id }-*/;
-
- public final Change.Status status() {
- String s = statusRaw();
- return s != null ? Change.Status.valueOf(s) : null;
- }
- private final native String statusRaw() /*-{ return this.status; }-*/;
-
public final native CommitInfo commit() /*-{ return this.commit }-*/;
final native String branch() /*-{ return this.branch }-*/;
final native String project() /*-{ return this.project }-*/;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChangesTab.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChangesTab.java
index 492f30a..8277de6 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChangesTab.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChangesTab.java
@@ -20,7 +20,6 @@
import com.google.gerrit.client.changes.ChangeInfo.CommitInfo;
import com.google.gerrit.client.changes.Util;
import com.google.gerrit.common.PageLinks;
-import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JsArray;
@@ -69,7 +68,8 @@
AbstractImagePrototype.create(Gerrit.RESOURCES.arrowRight()).getSafeHtml();
private static final native String init(String o) /*-{
- $wnd[o] = $entry(@com.google.gerrit.client.change.RelatedChangesTab::onOpen(Lcom/google/gwt/dom/client/NativeEvent;Lcom/google/gwt/dom/client/Element;));
+ $wnd[o] = $entry(@com.google.gerrit.client.change.RelatedChangesTab::onOpen(
+ Lcom/google/gwt/dom/client/NativeEvent;Lcom/google/gwt/dom/client/Element;));
return o + '(event,this)';
}-*/;
@@ -310,14 +310,6 @@
sb.setStyleName(RelatedChanges.R.css().notCurrent());
sb.setAttribute("title", Util.C.notCurrent());
sb.append('\u25CF');
- } else if (Change.Status.MERGED == info.status()) {
- sb.setStyleName(RelatedChanges.R.css().merged());
- sb.setAttribute("title", Resources.C.merged());
- sb.append('\u25CF');
- } else if (Change.Status.ABANDONED == info.status()) {
- sb.setStyleName(RelatedChanges.R.css().abandoned());
- sb.setAttribute("title", Resources.C.abandoned());
- sb.append('\u25CF');
} else {
sb.setStyleName(RelatedChanges.R.css().current());
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RenameFileAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RenameFileAction.java
index 1f11e65..d4b6c42 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RenameFileAction.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RenameFileAction.java
@@ -1,16 +1,16 @@
-//Copyright (C) 2015 The Android Open Source Project
+// Copyright (C) 2015 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
+// 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
+// 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.
+// 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.
package com.google.gerrit.client.change;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RenameFileBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RenameFileBox.java
index 77348f7..d6ab9ae 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RenameFileBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RenameFileBox.java
@@ -1,16 +1,16 @@
-//Copyright (C) 2015 The Android Open Source Project
+// Copyright (C) 2015 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
+// 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
+// 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.
+// 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.
package com.google.gerrit.client.change;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/related_changes.css b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/related_changes.css
index 4d103ae..2e62b98 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/related_changes.css
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/related_changes.css
@@ -68,8 +68,6 @@
.current,
.gitweb,
.indirect,
-.abandoned,
-.merged,
.notCurrent {
display: inline-block;
text-align: center;
@@ -77,7 +75,6 @@
width: 12px;
}
-.merged,
.gitweb {
color: #000;
}
@@ -87,10 +84,6 @@
font-weight: bold;
}
-.abandoned {
- color: #900; /* dark red */
-}
-
.notCurrent {
color: #FFA62F; /* orange */
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AccountDashboardScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AccountDashboardScreen.java
index d9e9878..2b8dbc9 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AccountDashboardScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AccountDashboardScreen.java
@@ -144,7 +144,9 @@
@Override
public int compare(ChangeInfo a, ChangeInfo b) {
int cmp = a.created().compareTo(b.created());
- if (cmp != 0) return cmp;
+ if (cmp != 0) {
+ return cmp;
+ }
return a._number() - b._number();
}
};
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeApi.java
index 98595e7..1135491 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeApi.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeApi.java
@@ -95,6 +95,13 @@
return call(id, "detail");
}
+ public static RestApi actions(int id, String revision) {
+ if (revision == null || revision.equals("")) {
+ revision = "current";
+ }
+ return call(id, revision, "actions");
+ }
+
public static void edit(int id, AsyncCallback<EditInfo> cb) {
edit(id).get(cb);
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentBox.java
index ca56bf4..0e85a2f 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentBox.java
@@ -1,4 +1,4 @@
-//Copyright (C) 2013 The Android Open Source Project
+// Copyright (C) 2013 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.
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentManager.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentManager.java
index 514a3be..7dc6c24b9 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentManager.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentManager.java
@@ -391,7 +391,8 @@
return w;
}
- int lineA, lineB;
+ int lineA;
+ int lineB;
if (line == 0) {
lineA = lineB = 0;
} else if (side == DisplaySide.A) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffChunkInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffChunkInfo.java
index 9b3ac38..1e5c5e5 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffChunkInfo.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffChunkInfo.java
@@ -1,4 +1,4 @@
-//Copyright (C) 2013 The Android Open Source Project
+// Copyright (C) 2013 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.
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java
index 1105476..243ce4d 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java
@@ -1,4 +1,4 @@
-//Copyright (C) 2013 The Android Open Source Project
+// Copyright (C) 2013 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.
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DraftBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DraftBox.java
index 5bf56c2..d7b528c 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DraftBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DraftBox.java
@@ -1,4 +1,4 @@
-//Copyright (C) 2013 The Android Open Source Project
+// Copyright (C) 2013 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.
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/InsertCommentBubble.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/InsertCommentBubble.java
index 7287a65..7c8bc21 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/InsertCommentBubble.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/InsertCommentBubble.java
@@ -1,4 +1,4 @@
-//Copyright (C) 2014 The Android Open Source Project
+// Copyright (C) 2014 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.
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PatchSetSelectBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PatchSetSelectBox.java
index aed2218..bbc5830 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PatchSetSelectBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PatchSetSelectBox.java
@@ -1,4 +1,4 @@
-//Copyright (C) 2013 The Android Open Source Project
+// Copyright (C) 2013 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.
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PublishedBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PublishedBox.java
index 7d74c2b..a32d7b8 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PublishedBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PublishedBox.java
@@ -1,4 +1,4 @@
-//Copyright (C) 2013 The Android Open Source Project
+// Copyright (C) 2013 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.
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SkipBar.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SkipBar.java
index 4c12cc0..258eec6 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SkipBar.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SkipBar.java
@@ -1,4 +1,4 @@
-//Copyright (C) 2013 The Android Open Source Project
+// Copyright (C) 2013 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.
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SkipManager.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SkipManager.java
index 4972f5d..a344e6b 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SkipManager.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SkipManager.java
@@ -45,7 +45,8 @@
JsArray<Region> regions = diff.content();
List<SkippedLine> skips = new ArrayList<>();
- int lineA = 0, lineB = 0;
+ int lineA = 0;
+ int lineB = 0;
for (int i = 0; i < regions.length(); i++) {
Region current = regions.get(i);
if (current.ab() != null || current.common() || current.skip() > 0) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/gerrit.css b/gerrit-gwtui/src/main/java/com/google/gerrit/client/gerrit.css
index 8d961ca..7995eeb 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/gerrit.css
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/gerrit.css
@@ -297,13 +297,22 @@
white-space: nowrap;
display: inline;
}
-.searchPanel .gwt-TextBox {
+.searchPanel .searchTextBox {
font-size: 9pt;
+ margin: 5.286px 3px 0 0;
}
-.searchPanel .gwt-Button {
- font-size: 9pt;
- margin-left: 2px;
- padding: 3px 6px;
+.searchPanel .searchButton {
+ text-align: center;
+ font-size: 8pt;
+ font-weight: bold;
+ cursor: pointer;
+ border: 2px solid;
+ color: #FFF;
+ border-color: rgba(0, 0, 0, 0.15);
+ height: 14px;
+ background-color: #20CA60;
+ -webkit-border-radius: 2px;
+ -webkit-box-sizing: content-box;
}
.suggestBoxPopup {
z-index: 200;
@@ -345,7 +354,7 @@
opacity: 0.80;
}
}
-@if user.agent ie6 ie8 {
+@if user.agent ie8 {
/* IE just doesn't do opacity the way we want, make our dialog
* stand out in a way that it can't be missed against the page
*/
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/AbstractPatchContentTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/AbstractPatchContentTable.java
index efeb2ec..63823ea 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/AbstractPatchContentTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/AbstractPatchContentTable.java
@@ -1,4 +1,4 @@
-//Copyright (C) 2008 The Android Open Source Project
+// Copyright (C) 2008 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.
@@ -546,7 +546,7 @@
private CommentEditorPanel findOrCreateCommentEditor(final int suggestRow,
final int column, final PatchLineComment newComment, final boolean create) {
int row = suggestRow;
- int spans[] = new int[column + 1];
+ int[] spans = new int[column + 1];
FIND_ROW: while (row < table.getRowCount()) {
int col = 0;
for (int cell = 0; row < table.getRowCount()
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/NavLinks.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/NavLinks.java
index 2a04c38..352ade7 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/NavLinks.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/NavLinks.java
@@ -54,7 +54,7 @@
private final KeyCommandSet keys;
private final Grid table;
- private KeyCommand cmds[] = new KeyCommand[2];
+ private KeyCommand[] cmds = new KeyCommand[2];
NavLinks(KeyCommandSet kcs, PatchSet.Id forPatch) {
patchSetId = forPatch;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImplIE6.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImplIE8.java
similarity index 96%
rename from gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImplIE6.java
rename to gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImplIE8.java
index 59feba8..76ad0e7 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImplIE6.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImplIE8.java
@@ -21,7 +21,7 @@
import com.google.gwtexpui.safehtml.client.SafeHtml;
import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
-public class FancyFlexTableImplIE6 extends FancyFlexTableImpl {
+public class FancyFlexTableImplIE8 extends FancyFlexTableImpl {
@Override
public void resetHtml(final FlexTable myTable, final SafeHtml bodyHtml) {
final Element oldBody = getBodyElement(myTable);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectsTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectsTable.java
index 6637957..bb55b69 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectsTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectsTable.java
@@ -65,8 +65,9 @@
}
public void displaySubset(ProjectMap projects, int fromIndex, int toIndex) {
- while (1 < table.getRowCount())
+ while (1 < table.getRowCount()) {
table.removeRow(table.getRowCount() - 1);
+ }
List<ProjectInfo> list = Natives.asList(projects.values());
Collections.sort(list, new Comparator<ProjectInfo>() {
@@ -75,8 +76,9 @@
return a.name().compareTo(b.name());
}
});
- for(ProjectInfo p : list.subList(fromIndex, toIndex))
+ for (ProjectInfo p : list.subList(fromIndex, toIndex)) {
insert(table.getRowCount(), p);
+ }
finishDisplay();
}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitWebConfig.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitWebConfig.java
index 9d47977..7dc0c17 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitWebConfig.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitWebConfig.java
@@ -14,6 +14,9 @@
package com.google.gerrit.httpd;
+import static java.nio.file.Files.isExecutable;
+import static java.nio.file.Files.isRegularFile;
+
import com.google.gerrit.common.data.GitWebType;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.SitePaths;
@@ -23,16 +26,17 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
public class GitWebConfig {
private static final Logger log = LoggerFactory.getLogger(GitWebConfig.class);
private final String url;
- private final File gitweb_cgi;
- private final File gitweb_css;
- private final File gitweb_js;
- private final File git_logo_png;
+ private final Path gitweb_cgi;
+ private final Path gitweb_css;
+ private final Path gitweb_js;
+ private final Path git_logo_png;
private GitWebType type;
@Inject
@@ -117,20 +121,20 @@
return;
}
- final File pkgCgi = new File("/usr/lib/cgi-bin/gitweb.cgi");
+ final Path pkgCgi = Paths.get("/usr/lib/cgi-bin/gitweb.cgi");
String[] resourcePaths = {"/usr/share/gitweb/static", "/usr/share/gitweb",
"/var/www/static", "/var/www"};
- File cgi;
+ Path cgi;
if (cfgCgi != null) {
// Use the CGI script configured by the administrator, failing if it
// cannot be used as specified.
//
cgi = sitePaths.resolve(cfgCgi);
- if (!cgi.isFile()) {
+ if (!isRegularFile(cgi)) {
throw new IllegalStateException("Cannot find gitweb.cgi: " + cgi);
}
- if (!cgi.canExecute()) {
+ if (!isExecutable(cgi)) {
throw new IllegalStateException("Cannot execute gitweb.cgi: " + cgi);
}
@@ -138,11 +142,11 @@
// Assume the administrator pointed us to the distribution,
// which also has the corresponding CSS and logo file.
//
- String absPath = cgi.getParentFile().getAbsolutePath();
+ String absPath = cgi.getParent().toAbsolutePath().toString();
resourcePaths = new String[] {absPath + "/static", absPath};
}
- } else if (pkgCgi.isFile() && pkgCgi.canExecute()) {
+ } else if (isRegularFile(pkgCgi) && isExecutable(pkgCgi)) {
// Use the OS packaged CGI.
//
log.debug("Assuming gitweb at " + pkgCgi);
@@ -154,13 +158,15 @@
resourcePaths = new String[] {};
}
- File css = null, js = null, logo = null;
+ Path css = null;
+ Path js = null;
+ Path logo = null;
for (String path : resourcePaths) {
- File dir = new File(path);
- css = new File(dir, "gitweb.css");
- js = new File(dir, "gitweb.js");
- logo = new File(dir, "git-logo.png");
- if (css.isFile() && logo.isFile()) {
+ Path dir = Paths.get(path);
+ css = dir.resolve("gitweb.css");
+ js = dir.resolve("gitweb.js");
+ logo = dir.resolve("git-logo.png");
+ if (isRegularFile(css) && isRegularFile(logo)) {
break;
}
}
@@ -191,22 +197,22 @@
}
/** @return local path to the CGI executable; null if we shouldn't execute. */
- public File getGitwebCGI() {
+ public Path getGitwebCGI() {
return gitweb_cgi;
}
/** @return local path of the {@code gitweb.css} matching the CGI. */
- public File getGitwebCSS() {
+ public Path getGitwebCSS() {
return gitweb_css;
}
/** @return local path of the {@code gitweb.js} for the CGI. */
- public File getGitwebJS() {
+ public Path getGitwebJS() {
return gitweb_js;
}
/** @return local path of the {@code git-logo.png} for the CGI. */
- public File getGitLogoPNG() {
+ public Path getGitLogoPNG() {
return git_logo_png;
}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HtmlDomUtil.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HtmlDomUtil.java
index 1a2d3f6..1eb88b1 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HtmlDomUtil.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HtmlDomUtil.java
@@ -14,6 +14,8 @@
package com.google.gerrit.httpd;
+import com.google.common.io.ByteStreams;
+
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
@@ -21,14 +23,14 @@
import org.xml.sax.SAXException;
import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
-import java.io.InputStreamReader;
import java.io.StringWriter;
-import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
import java.util.zip.GZIPOutputStream;
import javax.xml.parsers.DocumentBuilder;
@@ -36,7 +38,6 @@
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
@@ -49,21 +50,21 @@
/** Utility functions to deal with HTML using W3C DOM operations. */
public class HtmlDomUtil {
/** Standard character encoding we prefer (UTF-8). */
- public static final String ENC = "UTF-8";
+ public static final Charset ENC = StandardCharsets.UTF_8;
/** DOCTYPE for a standards mode HTML document. */
public static final String HTML_STRICT =
"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd";
/** Convert a document to a UTF-8 byte sequence. */
- public static byte[] toUTF8(final Document hostDoc) throws IOException {
+ public static byte[] toUTF8(Document hostDoc) throws IOException {
return toString(hostDoc).getBytes(ENC);
}
/** Compress the document. */
- public static byte[] compress(final byte[] raw) throws IOException {
- final ByteArrayOutputStream out = new ByteArrayOutputStream();
- final GZIPOutputStream gz = new GZIPOutputStream(out);
+ public static byte[] compress(byte[] raw) throws IOException {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ GZIPOutputStream gz = new GZIPOutputStream(out);
gz.write(raw);
gz.finish();
gz.flush();
@@ -71,43 +72,39 @@
}
/** Convert a document to a String, assuming later encoding to UTF-8. */
- public static String toString(final Document hostDoc) throws IOException {
+ public static String toString(Document hostDoc) throws IOException {
try {
- final StringWriter out = new StringWriter();
- final DOMSource domSource = new DOMSource(hostDoc);
- final StreamResult streamResult = new StreamResult(out);
- final TransformerFactory tf = TransformerFactory.newInstance();
- final Transformer serializer = tf.newTransformer();
- serializer.setOutputProperty(OutputKeys.ENCODING, ENC);
+ StringWriter out = new StringWriter();
+ DOMSource domSource = new DOMSource(hostDoc);
+ StreamResult streamResult = new StreamResult(out);
+ TransformerFactory tf = TransformerFactory.newInstance();
+ Transformer serializer = tf.newTransformer();
+ serializer.setOutputProperty(OutputKeys.ENCODING, ENC.name());
serializer.setOutputProperty(OutputKeys.METHOD, "html");
serializer.setOutputProperty(OutputKeys.INDENT, "no");
serializer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,
HtmlDomUtil.HTML_STRICT);
serializer.transform(domSource, streamResult);
return out.toString();
- } catch (TransformerConfigurationException e) {
- final IOException r = new IOException("Error transforming page");
- r.initCause(e);
- throw r;
} catch (TransformerException e) {
- final IOException r = new IOException("Error transforming page");
+ IOException r = new IOException("Error transforming page");
r.initCause(e);
throw r;
}
}
/** Find an element by its "id" attribute; null if no element is found. */
- public static Element find(final Node parent, final String name) {
- final NodeList list = parent.getChildNodes();
+ public static Element find(Node parent, String name) {
+ NodeList list = parent.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
- final Node n = list.item(i);
+ Node n = list.item(i);
if (n instanceof Element) {
- final Element e = (Element) n;
+ Element e = (Element) n;
if (name.equals(e.getAttribute("id"))) {
return e;
}
}
- final Element r = find(n, name);
+ Element r = find(n, name);
if (r != null) {
return r;
}
@@ -116,9 +113,8 @@
}
/** Append an HTML <input type="hidden"> to the form. */
- public static void addHidden(final Element form, final String name,
- final String value) {
- final Element in = form.getOwnerDocument().createElement("input");
+ public static void addHidden(Element form, String name, String value) {
+ Element in = form.getOwnerDocument().createElement("input");
in.setAttribute("type", "hidden");
in.setAttribute("name", name);
in.setAttribute("value", value);
@@ -135,51 +131,38 @@
}
/** Clone a document so it can be safely modified on a per-request basis. */
- public static Document clone(final Document doc) throws IOException {
- final Document d;
+ public static Document clone(Document doc) throws IOException {
+ Document d;
try {
d = newBuilder().newDocument();
} catch (ParserConfigurationException e) {
throw new IOException("Cannot clone document");
}
- final Node n = d.importNode(doc.getDocumentElement(), true);
+ Node n = d.importNode(doc.getDocumentElement(), true);
d.appendChild(n);
return d;
}
/** Parse an XHTML file from our CLASSPATH and return the instance. */
- public static Document parseFile(final Class<?> context, final String name)
+ public static Document parseFile(Class<?> context, String name)
throws IOException {
- final InputStream in;
-
- in = context.getResourceAsStream(name);
- if (in == null) {
- return null;
- }
- try {
- try {
- try {
- final Document doc = newBuilder().parse(in);
- compact(doc);
- return doc;
- } catch (SAXException e) {
- throw new IOException("Error reading " + name, e);
- } catch (ParserConfigurationException e) {
- throw new IOException("Error reading " + name, e);
- }
- } finally {
- in.close();
+ try (InputStream in = context.getResourceAsStream(name)) {
+ if (in == null) {
+ return null;
}
- } catch (IOException e) {
+ Document doc = newBuilder().parse(in);
+ compact(doc);
+ return doc;
+ } catch (SAXException | ParserConfigurationException | IOException e) {
throw new IOException("Error reading " + name, e);
}
}
- private static void compact(final Document doc) {
+ private static void compact(Document doc) {
try {
- final String expr = "//text()[normalize-space(.) = '']";
- final XPathFactory xp = XPathFactory.newInstance();
- final XPathExpression e = xp.newXPath().compile(expr);
+ String expr = "//text()[normalize-space(.) = '']";
+ XPathFactory xp = XPathFactory.newInstance();
+ XPathExpression e = xp.newXPath().compile(expr);
NodeList empty = (NodeList) e.evaluate(doc, XPathConstants.NODESET);
for (int i = 0; i < empty.getLength(); i++) {
Node node = empty.item(i);
@@ -191,78 +174,50 @@
}
/** Read a Read a UTF-8 text file from our CLASSPATH and return it. */
- public static String readFile(final Class<?> context, final String name)
+ public static String readFile(Class<?> context, String name)
throws IOException {
- final InputStream in = context.getResourceAsStream(name);
- if (in == null) {
- return null;
- }
- try {
- return asString(in);
+ try (InputStream in = context.getResourceAsStream(name)) {
+ if (in == null) {
+ return null;
+ }
+ return new String(ByteStreams.toByteArray(in), ENC);
} catch (IOException e) {
throw new IOException("Error reading " + name, e);
}
}
/** Parse an XHTML file from the local drive and return the instance. */
- public static Document parseFile(final File path) throws IOException {
- try {
- final InputStream in = new FileInputStream(path);
- try {
- try {
- final Document doc = newBuilder().parse(in);
- compact(doc);
- return doc;
- } catch (SAXException e) {
- throw new IOException("Error reading " + path, e);
- } catch (ParserConfigurationException e) {
- throw new IOException("Error reading " + path, e);
- }
- } finally {
- in.close();
- }
- } catch (FileNotFoundException e) {
+ public static Document parseFile(Path path) throws IOException {
+ try (InputStream in = Files.newInputStream(path)) {
+ Document doc = newBuilder().parse(in);
+ compact(doc);
+ return doc;
+ } catch (NoSuchFileException e) {
return null;
- } catch (IOException e) {
+ } catch (SAXException | ParserConfigurationException | IOException e) {
throw new IOException("Error reading " + path, e);
}
}
/** Read a UTF-8 text file from the local drive. */
- public static String readFile(final File parentDir, final String name)
+ public static String readFile(Path parentDir, String name)
throws IOException {
if (parentDir == null) {
return null;
}
- final File path = new File(parentDir, name);
- try {
- return asString(new FileInputStream(path));
- } catch (FileNotFoundException e) {
+ Path path = parentDir.resolve(name);
+ try (InputStream in = Files.newInputStream(path)) {
+ return new String(ByteStreams.toByteArray(in), ENC);
+ } catch (NoSuchFileException e) {
return null;
} catch (IOException e) {
throw new IOException("Error reading " + path, e);
}
}
- private static String asString(final InputStream in)
- throws UnsupportedEncodingException, IOException {
- try {
- final StringBuilder w = new StringBuilder();
- final InputStreamReader r = new InputStreamReader(in, ENC);
- final char[] buf = new char[512];
- int n;
- while ((n = r.read(buf)) > 0) {
- w.append(buf, 0, n);
- }
- return w.toString();
- } finally {
- in.close();
- }
- }
-
private static DocumentBuilder newBuilder()
throws ParserConfigurationException {
- final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
factory.setExpandEntityReferences(false);
factory.setIgnoringComments(true);
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectDigestFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectDigestFilter.java
index 12de344..33b9fed 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectDigestFilter.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectDigestFilter.java
@@ -260,8 +260,12 @@
} else {
int space = auth.indexOf(' ', eq + 1);
int comma = auth.indexOf(',', eq + 1);
- if (space < 0) space = auth.length();
- if (comma < 0) comma = auth.length();
+ if (space < 0) {
+ space = auth.length();
+ }
+ if (comma < 0) {
+ comma = auth.length();
+ }
final int e = Math.min(space, comma);
value = auth.substring(eq + 1, e);
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java
index b8a8092..ed84caf 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java
@@ -104,7 +104,7 @@
throw new ServletException(e);
}
rsp.setContentType("text/html");
- rsp.setCharacterEncoding(HtmlDomUtil.ENC);
+ rsp.setCharacterEncoding(HtmlDomUtil.ENC.name());
rsp.setContentLength(raw.length);
final OutputStream out = rsp.getOutputStream();
try {
@@ -138,7 +138,7 @@
} else {
rsp.setContentType("text/html");
- rsp.setCharacterEncoding(HtmlDomUtil.ENC);
+ rsp.setCharacterEncoding(HtmlDomUtil.ENC.name());
final Writer out = rsp.getWriter();
out.write("<html>");
out.write("<body>");
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java
index 19c8342..b5400b2 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java
@@ -110,7 +110,7 @@
CacheHeaders.setNotCacheable(rsp);
rsp.setContentType("text/html");
- rsp.setCharacterEncoding(HtmlDomUtil.ENC);
+ rsp.setCharacterEncoding(HtmlDomUtil.ENC.name());
rsp.setContentLength(tosend.length);
final OutputStream out = rsp.getOutputStream();
try {
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertLoginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertLoginServlet.java
index 8652ef0..4c7ce7b 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertLoginServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertLoginServlet.java
@@ -1,4 +1,4 @@
-//Copyright (C) 2011 The Android Open Source Project
+// Copyright (C) 2011 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.
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitLogoServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitLogoServlet.java
index 41aa552..3396f2b 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitLogoServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitLogoServlet.java
@@ -14,16 +14,19 @@
package com.google.gerrit.httpd.gitweb;
+import static com.google.gerrit.common.FileUtil.lastModified;
+
+import com.google.common.io.ByteStreams;
import com.google.gerrit.httpd.GitWebConfig;
import com.google.gwtexpui.server.CacheHeaders;
import com.google.inject.Inject;
import com.google.inject.Singleton;
-import org.eclipse.jgit.util.IO;
-
-import java.io.File;
-import java.io.FileNotFoundException;
import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
import java.util.concurrent.TimeUnit;
import javax.servlet.ServletOutputStream;
@@ -38,16 +41,16 @@
private final byte[] raw;
@Inject
- GitLogoServlet(final GitWebConfig gitWebConfig) throws IOException {
+ GitLogoServlet(GitWebConfig gitWebConfig) throws IOException {
byte[] png;
- final File src = gitWebConfig.getGitLogoPNG();
+ Path src = gitWebConfig.getGitLogoPNG();
if (src != null) {
- try {
- png = IO.readFully(src);
- } catch (FileNotFoundException e) {
+ try (InputStream in = Files.newInputStream(src)) {
+ png = ByteStreams.toByteArray(in);
+ } catch (NoSuchFileException e) {
png = null;
}
- modified = src.lastModified();
+ modified = lastModified(src);
} else {
modified = -1;
png = null;
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitWebCssServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitWebCssServlet.java
index 4a39b97..5625334 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitWebCssServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitWebCssServlet.java
@@ -14,6 +14,8 @@
package com.google.gerrit.httpd.gitweb;
+import static com.google.gerrit.common.FileUtil.lastModified;
+
import com.google.gerrit.httpd.GitWebConfig;
import com.google.gerrit.httpd.HtmlDomUtil;
import com.google.gerrit.server.config.SitePaths;
@@ -22,8 +24,8 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
-import java.io.File;
import java.io.IOException;
+import java.nio.file.Path;
import java.util.concurrent.TimeUnit;
import javax.servlet.ServletOutputStream;
@@ -55,14 +57,14 @@
private final byte[] raw_css;
private final byte[] gz_css;
- GitWebCssServlet(final File src)
+ GitWebCssServlet(final Path src)
throws IOException {
if (src != null) {
- final File dir = src.getParentFile();
- final String name = src.getName();
+ final Path dir = src.getParent();
+ final String name = src.getFileName().toString();
final String raw = HtmlDomUtil.readFile(dir, name);
if (raw != null) {
- modified = src.lastModified();
+ modified = lastModified(src);
raw_css = raw.getBytes(ENC);
gz_css = HtmlDomUtil.compress(raw_css);
} else {
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitWebJavaScriptServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitWebJavaScriptServlet.java
index d71732a..6926afd 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitWebJavaScriptServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitWebJavaScriptServlet.java
@@ -14,16 +14,19 @@
package com.google.gerrit.httpd.gitweb;
+import static com.google.gerrit.common.FileUtil.lastModified;
+
+import com.google.common.io.ByteStreams;
import com.google.gerrit.httpd.GitWebConfig;
import com.google.gwtexpui.server.CacheHeaders;
import com.google.inject.Inject;
import com.google.inject.Singleton;
-import org.eclipse.jgit.util.IO;
-
-import java.io.File;
-import java.io.FileNotFoundException;
import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
import java.util.concurrent.TimeUnit;
import javax.servlet.ServletOutputStream;
@@ -40,14 +43,14 @@
@Inject
GitWebJavaScriptServlet(final GitWebConfig gitWebConfig) throws IOException {
byte[] png;
- final File src = gitWebConfig.getGitwebJS();
+ Path src = gitWebConfig.getGitwebJS();
if (src != null) {
- try {
- png = IO.readFully(src);
- } catch (FileNotFoundException e) {
+ try (InputStream in = Files.newInputStream(src)) {
+ png = ByteStreams.toByteArray(in);
+ } catch (NoSuchFileException e) {
png = null;
}
- modified = src.lastModified();
+ modified = lastModified(src);
} else {
modified = -1;
png = null;
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitWebServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitWebServlet.java
index 32fbe96..fd8d3b4 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitWebServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitWebServlet.java
@@ -29,6 +29,8 @@
package com.google.gerrit.httpd.gitweb;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.common.data.GerritConfig;
import com.google.gerrit.extensions.restapi.Url;
@@ -55,7 +57,6 @@
import java.io.BufferedReader;
import java.io.EOFException;
import java.io.File;
-import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -63,6 +64,8 @@
import java.io.PrintWriter;
import java.net.URI;
import java.net.URISyntaxException;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
@@ -84,7 +87,7 @@
private final Set<String> deniedActions;
private final int bufferSize = 8192;
- private final File gitwebCgi;
+ private final Path gitwebCgi;
private final URI gitwebUrl;
private final LocalDiskRepositoryManager repoManager;
private final ProjectControl.Factory projectControl;
@@ -145,26 +148,28 @@
private void makeSiteConfig(final SitePaths site,
final GerritConfig gerritConfig) throws IOException {
- if (!site.tmp_dir.exists()) {
- site.tmp_dir.mkdirs();
+ if (!Files.exists(site.tmp_dir)) {
+ Files.createDirectories(site.tmp_dir);
}
- File myconf = File.createTempFile("gitweb_config", ".perl", site.tmp_dir);
+ Path myconf = Files.createTempFile(site.tmp_dir, "gitweb_config", ".perl");
// To make our configuration file only readable or writable by us;
// this reduces the chances of someone tampering with the file.
//
- myconf.setWritable(false, false /* all */);
- myconf.setReadable(false, false /* all */);
- myconf.setExecutable(false, false /* all */);
+ // TODO(dborowitz): Is there a portable way to do this with NIO?
+ File myconfFile = myconf.toFile();
+ myconfFile.setWritable(false, false /* all */);
+ myconfFile.setReadable(false, false /* all */);
+ myconfFile.setExecutable(false, false /* all */);
- myconf.setWritable(true, true /* owner only */);
- myconf.setReadable(true, true /* owner only */);
+ myconfFile.setWritable(true, true /* owner only */);
+ myconfFile.setReadable(true, true /* owner only */);
_env.set("GIT_DIR", ".");
- _env.set("GITWEB_CONFIG", myconf.getAbsolutePath());
+ _env.set("GITWEB_CONFIG", myconf.toAbsolutePath().toString());
- final PrintWriter p = new PrintWriter(new FileWriter(myconf));
- try {
+ try (PrintWriter p =
+ new PrintWriter(Files.newBufferedWriter(myconf, UTF_8))) {
p.print("# Autogenerated by Gerrit Code Review \n");
p.print("# DO NOT EDIT\n");
p.print("\n");
@@ -172,12 +177,12 @@
// We are mounted at the same level in the context as the main
// UI, so we can include the same header and footer scheme.
//
- final File hdr = site.site_header;
- if (hdr.isFile()) {
+ Path hdr = site.site_header;
+ if (Files.isRegularFile(hdr)) {
p.print("$site_header = " + quoteForPerl(hdr) + ";\n");
}
- final File ftr = site.site_footer;
- if (ftr.isFile()) {
+ Path ftr = site.site_footer;
+ if (Files.isRegularFile(ftr)) {
p.print("$site_footer = " + quoteForPerl(ftr) + ";\n");
}
@@ -190,8 +195,8 @@
p.print("$logo = 'gitweb-logo.png';\n");
p.print("$javascript = 'gitweb.js';\n");
p.print("@stylesheets = ('gitweb-default.css');\n");
- final File css = site.site_css;
- if (css.isFile()) {
+ Path css = site.site_css;
+ if (Files.isRegularFile(css)) {
p.print("push @stylesheets, 'gitweb-site.css';\n");
}
@@ -292,15 +297,15 @@
// If the administrator has created a site-specific gitweb_config,
// load that before we perform any final overrides.
//
- final File sitecfg = site.site_gitweb;
- if (sitecfg.isFile()) {
+ Path sitecfg = site.site_gitweb;
+ if (Files.isRegularFile(sitecfg)) {
p.print("$GITWEB_CONFIG = " + quoteForPerl(sitecfg) + ";\n");
p.print("if (-e $GITWEB_CONFIG) {\n");
p.print(" do " + quoteForPerl(sitecfg) + ";\n");
p.print("}\n");
}
- final File root = repoManager.getBasePath();
+ Path root = repoManager.getBasePath();
p.print("$projectroot = " + quoteForPerl(root) + ";\n");
// Permit exporting only the project we were started for.
@@ -324,18 +329,16 @@
//
p.print("$feature{'forks'}{'override'} = 0;\n");
p.print("$feature{'forks'}{'default'} = [0];\n");
- } finally {
- p.close();
}
- myconf.setReadOnly();
+ myconfFile.setReadOnly();
}
- private String quoteForPerl(File value) {
- return quoteForPerl(value.getAbsolutePath());
+ private static String quoteForPerl(Path value) {
+ return quoteForPerl(value.toAbsolutePath().toString());
}
- private String quoteForPerl(String value) {
+ private static String quoteForPerl(String value) {
if (value == null || value.isEmpty()) {
return "''";
}
@@ -450,9 +453,10 @@
private void exec(final HttpServletRequest req,
final HttpServletResponse rsp, final ProjectControl project) throws IOException {
final Process proc =
- Runtime.getRuntime().exec(new String[] {gitwebCgi.getAbsolutePath()},
+ Runtime.getRuntime().exec(
+ new String[] {gitwebCgi.toAbsolutePath().toString()},
makeEnv(req, project),
- gitwebCgi.getAbsoluteFile().getParentFile());
+ gitwebCgi.toAbsolutePath().getParent().toFile());
copyStderrToLog(proc.getErrorStream());
if (0 < req.getContentLength()) {
@@ -530,7 +534,7 @@
//
env.set("REQUEST_METHOD", req.getMethod());
env.set("SCRIPT_NAME", req.getContextPath() + req.getServletPath());
- env.set("SCRIPT_FILENAME", gitwebCgi.getAbsolutePath());
+ env.set("SCRIPT_FILENAME", gitwebCgi.toAbsolutePath().toString());
env.set("SERVER_NAME", req.getServerName());
env.set("SERVER_PORT", Integer.toString(req.getServerPort()));
env.set("SERVER_PROTOCOL", req.getProtocol());
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java
index 31ff107..fd26837 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java
@@ -14,6 +14,7 @@
package com.google.gerrit.httpd.plugins;
+import static com.google.gerrit.common.FileUtil.lastModified;
import static com.google.gerrit.server.plugins.PluginEntry.ATTR_CHARACTER_ENCODING;
import static com.google.gerrit.server.plugins.PluginEntry.ATTR_CONTENT_TYPE;
@@ -24,6 +25,7 @@
import com.google.common.cache.Cache;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import com.google.common.io.ByteStreams;
import com.google.common.net.HttpHeaders;
import com.google.gerrit.extensions.registration.RegistrationHandle;
import com.google.gerrit.httpd.resources.Resource;
@@ -55,14 +57,14 @@
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
@@ -303,7 +305,7 @@
}
if (!entry.isPresent() && file.endsWith("/index.html")) {
String pfx = file.substring(0, file.length() - "index.html".length());
- long pluginLastModified = holder.plugin.getSrcFile().lastModified();
+ long pluginLastModified = lastModified(holder.plugin.getSrcFile());
if (hasUpToDateCachedResource(rsc, pluginLastModified)) {
rsc.send(req, res);
} else {
@@ -608,12 +610,12 @@
private void sendJsPlugin(Plugin plugin, PluginResourceKey key,
HttpServletRequest req, HttpServletResponse res) throws IOException {
- File pluginFile = plugin.getSrcFile();
+ Path path = plugin.getSrcFile();
if (req.getRequestURI().endsWith(getJsPluginPath(plugin))
- && pluginFile.exists()) {
- res.setHeader("Content-Length", Long.toString(pluginFile.length()));
+ && Files.exists(path)) {
+ res.setHeader("Content-Length", Long.toString(Files.size(path)));
res.setContentType("application/javascript");
- writeToResponse(res, new FileInputStream(pluginFile));
+ writeToResponse(res, Files.newInputStream(path));
} else {
resourceCache.put(key, Resource.NOT_FOUND);
Resource.NOT_FOUND.send(req, res);
@@ -621,25 +623,15 @@
}
private static String getJsPluginPath(Plugin plugin) {
- return String.format("/plugins/%s/static/%s", plugin.getName(), plugin.getSrcFile()
- .getName());
+ return String.format("/plugins/%s/static/%s", plugin.getName(),
+ plugin.getSrcFile().getFileName());
}
- private void writeToResponse(HttpServletResponse res, InputStream in)
+ private void writeToResponse(HttpServletResponse res, InputStream inputStream)
throws IOException {
- try {
- OutputStream out = res.getOutputStream();
- try {
- byte[] tmp = new byte[1024];
- int n;
- while ((n = in.read(tmp)) > 0) {
- out.write(tmp, 0, n);
- }
- } finally {
- out.close();
- }
- } finally {
- in.close();
+ try (OutputStream out = res.getOutputStream();
+ InputStream in = inputStream) {
+ ByteStreams.copy(in, out);
}
}
@@ -671,9 +663,9 @@
}
private static String getPrefix(Plugin plugin, String attr, String def) {
- File srcFile = plugin.getSrcFile();
+ Path path = plugin.getSrcFile();
PluginContentScanner scanner = plugin.getContentScanner();
- if (srcFile == null || scanner == PluginContentScanner.EMPTY) {
+ if (path == null || scanner == PluginContentScanner.EMPTY) {
return def;
}
try {
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/CatServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/CatServlet.java
index dddcd67..72fc008 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/CatServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/CatServlet.java
@@ -202,32 +202,29 @@
final RevCommit fromCommit;
final String suffix;
final String path = patchKey.getFileName();
- try {
- final ObjectReader reader = repo.newObjectReader();
- try {
- final RevWalk rw = new RevWalk(reader);
- final RevCommit c;
- final TreeWalk tw;
+ try (ObjectReader reader = repo.newObjectReader();
+ RevWalk rw = new RevWalk(reader)) {
+ final RevCommit c;
- c = rw.parseCommit(ObjectId.fromString(revision));
- if (side == 0) {
- fromCommit = c;
- suffix = "new";
+ c = rw.parseCommit(ObjectId.fromString(revision));
+ if (side == 0) {
+ fromCommit = c;
+ suffix = "new";
- } else if (1 <= side && side - 1 < c.getParentCount()) {
- fromCommit = rw.parseCommit(c.getParent(side - 1));
- if (c.getParentCount() == 1) {
- suffix = "old";
- } else {
- suffix = "old" + side;
- }
-
+ } else if (1 <= side && side - 1 < c.getParentCount()) {
+ fromCommit = rw.parseCommit(c.getParent(side - 1));
+ if (c.getParentCount() == 1) {
+ suffix = "old";
} else {
- rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
- return;
+ suffix = "old" + side;
}
- tw = TreeWalk.forPath(reader, path, fromCommit.getTree());
+ } else {
+ rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
+ return;
+ }
+
+ try (TreeWalk tw = TreeWalk.forPath(reader, path, fromCommit.getTree())) {
if (tw == null) {
rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
@@ -240,8 +237,6 @@
rsp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
return;
}
- } finally {
- reader.release();
}
} catch (IOException e) {
getServletContext().log("Cannot read repository", e);
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java
index 90c5ff4..f3895b8 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java
@@ -14,6 +14,8 @@
package com.google.gerrit.httpd.raw;
+import static com.google.gerrit.common.FileUtil.lastModified;
+
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.hash.Hasher;
@@ -30,6 +32,7 @@
import com.google.gerrit.httpd.WebSession;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.config.ConfigUtil;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.notedb.NotesMigration;
@@ -47,14 +50,15 @@
import org.w3c.dom.Element;
import org.w3c.dom.Node;
-import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.StringWriter;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.TimeUnit;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
@@ -70,6 +74,7 @@
LoggerFactory.getLogger(HostPageServlet.class);
private static final boolean IS_DEV = Boolean.getBoolean("Gerrit.GwtDevMode");
private static final String HPD_ID = "gerrit_hostpagedata";
+ private static final int DEFAULT_JS_LOAD_TIMEOUT = 5000;
private final Provider<CurrentUser> currentUser;
private final DynamicItem<WebSession> session;
@@ -84,6 +89,7 @@
private final boolean refreshHeaderFooter;
private final StaticServlet staticServlet;
private final boolean isNoteDbEnabled;
+ private final Integer pluginsLoadTimeout;
private volatile Page page;
@Inject
@@ -107,6 +113,7 @@
refreshHeaderFooter = cfg.getBoolean("site", "refreshHeaderFooter", true);
staticServlet = ss;
isNoteDbEnabled = migration.enabled();
+ pluginsLoadTimeout = getPluginsLoadTimeout(cfg);
final String pageName = "HostPage.html";
template = HtmlDomUtil.parseFile(getClass(), pageName);
@@ -154,22 +161,29 @@
page = new Page();
}
+ private static int getPluginsLoadTimeout(final Config cfg) {
+ long cfgValue =
+ ConfigUtil.getTimeUnit(cfg, "plugins", null, "jsLoadTimeout",
+ DEFAULT_JS_LOAD_TIMEOUT, TimeUnit.MILLISECONDS);
+ if (cfgValue < 0) {
+ return 0;
+ }
+ return (int) cfgValue;
+ }
+
private void json(final Object data, final StringWriter w) {
JsonServlet.defaultGsonBuilder().create().toJson(data, w);
}
private Page get() {
Page p = page;
- if (refreshHeaderFooter && p.isStale()) {
- final Page newPage;
- try {
- newPage = new Page();
- } catch (IOException e) {
- log.error("Cannot refresh site header/footer", e);
- return p;
+ try {
+ if (refreshHeaderFooter && p.isStale()) {
+ p = new Page();
+ page = p;
}
- p = newPage;
- page = p;
+ } catch (IOException e) {
+ log.error("Cannot refresh site header/footer", e);
}
return p;
}
@@ -216,7 +230,7 @@
CacheHeaders.setNotCacheable(rsp);
rsp.setContentType("text/html");
- rsp.setCharacterEncoding(HtmlDomUtil.ENC);
+ rsp.setCharacterEncoding(HtmlDomUtil.ENC.name());
rsp.setContentLength(tosend.length);
final OutputStream out = rsp.getOutputStream();
try {
@@ -288,16 +302,16 @@
}
private static class FileInfo {
- private final File path;
+ private final Path path;
private final long time;
- FileInfo(final File p) {
+ FileInfo(Path p) {
path = p;
- time = path.lastModified();
+ time = lastModified(path);
}
boolean isStale() {
- return time != path.lastModified();
+ return time != lastModified(path);
}
}
@@ -319,6 +333,7 @@
pageData.version = Version.getVersion();
pageData.config = config;
pageData.isNoteDbEnabled = isNoteDbEnabled;
+ pageData.pluginsLoadTimeout = pluginsLoadTimeout;
final StringWriter w = new StringWriter();
w.write("var " + HPD_ID + "=");
@@ -364,8 +379,8 @@
}
}
- private FileInfo injectCssFile(final Document hostDoc, final String id,
- final File src) throws IOException {
+ private FileInfo injectCssFile(Document hostDoc, String id, Path src)
+ throws IOException {
final FileInfo info = new FileInfo(src);
final Element banner = HtmlDomUtil.find(hostDoc, id);
if (banner == null) {
@@ -376,7 +391,8 @@
banner.removeChild(banner.getFirstChild());
}
- String css = HtmlDomUtil.readFile(src.getParentFile(), src.getName());
+ String css =
+ HtmlDomUtil.readFile(src.getParent(), src.getFileName().toString());
if (css == null) {
return info;
}
@@ -385,8 +401,8 @@
return info;
}
- private FileInfo injectXmlFile(final Document hostDoc, final String id,
- final File src) throws IOException {
+ private FileInfo injectXmlFile(Document hostDoc, String id, Path src)
+ throws IOException {
final FileInfo info = new FileInfo(src);
final Element banner = HtmlDomUtil.find(hostDoc, id);
if (banner == null) {
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/LegacyGerritServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/LegacyGerritServlet.java
index 9c267a8..00568f0 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/LegacyGerritServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/LegacyGerritServlet.java
@@ -68,7 +68,7 @@
CacheHeaders.setNotCacheable(rsp);
rsp.setContentType("text/html");
- rsp.setCharacterEncoding(HtmlDomUtil.ENC);
+ rsp.setCharacterEncoding(HtmlDomUtil.ENC.name());
rsp.setContentLength(tosend.length);
final OutputStream out = rsp.getOutputStream();
try {
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/RobotsServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/RobotsServlet.java
index 1d8e74d..2f5bc3a 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/RobotsServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/RobotsServlet.java
@@ -14,6 +14,9 @@
package com.google.gerrit.httpd.raw;
+import static java.nio.file.Files.exists;
+import static java.nio.file.Files.isReadable;
+
import com.google.common.io.ByteStreams;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.SitePaths;
@@ -24,11 +27,11 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
-import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
@@ -58,13 +61,13 @@
private static final Logger log =
LoggerFactory.getLogger(RobotsServlet.class);
- private final File robotsFile;
+ private final Path robotsFile;
@Inject
RobotsServlet(@GerritServerConfig final Config config, final SitePaths sitePaths) {
- File file = sitePaths.resolve(
+ Path file = sitePaths.resolve(
config.getString("httpd", null, "robotsFile"));
- if (file != null && (!file.exists() || !file.canRead())) {
+ if (file != null && (!exists(file) || !isReadable(file))) {
log.warn("Cannot read httpd.robotsFile, using default");
file = null;
}
@@ -75,23 +78,16 @@
protected void doGet(final HttpServletRequest req, final HttpServletResponse rsp)
throws IOException {
rsp.setContentType("text/plain");
- InputStream in = openRobotsFile();
- try {
- OutputStream out = rsp.getOutputStream();
- try {
- ByteStreams.copy(in, out);
- } finally {
- out.close();
- }
- } finally {
- in.close();
+ try (InputStream in = openRobotsFile();
+ OutputStream out = rsp.getOutputStream()) {
+ ByteStreams.copy(in, out);
}
}
private InputStream openRobotsFile() {
if (robotsFile != null) {
try {
- return new FileInputStream(robotsFile);
+ return Files.newInputStream(robotsFile);
} catch (IOException e) {
log.warn("Cannot read " + robotsFile + "; using default", e);
}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/StaticServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/StaticServlet.java
index 52b7a5c9..e690334 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/StaticServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/StaticServlet.java
@@ -17,6 +17,7 @@
import static com.google.common.net.HttpHeaders.CONTENT_ENCODING;
import static com.google.common.net.HttpHeaders.ETAG;
import static com.google.common.net.HttpHeaders.IF_NONE_MATCH;
+import static com.google.gerrit.common.FileUtil.lastModified;
import static java.util.concurrent.TimeUnit.DAYS;
import static java.util.concurrent.TimeUnit.MINUTES;
import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
@@ -30,7 +31,7 @@
import com.google.common.cache.Weigher;
import com.google.common.collect.Maps;
import com.google.common.hash.Hashing;
-import com.google.common.io.ByteStreams;
+import com.google.gerrit.common.FileUtil;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.httpd.HtmlDomUtil;
import com.google.gerrit.server.config.GerritServerConfig;
@@ -44,11 +45,11 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@@ -89,21 +90,19 @@
return type != null ? type : "application/octet-stream";
}
- private final File staticBase;
- private final String staticBasePath;
+ private final Path staticBase;
private final boolean refresh;
private final LoadingCache<String, Resource> cache;
@Inject
StaticServlet(@GerritServerConfig Config cfg, SitePaths site) {
- File f;
+ Path p;
try {
- f = site.static_dir.getCanonicalFile();
+ p = site.static_dir.toRealPath().normalize();
} catch (IOException e) {
- f = site.static_dir.getAbsoluteFile();
+ p = site.static_dir.toAbsolutePath().normalize();
}
- staticBase = f;
- staticBasePath = staticBase.getPath() + File.separator;
+ staticBase = p;
refresh = cfg.getBoolean("site", "refreshHeaderFooter", true);
cache = CacheBuilder.newBuilder()
.maximumWeight(1 << 20)
@@ -131,7 +130,8 @@
}
}
- private Resource getResource(HttpServletRequest req) throws ExecutionException {
+ private Resource getResource(HttpServletRequest req)
+ throws ExecutionException {
String name = CharMatcher.is('/').trimFrom(req.getPathInfo());
if (isUnreasonableName(name)) {
return Resource.NOT_FOUND;
@@ -150,13 +150,12 @@
}
private static boolean isUnreasonableName(String name) {
- if (name.length() < 1) return true;
- if (name.contains("\\")) return true; // no windows/dos style paths
- if (name.startsWith("../")) return true; // no "../etc/passwd"
- if (name.contains("/../")) return true; // no "foo/../etc/passwd"
- if (name.contains("/./")) return true; // "foo/./foo" is insane to ask
- if (name.contains("//")) return true; // windows UNC path can be "//..."
- return false; // is a reasonable name
+ return name.length() < 1
+ || name.contains("\\") // no windows/dos style paths
+ || name.startsWith("../") // no "../etc/passwd"
+ || name.contains("/../") // no "foo/../etc/passwd"
+ || name.contains("/./") // "foo/./foo" is insane to ask
+ || name.contains("//"); // windows UNC path can be "//..."
}
@Override
@@ -209,29 +208,22 @@
}
private Resource loadResource(String name) throws IOException {
- File p = new File(staticBase, name);
+ Path p = staticBase.resolve(name);
try {
- p = p.getCanonicalFile();
+ p = p.toRealPath().normalize();
} catch (IOException e) {
return Resource.NOT_FOUND;
}
- if (!p.getPath().startsWith(staticBasePath)) {
+ if (!p.startsWith(staticBase)) {
return Resource.NOT_FOUND;
}
- long ts = p.lastModified();
- FileInputStream in;
- try {
- in = new FileInputStream(p);
- } catch (FileNotFoundException e) {
- return Resource.NOT_FOUND;
- }
-
+ long ts = FileUtil.lastModified(p);
byte[] raw;
try {
- raw = ByteStreams.toByteArray(in);
- } finally {
- in.close();
+ raw = Files.readAllBytes(p);
+ } catch (NoSuchFileException e) {
+ return Resource.NOT_FOUND;
}
return new Resource(p, ts, contentType(name), raw);
}
@@ -239,13 +231,13 @@
static class Resource {
static final Resource NOT_FOUND = new Resource(null, -1, "", new byte[] {});
- final File src;
+ final Path src;
final long lastModified;
final String contentType;
final String etag;
final byte[] raw;
- Resource(File src, long lastModified, String contentType, byte[] raw) {
+ Resource(Path src, long lastModified, String contentType, byte[] raw) {
this.src = src;
this.lastModified = lastModified;
this.contentType = contentType;
@@ -254,7 +246,7 @@
}
boolean isStale() {
- return lastModified != src.lastModified();
+ return lastModified != lastModified(src);
}
}
}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
index 6f4cc08..dca850ac 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
@@ -142,6 +142,8 @@
private static final String JSON_TYPE = "application/json";
private static final String FORM_TYPE = "application/x-www-form-urlencoded";
+ private static final int HEAP_EST_SIZE = 10 * 8 * 1024; // Presize 10 blocks.
+
/**
* Garbage prefix inserted before JSON output to prevent XSSI.
* <p>
@@ -656,7 +658,7 @@
Multimap<String, String> config,
Object result)
throws IOException {
- TemporaryBuffer.Heap buf = heap(Integer.MAX_VALUE);
+ TemporaryBuffer.Heap buf = heap(HEAP_EST_SIZE, Integer.MAX_VALUE);
buf.write(JSON_MAGIC);
Writer w = new BufferedWriter(new OutputStreamWriter(buf, UTF_8));
Gson gson = newGson(config, req);
@@ -781,7 +783,7 @@
private static BinaryResult stackJsonString(HttpServletResponse res,
final BinaryResult src) throws IOException {
- TemporaryBuffer.Heap buf = heap(Integer.MAX_VALUE);
+ TemporaryBuffer.Heap buf = heap(HEAP_EST_SIZE, Integer.MAX_VALUE);
buf.write(JSON_MAGIC);
try(Writer w = new BufferedWriter(new OutputStreamWriter(buf, UTF_8));
JsonWriter json = new JsonWriter(w)) {
@@ -958,7 +960,8 @@
if (user instanceof AnonymousUser) {
throw new AuthException("Authentication required");
} else if (!globals.webSession.get().isAccessPathOk(AccessPath.REST_API)) {
- throw new AuthException("Invalid authentication method. In order to authenticate, prefix the REST endpoint URL with /a/ (e.g. http://example.com/a/projects/).");
+ throw new AuthException("Invalid authentication method. In order to authenticate, "
+ + "prefix the REST endpoint URL with /a/ (e.g. http://example.com/a/projects/).");
}
}
user.setAccessPath(AccessPath.REST_API);
@@ -1053,10 +1056,15 @@
return false;
}
+ private static int base64MaxSize(long n) {
+ return 4 * IntMath.divide((int) n, 3, CEILING);
+ }
+
private static BinaryResult base64(BinaryResult bin)
throws IOException {
- int max = 4 * IntMath.divide((int) bin.getContentLength(), 3, CEILING);
- TemporaryBuffer.Heap buf = heap(max);
+ int maxSize = base64MaxSize(bin.getContentLength());
+ int estSize = Math.min(base64MaxSize(HEAP_EST_SIZE), maxSize);
+ TemporaryBuffer.Heap buf = heap(estSize, maxSize);
OutputStream encoded = BaseEncoding.base64().encodingStream(
new OutputStreamWriter(buf, ISO_8859_1));
bin.writeTo(encoded);
@@ -1066,7 +1074,7 @@
private static BinaryResult compress(BinaryResult bin)
throws IOException {
- TemporaryBuffer.Heap buf = heap(20 << 20);
+ TemporaryBuffer.Heap buf = heap(HEAP_EST_SIZE, 20 << 20);
GZIPOutputStream gz = new GZIPOutputStream(buf);
bin.writeTo(gz);
gz.close();
@@ -1083,8 +1091,8 @@
}.setContentLength(buf.length());
}
- private static Heap heap(int max) {
- return new TemporaryBuffer.Heap(max);
+ private static Heap heap(int est, int max) {
+ return new TemporaryBuffer.Heap(est, max);
}
@SuppressWarnings("serial")
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountServiceImpl.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountServiceImpl.java
index e1c9e3c..a12d8d5 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountServiceImpl.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountServiceImpl.java
@@ -201,8 +201,9 @@
public VoidResult run(final ReviewDb db) throws OrmException, Failure {
final Account.Id me = getAccountId();
for (final AccountProjectWatch.Key keyId : keys) {
- if (!me.equals(keyId.getParentKey()))
+ if (!me.equals(keyId.getParentKey())) {
throw new Failure(new NoSuchEntityException());
+ }
}
db.accountProjectWatches().deleteKeys(keys);
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/template/SiteHeaderFooter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/template/SiteHeaderFooter.java
index 321f032..9c067de 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/template/SiteHeaderFooter.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/template/SiteHeaderFooter.java
@@ -14,6 +14,8 @@
package com.google.gerrit.httpd.template;
+import static com.google.gerrit.common.FileUtil.lastModified;
+
import com.google.common.base.Strings;
import com.google.gerrit.httpd.HtmlDomUtil;
import com.google.gerrit.server.config.GerritServerConfig;
@@ -27,8 +29,8 @@
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-import java.io.File;
import java.io.IOException;
+import java.nio.file.Path;
@Singleton
public class SiteHeaderFooter {
@@ -43,13 +45,13 @@
this.refreshHeaderFooter = cfg.getBoolean("site", "refreshHeaderFooter", true);
this.sitePaths = sitePaths;
- Template t = new Template(sitePaths);
try {
+ Template t = new Template(sitePaths);
t.load();
+ template = t;
} catch (IOException e) {
log.warn("Cannot load site header or footer", e);
}
- template = t;
}
public Document parse(Class<?> clazz, String name) throws IOException {
@@ -118,8 +120,8 @@
void load() throws IOException {
css = HtmlDomUtil.readFile(
- cssFile.path.getParentFile(),
- cssFile.path.getName());
+ cssFile.path.getParent(),
+ cssFile.path.getFileName().toString());
header = readXml(headerFile);
footer = readXml(footerFile);
}
@@ -135,16 +137,16 @@
}
private static class FileInfo {
- final File path;
+ final Path path;
final long time;
- FileInfo(File p) {
+ FileInfo(Path p) {
path = p;
- time = path.lastModified();
+ time = lastModified(p);
}
boolean isStale() {
- return time != path.lastModified();
+ return time != lastModified(path);
}
}
}
diff --git a/gerrit-launcher/src/main/java/com/google/gerrit/launcher/GerritLauncher.java b/gerrit-launcher/src/main/java/com/google/gerrit/launcher/GerritLauncher.java
index 4ee9676..e3e6d48 100644
--- a/gerrit-launcher/src/main/java/com/google/gerrit/launcher/GerritLauncher.java
+++ b/gerrit-launcher/src/main/java/com/google/gerrit/launcher/GerritLauncher.java
@@ -46,11 +46,11 @@
private static final String pkg = "com.google.gerrit.pgm";
public static final String NOT_ARCHIVED = "NOT_ARCHIVED";
- public static void main(final String argv[]) throws Exception {
+ public static void main(final String[] argv) throws Exception {
System.exit(mainImpl(argv));
}
- public static int mainImpl(final String argv[]) throws Exception {
+ public static int mainImpl(final String[] argv) throws Exception {
if (argv.length == 0) {
File me;
try {
@@ -88,11 +88,15 @@
// Run the application class
//
- final ClassLoader cl = libClassLoader();
+ final ClassLoader cl = libClassLoader(isProlog(programClassName(argv[0])));
Thread.currentThread().setContextClassLoader(cl);
return invokeProgram(cl, argv);
}
+ private static boolean isProlog(String cn) {
+ return "PrologShell".equals(cn) || "Rulec".equals(cn);
+ }
+
private static String getVersion(final File me) {
if (me == null) {
return "";
@@ -122,20 +126,7 @@
Class<?> clazz;
try {
try {
- String cn = name;
- if (cn.equals(cn.toLowerCase())) {
- StringBuilder buf = new StringBuilder();
- buf.append(Character.toUpperCase(cn.charAt(0)));
- for (int i = 1; i < cn.length(); i++) {
- if (cn.charAt(i) == '-' && i + 1 < cn.length()) {
- i++;
- buf.append(Character.toUpperCase(cn.charAt(i)));
- } else {
- buf.append(cn.charAt(i));
- }
- }
- cn = buf.toString();
- }
+ String cn = programClassName(name);
clazz = Class.forName(pkg + "." + cn, true, loader);
} catch (ClassNotFoundException cnfe) {
if (name.equals(name.toLowerCase())) {
@@ -181,7 +172,25 @@
}
}
- private static ClassLoader libClassLoader() throws IOException {
+ private static String programClassName(String cn) {
+ if (cn.equals(cn.toLowerCase())) {
+ StringBuilder buf = new StringBuilder();
+ buf.append(Character.toUpperCase(cn.charAt(0)));
+ for (int i = 1; i < cn.length(); i++) {
+ if (cn.charAt(i) == '-' && i + 1 < cn.length()) {
+ i++;
+ buf.append(Character.toUpperCase(cn.charAt(i)));
+ } else {
+ buf.append(cn.charAt(i));
+ }
+ }
+ return buf.toString();
+ }
+ return cn;
+ }
+
+ private static ClassLoader libClassLoader(boolean prologCompiler)
+ throws IOException {
final File path;
try {
path = getDistributionArchive();
@@ -201,10 +210,16 @@
final ZipEntry ze = e.nextElement();
if (ze.isDirectory()) {
continue;
- } else if (ze.getName().startsWith("WEB-INF/lib/")) {
+ }
+
+ String name = ze.getName();
+ if (name.startsWith("WEB-INF/lib/")) {
extractJar(zf, ze, jars);
- } else if (ze.getName().startsWith("WEB-INF/pgm-lib/")) {
- extractJar(zf, ze, jars);
+ } else if (name.startsWith("WEB-INF/pgm-lib/")) {
+ // Some Prolog tools are restricted.
+ if (prologCompiler || !name.startsWith("WEB-INF/pgm-lib/prolog-")) {
+ extractJar(zf, ze, jars);
+ }
}
}
} finally {
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java
index e8825c5..0084536 100644
--- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java
+++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java
@@ -89,8 +89,9 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.sql.Timestamp;
import java.util.Collections;
import java.util.Iterator;
@@ -223,7 +224,6 @@
private final ListeningExecutorService executor;
private final Provider<ReviewDb> db;
private final ChangeData.Factory changeDataFactory;
- private final File dir;
private final Schema<ChangeData> schema;
private final QueryBuilder queryBuilder;
private final SubIndex openIndex;
@@ -246,11 +246,6 @@
this.changeDataFactory = changeDataFactory;
this.schema = schema;
- if (base == null) {
- dir = LuceneVersionManager.getDir(sitePaths, schema);
- } else {
- dir = new File(base);
- }
Version luceneVersion = checkNotNull(
LUCENE_VERSIONS.get(schema),
"unknown Lucene version for index schema: %s", schema);
@@ -271,8 +266,10 @@
openIndex = new SubIndex(new RAMDirectory(), "ramOpen", openConfig);
closedIndex = new SubIndex(new RAMDirectory(), "ramClosed", closedConfig);
} else {
- openIndex = new SubIndex(new File(dir, CHANGES_OPEN), openConfig);
- closedIndex = new SubIndex(new File(dir, CHANGES_CLOSED), closedConfig);
+ Path dir = base != null ? Paths.get(base)
+ : LuceneVersionManager.getDir(sitePaths, schema);
+ openIndex = new SubIndex(dir.resolve(CHANGES_OPEN), openConfig);
+ closedIndex = new SubIndex(dir.resolve(CHANGES_CLOSED), closedConfig);
}
}
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneVersionManager.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneVersionManager.java
index c3570a1..3c38225 100644
--- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneVersionManager.java
+++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneVersionManager.java
@@ -36,8 +36,10 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
import java.io.IOException;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.Collection;
import java.util.List;
import java.util.TreeMap;
@@ -65,15 +67,16 @@
}
}
- static File getDir(SitePaths sitePaths, Schema<ChangeData> schema) {
- return new File(sitePaths.index_dir, String.format("%s%04d",
+ static Path getDir(SitePaths sitePaths, Schema<ChangeData> schema) {
+ return sitePaths.index_dir.resolve(String.format("%s%04d",
CHANGES_PREFIX, schema.getVersion()));
}
static FileBasedConfig loadGerritIndexConfig(SitePaths sitePaths)
throws ConfigInvalidException, IOException {
FileBasedConfig cfg = new FileBasedConfig(
- new File(sitePaths.index_dir, "gerrit_index.config"), FS.detect());
+ sitePaths.index_dir.resolve("gerrit_index.config").toFile(),
+ FS.detect());
cfg.load();
return cfg;
}
@@ -114,10 +117,10 @@
throw fail(e);
}
- if (!sitePaths.index_dir.exists()) {
+ if (!Files.exists(sitePaths.index_dir)) {
throw new ProvisionException("No index versions ready; run Reindex");
- } else if (!sitePaths.index_dir.isDirectory()) {
- log.warn("Not a directory: %s", sitePaths.index_dir.getAbsolutePath());
+ } else if (!Files.exists(sitePaths.index_dir)) {
+ log.warn("Not a directory: %s", sitePaths.index_dir.toAbsolutePath());
throw new ProvisionException("No index versions ready; run Reindex");
}
@@ -167,29 +170,35 @@
private TreeMap<Integer, Version> scanVersions(Config cfg) {
TreeMap<Integer, Version> versions = Maps.newTreeMap();
for (Schema<ChangeData> schema : ChangeSchemas.ALL.values()) {
- File f = getDir(sitePaths, schema);
- boolean exists = f.exists() && f.isDirectory();
- if (f.exists() && !f.isDirectory()) {
- log.warn("Not a directory: %s", f.getAbsolutePath());
+ Path p = getDir(sitePaths, schema);
+ boolean isDir = Files.isDirectory(p);
+ if (Files.exists(p) && !isDir) {
+ log.warn("Not a directory: %s", p.toAbsolutePath());
}
int v = schema.getVersion();
- versions.put(v, new Version(schema, v, exists, getReady(cfg, v)));
+ versions.put(v, new Version(schema, v, isDir, getReady(cfg, v)));
}
- for (File f : sitePaths.index_dir.listFiles()) {
- if (!f.getName().startsWith(CHANGES_PREFIX)) {
- continue;
+ try (DirectoryStream<Path> paths =
+ Files.newDirectoryStream(sitePaths.index_dir)) {
+ for (Path p : paths) {
+ String n = p.getFileName().toString();
+ if (!n.startsWith(CHANGES_PREFIX)) {
+ continue;
+ }
+ String versionStr = n.substring(CHANGES_PREFIX.length());
+ Integer v = Ints.tryParse(versionStr);
+ if (v == null || versionStr.length() != 4) {
+ log.warn("Unrecognized version in index directory: {}",
+ p.toAbsolutePath());
+ continue;
+ }
+ if (!versions.containsKey(v)) {
+ versions.put(v, new Version(null, v, true, getReady(cfg, v)));
+ }
}
- String versionStr = f.getName().substring(CHANGES_PREFIX.length());
- Integer v = Ints.tryParse(versionStr);
- if (v == null || versionStr.length() != 4) {
- log.warn("Unrecognized version in index directory: {}",
- f.getAbsolutePath());
- continue;
- }
- if (!versions.containsKey(v)) {
- versions.put(v, new Version(null, v, true, getReady(cfg, v)));
- }
+ } catch (IOException e) {
+ log.error("Error scanning index directory: " + sitePaths.index_dir, e);
}
return versions;
}
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/QueryBuilder.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/QueryBuilder.java
index 28af057..bb29db2 100644
--- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/QueryBuilder.java
+++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/QueryBuilder.java
@@ -164,8 +164,8 @@
try {
// Can't use IntPredicate because it and IndexPredicate are different
// subclasses of OperatorPredicate.
- value = Integer.valueOf(p.getValue());
- } catch (IllegalArgumentException e) {
+ value = Integer.parseInt(p.getValue());
+ } catch (NumberFormatException e) {
throw new QueryParseException("not an integer: " + p.getValue());
}
return new TermQuery(intTerm(p.getField().getName(), value));
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/SubIndex.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/SubIndex.java
index e024f76..f28bf05 100644
--- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/SubIndex.java
+++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/SubIndex.java
@@ -37,8 +37,8 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
import java.io.IOException;
+import java.nio.file.Path;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
@@ -56,8 +56,9 @@
private final ControlledRealTimeReopenThread<IndexSearcher> reopenThread;
private final Set<NrtFuture> notDoneNrtFutures;
- SubIndex(File file, GerritIndexWriterConfig writerConfig) throws IOException {
- this(FSDirectory.open(file), file.getName(), writerConfig);
+ SubIndex(Path path, GerritIndexWriterConfig writerConfig) throws IOException {
+ this(FSDirectory.open(path.toFile()), path.getFileName().toString(),
+ writerConfig);
}
SubIndex(Directory dir, final String dirName,
diff --git a/gerrit-main/src/main/java/Main.java b/gerrit-main/src/main/java/Main.java
index d3c9fdd..54cf20e 100644
--- a/gerrit-main/src/main/java/Main.java
+++ b/gerrit-main/src/main/java/Main.java
@@ -20,7 +20,7 @@
// to jump into the real main code.
//
- public static void main(final String argv[]) throws Exception {
+ public static void main(final String[] argv) throws Exception {
if (onSupportedJavaVersion()) {
com.google.gerrit.launcher.GerritLauncher.main(argv);
diff --git a/gerrit-pgm/BUCK b/gerrit-pgm/BUCK
index 9a317cd..8c1ffd3 100644
--- a/gerrit-pgm/BUCK
+++ b/gerrit-pgm/BUCK
@@ -91,7 +91,7 @@
java_library(
name = 'pgm',
- srcs = glob([SRCS + '*.java']),
+ srcs = glob([SRCS + '*.java', SRCS + 'rules/*.java']),
resources = glob([RSRCS + '*']),
deps = DEPS + [
':http',
@@ -106,7 +106,9 @@
'//lib:args4j',
'//lib:gwtorm',
'//lib:servlet-api-3_1',
- '//lib/prolog:prolog-cafe',
+ '//lib/prolog:cafeteria',
+ '//lib/prolog:compiler',
+ '//lib/prolog:runtime',
],
provided_deps = ['//gerrit-launcher:launcher'],
visibility = [
@@ -125,7 +127,9 @@
':init',
':init-api',
':pgm',
+ '//gerrit-common:server',
'//gerrit-server:server',
+ '//lib:guava',
'//lib:junit',
'//lib/easymock:easymock',
'//lib/guice:guice',
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java
index 9726f03..63cdc93 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java
@@ -15,6 +15,7 @@
package com.google.gerrit.pgm;
import static com.google.gerrit.server.schema.DataSourceProvider.Context.MULTI_USER;
+import static java.nio.charset.StandardCharsets.UTF_8;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.MoreObjects;
@@ -93,10 +94,10 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.Thread.UncaughtExceptionHandler;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
@@ -148,7 +149,7 @@
private Injector sshInjector;
private Injector webInjector;
private Injector httpdInjector;
- private File runFile;
+ private Path runFile;
private boolean test;
private AbstractModule luceneModule;
@@ -184,7 +185,7 @@
});
if (runId != null) {
- runFile = new File(new File(getSitePath(), "logs"), "gerrit.run");
+ runFile = getSitePath().resolve("logs").resolve("gerrit.run");
}
if (httpd == null) {
@@ -196,8 +197,7 @@
}
manager.add(GarbageCollectionLogFile.start(getSitePath()));
- if (consoleLog) {
- } else {
+ if (!consoleLog) {
manager.add(ErrorLogFile.start(getSitePath()));
}
@@ -208,7 +208,11 @@
public void run() {
log.info("caught shutdown, cleaning up");
if (runId != null) {
- runFile.delete();
+ try {
+ Files.delete(runFile);
+ } catch (IOException err) {
+ log.warn("failed to delete " + runFile, err);
+ }
}
manager.stop();
}
@@ -217,15 +221,8 @@
log.info("Gerrit Code Review " + myVersion() + " ready");
if (runId != null) {
try {
- runFile.createNewFile();
- runFile.setReadable(true, false);
-
- FileOutputStream out = new FileOutputStream(runFile);
- try {
- out.write((runId + "\n").getBytes("UTF-8"));
- } finally {
- out.close();
- }
+ Files.write(runFile, (runId + "\n").getBytes(UTF_8));
+ runFile.toFile().setReadable(true, false);
} catch (IOException err) {
log.warn("Cannot write --run-id to " + runFile, err);
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java
index 29ab490..efc97f9 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java
@@ -37,8 +37,8 @@
import org.kohsuke.args4j.Option;
-import java.io.File;
import java.io.IOException;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
@@ -70,7 +70,7 @@
super(new WarDistribution(), null);
}
- public Init(File sitePath) {
+ public Init(Path sitePath) {
super(sitePath, true, true, new WarDistribution(), null);
batchMode = true;
noAutoStart = true;
@@ -106,7 +106,7 @@
modules.add(new AbstractModule() {
@Override
protected void configure() {
- bind(File.class).annotatedWith(SitePath.class).toInstance(getSitePath());
+ bind(Path.class).annotatedWith(SitePath.class).toInstance(getSitePath());
bind(Browser.class);
bind(String.class).annotatedWith(SecureStoreClassName.class)
.toProvider(Providers.of(getConfiguredSecureStoreClass()));
@@ -157,8 +157,8 @@
}
void startDaemon(SiteRun run) {
- final String[] argv = {run.site.gerrit_sh.getAbsolutePath(), "start"};
- final Process proc;
+ String[] argv = {run.site.gerrit_sh.toAbsolutePath().toString(), "start"};
+ Process proc;
try {
System.err.println("Executing " + argv[0] + " " + argv[1]);
proc = Runtime.getRuntime().exec(argv);
@@ -177,7 +177,7 @@
for (;;) {
try {
- final int rc = proc.waitFor();
+ int rc = proc.waitFor();
if (rc != 0) {
System.err.println("error: cannot start Gerrit: exit status " + rc);
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Ls.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Ls.java
index 7e7b602..2bcd6ea 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Ls.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Ls.java
@@ -39,6 +39,7 @@
show &= !ze.isDirectory();
show &= !name.startsWith("WEB-INF/classes/");
show &= !name.startsWith("WEB-INF/lib/");
+ show &= !name.startsWith("WEB-INF/pgm-lib/");
show &= !name.equals("WEB-INF/web.xml");
if (show) {
if (name.startsWith("WEB-INF/")) {
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/PrologShell.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/PrologShell.java
index fa434a6..2518025 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/PrologShell.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/PrologShell.java
@@ -16,19 +16,18 @@
import com.google.gerrit.pgm.util.AbstractProgram;
+import com.googlecode.prolog_cafe.exceptions.HaltException;
import com.googlecode.prolog_cafe.lang.BufferingPrologControl;
-import com.googlecode.prolog_cafe.lang.HaltException;
import com.googlecode.prolog_cafe.lang.Prolog;
import com.googlecode.prolog_cafe.lang.PrologClassLoader;
-import com.googlecode.prolog_cafe.lang.PrologMain;
import com.googlecode.prolog_cafe.lang.SymbolTerm;
+import com.googlecode.prolog_cafe.repl.PrologMain;
import org.kohsuke.args4j.Option;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.EnumSet;
import java.util.List;
public class PrologShell extends AbstractProgram {
@@ -41,14 +40,10 @@
BufferingPrologControl pcl = new BufferingPrologControl();
pcl.setPrologClassLoader(new PrologClassLoader(getClass().getClassLoader()));
- pcl.setEnabled(EnumSet.allOf(Prolog.Feature.class), false);
pcl.setEnabled(Prolog.Feature.IO, true);
- pcl.setEnabled(Prolog.Feature.STATISTICS_RUNTIME, true);
-
+ pcl.setEnabled(Prolog.Feature.STATISTICS, true);
+ pcl.configureUserIO(System.in, System.out, System.err);
pcl.initialize(Prolog.BUILTIN);
- pcl.execute(Prolog.BUILTIN, "set_prolog_flag",
- SymbolTerm.intern("print_stack_trace"),
- SymbolTerm.intern("on"));
for (String file : fileName) {
String path;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/RebuildNotedb.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/RebuildNotedb.java
index 88115b6..ab20f53 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/RebuildNotedb.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/RebuildNotedb.java
@@ -185,11 +185,8 @@
private static void execute(BatchRefUpdate bru, Repository repo)
throws IOException {
- RevWalk rw = new RevWalk(repo);
- try {
+ try (RevWalk rw = new RevWalk(repo)) {
bru.execute(rw, NullProgressMonitor.INSTANCE);
- } finally {
- rw.release();
}
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Rulec.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Rulec.java
index 17a54d4..8f1b354 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Rulec.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Rulec.java
@@ -17,15 +17,15 @@
import static com.google.gerrit.server.schema.DataSourceProvider.Context.SINGLE_USER;
import com.google.gerrit.lifecycle.LifecycleManager;
+import com.google.gerrit.pgm.rules.PrologCompiler;
import com.google.gerrit.pgm.util.SiteProgram;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.rules.PrologCompiler;
import com.google.gerrit.server.config.FactoryModule;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.inject.Inject;
import com.google.inject.Injector;
-import com.googlecode.prolog_cafe.compiler.CompileException;
+import com.googlecode.prolog_cafe.exceptions.CompileException;
import org.eclipse.jgit.lib.Repository;
import org.kohsuke.args4j.Argument;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/SwitchSecureStore.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/SwitchSecureStore.java
index f2feae1..ac84e82 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/SwitchSecureStore.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/SwitchSecureStore.java
@@ -19,7 +19,6 @@
import com.google.common.base.Joiner;
import com.google.common.base.Strings;
import com.google.common.collect.Iterables;
-import com.google.common.io.Files;
import com.google.gerrit.common.IoUtil;
import com.google.gerrit.common.SiteLibraryLoaderUtil;
import com.google.gerrit.pgm.util.SiteProgram;
@@ -37,8 +36,10 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.jar.JarFile;
@@ -47,7 +48,7 @@
public class SwitchSecureStore extends SiteProgram {
private static String getSecureStoreClassFromGerritConfig(SitePaths sitePaths) {
FileBasedConfig cfg =
- new FileBasedConfig(sitePaths.gerrit_config, FS.DETECTED);
+ new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.DETECTED);
try {
cfg.load();
} catch (IOException | ConfigInvalidException e) {
@@ -67,14 +68,14 @@
@Override
public int run() throws Exception {
SitePaths sitePaths = new SitePaths(getSitePath());
- File newSecureStoreFile = new File(newSecureStoreLib);
- if (!newSecureStoreFile.exists()) {
- log.error(String.format("File %s doesn't exists",
- newSecureStoreFile.getAbsolutePath()));
+ Path newSecureStorePath = Paths.get(newSecureStoreLib);
+ if (!Files.exists(newSecureStorePath)) {
+ log.error(String.format("File %s doesn't exist",
+ newSecureStorePath.toAbsolutePath()));
return -1;
}
- String newSecureStore = getNewSecureStoreClassName(newSecureStoreFile);
+ String newSecureStore = getNewSecureStoreClassName(newSecureStorePath);
String currentSecureStoreName = getCurrentSecureStoreClassName(sitePaths);
if (currentSecureStoreName.equals(newSecureStore)) {
@@ -83,7 +84,7 @@
return -1;
}
- IoUtil.loadJARs(newSecureStoreFile);
+ IoUtil.loadJARs(newSecureStorePath);
SiteLibraryLoaderUtil.loadSiteLib(sitePaths.lib_dir);
log.info("Current secureStoreClass property ({}) will be replaced with {}",
@@ -96,7 +97,7 @@
migrateProperties(currentStore, newStore);
removeOldLib(sitePaths, currentSecureStoreName);
- copyNewLib(sitePaths, newSecureStoreFile);
+ copyNewLib(sitePaths, newSecureStorePath);
updateGerritConfig(sitePaths, newSecureStore);
@@ -123,14 +124,17 @@
}
}
- private void removeOldLib(SitePaths sitePaths, String currentSecureStoreName) {
- File oldSecureStore =
+ private void removeOldLib(SitePaths sitePaths, String currentSecureStoreName)
+ throws IOException {
+ Path oldSecureStore =
findJarWithSecureStore(sitePaths, currentSecureStoreName);
if (oldSecureStore != null) {
log.info("Removing old SecureStore ({}) from lib/ directory",
- oldSecureStore.getName());
- if (!oldSecureStore.delete()) {
- log.error("Cannot remove {}", oldSecureStore.getAbsolutePath());
+ oldSecureStore.getFileName());
+ try {
+ Files.delete(oldSecureStore);
+ } catch (IOException e) {
+ log.error("Cannot remove {}", oldSecureStore.toAbsolutePath(), e);
}
} else {
log.info("Cannot find jar with old SecureStore ({}) in lib/ directory",
@@ -138,12 +142,12 @@
}
}
- private void copyNewLib(SitePaths sitePaths, File newSecureStoreFile)
+ private void copyNewLib(SitePaths sitePaths, Path newSecureStorePath)
throws IOException {
log.info("Copy new SecureStore ({}) into lib/ directory",
- newSecureStoreFile.getName());
- Files.copy(newSecureStoreFile, new File(sitePaths.lib_dir,
- newSecureStoreFile.getName()));
+ newSecureStorePath.getFileName());
+ Files.copy(newSecureStorePath,
+ sitePaths.lib_dir.resolve(newSecureStorePath.getFileName()));
}
private void updateGerritConfig(SitePaths sitePaths, String newSecureStore)
@@ -151,13 +155,13 @@
log.info("Set gerrit.secureStoreClass property of gerrit.config to {}",
newSecureStore);
FileBasedConfig config =
- new FileBasedConfig(sitePaths.gerrit_config, FS.DETECTED);
+ new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.DETECTED);
config.load();
config.setString("gerrit", null, "secureStoreClass", newSecureStore);
config.save();
}
- private String getNewSecureStoreClassName(File secureStore)
+ private String getNewSecureStoreClassName(Path secureStore)
throws IOException {
JarScanner scanner = new JarScanner(secureStore);
List<String> newSecureStores =
@@ -165,12 +169,12 @@
if (newSecureStores.isEmpty()) {
throw new RuntimeException(String.format(
"Cannot find implementation of SecureStore interface in %s",
- secureStore.getAbsolutePath()));
+ secureStore.toAbsolutePath()));
}
if (newSecureStores.size() > 1) {
throw new RuntimeException(String.format(
"Found too many implementations of SecureStore:\n%s\nin %s", Joiner
- .on("\n").join(newSecureStores), secureStore.getAbsolutePath()));
+ .on("\n").join(newSecureStores), secureStore.toAbsolutePath()));
}
return Iterables.getOnlyElement(newSecureStores);
}
@@ -195,15 +199,12 @@
}
}
- private File findJarWithSecureStore(SitePaths sitePaths,
- String secureStoreClass) {
- File[] jars = SiteLibraryLoaderUtil.listJars(sitePaths.lib_dir);
- if (jars == null || jars.length == 0) {
- return null;
- }
+ private Path findJarWithSecureStore(SitePaths sitePaths,
+ String secureStoreClass) throws IOException {
+ List<Path> jars = SiteLibraryLoaderUtil.listJars(sitePaths.lib_dir);
String secureStoreClassPath = secureStoreClass.replace('.', '/') + ".class";
- for (File jar : jars) {
- try (JarFile jarFile = new JarFile(jar)) {
+ for (Path jar : jars) {
+ try (JarFile jarFile = new JarFile(jar.toFile())) {
ZipEntry entry = jarFile.getEntry(secureStoreClassPath);
if (entry != null) {
return jar;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java
index 907624d..80d69f1 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java
@@ -81,6 +81,8 @@
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.Enumeration;
@@ -220,22 +222,22 @@
} else if ("https".equals(u.getScheme())) {
SslContextFactory ssl = new SslContextFactory();
- final File keystore = getFile(cfg, "sslkeystore", "etc/keystore");
+ final Path keystore = getFile(cfg, "sslkeystore", "etc/keystore");
String password = cfg.getString("httpd", null, "sslkeypassword");
if (password == null) {
password = "gerrit";
}
- ssl.setKeyStorePath(keystore.getAbsolutePath());
- ssl.setTrustStorePath(keystore.getAbsolutePath());
+ ssl.setKeyStorePath(keystore.toAbsolutePath().toString());
+ ssl.setTrustStorePath(keystore.toAbsolutePath().toString());
ssl.setKeyStorePassword(password);
ssl.setTrustStorePassword(password);
if (AuthType.CLIENT_SSL_CERT_LDAP.equals(authType)) {
ssl.setNeedClientAuth(true);
- File crl = getFile(cfg, "sslcrl", "etc/crl.pem");
- if (crl.exists()) {
- ssl.setCrlPath(crl.getAbsolutePath());
+ Path crl = getFile(cfg, "sslcrl", "etc/crl.pem");
+ if (Files.exists(crl)) {
+ ssl.setCrlPath(crl.toAbsolutePath().toString());
ssl.setValidatePeerCerts(true);
}
}
@@ -340,7 +342,7 @@
return r;
}
- private File getFile(final Config cfg, final String name, final String def) {
+ private Path getFile(Config cfg, String name, String def) {
String path = cfg.getString("httpd", null, name);
if (path == null || path.length() == 0) {
path = def;
@@ -525,11 +527,13 @@
final ZipEntry ze = e.nextElement();
final String name = ze.getName();
- if (ze.isDirectory()) continue;
- if (name.startsWith("WEB-INF/")) continue;
- if (name.startsWith("META-INF/")) continue;
- if (name.startsWith("com/google/gerrit/launcher/")) continue;
- if (name.equals("Main.class")) continue;
+ if (ze.isDirectory()
+ || name.startsWith("WEB-INF/")
+ || name.startsWith("META-INF/")
+ || name.startsWith("com/google/gerrit/launcher/")
+ || name.equals("Main.class")) {
+ continue;
+ }
final File rawtmp = new File(dstwar, name);
mkdir(rawtmp.getParentFile());
@@ -559,8 +563,9 @@
private static void mkdir(File dir) throws IOException {
if (!dir.isDirectory()) {
mkdir(dir.getParentFile());
- if (!dir.mkdir())
+ if (!dir.mkdir()) {
throw new IOException("Cannot mkdir " + dir.getAbsolutePath());
+ }
dir.deleteOnExit();
}
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java
index c9e76c8..534ef050 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java
@@ -56,9 +56,14 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
@@ -86,12 +91,12 @@
this.pluginsToInstall = pluginsToInstall;
}
- public BaseInit(File sitePath, boolean standalone, boolean initDb,
+ public BaseInit(Path sitePath, boolean standalone, boolean initDb,
PluginsDistribution pluginsDistribution, List<String> pluginsToInstall) {
this(sitePath, null, standalone, initDb, pluginsDistribution, pluginsToInstall);
}
- public BaseInit(File sitePath, final Provider<DataSource> dsProvider,
+ public BaseInit(Path sitePath, final Provider<DataSource> dsProvider,
boolean standalone, boolean initDb,
PluginsDistribution pluginsDistribution, List<String> pluginsToInstall) {
super(sitePath, dsProvider);
@@ -132,7 +137,7 @@
throw failure;
}
- System.err.println("Initialized " + getSitePath().getCanonicalPath());
+ System.err.println("Initialized " + getSitePath().toRealPath().normalize());
afterInit(run);
return 0;
}
@@ -208,7 +213,7 @@
private SiteInit createSiteInit() {
final ConsoleUI ui = getConsoleUI();
- final File sitePath = getSitePath();
+ final Path sitePath = getSitePath();
final List<Module> m = new ArrayList<>();
final SecureStoreInitData secureStoreInitData = discoverSecureStoreClass();
final String currentSecureStoreClassName = getConfiguredSecureStoreClass();
@@ -228,7 +233,7 @@
@Override
protected void configure() {
bind(ConsoleUI.class).toInstance(ui);
- bind(File.class).annotatedWith(SitePath.class).toInstance(sitePath);
+ bind(Path.class).annotatedWith(SitePath.class).toInstance(sitePath);
List<String> plugins =
MoreObjects.firstNonNull(
getInstallPlugins(), Lists.<String> newArrayList());
@@ -287,8 +292,8 @@
}
try {
- File secureStoreLib = new File(secureStore);
- if (!secureStoreLib.exists()) {
+ Path secureStoreLib = Paths.get(secureStore);
+ if (!Files.exists(secureStoreLib)) {
throw new InvalidSecureStoreException(String.format(
"File %s doesn't exist", secureStore));
}
@@ -408,15 +413,41 @@
return sysInjector;
}
- private static void recursiveDelete(File path) {
- File[] entries = path.listFiles();
- if (entries != null) {
- for (File e : entries) {
- recursiveDelete(e);
- }
- }
- if (!path.delete() && path.exists()) {
- System.err.println("warn: Cannot remove " + path);
+ private static void recursiveDelete(Path path) {
+ final String msg = "warn: Cannot remove ";
+ try {
+ Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
+ @Override
+ public FileVisitResult visitFile(Path f, BasicFileAttributes attrs)
+ throws IOException {
+ try {
+ Files.delete(f);
+ } catch (IOException e) {
+ System.err.println(msg + f);
+ }
+ return FileVisitResult.CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult postVisitDirectory(Path dir, IOException err) {
+ try {
+ // Previously warned if err was not null; if dir is not empty as a
+ // result, will cause an error that will be logged below.
+ Files.delete(dir);
+ } catch (IOException e) {
+ System.err.println(msg + dir);
+ }
+ return FileVisitResult.CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult visitFileFailed(Path f, IOException e) {
+ System.err.println(msg + f);
+ return FileVisitResult.CONTINUE;
+ }
+ });
+ } catch (IOException e) {
+ System.err.println(msg + path);
}
}
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/H2Initializer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/H2Initializer.java
index e20346a..6d60ad1 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/H2Initializer.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/H2Initializer.java
@@ -14,12 +14,14 @@
package com.google.gerrit.pgm.init;
-import com.google.gerrit.pgm.init.api.InitUtil;
+import static com.google.gerrit.pgm.init.api.InitUtil.die;
+
+import com.google.gerrit.common.FileUtil;
import com.google.gerrit.pgm.init.api.Section;
import com.google.gerrit.server.config.SitePaths;
import com.google.inject.Inject;
-import java.io.File;
+import java.nio.file.Path;
class H2Initializer implements DatabaseConfigInitializer {
@@ -33,18 +35,17 @@
@Override
public void initConfig(Section databaseSection) {
String path = databaseSection.get("database");
+ Path db;
if (path == null) {
- path = "db/ReviewDB";
- databaseSection.set("database", path);
+ db = site.resolve("db").resolve("ReviewDB");
+ databaseSection.set("database", db.toString());
+ } else {
+ db = site.resolve(path);
}
- File db = site.resolve(path);
if (db == null) {
- throw InitUtil.die("database.database must be supplied for H2");
+ throw die("database.database must be supplied for H2");
}
- db = db.getParentFile();
- if (!db.exists() && !db.mkdirs()) {
- throw InitUtil.die("cannot create database.database "
- + db.getAbsolutePath());
- }
+ db = db.getParent();
+ FileUtil.mkdirsOrDie(db, "cannot create database.database");
}
-}
\ No newline at end of file
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitCache.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitCache.java
index 8da4a03..4e5d044 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitCache.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitCache.java
@@ -14,15 +14,14 @@
package com.google.gerrit.pgm.init;
-import static com.google.gerrit.pgm.init.api.InitUtil.die;
-
+import com.google.gerrit.common.FileUtil;
import com.google.gerrit.pgm.init.api.InitStep;
import com.google.gerrit.pgm.init.api.Section;
import com.google.gerrit.server.config.SitePaths;
import com.google.inject.Inject;
import com.google.inject.Singleton;
-import java.io.File;
+import java.nio.file.Path;
/** Initialize the {@code cache} configuration section. */
@Singleton
@@ -52,10 +51,8 @@
cache.set("directory", path);
}
- final File loc = site.resolve(path);
- if (!loc.exists() && !loc.mkdirs()) {
- throw die("cannot create cache.directory " + loc.getAbsolutePath());
- }
+ Path loc = site.resolve(path);
+ FileUtil.mkdirsOrDie(loc, "cannot create cache.directory");
}
@Override
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitContainer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitContainer.java
index f830854..60ff665 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitContainer.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitContainer.java
@@ -17,6 +17,7 @@
import static com.google.gerrit.pgm.init.api.InitUtil.die;
import static com.google.gerrit.pgm.init.api.InitUtil.username;
+import com.google.common.io.ByteStreams;
import com.google.gerrit.launcher.GerritLauncher;
import com.google.gerrit.pgm.init.api.ConsoleUI;
import com.google.gerrit.pgm.init.api.InitStep;
@@ -28,11 +29,12 @@
import org.eclipse.jgit.internal.storage.file.LockFile;
import org.eclipse.jgit.util.FS;
-import java.io.File;
-import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
+import java.io.InputStream;
import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
/** Initialize the {@code container} configuration section. */
@Singleton
@@ -56,9 +58,9 @@
container.string("Run as", "user", username());
container.string("Java runtime", "javaHome", javaHome());
- File myWar;
+ Path myWar;
try {
- myWar = GerritLauncher.getDistributionArchive();
+ myWar = GerritLauncher.getDistributionArchive().toPath();
} catch (FileNotFoundException e) {
System.err.println("warn: Cannot find distribution archive (e.g. gerrit.war)");
myWar = null;
@@ -66,53 +68,41 @@
String path = container.get("war");
if (path != null) {
- path = container.string("Gerrit runtime", "war", //
- myWar != null ? myWar.getAbsolutePath() : null);
+ path = container.string("Gerrit runtime", "war",
+ myWar != null ? myWar.toAbsolutePath().toString() : null);
if (path == null || path.isEmpty()) {
throw die("container.war is required");
}
} else if (myWar != null) {
final boolean copy;
- final File siteWar = site.gerrit_war;
- if (siteWar.exists()) {
- copy = ui.yesno(true, "Upgrade %s", siteWar.getPath());
+ final Path siteWar = site.gerrit_war;
+ if (Files.exists(siteWar)) {
+ copy = ui.yesno(true, "Upgrade %s", siteWar);
} else {
- copy = ui.yesno(true, "Copy %s to %s", myWar.getName(), siteWar.getPath());
+ copy = ui.yesno(true, "Copy %s to %s", myWar.getFileName(), siteWar);
if (copy) {
container.unset("war");
} else {
- container.set("war", myWar.getAbsolutePath());
+ container.set("war", myWar.toAbsolutePath().toString());
}
}
if (copy) {
if (!ui.isBatch()) {
- System.err.format("Copying %s to %s", myWar.getName(), siteWar.getPath());
+ System.err.format("Copying %s to %s", myWar.getFileName(), siteWar);
System.err.println();
}
- FileInputStream in = new FileInputStream(myWar);
- try {
- siteWar.getParentFile().mkdirs();
+ try (InputStream in = Files.newInputStream(myWar)) {
+ Files.createDirectories(siteWar.getParent());
- LockFile lf = new LockFile(siteWar, FS.DETECTED);
+ LockFile lf = new LockFile(siteWar.toFile(), FS.DETECTED);
if (!lf.lock()) {
throw new IOException("Cannot lock " + siteWar);
}
-
try {
- final OutputStream out = lf.getOutputStream();
- try {
- final byte[] tmp = new byte[4096];
- for (;;) {
- int n = in.read(tmp);
- if (n < 0) {
- break;
- }
- out.write(tmp, 0, n);
- }
- } finally {
- out.close();
+ try (OutputStream out = lf.getOutputStream()) {
+ ByteStreams.copy(in, out);
}
if (!lf.commit()) {
throw new IOException("Cannot commit " + siteWar);
@@ -120,8 +110,6 @@
} finally {
lf.unlock();
}
- } finally {
- in.close();
}
}
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitGitManager.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitGitManager.java
index 067b103..d8fd509 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitGitManager.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitGitManager.java
@@ -16,13 +16,14 @@
import static com.google.gerrit.pgm.init.api.InitUtil.die;
+import com.google.gerrit.common.FileUtil;
import com.google.gerrit.pgm.init.api.ConsoleUI;
import com.google.gerrit.pgm.init.api.InitStep;
import com.google.gerrit.pgm.init.api.Section;
import com.google.inject.Inject;
import com.google.inject.Singleton;
-import java.io.File;
+import java.nio.file.Path;
/** Initialize the GitRepositoryManager configuration section. */
@Singleton
@@ -40,13 +41,11 @@
public void run() {
ui.header("Git Repositories");
- File d = gerrit.path("Location of Git repositories", "basePath", "git");
+ Path d = gerrit.path("Location of Git repositories", "basePath", "git");
if (d == null) {
throw die("gerrit.basePath is required");
}
- if (!d.exists() && !d.mkdirs()) {
- throw die("Cannot create " + d);
- }
+ FileUtil.mkdirsOrDie(d, "Cannot create");
}
@Override
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitHttpd.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitHttpd.java
index c8f1cd7..a907d46 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitHttpd.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitHttpd.java
@@ -29,10 +29,11 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
-import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
+import java.nio.file.Files;
+import java.nio.file.Path;
/** Initialize the {@code httpd} configuration section. */
@Singleton
@@ -57,7 +58,8 @@
public void run() throws IOException, InterruptedException {
ui.header("HTTP Daemon");
- boolean proxy = false, ssl = false;
+ boolean proxy = false;
+ boolean ssl = false;
String address = "*";
int port = -1;
String context = "/";
@@ -149,8 +151,9 @@
return;
}
- final File store = site.ssl_keystore;
- if (!ui.yesno(!store.exists(), "Create new self-signed SSL certificate")) {
+ Path store = site.ssl_keystore;
+ if (!ui.yesno(!Files.exists(store),
+ "Create new self-signed SSL certificate")) {
return;
}
@@ -167,15 +170,17 @@
final String dname =
"CN=" + hostname + ",OU=Gerrit Code Review,O=" + domainOf(hostname);
- final File tmpdir = new File(site.etc_dir, "tmp.sslcertgen");
- if (!tmpdir.mkdir()) {
- throw die("Cannot create directory " + tmpdir);
+ Path tmpdir = site.etc_dir.resolve("tmp.sslcertgen");
+ try {
+ Files.createDirectory(tmpdir);
+ } catch (IOException e) {
+ throw die("Cannot create directory " + tmpdir, e);
}
chmod(0600, tmpdir);
- final File tmpstore = new File(tmpdir, "keystore");
+ Path tmpstore = tmpdir.resolve("keystore");
Runtime.getRuntime().exec(new String[] {"keytool", //
- "-keystore", tmpstore.getAbsolutePath(), //
+ "-keystore", tmpstore.toAbsolutePath().toString(), //
"-storepass", ssl_pass, //
"-genkeypair", //
"-alias", hostname, //
@@ -186,11 +191,15 @@
}).waitFor();
chmod(0600, tmpstore);
- if (!tmpstore.renameTo(store)) {
- throw die("Cannot rename " + tmpstore + " to " + store);
+ try {
+ Files.move(tmpstore, store);
+ } catch (IOException e) {
+ throw die("Cannot rename " + tmpstore + " to " + store, e);
}
- if (!tmpdir.delete()) {
- throw die("Cannot delete " + tmpdir);
+ try {
+ Files.delete(tmpdir);
+ } catch (IOException e) {
+ throw die("Cannot delete " + tmpdir, e);
}
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPluginStepsLoader.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPluginStepsLoader.java
index 893f00d..2cffe42 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPluginStepsLoader.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPluginStepsLoader.java
@@ -15,6 +15,7 @@
package com.google.gerrit.pgm.init;
import com.google.common.base.MoreObjects;
+import com.google.common.collect.Ordering;
import com.google.gerrit.extensions.annotations.PluginName;
import com.google.gerrit.pgm.init.api.ConsoleUI;
import com.google.gerrit.pgm.init.api.InitStep;
@@ -26,23 +27,22 @@
import com.google.inject.Injector;
import com.google.inject.Singleton;
-import java.io.File;
-import java.io.FileFilter;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
-import java.util.Comparator;
import java.util.List;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
@Singleton
public class InitPluginStepsLoader {
- private final File pluginsDir;
+ private final Path pluginsDir;
private final Injector initInjector;
final ConsoleUI ui;
@@ -55,10 +55,10 @@
}
public Collection<InitStep> getInitSteps() {
- List<File> jars = scanJarsInPluginsDirectory();
+ List<Path> jars = scanJarsInPluginsDirectory();
ArrayList<InitStep> pluginsInitSteps = new ArrayList<>();
- for (File jar : jars) {
+ for (Path jar : jars) {
InitStep init = loadInitStep(jar);
if (init != null) {
pluginsInitSteps.add(init);
@@ -68,12 +68,12 @@
}
@SuppressWarnings("resource")
- private InitStep loadInitStep(File jar) {
+ private InitStep loadInitStep(Path jar) {
try {
URLClassLoader pluginLoader =
- new URLClassLoader(new URL[] {jar.toURI().toURL()},
+ new URLClassLoader(new URL[] {jar.toUri().toURL()},
InitPluginStepsLoader.class.getClassLoader());
- try (JarFile jarFile = new JarFile(jar)) {
+ try (JarFile jarFile = new JarFile(jar.toFile())) {
Attributes jarFileAttributes = jarFile.getManifest().getMainAttributes();
String initClassName = jarFileAttributes.getValue("Gerrit-InitStep");
if (initClassName == null) {
@@ -86,7 +86,7 @@
} catch (ClassCastException e) {
ui.message(
"WARN: InitStep from plugin %s does not implement %s (Exception: %s)",
- jar.getName(), InitStep.class.getName(), e.getMessage());
+ jar.getFileName(), InitStep.class.getName(), e.getMessage());
return null;
}
} catch (Exception e) {
@@ -97,11 +97,10 @@
}
}
- private Injector getPluginInjector(final File jarFile) throws IOException {
- final String pluginName =
- MoreObjects.firstNonNull(
- JarPluginProvider.getJarPluginName(jarFile),
- PluginLoader.nameOf(jarFile));
+ private Injector getPluginInjector(Path jarPath) throws IOException {
+ final String pluginName = MoreObjects.firstNonNull(
+ JarPluginProvider.getJarPluginName(jarPath),
+ PluginLoader.nameOf(jarPath));
return initInjector.createChildInjector(new AbstractModule() {
@Override
protected void configure() {
@@ -111,27 +110,24 @@
});
}
- private List<File> scanJarsInPluginsDirectory() {
- if (pluginsDir == null || !pluginsDir.exists()) {
+ private List<Path> scanJarsInPluginsDirectory() {
+ if (pluginsDir == null || !Files.isDirectory(pluginsDir)) {
return Collections.emptyList();
}
- File[] matches = pluginsDir.listFiles(new FileFilter() {
+ DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
@Override
- public boolean accept(File pathname) {
- String n = pathname.getName();
- return (n.endsWith(".jar") && pathname.isFile());
+ public boolean accept(Path entry) throws IOException {
+ return entry.getFileName().toString().endsWith(".jar")
+ && Files.isRegularFile(entry);
}
- });
- if (matches == null) {
- ui.message("WARN: Cannot list %s", pluginsDir.getAbsolutePath());
+ };
+ try (DirectoryStream<Path> paths =
+ Files.newDirectoryStream(pluginsDir, filter)) {
+ return Ordering.natural().sortedCopy(paths);
+ } catch (IOException e) {
+ ui.message("WARN: Cannot list %s: %s", pluginsDir.toAbsolutePath(),
+ e.getMessage());
return Collections.emptyList();
}
- Arrays.sort(matches, new Comparator<File>() {
- @Override
- public int compare(File o1, File o2) {
- return o1.getName().compareTo(o2.getName());
- }
- });
- return Arrays.asList(matches);
}
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPlugins.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPlugins.java
index cc076b5..ca4b949 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPlugins.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPlugins.java
@@ -25,9 +25,10 @@
import com.google.inject.Injector;
import com.google.inject.Singleton;
-import java.io.File;
import java.io.IOException;
import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.List;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
@@ -55,10 +56,10 @@
pluginsDistribution.foreach(new PluginsDistribution.Processor() {
@Override
public void process(String pluginName, InputStream in) throws IOException {
- File tmpPlugin = JarPluginProvider.storeInTemp(pluginName, in, site);
+ Path tmpPlugin = JarPluginProvider.storeInTemp(pluginName, in, site);
String pluginVersion = getVersion(tmpPlugin);
if (deleteTempPluginFile) {
- tmpPlugin.delete();
+ Files.delete(tmpPlugin);
}
result.add(new PluginData(pluginName, pluginVersion, tmpPlugin));
}
@@ -108,37 +109,39 @@
for (PluginData plugin : plugins) {
String pluginName = plugin.name;
try {
- final File tmpPlugin = plugin.pluginFile;
+ final Path tmpPlugin = plugin.pluginPath;
if (!(initFlags.installPlugins.contains(pluginName) || ui.yesno(false,
"Install plugin %s version %s", pluginName, plugin.version))) {
- tmpPlugin.delete();
+ Files.deleteIfExists(tmpPlugin);
continue;
}
- final File p = new File(site.plugins_dir, plugin.name + ".jar");
- if (p.exists()) {
+ final Path p = site.plugins_dir.resolve(plugin.name + ".jar");
+ if (Files.exists(p)) {
final String installedPluginVersion = getVersion(p);
if (!ui.yesno(false,
"version %s is already installed, overwrite it",
installedPluginVersion)) {
- tmpPlugin.delete();
+ Files.deleteIfExists(tmpPlugin);
continue;
}
- if (!p.delete()) {
+ try {
+ Files.delete(p);
+ } catch (IOException e) {
throw new IOException("Failed to delete plugin " + pluginName
- + ": " + p.getAbsolutePath());
+ + ": " + p.toAbsolutePath(), e);
}
}
- if (!tmpPlugin.renameTo(p)) {
+ try {
+ Files.move(tmpPlugin, p);
+ } catch (IOException e) {
throw new IOException("Failed to install plugin " + pluginName
- + ": " + tmpPlugin.getAbsolutePath() + " -> "
- + p.getAbsolutePath());
+ + ": " + tmpPlugin.toAbsolutePath() + " -> "
+ + p.toAbsolutePath(), e);
}
} finally {
- if (plugin.pluginFile.exists()) {
- plugin.pluginFile.delete();
- }
+ Files.deleteIfExists(plugin.pluginPath);
}
}
if (plugins.isEmpty()) {
@@ -159,11 +162,11 @@
}
}
- private static String getVersion(final File plugin) throws IOException {
- final JarFile jarFile = new JarFile(plugin);
+ private static String getVersion(Path plugin) throws IOException {
+ JarFile jarFile = new JarFile(plugin.toFile());
try {
- final Manifest manifest = jarFile.getManifest();
- final Attributes main = manifest.getMainAttributes();
+ Manifest manifest = jarFile.getManifest();
+ Attributes main = manifest.getMainAttributes();
return main.getValue(Attributes.Name.IMPLEMENTATION_VERSION);
} finally {
jarFile.close();
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSendEmail.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSendEmail.java
index 51eaa22..5c7eefd 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSendEmail.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSendEmail.java
@@ -25,6 +25,8 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
+import java.nio.file.Files;
+
/** Initialize the {@code sendemail} configuration section. */
@Singleton
class InitSendEmail implements InitStep {
@@ -54,7 +56,7 @@
true);
String username = null;
- if (site.gerrit_config.exists()) {
+ if (Files.exists(site.gerrit_config)) {
username = sendemail.get("smtpUser");
} else if ((enc != null && enc != Encryption.NONE) || !isLocal(hostname)) {
username = username();
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSshd.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSshd.java
index ed18d73..c654c8d 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSshd.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSshd.java
@@ -17,6 +17,7 @@
import static com.google.gerrit.common.FileUtil.chmod;
import static com.google.gerrit.pgm.init.api.InitUtil.die;
import static com.google.gerrit.pgm.init.api.InitUtil.hostname;
+import static java.nio.file.Files.exists;
import com.google.gerrit.pgm.init.api.ConsoleUI;
import com.google.gerrit.pgm.init.api.InitStep;
@@ -29,9 +30,10 @@
import org.apache.sshd.common.util.SecurityUtils;
import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
-import java.io.File;
import java.io.IOException;
import java.net.InetSocketAddress;
+import java.nio.file.Files;
+import java.nio.file.Path;
/** Initialize the {@code sshd} configuration section. */
@Singleton
@@ -74,9 +76,9 @@
port = ui.readInt(port, "Listen on port");
sshd.set("listenAddress", SocketUtil.format(hostname, port));
- if (site.ssh_rsa.exists() || site.ssh_dsa.exists()) {
+ if (exists(site.ssh_rsa) || exists(site.ssh_dsa)) {
libraries.bouncyCastleSSL.downloadRequired();
- } else if (!site.ssh_key.exists()) {
+ } else if (!exists(site.ssh_key)) {
libraries.bouncyCastleSSL.downloadOptional();
}
@@ -90,9 +92,9 @@
}
private void generateSshHostKeys() throws InterruptedException, IOException {
- if (!site.ssh_key.exists() //
- && !site.ssh_rsa.exists() //
- && !site.ssh_dsa.exists()) {
+ if (!exists(site.ssh_key) //
+ && !exists(site.ssh_rsa) //
+ && !exists(site.ssh_dsa)) {
System.err.print("Generating SSH host key ...");
System.err.flush();
@@ -108,7 +110,7 @@
"-t", "rsa", //
"-P", "", //
"-C", comment, //
- "-f", site.ssh_rsa.getAbsolutePath() //
+ "-f", site.ssh_rsa.toAbsolutePath().toString() //
}).waitFor();
System.err.print(" dsa...");
@@ -118,7 +120,7 @@
"-t", "dsa", //
"-P", "", //
"-C", comment, //
- "-f", site.ssh_dsa.getAbsolutePath() //
+ "-f", site.ssh_dsa.toAbsolutePath().toString() //
}).waitFor();
} else {
@@ -128,28 +130,34 @@
// short period of time. We try to reduce that risk by creating
// the key within a temporary directory.
//
- final File tmpdir = new File(site.etc_dir, "tmp.sshkeygen");
- if (!tmpdir.mkdir()) {
- throw die("Cannot create directory " + tmpdir);
+ Path tmpdir = site.etc_dir.resolve("tmp.sshkeygen");
+ try {
+ Files.createDirectory(tmpdir);
+ } catch (IOException e) {
+ throw die("Cannot create directory " + tmpdir, e);
}
chmod(0600, tmpdir);
- final File tmpkey = new File(tmpdir, site.ssh_key.getName());
- final SimpleGeneratorHostKeyProvider p;
+ Path tmpkey = tmpdir.resolve(site.ssh_key.getFileName().toString());
+ SimpleGeneratorHostKeyProvider p;
System.err.print(" rsa(simple)...");
System.err.flush();
p = new SimpleGeneratorHostKeyProvider();
- p.setPath(tmpkey.getAbsolutePath());
+ p.setPath(tmpkey.toAbsolutePath().toString());
p.setAlgorithm("RSA");
p.loadKeys(); // forces the key to generate.
chmod(0600, tmpkey);
- if (!tmpkey.renameTo(site.ssh_key)) {
- throw die("Cannot rename " + tmpkey + " to " + site.ssh_key);
+ try {
+ Files.move(tmpkey, site.ssh_key);
+ } catch (IOException e) {
+ throw die("Cannot rename " + tmpkey + " to " + site.ssh_key, e);
}
- if (!tmpdir.delete()) {
- throw die("Cannot delete " + tmpdir);
+ try {
+ Files.delete(tmpdir);
+ } catch (IOException e) {
+ throw die("Cannot delete " + tmpdir, e);
}
}
System.err.println(" done");
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/LibraryDownloader.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/LibraryDownloader.java
index 4bf1c88..00c7c58 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/LibraryDownloader.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/LibraryDownloader.java
@@ -15,21 +15,19 @@
package com.google.gerrit.pgm.init;
import com.google.common.base.Strings;
-import com.google.common.io.Files;
+import com.google.common.hash.Funnels;
+import com.google.common.hash.Hasher;
+import com.google.common.hash.Hashing;
+import com.google.common.io.ByteStreams;
import com.google.gerrit.common.Die;
import com.google.gerrit.common.IoUtil;
import com.google.gerrit.pgm.init.api.ConsoleUI;
import com.google.gerrit.server.config.SitePaths;
import com.google.inject.Inject;
-import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.util.HttpSupport;
-import java.io.File;
-import java.io.FileInputStream;
import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -38,15 +36,17 @@
import java.net.ProxySelector;
import java.net.URISyntaxException;
import java.net.URL;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
/** Get optional or required 3rd party library files into $site_path/lib. */
class LibraryDownloader {
private final ConsoleUI ui;
- private final File lib_dir;
+ private final Path lib_dir;
private boolean required;
private String name;
@@ -55,7 +55,7 @@
private String remove;
private List<LibraryDownloader> needs;
private LibraryDownloader neededBy;
- private File dst;
+ private Path dst;
private boolean download; // download or copy
private boolean exists;
@@ -118,8 +118,8 @@
name = jarName;
}
- dst = new File(lib_dir, jarName);
- if (dst.exists()) {
+ dst = lib_dir.resolve(jarName);
+ if (Files.exists(dst)) {
exists = true;
} else if (shouldGet()) {
doGet();
@@ -158,8 +158,12 @@
}
private void doGet() {
- if (!lib_dir.exists() && !lib_dir.mkdirs()) {
- throw new Die("Cannot create " + lib_dir);
+ if (!Files.exists(lib_dir)) {
+ try {
+ Files.createDirectories(lib_dir);
+ } catch (IOException e) {
+ throw new Die("Cannot create " + lib_dir, e);
+ }
}
try {
@@ -171,7 +175,11 @@
}
verifyFileChecksum();
} catch (IOException err) {
- dst.delete();
+ try {
+ Files.delete(dst);
+ } catch (IOException e) {
+ // Delete failed; leave alone.
+ }
if (ui.isBatch()) {
throw new Die("error: Cannot get " + jarUrl, err);
@@ -186,13 +194,13 @@
System.err.println();
System.err.println("and save as:");
System.err.println();
- System.err.println(" " + dst.getAbsolutePath());
+ System.err.println(" " + dst.toAbsolutePath());
System.err.println();
System.err.flush();
ui.waitForUser();
- if (dst.exists()) {
+ if (Files.exists(dst)) {
verifyFileChecksum();
} else if (!ui.yesno(!required, "Continue without this library")) {
@@ -200,7 +208,7 @@
}
}
- if (dst.exists()) {
+ if (Files.exists(dst)) {
exists = true;
IoUtil.loadJARs(dst);
}
@@ -208,131 +216,120 @@
private void removeStaleVersions() {
if (!Strings.isNullOrEmpty(remove)) {
- String[] names = lib_dir.list(new FilenameFilter() {
+ DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
@Override
- public boolean accept(File dir, String name) {
- return name.matches("^" + remove + "$");
+ public boolean accept(Path entry) {
+ return entry.getFileName().toString()
+ .matches("^" + remove + "$");
}
- });
- if (names != null) {
- for (String old : names) {
+ };
+ try (DirectoryStream<Path> paths =
+ Files.newDirectoryStream(lib_dir, filter)) {
+ for (Path p : paths) {
+ String old = p.getFileName().toString();
String bak = "." + old + ".backup";
ui.message("Renaming %s to %s", old, bak);
- if (!new File(lib_dir, old).renameTo(new File(lib_dir, bak))) {
- throw new Die("cannot rename " + old);
+ try {
+ Files.move(p, p.resolveSibling(bak));
+ } catch (IOException e) {
+ throw new Die("cannot rename " + old, e);
}
}
+ } catch (IOException e) {
+ throw new Die("cannot remove stale library versions", e);
}
}
}
private void doGetByLocalCopy() throws IOException {
System.err.print("Copying " + jarUrl + " ...");
- File f = url2file(jarUrl);
- if (!f.exists()) {
+ Path p = url2file(jarUrl);
+ if (!Files.exists(p)) {
StringBuilder msg = new StringBuilder()
.append("\n")
.append("Can not find the %s at this location: %s\n")
.append("Please provide alternative URL");
- f = url2file(ui.readString(null, msg.toString(), name, jarUrl));
+ p = url2file(ui.readString(null, msg.toString(), name, jarUrl));
}
- Files.copy(f, dst);
+ Files.copy(p, dst);
}
- private static File url2file(final String urlString) throws IOException {
+ private static Path url2file(final String urlString) throws IOException {
final URL url = new URL(urlString);
try {
- return new File(url.toURI());
+ return Paths.get(url.toURI());
} catch (URISyntaxException e) {
- return new File(url.getPath());
+ return Paths.get(url.getPath());
}
}
private void doGetByHttp() throws IOException {
System.err.print("Downloading " + jarUrl + " ...");
System.err.flush();
- try {
- final ProxySelector proxySelector = ProxySelector.getDefault();
- final URL url = new URL(jarUrl);
- final Proxy proxy = HttpSupport.proxyFor(proxySelector, url);
- final HttpURLConnection c = (HttpURLConnection) url.openConnection(proxy);
- final InputStream in;
-
- switch (HttpSupport.response(c)) {
- case HttpURLConnection.HTTP_OK:
- in = c.getInputStream();
- break;
-
- case HttpURLConnection.HTTP_NOT_FOUND:
- throw new FileNotFoundException(url.toString());
-
- default:
- throw new IOException(url.toString() + ": " + HttpSupport.response(c)
- + " " + c.getResponseMessage());
- }
-
- try {
- final OutputStream out = new FileOutputStream(dst);
- try {
- final byte[] buf = new byte[8192];
- int n;
- while ((n = in.read(buf)) > 0) {
- out.write(buf, 0, n);
- }
- } finally {
- out.close();
- }
- } finally {
- in.close();
- }
+ try (InputStream in = openHttpStream(jarUrl);
+ OutputStream out = Files.newOutputStream(dst)) {
+ ByteStreams.copy(in, out);
System.err.println(" OK");
System.err.flush();
} catch (IOException err) {
- dst.delete();
+ deleteDst();
System.err.println(" !! FAIL !!");
System.err.flush();
throw err;
}
}
+ private static InputStream openHttpStream(String urlStr) throws IOException {
+ ProxySelector proxySelector = ProxySelector.getDefault();
+ URL url = new URL(urlStr);
+ Proxy proxy = HttpSupport.proxyFor(proxySelector, url);
+ HttpURLConnection c = (HttpURLConnection) url.openConnection(proxy);
+
+ switch (HttpSupport.response(c)) {
+ case HttpURLConnection.HTTP_OK:
+ return c.getInputStream();
+
+ case HttpURLConnection.HTTP_NOT_FOUND:
+ throw new FileNotFoundException(url.toString());
+
+ default:
+ throw new IOException(url.toString() + ": " + HttpSupport.response(c)
+ + " " + c.getResponseMessage());
+ }
+ }
+
private void verifyFileChecksum() {
- if (sha1 != null) {
- try {
- final MessageDigest md = MessageDigest.getInstance("SHA-1");
- final FileInputStream in = new FileInputStream(dst);
- try {
- final byte[] buf = new byte[8192];
- int n;
- while ((n = in.read(buf)) > 0) {
- md.update(buf, 0, n);
- }
- } finally {
- in.close();
- }
+ if (sha1 == null) {
+ return;
+ }
+ Hasher h = Hashing.sha1().newHasher();
+ try (InputStream in = Files.newInputStream(dst);
+ OutputStream out = Funnels.asOutputStream(h)) {
+ ByteStreams.copy(in, out);
+ } catch (IOException e) {
+ deleteDst();
+ throw new Die("cannot checksum " + dst, e);
+ }
+ if (sha1.equals(h.hash().toString())) {
+ System.err.println("Checksum " + dst.getFileName() + " OK");
+ System.err.flush();
+ } else if (ui.isBatch()) {
+ deleteDst();
+ throw new Die(dst + " SHA-1 checksum does not match");
- if (sha1.equals(ObjectId.fromRaw(md.digest()).name())) {
- System.err.println("Checksum " + dst.getName() + " OK");
- System.err.flush();
+ } else if (!ui.yesno(null /* force an answer */,
+ "error: SHA-1 checksum does not match\n" + "Use %s anyway",//
+ dst.getFileName())) {
+ deleteDst();
+ throw new Die("aborted by user");
+ }
+ }
- } else if (ui.isBatch()) {
- dst.delete();
- throw new Die(dst + " SHA-1 checksum does not match");
-
- } else if (!ui.yesno(null /* force an answer */,
- "error: SHA-1 checksum does not match\n" + "Use %s anyway",//
- dst.getName())) {
- dst.delete();
- throw new Die("aborted by user");
- }
-
- } catch (IOException checksumError) {
- dst.delete();
- throw new Die("cannot checksum " + dst, checksumError);
-
- } catch (NoSuchAlgorithmException checksumError) {
- dst.delete();
- throw new Die("cannot checksum " + dst, checksumError);
- }
+ private void deleteDst() {
+ try {
+ Files.delete(dst);
+ } catch (IOException e) {
+ System.err.println(" Failed to clean up lib: " + dst);
}
}
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SecureStoreInitData.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SecureStoreInitData.java
index 8926759..49877dc 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SecureStoreInitData.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SecureStoreInitData.java
@@ -14,13 +14,13 @@
package com.google.gerrit.pgm.init;
-import java.io.File;
+import java.nio.file.Path;
class SecureStoreInitData {
- final File jarFile;
+ final Path jarFile;
final String className;
- SecureStoreInitData(File jar, String className) {
+ SecureStoreInitData(Path jar, String className) {
this.className = className;
this.jarFile = jar;
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SitePathInitializer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SitePathInitializer.java
index 10c9bad..c30fe58 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SitePathInitializer.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SitePathInitializer.java
@@ -21,7 +21,7 @@
import static com.google.gerrit.pgm.init.api.InitUtil.savePublic;
import static com.google.gerrit.pgm.init.api.InitUtil.version;
-import com.google.common.io.Files;
+import com.google.gerrit.common.FileUtil;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.pgm.init.api.ConsoleUI;
import com.google.gerrit.pgm.init.api.InitFlags;
@@ -35,8 +35,9 @@
import com.google.inject.Injector;
import com.google.inject.TypeLiteral;
-import java.io.File;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
@@ -66,12 +67,10 @@
ui.header("Gerrit Code Review %s", version());
if (site.isNew) {
- if (!ui.yesno(true, "Create '%s'", site.site_path.getCanonicalPath())) {
+ if (!ui.yesno(true, "Create '%s'", site.site_path.toAbsolutePath())) {
throw die("aborted by user");
}
- if (!site.site_path.isDirectory() && !site.site_path.mkdirs()) {
- throw die("Cannot make directory " + site.site_path);
- }
+ FileUtil.mkdirsOrDie(site.site_path, "Cannot make directory");
flags.deleteOnFailure = true;
}
@@ -132,7 +131,8 @@
private void saveSecureStore() throws IOException {
if (secureStoreInitData != null) {
- File dst = new File(site.lib_dir, secureStoreInitData.jarFile.getName());
+ Path dst =
+ site.lib_dir.resolve(secureStoreInitData.jarFile.getFileName());
Files.copy(secureStoreInitData.jarFile, dst);
Section gerritSection = sectionFactory.get("gerrit", null);
gerritSection.set("secureStoreClass", secureStoreInitData.className);
@@ -140,7 +140,7 @@
}
private void extractMailExample(String orig) throws Exception {
- File ex = new File(site.mail_dir, orig + ".example");
+ Path ex = site.mail_dir.resolve(orig + ".example");
extract(ex, OutgoingEmail.class, orig);
chmod(0444, ex);
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java
index 8c13540..21cd3c8 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java
@@ -30,13 +30,14 @@
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.storage.file.FileBasedConfig;
-import java.io.File;
-import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress;
import java.net.URLDecoder;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Map;
import java.util.Properties;
@@ -64,8 +65,8 @@
private final FileBasedConfig cfg;
private final SecureStore sec;
- private final File site_path;
- private final File etc_dir;
+ private final Path site_path;
+ private final Path etc_dir;
private final Section.Factory sections;
@Inject
@@ -82,7 +83,7 @@
boolean isNeedUpgrade() {
for (String name : etcFiles) {
- if (new File(site_path, name).exists()) {
+ if (Files.exists(site_path.resolve(name))) {
return true;
}
}
@@ -95,19 +96,21 @@
return;
}
- if (!ui.yesno(true, "Upgrade '%s'", site_path.getCanonicalPath())) {
+ if (!ui.yesno(true, "Upgrade '%s'", site_path.toAbsolutePath())) {
throw die("aborted by user");
}
for (String name : etcFiles) {
- final File src = new File(site_path, name);
- final File dst = new File(etc_dir, name);
- if (src.exists()) {
- if (dst.exists()) {
+ Path src = site_path.resolve(name);
+ Path dst = etc_dir.resolve(name);
+ if (Files.exists(src)) {
+ if (Files.exists(dst)) {
throw die("File " + src + " would overwrite " + dst);
}
- if (!src.renameTo(dst)) {
- throw die("Cannot rename " + src + " to " + dst);
+ try {
+ Files.move(src, dst);
+ } catch (IOException e) {
+ throw die("Cannot rename " + src + " to " + dst, e);
}
}
}
@@ -256,23 +259,18 @@
private Properties readGerritServerProperties() throws IOException {
final Properties srvprop = new Properties();
final String name = System.getProperty("GerritServer");
- File path;
+ Path path;
if (name != null) {
- path = new File(name);
+ path = Paths.get(name);
} else {
- path = new File(site_path, "GerritServer.properties");
- if (!path.exists()) {
- path = new File("GerritServer.properties");
+ path = site_path.resolve("GerritServer.properties");
+ if (!Files.exists(path)) {
+ path = Paths.get("GerritServer.properties");
}
}
- if (path.exists()) {
- try {
- final InputStream in = new FileInputStream(path);
- try {
- srvprop.load(in);
- } finally {
- in.close();
- }
+ if (Files.exists(path)) {
+ try (InputStream in = Files.newInputStream(path)) {
+ srvprop.load(in);
} catch (IOException e) {
throw new IOException("Cannot read " + name, e);
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java
index dda536d..10d93ee 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java
@@ -40,6 +40,7 @@
import java.io.File;
import java.io.IOException;
+import java.nio.file.Path;
public class AllProjectsConfig extends VersionedMetaData {
@@ -68,11 +69,11 @@
}
private File getPath() {
- File basePath = site.resolve(flags.cfg.getString("gerrit", null, "basePath"));
+ Path basePath = site.resolve(flags.cfg.getString("gerrit", null, "basePath"));
if (basePath == null) {
throw new IllegalStateException("gerrit.basePath must be configured");
}
- return FileKey.resolve(new File(basePath, project), FS.DETECTED);
+ return FileKey.resolve(basePath.resolve(project).toFile(), FS.DETECTED);
}
public AllProjectsConfig load() throws IOException, ConfigInvalidException {
@@ -136,49 +137,41 @@
throw new IOException("All-Projects does not exist.");
}
- Repository repo = new FileRepository(path);
- try {
+ try (Repository repo = new FileRepository(path)) {
inserter = repo.newObjectInserter();
reader = repo.newObjectReader();
- try {
- RevWalk rw = new RevWalk(reader);
- try {
- RevTree srcTree = revision != null ? rw.parseTree(revision) : null;
- newTree = readTree(srcTree);
- saveConfig(ProjectConfig.PROJECT_CONFIG, cfg);
- saveGroupList();
- ObjectId res = newTree.writeTree(inserter);
- if (res.equals(srcTree)) {
- // If there are no changes to the content, don't create the commit.
- return;
- }
-
- CommitBuilder commit = new CommitBuilder();
- commit.setAuthor(ident);
- commit.setCommitter(ident);
- commit.setMessage(msg);
- commit.setTreeId(res);
- if (revision != null) {
- commit.addParentId(revision);
- }
- ObjectId newRevision = inserter.insert(commit);
- updateRef(repo, ident, newRevision, "commit: " + msg);
- revision = newRevision;
- } finally {
- rw.release();
+ try (RevWalk rw = new RevWalk(reader)) {
+ RevTree srcTree = revision != null ? rw.parseTree(revision) : null;
+ newTree = readTree(srcTree);
+ saveConfig(ProjectConfig.PROJECT_CONFIG, cfg);
+ saveGroupList();
+ ObjectId res = newTree.writeTree(inserter);
+ if (res.equals(srcTree)) {
+ // If there are no changes to the content, don't create the commit.
+ return;
}
+
+ CommitBuilder commit = new CommitBuilder();
+ commit.setAuthor(ident);
+ commit.setCommitter(ident);
+ commit.setMessage(msg);
+ commit.setTreeId(res);
+ if (revision != null) {
+ commit.addParentId(revision);
+ }
+ ObjectId newRevision = inserter.insert(commit);
+ updateRef(repo, ident, newRevision, "commit: " + msg);
+ revision = newRevision;
} finally {
if (inserter != null) {
- inserter.release();
+ inserter.close();
inserter = null;
}
if (reader != null) {
- reader.release();
+ reader.close();
reader = null;
}
}
- } finally {
- repo.close();
}
// we need to invalidate the JGit cache if the group list is invalidated in
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitFlags.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitFlags.java
index 2a8155e..07137bc 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitFlags.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitFlags.java
@@ -51,7 +51,7 @@
ConfigInvalidException {
sec = secureStore;
this.installPlugins = installPlugins;
- cfg = new FileBasedConfig(site.gerrit_config, FS.DETECTED);
+ cfg = new FileBasedConfig(site.gerrit_config.toFile(), FS.DETECTED);
cfg.load();
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitUtil.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitUtil.java
index 881208d..904af2f 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitUtil.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitUtil.java
@@ -16,14 +16,15 @@
import static com.google.gerrit.common.FileUtil.modified;
+import com.google.common.io.ByteStreams;
import com.google.gerrit.common.Die;
import org.eclipse.jgit.internal.storage.file.LockFile;
import org.eclipse.jgit.storage.file.FileBasedConfig;
import org.eclipse.jgit.util.FS;
-import org.eclipse.jgit.util.IO;
import org.eclipse.jgit.util.SystemReader;
+import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
@@ -33,7 +34,10 @@
import java.net.URI;
import java.net.URISyntaxException;
import java.net.UnknownHostException;
-import java.nio.ByteBuffer;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
+import java.util.Arrays;
/** Utility functions to help initialize a site. */
public class InitUtil {
@@ -51,9 +55,18 @@
}
}
- public static void mkdir(final File path) {
- if (!path.isDirectory() && !path.mkdir()) {
- throw die("Cannot make directory " + path);
+ public static void mkdir(File file) {
+ mkdir(file.toPath());
+ }
+
+ public static void mkdir(Path path) {
+ if (Files.isDirectory(path)) {
+ return;
+ }
+ try {
+ Files.createDirectory(path);
+ } catch (IOException e) {
+ throw die("Cannot make directory " + path, e);
}
}
@@ -109,12 +122,11 @@
return name;
}
- public static void extract(final File dst, final Class<?> sibling,
- final String name) throws IOException {
+ public static void extract(Path dst, Class<?> sibling, String name)
+ throws IOException {
try (InputStream in = open(sibling, name)) {
if (in != null) {
- ByteBuffer buf = IO.readWholeStream(in, 8192);
- copy(dst, buf);
+ copy(dst, ByteStreams.toByteArray(in));
}
}
}
@@ -136,35 +148,28 @@
return in;
}
- public static void copy(final File dst, final ByteBuffer buf)
+ public static void copy(Path dst, byte[] buf)
throws FileNotFoundException, IOException {
// If the file already has the content we want to put there,
// don't attempt to overwrite the file.
//
- try {
- if (buf.equals(ByteBuffer.wrap(IO.readFully(dst)))) {
+ try (InputStream in = Files.newInputStream(dst)) {
+ if (Arrays.equals(buf, ByteStreams.toByteArray(in))) {
return;
}
- } catch (FileNotFoundException notFound) {
+ } catch (NoSuchFileException notFound) {
// Fall through and write the file.
}
- dst.getParentFile().mkdirs();
- LockFile lf = new LockFile(dst, FS.DETECTED);
+ Files.createDirectories(dst.getParent());
+ LockFile lf = new LockFile(dst.toFile(), FS.DETECTED);
if (!lf.lock()) {
throw new IOException("Cannot lock " + dst);
}
try {
- final OutputStream out = lf.getOutputStream();
- try {
- final byte[] tmp = new byte[4096];
- while (0 < buf.remaining()) {
- int n = Math.min(buf.remaining(), tmp.length);
- buf.get(tmp, 0, n);
- out.write(tmp, 0, n);
- }
- } finally {
- out.close();
+ try (InputStream in = new ByteArrayInputStream(buf);
+ OutputStream out = lf.getOutputStream()) {
+ ByteStreams.copy(in, out);
}
if (!lf.commit()) {
throw new IOException("Cannot commit " + dst);
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/Section.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/Section.java
index fbd8ecd..52b0daa 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/Section.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/Section.java
@@ -20,7 +20,7 @@
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
-import java.io.File;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Set;
@@ -68,10 +68,9 @@
flags.cfg.setStringList(section, subsection, name, all);
}
- } else if (all.size() == 0) {
} else if (all.size() == 1) {
flags.cfg.unset(section, subsection, name);
- } else {
+ } else if (all.size() != 0) {
all.remove(0);
flags.cfg.setStringList(section, subsection, name, all);
}
@@ -106,7 +105,7 @@
return nv;
}
- public File path(final String title, final String name, final String defValue) {
+ public Path path(final String title, final String name, final String defValue) {
return site.resolve(string(title, name, defValue));
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/PrologCompiler.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/rules/PrologCompiler.java
similarity index 80%
rename from gerrit-server/src/main/java/com/google/gerrit/rules/PrologCompiler.java
rename to gerrit-pgm/src/main/java/com/google/gerrit/pgm/rules/PrologCompiler.java
index 4724bc2..ca8b183 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/rules/PrologCompiler.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/rules/PrologCompiler.java
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.rules;
+package com.google.gerrit.pgm.rules;
import com.google.gerrit.common.TimeUtil;
import com.google.gerrit.common.Version;
@@ -22,8 +22,8 @@
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
-import com.googlecode.prolog_cafe.compiler.CompileException;
import com.googlecode.prolog_cafe.compiler.Compiler;
+import com.googlecode.prolog_cafe.exceptions.CompileException;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.lib.Config;
@@ -35,8 +35,11 @@
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.OutputStream;
import java.net.URL;
import java.net.URLClassLoader;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
@@ -67,14 +70,14 @@
NO_RULES, COMPILED
}
- private final File ruleDir;
+ private final Path ruleDir;
private final Repository git;
@Inject
PrologCompiler(@GerritServerConfig Config config, SitePaths site,
@Assisted Repository gitRepository) {
- File cacheDir = site.resolve(config.getString("cache", null, "directory"));
- ruleDir = cacheDir != null ? new File(cacheDir, "rules") : null;
+ Path cacheDir = site.resolve(config.getString("cache", null, "directory"));
+ ruleDir = cacheDir != null ? cacheDir.resolve("rules") : null;
git = gitRepository;
}
@@ -93,9 +96,7 @@
if (ruleDir == null) {
throw new CompileException("Caching not enabled");
}
- if (!ruleDir.isDirectory() && !ruleDir.mkdir()) {
- throw new IOException("Cannot create " + ruleDir);
- }
+ Files.createDirectories(ruleDir);
File tempDir = File.createTempFile("GerritCodeReview_", ".rulec");
if (!tempDir.delete() || !tempDir.mkdir()) {
@@ -111,9 +112,9 @@
compileProlog(rulesId, tempDir);
compileJava(tempDir);
- File jarFile = new File(ruleDir, "rules-" + rulesId.getName() + ".jar");
+ Path jarPath = ruleDir.resolve("rules-" + rulesId.getName() + ".jar");
List<String> classFiles = getRelativePaths(tempDir, ".class");
- createJar(jarFile, classFiles, tempDir, metaConfig, rulesId);
+ createJar(jarPath, classFiles, tempDir, metaConfig, rulesId);
return Status.COMPILED;
} finally {
@@ -222,51 +223,51 @@
}
/** Takes compiled prolog .class files, puts them into the jar file. */
- private void createJar(File archiveFile, List<String> toBeJared,
+ private void createJar(Path archiveFile, List<String> toBeJared,
File tempDir, ObjectId metaConfig, ObjectId rulesId) throws IOException {
long now = TimeUtil.nowMs();
- File tmpjar = File.createTempFile(".rulec_", ".jar", archiveFile.getParentFile());
- try {
- Manifest mf = new Manifest();
- mf.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
- mf.getMainAttributes().putValue("Built-by", "Gerrit Code Review " + Version.getVersion());
- if (git.getDirectory() != null) {
- mf.getMainAttributes().putValue("Source-Repository", git.getDirectory().getPath());
- }
- mf.getMainAttributes().putValue("Source-Commit", metaConfig.name());
- mf.getMainAttributes().putValue("Source-Blob", rulesId.name());
+ Manifest mf = new Manifest();
+ mf.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
+ mf.getMainAttributes().putValue("Built-by", "Gerrit Code Review " + Version.getVersion());
+ if (git.getDirectory() != null) {
+ mf.getMainAttributes().putValue("Source-Repository", git.getDirectory().getPath());
+ }
+ mf.getMainAttributes().putValue("Source-Commit", metaConfig.name());
+ mf.getMainAttributes().putValue("Source-Blob", rulesId.name());
- try (FileOutputStream stream = new FileOutputStream(tmpjar);
- JarOutputStream out = new JarOutputStream(stream, mf)) {
- byte buffer[] = new byte[10240];
- for (String path : toBeJared) {
- JarEntry jarAdd = new JarEntry(path);
- File f = new File(tempDir, path);
- jarAdd.setTime(now);
- out.putNextEntry(jarAdd);
- if (f.isFile()) {
- FileInputStream in = new FileInputStream(f);
- try {
- while (true) {
- int nRead = in.read(buffer, 0, buffer.length);
- if (nRead <= 0) {
- break;
- }
- out.write(buffer, 0, nRead);
+ Path tmpjar =
+ Files.createTempFile(archiveFile.getParent(), ".rulec_", ".jar");
+ try (OutputStream stream = Files.newOutputStream(tmpjar);
+ JarOutputStream out = new JarOutputStream(stream, mf)) {
+ byte[] buffer = new byte[10240];
+ // TODO: fixify this loop
+ for (String path : toBeJared) {
+ JarEntry jarAdd = new JarEntry(path);
+ File f = new File(tempDir, path);
+ jarAdd.setTime(now);
+ out.putNextEntry(jarAdd);
+ if (f.isFile()) {
+ FileInputStream in = new FileInputStream(f);
+ try {
+ while (true) {
+ int nRead = in.read(buffer, 0, buffer.length);
+ if (nRead <= 0) {
+ break;
}
- } finally {
- in.close();
+ out.write(buffer, 0, nRead);
}
+ } finally {
+ in.close();
}
- out.closeEntry();
}
+ out.closeEntry();
}
+ }
- if (!tmpjar.renameTo(archiveFile)) {
- throw new IOException("Cannot replace " + archiveFile);
- }
- } finally {
- tmpjar.delete();
+ try {
+ Files.move(tmpjar, archiveFile);
+ } catch (IOException e) {
+ throw new IOException("Cannot replace " + archiveFile, e);
}
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ErrorLogFile.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ErrorLogFile.java
index a766d1e..b8a618b 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ErrorLogFile.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ErrorLogFile.java
@@ -14,7 +14,7 @@
package com.google.gerrit.pgm.util;
-import com.google.gerrit.common.Die;
+import com.google.gerrit.common.FileUtil;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.util.SystemLog;
@@ -25,8 +25,8 @@
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
-import java.io.File;
-import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.file.Path;
public class ErrorLogFile {
static final String LOG_NAME = "error_log";
@@ -47,12 +47,10 @@
root.addAppender(dst);
}
- public static LifecycleListener start(final File sitePath)
- throws FileNotFoundException {
- final File logdir = new SitePaths(sitePath).logs_dir;
- if (!logdir.exists() && !logdir.mkdirs()) {
- throw new Die("Cannot create log directory: " + logdir);
- }
+ public static LifecycleListener start(final Path sitePath)
+ throws IOException {
+ Path logdir = FileUtil.mkdirsOrDie(new SitePaths(sitePath).logs_dir,
+ "Cannot create log directory");
if (SystemLog.shouldConfigure()) {
initLogSystem(logdir);
}
@@ -69,7 +67,7 @@
};
}
- private static void initLogSystem(final File logdir) {
+ private static void initLogSystem(Path logdir) {
final Logger root = LogManager.getRootLogger();
root.removeAllAppenders();
root.addAppender(SystemLog.createAppender(logdir, LOG_NAME,
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/GarbageCollectionLogFile.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/GarbageCollectionLogFile.java
index 7d33a36..80975a6 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/GarbageCollectionLogFile.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/GarbageCollectionLogFile.java
@@ -14,7 +14,7 @@
package com.google.gerrit.pgm.util;
-import com.google.gerrit.common.Die;
+import com.google.gerrit.common.FileUtil;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.git.GarbageCollection;
@@ -24,17 +24,13 @@
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
-import java.io.File;
-import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.file.Path;
public class GarbageCollectionLogFile {
-
- public static LifecycleListener start(File sitePath)
- throws FileNotFoundException {
- File logdir = new SitePaths(sitePath).logs_dir;
- if (!logdir.exists() && !logdir.mkdirs()) {
- throw new Die("Cannot create log directory: " + logdir);
- }
+ public static LifecycleListener start(Path sitePath) throws IOException {
+ Path logdir = FileUtil.mkdirsOrDie(new SitePaths(sitePath).logs_dir,
+ "Cannot create log directory");
if (SystemLog.shouldConfigure()) {
initLogSystem(logdir);
}
@@ -51,7 +47,7 @@
};
}
- private static void initLogSystem(File logdir) {
+ private static void initLogSystem(Path logdir) {
Logger gcLogger = LogManager.getLogger(GarbageCollection.LOG_NAME);
gcLogger.removeAllAppenders();
gcLogger.addAppender(SystemLog.createAppender(logdir,
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/LogFileCompressor.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/LogFileCompressor.java
index db74ac3..1107208 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/LogFileCompressor.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/LogFileCompressor.java
@@ -16,6 +16,7 @@
import static java.util.concurrent.TimeUnit.HOURS;
+import com.google.common.io.ByteStreams;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.lifecycle.LifecycleModule;
import com.google.gerrit.server.config.SitePaths;
@@ -25,12 +26,12 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.zip.GZIPOutputStream;
/** Compresses the old error logs. */
@@ -65,76 +66,78 @@
}
}
- private final File logs_dir;
+ private final Path logs_dir;
@Inject
LogFileCompressor(final SitePaths site) {
logs_dir = resolve(site.logs_dir);
}
- private static File resolve(final File logs_dir) {
+ private static Path resolve(Path p) {
try {
- return logs_dir.getCanonicalFile();
+ return p.toRealPath().normalize();
} catch (IOException e) {
- return logs_dir.getAbsoluteFile();
+ return p.toAbsolutePath().normalize();
}
}
@Override
public void run() {
- final File[] list = logs_dir.listFiles();
- if (list == null) {
+ if (!Files.isDirectory(logs_dir)) {
return;
}
-
- for (final File entry : list) {
- if (!isLive(entry) && !isCompressed(entry) && isLogFile(entry)) {
- compress(entry);
+ try (DirectoryStream<Path> list = Files.newDirectoryStream(logs_dir)) {
+ for (Path entry : list) {
+ if (!isLive(entry) && !isCompressed(entry) && isLogFile(entry)) {
+ compress(entry);
+ }
}
+ } catch (IOException e) {
+ log.error("Error listing logs to compress in " + logs_dir, e);
}
}
- private boolean isLive(final File entry) {
- final String name = entry.getName();
+ private boolean isLive(Path entry) {
+ String name = entry.getFileName().toString();
return name.endsWith("_log")
|| name.endsWith(".log")
|| name.endsWith(".run")
|| name.endsWith(".pid");
}
- private boolean isCompressed(final File entry) {
- final String name = entry.getName();
+ private boolean isCompressed(Path entry) {
+ String name = entry.getFileName().toString();
return name.endsWith(".gz") //
|| name.endsWith(".zip") //
|| name.endsWith(".bz2");
}
- private boolean isLogFile(final File entry) {
- return entry.isFile();
+ private boolean isLogFile(Path entry) {
+ return Files.isRegularFile(entry);
}
- private void compress(final File src) {
- final File dir = src.getParentFile();
- final File dst = new File(dir, src.getName() + ".gz");
- final File tmp = new File(dir, ".tmp." + src.getName());
+ private void compress(Path src) {
+ Path dst = src.resolveSibling(src.getFileName() + ".gz");
+ Path tmp = src.resolveSibling(".tmp." + src.getFileName());
try {
- try (InputStream in = new FileInputStream(src);
- FileOutputStream fo = new FileOutputStream(tmp);
- OutputStream out = new GZIPOutputStream(fo)) {
- final byte[] buf = new byte[2048];
- int n;
- while (0 < (n = in.read(buf))) {
- out.write(buf, 0, n);
- }
- tmp.setReadOnly();
+ try (InputStream in = Files.newInputStream(src);
+ OutputStream out = new GZIPOutputStream(Files.newOutputStream(tmp))) {
+ ByteStreams.copy(in, out);
}
- if (!tmp.renameTo(dst)) {
- throw new IOException("Cannot rename " + tmp + " to " + dst);
+ tmp.toFile().setReadOnly();
+ try {
+ Files.move(tmp, dst);
+ } catch (IOException e) {
+ throw new IOException("Cannot rename " + tmp + " to " + dst, e);
}
- src.delete();
+ Files.delete(src);
} catch (IOException e) {
log.error("Cannot compress " + src, e);
- tmp.delete();
+ try {
+ Files.deleteIfExists(tmp);
+ } catch (IOException e2) {
+ log.warn("Failed to delete temporary log file " + tmp, e2);
+ }
}
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteLibraryBasedDataSourceProvider.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteLibraryBasedDataSourceProvider.java
index c713b79..048c2ee 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteLibraryBasedDataSourceProvider.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteLibraryBasedDataSourceProvider.java
@@ -24,14 +24,14 @@
import org.eclipse.jgit.lib.Config;
-import java.io.File;
+import java.nio.file.Path;
import javax.sql.DataSource;
/** Loads the site library if not yet loaded. */
@Singleton
public class SiteLibraryBasedDataSourceProvider extends DataSourceProvider {
- private final File libdir;
+ private final Path libdir;
private boolean init;
@Inject
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java
index 02a8eac..293914b 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java
@@ -54,9 +54,11 @@
import org.eclipse.jgit.util.FS;
import org.kohsuke.args4j.Option;
-import java.io.File;
import java.io.IOException;
import java.lang.annotation.Annotation;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
@@ -66,30 +68,30 @@
public abstract class SiteProgram extends AbstractProgram {
@Option(name = "--site-path", aliases = {"-d"}, usage = "Local directory containing site data")
- private File sitePath = new File(".");
+ private void setSitePath(String path) {
+ sitePath = Paths.get(path);
+ }
protected Provider<DataSource> dsProvider;
+ private Path sitePath = Paths.get(".");
+
protected SiteProgram() {
}
- protected SiteProgram(File sitePath, final Provider<DataSource> dsProvider) {
+ protected SiteProgram(Path sitePath, final Provider<DataSource> dsProvider) {
this.sitePath = sitePath;
this.dsProvider = dsProvider;
}
/** @return the site path specified on the command line. */
- protected File getSitePath() {
- File path = sitePath.getAbsoluteFile();
- if (".".equals(path.getName())) {
- path = path.getParentFile();
- }
- return path;
+ protected Path getSitePath() {
+ return sitePath;
}
/** Ensures we are running inside of a valid site, otherwise throws a Die. */
protected void mustHaveValidSite() throws Die {
- if (!new File(new File(getSitePath(), "etc"), "gerrit.config").exists()) {
+ if (!Files.exists(sitePath.resolve("etc").resolve("gerrit.config"))) {
throw die("not a Gerrit site: '" + getSitePath() + "'\n"
+ "Perhaps you need to run init first?");
}
@@ -97,13 +99,13 @@
/** @return provides database connectivity and site path. */
protected Injector createDbInjector(final DataSourceProvider.Context context) {
- final File sitePath = getSitePath();
+ final Path sitePath = getSitePath();
final List<Module> modules = new ArrayList<>();
Module sitePathModule = new AbstractModule() {
@Override
protected void configure() {
- bind(File.class).annotatedWith(SitePath.class).toInstance(sitePath);
+ bind(Path.class).annotatedWith(SitePath.class).toInstance(sitePath);
bind(String.class).annotatedWith(SecureStoreClassName.class)
.toProvider(Providers.of(getConfiguredSecureStoreClass()));
}
@@ -191,13 +193,14 @@
Module m = new AbstractModule() {
@Override
protected void configure() {
- bind(File.class).annotatedWith(SitePath.class).toInstance(sitePath);
+ bind(Path.class).annotatedWith(SitePath.class).toInstance(getSitePath());
bind(SitePaths.class);
}
};
Injector i = Guice.createInjector(m);
SitePaths site = i.getInstance(SitePaths.class);
- FileBasedConfig cfg = new FileBasedConfig(site.gerrit_config, FS.DETECTED);
+ FileBasedConfig cfg =
+ new FileBasedConfig(site.gerrit_config.toFile(), FS.DETECTED);
if (!cfg.getFile().exists()) {
return null;
}
@@ -222,7 +225,7 @@
modules.add(new AbstractModule() {
@Override
protected void configure() {
- bind(File.class).annotatedWith(SitePath.class).toInstance(sitePath);
+ bind(Path.class).annotatedWith(SitePath.class).toInstance(getSitePath());
}
});
modules.add(new GerritServerConfigModule());
diff --git a/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/InitTestCase.java b/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/InitTestCase.java
index 4d7370b..150309e 100644
--- a/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/InitTestCase.java
+++ b/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/InitTestCase.java
@@ -16,11 +16,11 @@
import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase;
-import java.io.File;
import java.io.IOException;
+import java.nio.file.Path;
public abstract class InitTestCase extends LocalDiskRepositoryTestCase {
- protected File newSitePath() throws IOException {
- return new File(createWorkRepository().getWorkTree(), "test_site");
+ protected Path newSitePath() throws IOException {
+ return createWorkRepository().getWorkTree().toPath().resolve("test_site");
}
}
diff --git a/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/LibrariesTest.java b/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/LibrariesTest.java
index a37c97d..2198788 100644
--- a/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/LibrariesTest.java
+++ b/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/LibrariesTest.java
@@ -25,13 +25,12 @@
import org.junit.Test;
-import java.io.File;
-import java.io.FileNotFoundException;
+import java.nio.file.Paths;
public class LibrariesTest {
@Test
- public void testCreate() throws FileNotFoundException {
- final SitePaths site = new SitePaths(new File("."));
+ public void testCreate() throws Exception {
+ final SitePaths site = new SitePaths(Paths.get("."));
final ConsoleUI ui = createStrictMock(ConsoleUI.class);
replay(ui);
diff --git a/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_xTest.java b/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_xTest.java
index 720d108..dc7ce59 100644
--- a/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_xTest.java
+++ b/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_xTest.java
@@ -14,6 +14,7 @@
package com.google.gerrit.pgm.init;
+import static java.nio.charset.StandardCharsets.UTF_8;
import static org.easymock.EasyMock.createStrictMock;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
@@ -24,6 +25,8 @@
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import com.google.common.io.ByteStreams;
+import com.google.gerrit.common.FileUtil;
import com.google.gerrit.pgm.init.api.ConsoleUI;
import com.google.gerrit.pgm.init.api.InitFlags;
import com.google.gerrit.pgm.init.api.Section;
@@ -34,13 +37,12 @@
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.storage.file.FileBasedConfig;
import org.eclipse.jgit.util.FS;
-import org.eclipse.jgit.util.IO;
import org.junit.Test;
-import java.io.File;
-import java.io.FileWriter;
import java.io.IOException;
-import java.io.Writer;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.Collections;
import java.util.List;
@@ -49,23 +51,17 @@
@Test
public void testUpgrade() throws IOException, ConfigInvalidException {
- final File p = newSitePath();
+ final Path p = newSitePath();
final SitePaths site = new SitePaths(p);
assertTrue(site.isNew);
- assertTrue(site.site_path.mkdir());
- assertTrue(site.etc_dir.mkdir());
+ FileUtil.mkdirsOrDie(site.etc_dir, "Failed to create");
for (String n : UpgradeFrom2_0_x.etcFiles) {
- Writer w = new FileWriter(new File(p, n));
- try {
- w.write("# " + n + "\n");
- } finally {
- w.close();
- }
+ Files.write(p.resolve(n), ("# " + n + "\n").getBytes(UTF_8));
}
FileBasedConfig old =
- new FileBasedConfig(new File(p, "gerrit.config"), FS.DETECTED);
+ new FileBasedConfig(p.resolve("gerrit.config").toFile(), FS.DETECTED);
old.setString("ldap", null, "username", "ldap.user");
old.setString("ldap", null, "password", "ldap.s3kr3t");
@@ -85,8 +81,11 @@
}
};
- expect(ui.yesno(eq(true), eq("Upgrade '%s'"), eq(p.getCanonicalPath())))
- .andReturn(true);
+ expect(ui.yesno(
+ eq(true),
+ eq("Upgrade '%s'"),
+ eq(p.toAbsolutePath().normalize())))
+ .andReturn(true);
replay(ui);
UpgradeFrom2_0_x u = new UpgradeFrom2_0_x(site, flags, ui, sections);
@@ -96,13 +95,17 @@
verify(ui);
for (String n : UpgradeFrom2_0_x.etcFiles) {
- if ("gerrit.config".equals(n)) continue;
- if ("secure.config".equals(n)) continue;
- assertEquals("# " + n + "\n",//
- new String(IO.readFully(new File(site.etc_dir, n)), "UTF-8"));
+ if ("gerrit.config".equals(n) || "secure.config".equals(n)) {
+ continue;
+ }
+ try (InputStream in = Files.newInputStream(site.etc_dir.resolve(n))) {
+ assertEquals("# " + n + "\n",
+ new String(ByteStreams.toByteArray(in), UTF_8));
+ }
}
- FileBasedConfig cfg = new FileBasedConfig(site.gerrit_config, FS.DETECTED);
+ FileBasedConfig cfg =
+ new FileBasedConfig(site.gerrit_config.toFile(), FS.DETECTED);
cfg.load();
assertEquals("email.user", cfg.getString("sendemail", null, "smtpUser"));
diff --git a/gerrit-plugin-api/pom.xml b/gerrit-plugin-api/pom.xml
index 40767e0..eb2ec31 100644
--- a/gerrit-plugin-api/pom.xml
+++ b/gerrit-plugin-api/pom.xml
@@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.google.gerrit</groupId>
<artifactId>gerrit-plugin-api</artifactId>
- <version>2.11-SNAPSHOT</version>
+ <version>2.12-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Gerrit Code Review - Plugin API</name>
<description>API for Gerrit Plugins</description>
diff --git a/gerrit-plugin-archetype/pom.xml b/gerrit-plugin-archetype/pom.xml
index b117b29..1da5d51 100644
--- a/gerrit-plugin-archetype/pom.xml
+++ b/gerrit-plugin-archetype/pom.xml
@@ -20,7 +20,7 @@
<groupId>com.google.gerrit</groupId>
<artifactId>gerrit-plugin-archetype</artifactId>
- <version>2.11-SNAPSHOT</version>
+ <version>2.12-SNAPSHOT</version>
<name>Gerrit Code Review - Plugin Archetype</name>
<description>Maven Archetype for Gerrit Plugins</description>
<url>http://code.google.com/p/gerrit/</url>
diff --git a/gerrit-plugin-gwt-archetype/pom.xml b/gerrit-plugin-gwt-archetype/pom.xml
index a7f2bbf..bd4d738 100644
--- a/gerrit-plugin-gwt-archetype/pom.xml
+++ b/gerrit-plugin-gwt-archetype/pom.xml
@@ -20,7 +20,7 @@
<groupId>com.google.gerrit</groupId>
<artifactId>gerrit-plugin-gwt-archetype</artifactId>
- <version>2.11-SNAPSHOT</version>
+ <version>2.12-SNAPSHOT</version>
<name>Gerrit Code Review - Web UI GWT Plugin Archetype</name>
<description>Maven Archetype for Gerrit Web UI GWT Plugins</description>
<url>http://code.google.com/p/gerrit/</url>
diff --git a/gerrit-plugin-gwtui/pom.xml b/gerrit-plugin-gwtui/pom.xml
index fd6fc9b..fa261be 100644
--- a/gerrit-plugin-gwtui/pom.xml
+++ b/gerrit-plugin-gwtui/pom.xml
@@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.google.gerrit</groupId>
<artifactId>gerrit-plugin-gwtui</artifactId>
- <version>2.11-SNAPSHOT</version>
+ <version>2.12-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Gerrit Code Review - Plugin GWT UI</name>
<description>Common Classes for Gerrit GWT UI Plugins</description>
diff --git a/gerrit-plugin-js-archetype/pom.xml b/gerrit-plugin-js-archetype/pom.xml
index 796df19..11d4d83 100644
--- a/gerrit-plugin-js-archetype/pom.xml
+++ b/gerrit-plugin-js-archetype/pom.xml
@@ -20,7 +20,7 @@
<groupId>com.google.gerrit</groupId>
<artifactId>gerrit-plugin-js-archetype</artifactId>
- <version>2.11-SNAPSHOT</version>
+ <version>2.12-SNAPSHOT</version>
<name>Gerrit Code Review - Web UI JavaScript Plugin Archetype</name>
<description>Maven Archetype for Gerrit Web UI JavaScript Plugins</description>
<url>http://code.google.com/p/gerrit/</url>
diff --git a/gerrit-prettify/src/main/java/com/google/gerrit/prettify/PrettyFormatter.gwt.xml b/gerrit-prettify/src/main/java/com/google/gerrit/prettify/PrettyFormatter.gwt.xml
index 48591f8..fd88f6c 100644
--- a/gerrit-prettify/src/main/java/com/google/gerrit/prettify/PrettyFormatter.gwt.xml
+++ b/gerrit-prettify/src/main/java/com/google/gerrit/prettify/PrettyFormatter.gwt.xml
@@ -14,10 +14,9 @@
limitations under the License.
-->
<module>
- <replace-with class='com.google.gerrit.prettify.client.PrivateScopeImplIE6'>
+ <replace-with class='com.google.gerrit.prettify.client.PrivateScopeImplIE8'>
<when-type-is class='com.google.gerrit.prettify.client.PrivateScopeImpl'/>
<any>
- <when-property-is name="user.agent" value="ie6" />
<when-property-is name="user.agent" value="ie8" />
</any>
</replace-with>
diff --git a/gerrit-prettify/src/main/java/com/google/gerrit/prettify/client/PrivateScopeImplIE6.java b/gerrit-prettify/src/main/java/com/google/gerrit/prettify/client/PrivateScopeImplIE8.java
similarity index 90%
rename from gerrit-prettify/src/main/java/com/google/gerrit/prettify/client/PrivateScopeImplIE6.java
rename to gerrit-prettify/src/main/java/com/google/gerrit/prettify/client/PrivateScopeImplIE8.java
index abb4e15..0496d91 100644
--- a/gerrit-prettify/src/main/java/com/google/gerrit/prettify/client/PrivateScopeImplIE6.java
+++ b/gerrit-prettify/src/main/java/com/google/gerrit/prettify/client/PrivateScopeImplIE8.java
@@ -16,8 +16,8 @@
import com.google.gwt.core.client.JavaScriptObject;
-/** IE6 requires us to initialize the document before we can use it. */
-public class PrivateScopeImplIE6 extends PrivateScopeImpl {
+/** MSIE requires us to initialize the document before we can use it. */
+public class PrivateScopeImplIE8 extends PrivateScopeImpl {
private JavaScriptObject context;
@Override
diff --git a/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/EditList.java b/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/EditList.java
index 6a42a8e..ec5c78d8 100644
--- a/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/EditList.java
+++ b/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/EditList.java
@@ -68,8 +68,9 @@
private int findCombinedEnd(final int i) {
int end = i + 1;
- while (end < edits.size() && (combineA(end) || combineB(end)))
+ while (end < edits.size() && (combineA(end) || combineB(end))) {
end++;
+ }
return end - 1;
}
diff --git a/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/SparseFileContent.java b/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/SparseFileContent.java
index b6e3bf9..a57146f 100644
--- a/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/SparseFileContent.java
+++ b/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/SparseFileContent.java
@@ -130,10 +130,11 @@
return size();
}
- if (idx < cur.base)
+ if (idx < cur.base) {
high = mid;
- else
+ } else {
low = mid + 1;
+ }
} while (low < high);
return size();
@@ -183,10 +184,11 @@
currentRangeIdx = mid;
return cur.get(idx);
}
- if (idx < cur.base)
+ if (idx < cur.base) {
high = mid;
- else
+ } else {
low = mid + 1;
+ }
} while (low < high);
return null;
}
diff --git a/gerrit-server/BUCK b/gerrit-server/BUCK
index 7202dc3..087880e 100644
--- a/gerrit-server/BUCK
+++ b/gerrit-server/BUCK
@@ -66,7 +66,7 @@
'//lib/ow2:ow2-asm',
'//lib/ow2:ow2-asm-tree',
'//lib/ow2:ow2-asm-util',
- '//lib/prolog:prolog-cafe',
+ '//lib/prolog:runtime',
],
provided_deps = [
'//lib:servlet-api-3_1',
@@ -134,7 +134,7 @@
'//gerrit-common:server',
'//lib:junit',
'//lib/guice:guice',
- '//lib/prolog:prolog-cafe',
+ '//lib/prolog:runtime',
],
)
@@ -155,7 +155,7 @@
'//lib:truth',
'//lib/jgit:jgit',
'//lib/guice:guice',
- '//lib/prolog:prolog-cafe',
+ '//lib/prolog:runtime',
],
)
@@ -217,7 +217,7 @@
'//lib/joda:joda-time',
'//lib:parboiled-core',
'//lib:parboiled-java',
- '//lib/prolog:prolog-cafe',
+ '//lib/prolog:runtime',
],
source_under_test = [':server'],
visibility = ['//tools/eclipse:classpath'],
diff --git a/gerrit-server/src/main/java/com/google/gerrit/audit/AuditEvent.java b/gerrit-server/src/main/java/com/google/gerrit/audit/AuditEvent.java
index e25b7cb..14f12b8 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/audit/AuditEvent.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/audit/AuditEvent.java
@@ -79,9 +79,15 @@
@Override
public boolean equals(Object obj) {
- if (this == obj) return true;
- if (obj == null) return false;
- if (getClass() != obj.getClass()) return false;
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
AuditEvent other = (AuditEvent) obj;
return this.uuid.equals(other.uuid);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHookRunner.java b/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHookRunner.java
index 8bd082d..019bcab 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHookRunner.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHookRunner.java
@@ -14,7 +14,6 @@
package com.google.gerrit.common;
-import com.google.common.base.Strings;
import com.google.common.collect.Sets;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.google.gerrit.common.data.ContributorAgreement;
@@ -66,12 +65,14 @@
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
-import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.io.StringWriter;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -169,44 +170,44 @@
/** Listeners to receive all changes as they happen. */
private final DynamicSet<EventListener> unrestrictedListeners;
- /** Filename of the new patchset hook. */
- private final File patchsetCreatedHook;
+ /** Path of the new patchset hook. */
+ private final Path patchsetCreatedHook;
- /** Filename of the draft published hook. */
- private final File draftPublishedHook;
+ /** Path of the draft published hook. */
+ private final Path draftPublishedHook;
- /** Filename of the new comments hook. */
- private final File commentAddedHook;
+ /** Path of the new comments hook. */
+ private final Path commentAddedHook;
- /** Filename of the change merged hook. */
- private final File changeMergedHook;
+ /** Path of the change merged hook. */
+ private final Path changeMergedHook;
- /** Filename of the merge failed hook. */
- private final File mergeFailedHook;
+ /** Path of the merge failed hook. */
+ private final Path mergeFailedHook;
- /** Filename of the change abandoned hook. */
- private final File changeAbandonedHook;
+ /** Path of the change abandoned hook. */
+ private final Path changeAbandonedHook;
- /** Filename of the change restored hook. */
- private final File changeRestoredHook;
+ /** Path of the change restored hook. */
+ private final Path changeRestoredHook;
- /** Filename of the ref updated hook. */
- private final File refUpdatedHook;
+ /** Path of the ref updated hook. */
+ private final Path refUpdatedHook;
- /** Filename of the reviewer added hook. */
- private final File reviewerAddedHook;
+ /** Path of the reviewer added hook. */
+ private final Path reviewerAddedHook;
- /** Filename of the topic changed hook. */
- private final File topicChangedHook;
+ /** Path of the topic changed hook. */
+ private final Path topicChangedHook;
- /** Filename of the cla signed hook. */
- private final File claSignedHook;
+ /** Path of the cla signed hook. */
+ private final Path claSignedHook;
- /** Filename of the update hook. */
- private final File refUpdateHook;
+ /** Path of the update hook. */
+ private final Path refUpdateHook;
- /** Filename of the hashtags changed hook */
- private final File hashtagsChangedHook;
+ /** Path of the hashtags changed hook */
+ private final Path hashtagsChangedHook;
private final String anonymousCowardName;
@@ -258,21 +259,30 @@
this.sitePaths = sitePath;
this.unrestrictedListeners = unrestrictedListeners;
- final File hooksPath = sitePath.resolve(getValue(config, "hooks", "path", sitePath.hooks_dir.getAbsolutePath()));
+ Path hooksPath;
+ String hooksPathConfig = config.getString("hooks", null, "path");
+ if (hooksPathConfig != null) {
+ hooksPath = Paths.get(hooksPathConfig);
+ } else {
+ hooksPath = sitePath.hooks_dir;
+ }
- patchsetCreatedHook = sitePath.resolve(new File(hooksPath, getValue(config, "hooks", "patchsetCreatedHook", "patchset-created")).getPath());
- draftPublishedHook = sitePath.resolve(new File(hooksPath, getValue(config, "hooks", "draftPublishedHook", "draft-published")).getPath());
- commentAddedHook = sitePath.resolve(new File(hooksPath, getValue(config, "hooks", "commentAddedHook", "comment-added")).getPath());
- changeMergedHook = sitePath.resolve(new File(hooksPath, getValue(config, "hooks", "changeMergedHook", "change-merged")).getPath());
- mergeFailedHook = sitePath.resolve(new File(hooksPath, getValue(config, "hooks", "mergeFailedHook", "merge-failed")).getPath());
- changeAbandonedHook = sitePath.resolve(new File(hooksPath, getValue(config, "hooks", "changeAbandonedHook", "change-abandoned")).getPath());
- changeRestoredHook = sitePath.resolve(new File(hooksPath, getValue(config, "hooks", "changeRestoredHook", "change-restored")).getPath());
- refUpdatedHook = sitePath.resolve(new File(hooksPath, getValue(config, "hooks", "refUpdatedHook", "ref-updated")).getPath());
- reviewerAddedHook = sitePath.resolve(new File(hooksPath, getValue(config, "hooks", "reviewerAddedHook", "reviewer-added")).getPath());
- topicChangedHook = sitePath.resolve(new File(hooksPath, getValue(config, "hooks", "topicChangedHook", "topic-changed")).getPath());
- claSignedHook = sitePath.resolve(new File(hooksPath, getValue(config, "hooks", "claSignedHook", "cla-signed")).getPath());
- refUpdateHook = sitePath.resolve(new File(hooksPath, getValue(config, "hooks", "refUpdateHook", "ref-update")).getPath());
- hashtagsChangedHook = sitePath.resolve(new File(hooksPath, getValue(config, "hooks", "hashtagsChangedHook", "hashtags-changed")).getPath());
+ // When adding a new hook, make sure to check that the setting name
+ // canonicalizes correctly in hook() below.
+ patchsetCreatedHook = hook(config, hooksPath, "patchset-created");
+ draftPublishedHook = hook(config, hooksPath, "draft-published");
+ commentAddedHook = hook(config, hooksPath, "comment-added");
+ changeMergedHook = hook(config, hooksPath, "change-merged");
+ mergeFailedHook = hook(config, hooksPath, "merge-failed");
+ changeAbandonedHook = hook(config, hooksPath, "change-abandoned");
+ changeRestoredHook = hook(config, hooksPath, "change-restored");
+ refUpdatedHook = hook(config, hooksPath, "ref-updated");
+ reviewerAddedHook = hook(config, hooksPath, "reviewer-added");
+ topicChangedHook = hook(config, hooksPath, "topic-changed");
+ claSignedHook = hook(config, hooksPath, "cla-signed");
+ refUpdateHook = hook(config, hooksPath, "ref-update");
+ hashtagsChangedHook = hook(config, hooksPath, "hashtags-changed");
+
syncHookTimeout = config.getInt("hooks", "syncHookTimeout", 30);
syncHookThreadPool = Executors.newCachedThreadPool(
new ThreadFactoryBuilder()
@@ -280,6 +290,12 @@
.build());
}
+ private static Path hook(Config config, Path path, String name) {
+ String setting = name.replace("-", "") + "hook";
+ String value = config.getString("hooks", null, setting);
+ return path.resolve(value != null ? value : name);
+ }
+
@Override
public void addEventListener(EventListener listener, CurrentUser user) {
listeners.put(listener, new EventListenerHolder(listener, user));
@@ -291,20 +307,6 @@
}
/**
- * Helper Method for getting values from the config.
- *
- * @param config Config file to get value from.
- * @param section Section to look in.
- * @param setting Setting to get.
- * @param fallback Fallback value.
- * @return Setting value if found, else fallback.
- */
- private String getValue(final Config config, final String section, final String setting, final String fallback) {
- final String result = config.getString(section, null, setting);
- return Strings.isNullOrEmpty(result) ? fallback : result;
- }
-
- /**
* Get the Repository for the given project name, or null on error.
*
* @param name Project to get repo for,
@@ -788,23 +790,23 @@
* @param hook the hook to execute.
* @param args Arguments to use to run the hook.
*/
- private synchronized void runHook(Project.NameKey project, File hook,
+ private synchronized void runHook(Project.NameKey project, Path hook,
List<String> args) {
- if (project != null && hook.exists()) {
+ if (project != null && Files.exists(hook)) {
hookQueue.execute(new AsyncHookTask(project, hook, args));
}
}
- private synchronized void runHook(File hook, List<String> args) {
- if (hook.exists()) {
+ private synchronized void runHook(Path hook, List<String> args) {
+ if (Files.exists(hook)) {
hookQueue.execute(new AsyncHookTask(null, hook, args));
}
}
private HookResult runSyncHook(Project.NameKey project,
- File hook, List<String> args) {
+ Path hook, List<String> args) {
- if (!hook.exists()) {
+ if (!Files.exists(hook)) {
return null;
}
@@ -818,10 +820,10 @@
try {
return task.get(syncHookTimeout, TimeUnit.SECONDS);
} catch (TimeoutException e) {
- message = "Synchronous hook timed out " + hook.getAbsolutePath();
+ message = "Synchronous hook timed out " + hook.toAbsolutePath();
log.error(message);
} catch (Exception e) {
- message = "Error running hook " + hook.getAbsolutePath();
+ message = "Error running hook " + hook.toAbsolutePath();
log.error(message, e);
}
@@ -849,12 +851,12 @@
private class HookTask {
private final Project.NameKey project;
- private final File hook;
+ private final Path hook;
private final List<String> args;
private StringWriter output;
private Process ps;
- protected HookTask(Project.NameKey project, File hook, List<String> args) {
+ protected HookTask(Project.NameKey project, Path hook, List<String> args) {
this.project = project;
this.hook = hook;
this.args = args;
@@ -870,7 +872,7 @@
try {
final List<String> argv = new ArrayList<>(1 + args.size());
- argv.add(hook.getAbsolutePath());
+ argv.add(hook.toAbsolutePath().toString());
argv.addAll(args);
final ProcessBuilder pb = new ProcessBuilder(argv);
@@ -881,7 +883,7 @@
}
final Map<String, String> env = pb.environment();
- env.put("GERRIT_SITE", sitePaths.site_path.getAbsolutePath());
+ env.put("GERRIT_SITE", sitePaths.site_path.toAbsolutePath().toString());
if (repo != null) {
pb.directory(repo.getDirectory());
@@ -906,7 +908,7 @@
} catch (InterruptedException iex) {
// InterruptedExeception - timeout or cancel
} catch (Throwable err) {
- log.error("Error running hook " + hook.getAbsolutePath(), err);
+ log.error("Error running hook " + hook.toAbsolutePath(), err);
} finally {
if (repo != null) {
repo.close();
@@ -949,12 +951,12 @@
}
protected String getName() {
- return hook.getName();
+ return hook.getFileName().toString();
}
@Override
public String toString() {
- return "hook " + hook.getName();
+ return "hook " + hook.getFileName();
}
public void cancel() {
@@ -966,7 +968,7 @@
private final class SyncHookTask extends HookTask
implements Callable<HookResult> {
- private SyncHookTask(Project.NameKey project, File hook, List<String> args) {
+ private SyncHookTask(Project.NameKey project, Path hook, List<String> args) {
super(project, hook, args);
}
@@ -979,7 +981,7 @@
/** Runnable type used to run asynchronous hooks */
private final class AsyncHookTask extends HookTask implements Runnable {
- private AsyncHookTask(Project.NameKey project, File hook, List<String> args) {
+ private AsyncHookTask(Project.NameKey project, Path hook, List<String> args) {
super(project, hook, args);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/PrologEnvironment.java b/gerrit-server/src/main/java/com/google/gerrit/rules/PrologEnvironment.java
index 2afdffc..26c0fd0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/rules/PrologEnvironment.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/rules/PrologEnvironment.java
@@ -28,6 +28,7 @@
import com.googlecode.prolog_cafe.lang.BufferingPrologControl;
import com.googlecode.prolog_cafe.lang.Predicate;
+import com.googlecode.prolog_cafe.lang.PredicateEncoder;
import com.googlecode.prolog_cafe.lang.Prolog;
import com.googlecode.prolog_cafe.lang.PrologMachineCopy;
@@ -50,11 +51,8 @@
* A single copy of the Prolog interpreter, for the current thread.
*/
public class PrologEnvironment extends BufferingPrologControl {
-
private static final Logger log =
- LoggerFactory.getLogger(PrologEnvironment.class);
-
- static final int MAX_ARITY = 8;
+ LoggerFactory.getLogger(PrologEnvironment.class);
public static interface Factory {
/**
@@ -68,19 +66,14 @@
private final Args args;
private final Map<StoredValue<Object>, Object> storedValues;
- private int reductionLimit;
- private int reductionsRemaining;
private List<Runnable> cleanup;
@Inject
PrologEnvironment(Args a, @Assisted PrologMachineCopy src) {
super(src);
- setMaxArity(MAX_ARITY);
setEnabled(EnumSet.allOf(Prolog.Feature.class), false);
args = a;
storedValues = new HashMap<>();
- reductionLimit = a.reductionLimit;
- reductionsRemaining = reductionLimit;
cleanup = new LinkedList<>();
}
@@ -89,25 +82,9 @@
}
@Override
- public boolean isEngineStopped() {
- if (super.isEngineStopped()) {
- return true;
- } else if (--reductionsRemaining <= 0) {
- throw new ReductionLimitException(reductionLimit);
- }
- return false;
- }
-
- @Override
public void setPredicate(Predicate goal) {
super.setPredicate(goal);
- reductionLimit = args.reductionLimit(goal);
- reductionsRemaining = reductionLimit;
- }
-
- /** @return number of reductions during execution. */
- public int getReductions() {
- return reductionLimit - reductionsRemaining;
+ setReductionLimit(args.reductionLimit(goal));
}
/**
@@ -177,6 +154,19 @@
@Singleton
public static class Args {
+ private static final Class<Predicate> CONSULT_STREAM_2;
+ static {
+ try {
+ @SuppressWarnings("unchecked")
+ Class<Predicate> c = (Class<Predicate>) Class.forName(
+ PredicateEncoder.encode(Prolog.BUILTIN, "consult_stream", 2),
+ false, RulesCache.class.getClassLoader());
+ CONSULT_STREAM_2 = c;
+ } catch (ClassNotFoundException e) {
+ throw new LinkageError("cannot find predicate consult_stream", e);
+ }
+ }
+
private final ProjectCache projectCache;
private final GitRepositoryManager repositoryManager;
private final PatchListCache patchListCache;
@@ -210,8 +200,7 @@
}
private int reductionLimit(Predicate goal) {
- if ("com.googlecode.prolog_cafe.builtin.PRED_consult_stream_2"
- .equals(goal.getClass().getName())) {
+ if (goal.getClass() == CONSULT_STREAM_2) {
return compileLimit;
}
return reductionLimit;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/ReductionLimitException.java b/gerrit-server/src/main/java/com/google/gerrit/rules/ReductionLimitException.java
deleted file mode 100644
index 2c27240..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/rules/ReductionLimitException.java
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (C) 2014 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.
-
-package com.google.gerrit.rules;
-
-/** Thrown by {@link PrologEnvironment} if a script runs too long. */
-public class ReductionLimitException extends RuntimeException {
- private static final long serialVersionUID = 1L;
-
- ReductionLimitException(int limit) {
- super(String.format("exceeded reduction limit of %d", limit));
- }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/RulesCache.java b/gerrit-server/src/main/java/com/google/gerrit/rules/RulesCache.java
index 5dea6a2..f699e7a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/rules/RulesCache.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/rules/RulesCache.java
@@ -27,7 +27,7 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
-import com.googlecode.prolog_cafe.compiler.CompileException;
+import com.googlecode.prolog_cafe.exceptions.CompileException;
import com.googlecode.prolog_cafe.lang.BufferingPrologControl;
import com.googlecode.prolog_cafe.lang.JavaObjectTerm;
import com.googlecode.prolog_cafe.lang.Prolog;
@@ -44,7 +44,6 @@
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.util.RawParseUtils;
-import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -57,6 +56,8 @@
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
@@ -96,8 +97,8 @@
}
private final boolean enableProjectRules;
- private final File cacheDir;
- private final File rulesDir;
+ private final Path cacheDir;
+ private final Path rulesDir;
private final GitRepositoryManager gitMgr;
private final DynamicSet<PredicateProvider> predicateProviders;
private final ClassLoader systemLoader;
@@ -108,7 +109,7 @@
GitRepositoryManager gm, DynamicSet<PredicateProvider> predicateProviders) {
enableProjectRules = config.getBoolean("rules", null, "enable", true);
cacheDir = site.resolve(config.getString("cache", null, "directory"));
- rulesDir = cacheDir != null ? new File(cacheDir, "rules") : null;
+ rulesDir = cacheDir != null ? cacheDir.resolve("rules") : null;
gitMgr = gm;
this.predicateProviders = predicateProviders;
@@ -178,9 +179,9 @@
// that over dynamic consult as the bytecode will be faster.
//
if (rulesDir != null) {
- File jarFile = new File(rulesDir, "rules-" + rulesId.getName() + ".jar");
- if (jarFile.isFile()) {
- URL[] cp = new URL[] {toURL(jarFile)};
+ Path jarPath = rulesDir.resolve("rules-" + rulesId.getName() + ".jar");
+ if (Files.isRegularFile(jarPath)) {
+ URL[] cp = new URL[] {toURL(jarPath)};
return save(newEmptyMachine(new URLClassLoader(cp, systemLoader)));
}
}
@@ -237,7 +238,6 @@
private BufferingPrologControl newEmptyMachine(ClassLoader cl) {
BufferingPrologControl ctl = new BufferingPrologControl();
- ctl.setMaxArity(PrologEnvironment.MAX_ARITY);
ctl.setMaxDatabaseSize(DB_MAX);
ctl.setPrologClassLoader(new PrologClassLoader(new PredicateClassLoader(
predicateProviders, cl)));
@@ -254,11 +254,11 @@
return ctl;
}
- private static URL toURL(File jarFile) throws CompileException {
+ private static URL toURL(Path jarPath) throws CompileException {
try {
- return jarFile.toURI().toURL();
+ return jarPath.toUri().toURL();
} catch (MalformedURLException e) {
- throw new CompileException("Cannot create URL for " + jarFile, e);
+ throw new CompileException("Cannot create URL for " + jarPath, e);
}
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValue.java b/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValue.java
index d454e40..27f15e6 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValue.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValue.java
@@ -14,8 +14,8 @@
package com.google.gerrit.rules;
+import com.googlecode.prolog_cafe.exceptions.SystemException;
import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.SystemException;
/**
* Defines a value cached in a {@link PrologEnvironment}.
diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValues.java b/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValues.java
index 528fcc6..169e03b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValues.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValues.java
@@ -38,8 +38,8 @@
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gwtorm.server.OrmException;
+import com.googlecode.prolog_cafe.exceptions.SystemException;
import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.SystemException;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java
index 93bbd7b..f367cc6 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java
@@ -26,6 +26,7 @@
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetAncestor;
+import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RevId;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.change.ChangeInserter;
@@ -103,7 +104,8 @@
* @throws OrmException the database couldn't be incremented.
*/
public static String messageUUID(ReviewDb db) throws OrmException {
- int p, s;
+ int p;
+ int s;
synchronized (uuidLock) {
if (uuidSeq == 0) {
uuidPrefix = db.nextChangeMessageId();
@@ -227,119 +229,107 @@
}
Change changeToRevert = db.get().changes().get(changeId);
- Repository git;
- try {
- git = gitManager.openRepository(ctl.getChange().getProject());
+ Project.NameKey project = ctl.getChange().getProject();
+ try (Repository git = gitManager.openRepository(project);
+ RevWalk revWalk = new RevWalk(git)) {
+ RevCommit commitToRevert =
+ revWalk.parseCommit(ObjectId.fromString(patch.getRevision().get()));
+
+ PersonIdent authorIdent =
+ user().newCommitterIdent(myIdent.getWhen(), myIdent.getTimeZone());
+
+ RevCommit parentToCommitToRevert = commitToRevert.getParent(0);
+ revWalk.parseHeaders(parentToCommitToRevert);
+
+ CommitBuilder revertCommitBuilder = new CommitBuilder();
+ revertCommitBuilder.addParentId(commitToRevert);
+ revertCommitBuilder.setTreeId(parentToCommitToRevert.getTree());
+ revertCommitBuilder.setAuthor(authorIdent);
+ revertCommitBuilder.setCommitter(authorIdent);
+
+ if (message == null) {
+ message = MessageFormat.format(
+ ChangeMessages.get().revertChangeDefaultMessage,
+ changeToRevert.getSubject(), patch.getRevision().get());
+ }
+
+ ObjectId computedChangeId =
+ ChangeIdUtil.computeChangeId(parentToCommitToRevert.getTree(),
+ commitToRevert, authorIdent, myIdent, message);
+ revertCommitBuilder.setMessage(
+ ChangeIdUtil.insertId(message, computedChangeId, true));
+
+ RevCommit revertCommit;
+ try (ObjectInserter oi = git.newObjectInserter()) {
+ ObjectId id = oi.insert(revertCommitBuilder);
+ oi.flush();
+ revertCommit = revWalk.parseCommit(id);
+ }
+
+ RefControl refControl = ctl.getRefControl();
+ Change change = new Change(
+ new Change.Key("I" + computedChangeId.name()),
+ new Change.Id(db.get().nextChangeId()),
+ user().getAccountId(),
+ changeToRevert.getDest(),
+ TimeUtil.nowTs());
+ change.setTopic(changeToRevert.getTopic());
+ ChangeInserter ins =
+ changeInserterFactory.create(refControl.getProjectControl(),
+ change, revertCommit);
+ PatchSet ps = ins.getPatchSet();
+
+ String ref = refControl.getRefName();
+ String cmdRef = MagicBranch.NEW_PUBLISH_CHANGE
+ + ref.substring(ref.lastIndexOf('/') + 1);
+ CommitReceivedEvent commitReceivedEvent = new CommitReceivedEvent(
+ new ReceiveCommand(ObjectId.zeroId(), revertCommit.getId(), cmdRef),
+ refControl.getProjectControl().getProject(),
+ refControl.getRefName(), revertCommit, user());
+
+ try {
+ commitValidatorsFactory.create(refControl, sshInfo, git)
+ .validateForGerritCommits(commitReceivedEvent);
+ } catch (CommitValidationException e) {
+ throw new InvalidChangeOperationException(e.getMessage());
+ }
+
+ RefUpdate ru = git.updateRef(ps.getRefName());
+ ru.setExpectedOldObjectId(ObjectId.zeroId());
+ ru.setNewObjectId(revertCommit);
+ ru.disableRefLog();
+ if (ru.update(revWalk) != RefUpdate.Result.NEW) {
+ throw new IOException(String.format(
+ "Failed to create ref %s in %s: %s", ps.getRefName(),
+ change.getDest().getParentKey().get(), ru.getResult()));
+ }
+
+ ChangeMessage cmsg = new ChangeMessage(
+ new ChangeMessage.Key(changeId, messageUUID(db.get())),
+ user().getAccountId(), TimeUtil.nowTs(), patchSetId);
+ StringBuilder msgBuf = new StringBuilder();
+ msgBuf.append("Patch Set ").append(patchSetId.get()).append(": Reverted");
+ msgBuf.append("\n\n");
+ msgBuf.append("This patchset was reverted in change: ")
+ .append(change.getKey().get());
+ cmsg.setMessage(msgBuf.toString());
+
+ ins.setMessage(cmsg).insert();
+
+ try {
+ RevertedSender cm = revertedSenderFactory.create(change);
+ cm.setFrom(user().getAccountId());
+ cm.setChangeMessage(cmsg);
+ cm.send();
+ } catch (Exception err) {
+ log.error("Cannot send email for revert change " + change.getId(),
+ err);
+ }
+
+ return change.getId();
} catch (RepositoryNotFoundException e) {
throw new NoSuchChangeException(changeId, e);
}
- try {
- RevWalk revWalk = new RevWalk(git);
- try {
- RevCommit commitToRevert =
- revWalk.parseCommit(ObjectId.fromString(patch.getRevision().get()));
-
- PersonIdent authorIdent =
- user().newCommitterIdent(myIdent.getWhen(), myIdent.getTimeZone());
-
- RevCommit parentToCommitToRevert = commitToRevert.getParent(0);
- revWalk.parseHeaders(parentToCommitToRevert);
-
- CommitBuilder revertCommitBuilder = new CommitBuilder();
- revertCommitBuilder.addParentId(commitToRevert);
- revertCommitBuilder.setTreeId(parentToCommitToRevert.getTree());
- revertCommitBuilder.setAuthor(authorIdent);
- revertCommitBuilder.setCommitter(authorIdent);
-
- if (message == null) {
- message = MessageFormat.format(
- ChangeMessages.get().revertChangeDefaultMessage,
- changeToRevert.getSubject(), patch.getRevision().get());
- }
-
- ObjectId computedChangeId =
- ChangeIdUtil.computeChangeId(parentToCommitToRevert.getTree(),
- commitToRevert, authorIdent, myIdent, message);
- revertCommitBuilder.setMessage(
- ChangeIdUtil.insertId(message, computedChangeId, true));
-
- RevCommit revertCommit;
- ObjectInserter oi = git.newObjectInserter();
- try {
- ObjectId id = oi.insert(revertCommitBuilder);
- oi.flush();
- revertCommit = revWalk.parseCommit(id);
- } finally {
- oi.release();
- }
-
- RefControl refControl = ctl.getRefControl();
- Change change = new Change(
- new Change.Key("I" + computedChangeId.name()),
- new Change.Id(db.get().nextChangeId()),
- user().getAccountId(),
- changeToRevert.getDest(),
- TimeUtil.nowTs());
- change.setTopic(changeToRevert.getTopic());
- ChangeInserter ins =
- changeInserterFactory.create(refControl.getProjectControl(),
- change, revertCommit);
- PatchSet ps = ins.getPatchSet();
-
- String ref = refControl.getRefName();
- String cmdRef = MagicBranch.NEW_PUBLISH_CHANGE
- + ref.substring(ref.lastIndexOf('/') + 1);
- CommitReceivedEvent commitReceivedEvent = new CommitReceivedEvent(
- new ReceiveCommand(ObjectId.zeroId(), revertCommit.getId(), cmdRef),
- refControl.getProjectControl().getProject(),
- refControl.getRefName(), revertCommit, user());
-
- try {
- commitValidatorsFactory.create(refControl, sshInfo, git)
- .validateForGerritCommits(commitReceivedEvent);
- } catch (CommitValidationException e) {
- throw new InvalidChangeOperationException(e.getMessage());
- }
-
- RefUpdate ru = git.updateRef(ps.getRefName());
- ru.setExpectedOldObjectId(ObjectId.zeroId());
- ru.setNewObjectId(revertCommit);
- ru.disableRefLog();
- if (ru.update(revWalk) != RefUpdate.Result.NEW) {
- throw new IOException(String.format(
- "Failed to create ref %s in %s: %s", ps.getRefName(),
- change.getDest().getParentKey().get(), ru.getResult()));
- }
-
- ChangeMessage cmsg = new ChangeMessage(
- new ChangeMessage.Key(changeId, messageUUID(db.get())),
- user().getAccountId(), TimeUtil.nowTs(), patchSetId);
- StringBuilder msgBuf = new StringBuilder();
- msgBuf.append("Patch Set ").append(patchSetId.get()).append(": Reverted");
- msgBuf.append("\n\n");
- msgBuf.append("This patchset was reverted in change: ")
- .append(change.getKey().get());
- cmsg.setMessage(msgBuf.toString());
-
- ins.setMessage(cmsg).insert();
-
- try {
- RevertedSender cm = revertedSenderFactory.create(change);
- cm.setFrom(user().getAccountId());
- cm.setChangeMessage(cmsg);
- cm.send();
- } catch (Exception err) {
- log.error("Cannot send email for revert change " + change.getId(),
- err);
- }
-
- return change.getId();
- } finally {
- revWalk.release();
- }
- } finally {
- git.close();
- }
}
public Change.Id editCommitMessage(ChangeControl ctl, PatchSet ps,
@@ -354,68 +344,56 @@
"The commit message cannot be empty");
}
- Repository git;
- try {
- git = gitManager.openRepository(ctl.getChange().getProject());
+ Project.NameKey project = ctl.getChange().getProject();
+ try (Repository git = gitManager.openRepository(project);
+ RevWalk revWalk = new RevWalk(git)) {
+ RevCommit commit =
+ revWalk.parseCommit(ObjectId.fromString(ps.getRevision()
+ .get()));
+ if (commit.getFullMessage().equals(message)) {
+ throw new InvalidChangeOperationException(
+ "New commit message cannot be same as existing commit message");
+ }
+
+ Date now = myIdent.getWhen();
+ PersonIdent authorIdent =
+ user().newCommitterIdent(now, myIdent.getTimeZone());
+
+ CommitBuilder commitBuilder = new CommitBuilder();
+ commitBuilder.setTreeId(commit.getTree());
+ commitBuilder.setParentIds(commit.getParents());
+ commitBuilder.setAuthor(commit.getAuthorIdent());
+ commitBuilder.setCommitter(authorIdent);
+ commitBuilder.setMessage(message);
+
+ RevCommit newCommit;
+ try (ObjectInserter oi = git.newObjectInserter()) {
+ ObjectId id = oi.insert(commitBuilder);
+ oi.flush();
+ newCommit = revWalk.parseCommit(id);
+ }
+
+ PatchSet.Id id = nextPatchSetId(git, change.currentPatchSetId());
+ PatchSet newPatchSet = new PatchSet(id);
+ newPatchSet.setCreatedOn(new Timestamp(now.getTime()));
+ newPatchSet.setUploader(user().getAccountId());
+ newPatchSet.setRevision(new RevId(newCommit.name()));
+
+ String msg = "Patch Set " + newPatchSet.getPatchSetId()
+ + ": Commit message was updated";
+
+ change = patchSetInserterFactory
+ .create(git, revWalk, ctl, newCommit)
+ .setPatchSet(newPatchSet)
+ .setMessage(msg)
+ .setValidatePolicy(RECEIVE_COMMITS)
+ .setDraft(ps.isDraft())
+ .insert();
+
+ return change.getId();
} catch (RepositoryNotFoundException e) {
throw new NoSuchChangeException(changeId, e);
}
- try {
- RevWalk revWalk = new RevWalk(git);
- try {
- RevCommit commit =
- revWalk.parseCommit(ObjectId.fromString(ps.getRevision()
- .get()));
- if (commit.getFullMessage().equals(message)) {
- throw new InvalidChangeOperationException(
- "New commit message cannot be same as existing commit message");
- }
-
- Date now = myIdent.getWhen();
- PersonIdent authorIdent =
- user().newCommitterIdent(now, myIdent.getTimeZone());
-
- CommitBuilder commitBuilder = new CommitBuilder();
- commitBuilder.setTreeId(commit.getTree());
- commitBuilder.setParentIds(commit.getParents());
- commitBuilder.setAuthor(commit.getAuthorIdent());
- commitBuilder.setCommitter(authorIdent);
- commitBuilder.setMessage(message);
-
- RevCommit newCommit;
- ObjectInserter oi = git.newObjectInserter();
- try {
- ObjectId id = oi.insert(commitBuilder);
- oi.flush();
- newCommit = revWalk.parseCommit(id);
- } finally {
- oi.release();
- }
-
- PatchSet.Id id = nextPatchSetId(git, change.currentPatchSetId());
- PatchSet newPatchSet = new PatchSet(id);
- newPatchSet.setCreatedOn(new Timestamp(now.getTime()));
- newPatchSet.setUploader(user().getAccountId());
- newPatchSet.setRevision(new RevId(newCommit.name()));
-
- String msg = "Patch Set " + newPatchSet.getPatchSetId()
- + ": Commit message was updated";
-
- change = patchSetInserterFactory
- .create(git, revWalk, ctl, newCommit)
- .setPatchSet(newPatchSet)
- .setMessage(msg)
- .setValidatePolicy(RECEIVE_COMMITS)
- .setDraft(ps.isDraft())
- .insert();
-
- return change.getId();
- } finally {
- revWalk.release();
- }
- } finally {
- git.close();
- }
}
public String getMessage(Change change)
@@ -427,25 +405,14 @@
throw new NoSuchChangeException(changeId);
}
- Repository git;
- try {
- git = gitManager.openRepository(change.getProject());
+ try (Repository git = gitManager.openRepository(change.getProject());
+ RevWalk revWalk = new RevWalk(git)) {
+ RevCommit commit = revWalk.parseCommit(
+ ObjectId.fromString(ps.getRevision().get()));
+ return commit.getFullMessage();
} catch (RepositoryNotFoundException e) {
throw new NoSuchChangeException(changeId, e);
}
- try {
- RevWalk revWalk = new RevWalk(git);
- try {
- RevCommit commit =
- revWalk.parseCommit(ObjectId.fromString(ps.getRevision()
- .get()));
- return commit.getFullMessage();
- } finally {
- revWalk.release();
- }
- } finally {
- git.close();
- }
}
public void deleteDraftChange(Change change)
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/SuggestAccounts.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/SuggestAccounts.java
index 07936d9..d181c35 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/SuggestAccounts.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/SuggestAccounts.java
@@ -39,7 +39,7 @@
import java.util.List;
import java.util.Map;
-class SuggestAccounts implements RestReadView<TopLevelResource> {
+public class SuggestAccounts implements RestReadView<TopLevelResource> {
private static final int MAX_RESULTS = 100;
private static final String MAX_SUFFIX = "\u9fa5";
@@ -50,9 +50,10 @@
private final int suggestFrom;
private int limit = 10;
+ private String query;
@Option(name = "--limit", aliases = {"-n"}, metaVar = "CNT", usage = "maximum number of users to return")
- void setLimit(int n) {
+ public void setLimit(int n) {
if (n < 0) {
limit = 10;
} else if (n == 0) {
@@ -63,7 +64,9 @@
}
@Option(name = "--query", aliases = {"-q"}, metaVar = "QUERY", usage = "match users")
- private String query;
+ public void setQuery(String query) {
+ this.query = query;
+ }
@Inject
SuggestAccounts(AccountControl.Factory accountControlFactory,
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/GerritApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/GerritApiImpl.java
index 5f581c3..3af953e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/GerritApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/GerritApiImpl.java
@@ -22,7 +22,7 @@
import com.google.inject.Singleton;
@Singleton
-class GerritApiImpl extends GerritApi.NotImplemented implements GerritApi {
+class GerritApiImpl implements GerritApi {
private final Accounts accounts;
private final Changes changes;
private final Projects projects;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java
index 44413b7..7051617 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java
@@ -28,7 +28,7 @@
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
-public class AccountApiImpl extends AccountApi.NotImplemented implements AccountApi {
+public class AccountApiImpl implements AccountApi {
interface Factory {
AccountApiImpl create(AccountResource account);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountsImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountsImpl.java
index 0c02c99..3f578ae 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountsImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountsImpl.java
@@ -16,6 +16,7 @@
import com.google.gerrit.extensions.api.accounts.AccountApi;
import com.google.gerrit.extensions.api.accounts.Accounts;
+import com.google.gerrit.extensions.common.AccountInfo;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.IdString;
import com.google.gerrit.extensions.restapi.RestApiException;
@@ -24,24 +25,30 @@
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.account.AccountResource;
import com.google.gerrit.server.account.AccountsCollection;
+import com.google.gerrit.server.account.SuggestAccounts;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
+import java.util.List;
+
@Singleton
-public class AccountsImpl extends Accounts.NotImplemented implements Accounts {
+public class AccountsImpl implements Accounts {
private final AccountsCollection accounts;
private final AccountApiImpl.Factory api;
private final Provider<CurrentUser> self;
+ private final Provider<SuggestAccounts> suggestAccountsProvider;
@Inject
AccountsImpl(AccountsCollection accounts,
AccountApiImpl.Factory api,
- Provider<CurrentUser> self) {
+ Provider<CurrentUser> self,
+ Provider<SuggestAccounts> suggestAccountsProvider) {
this.accounts = accounts;
this.api = api;
this.self = self;
+ this.suggestAccountsProvider = suggestAccountsProvider;
}
@Override
@@ -61,4 +68,32 @@
}
return api.create(new AccountResource((IdentifiedUser)self.get()));
}
+
+ @Override
+ public SuggestAccountsRequest suggestAccounts() throws RestApiException {
+ return new SuggestAccountsRequest() {
+ @Override
+ public List<AccountInfo> get() throws RestApiException {
+ return AccountsImpl.this.suggestAccounts(this);
+ }
+ };
+ }
+
+ @Override
+ public SuggestAccountsRequest suggestAccounts(String query)
+ throws RestApiException {
+ return suggestAccounts().withQuery(query);
+ }
+
+ private List<AccountInfo> suggestAccounts(SuggestAccountsRequest r)
+ throws RestApiException {
+ try {
+ SuggestAccounts mySuggestAccounts = suggestAccountsProvider.get();
+ mySuggestAccounts.setQuery(r.getQuery());
+ mySuggestAccounts.setLimit(r.getLimit());
+ return mySuggestAccounts.apply(TopLevelResource.INSTANCE);
+ } catch (OrmException e) {
+ throw new RestApiException("Cannot retrieve suggested accounts", e);
+ }
+ }
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
index 161461d..610e344 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
@@ -56,7 +56,7 @@
import java.util.List;
import java.util.Set;
-class ChangeApiImpl extends ChangeApi.NotImplemented implements ChangeApi {
+class ChangeApiImpl implements ChangeApi {
interface Factory {
ChangeApiImpl create(ChangeResource change);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/FileApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/FileApiImpl.java
index 42c1e23..c09890f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/FileApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/FileApiImpl.java
@@ -30,7 +30,7 @@
import java.io.IOException;
-class FileApiImpl extends FileApi.NotImplemented implements FileApi {
+class FileApiImpl implements FileApi {
interface Factory {
FileApiImpl create(FileResource r);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java
index c36faa2..63d0902 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java
@@ -27,6 +27,7 @@
import com.google.gerrit.extensions.api.changes.ReviewInput;
import com.google.gerrit.extensions.api.changes.RevisionApi;
import com.google.gerrit.extensions.api.changes.SubmitInput;
+import com.google.gerrit.extensions.common.ActionInfo;
import com.google.gerrit.extensions.common.CommentInfo;
import com.google.gerrit.extensions.common.FileInfo;
import com.google.gerrit.extensions.common.MergeableInfo;
@@ -40,6 +41,7 @@
import com.google.gerrit.server.change.DraftComments;
import com.google.gerrit.server.change.FileResource;
import com.google.gerrit.server.change.Files;
+import com.google.gerrit.server.change.GetRevisionActions;
import com.google.gerrit.server.change.ListComments;
import com.google.gerrit.server.change.ListDraftComments;
import com.google.gerrit.server.change.Mergeable;
@@ -60,7 +62,7 @@
import java.util.Map;
import java.util.Set;
-class RevisionApiImpl extends RevisionApi.NotImplemented implements RevisionApi {
+class RevisionApiImpl implements RevisionApi {
interface Factory {
RevisionApiImpl create(RevisionResource r);
}
@@ -87,6 +89,7 @@
private final DraftApiImpl.Factory draftFactory;
private final Comments comments;
private final CommentApiImpl.Factory commentFactory;
+ private final GetRevisionActions revisionActions;
@Inject
RevisionApiImpl(Changes changes,
@@ -110,6 +113,7 @@
DraftApiImpl.Factory draftFactory,
Comments comments,
CommentApiImpl.Factory commentFactory,
+ GetRevisionActions revisionActions,
@Assisted RevisionResource r) {
this.changes = changes;
this.cherryPick = cherryPick;
@@ -132,6 +136,7 @@
this.draftFactory = draftFactory;
this.comments = comments;
this.commentFactory = commentFactory;
+ this.revisionActions = revisionActions;
this.revision = r;
}
@@ -329,4 +334,9 @@
throw new RestApiException("Cannot retrieve comment", e);
}
}
+
+ @Override
+ public Map<String, ActionInfo> actions() throws RestApiException {
+ return revisionActions.apply(revision).value();
+ }
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/BranchApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/BranchApiImpl.java
index f4dc67e..39166c3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/BranchApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/BranchApiImpl.java
@@ -24,7 +24,7 @@
import java.io.IOException;
-public class BranchApiImpl extends BranchApi.NotImplemented implements BranchApi {
+public class BranchApiImpl implements BranchApi {
interface Factory {
BranchApiImpl create(ProjectResource project, String ref);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ChildProjectApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ChildProjectApiImpl.java
new file mode 100644
index 0000000..02dc919
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ChildProjectApiImpl.java
@@ -0,0 +1,53 @@
+// Copyright (C) 2015 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.
+
+package com.google.gerrit.server.api.projects;
+
+import com.google.gerrit.extensions.api.projects.ChildProjectApi;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.project.ChildProjectResource;
+import com.google.gerrit.server.project.GetChildProject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+
+public class ChildProjectApiImpl implements ChildProjectApi {
+ interface Factory {
+ ChildProjectApiImpl create(ChildProjectResource rsrc);
+ }
+
+ private final Provider<GetChildProject> getProvider;
+ private final ChildProjectResource rsrc;
+
+ @AssistedInject
+ ChildProjectApiImpl(
+ Provider<GetChildProject> getProvider,
+ @Assisted ChildProjectResource rsrc) {
+ this.getProvider = getProvider;
+ this.rsrc = rsrc;
+ }
+
+ @Override
+ public ProjectInfo get() throws RestApiException {
+ return get(false);
+ }
+
+ @Override
+ public ProjectInfo get(boolean recursive) throws RestApiException {
+ GetChildProject get = getProvider.get();
+ get.setRecursive(recursive);
+ return get.apply(rsrc);
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/Module.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/Module.java
index 0b7e258..2e6b761 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/Module.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/Module.java
@@ -24,5 +24,6 @@
factory(BranchApiImpl.Factory.class);
factory(ProjectApiImpl.Factory.class);
+ factory(ChildProjectApiImpl.Factory.class);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java
index 7f73a38..f80762d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java
@@ -14,29 +14,36 @@
package com.google.gerrit.server.api.projects;
-import com.google.common.base.Preconditions;
import com.google.gerrit.common.errors.ProjectCreationFailedException;
import com.google.gerrit.extensions.api.projects.BranchApi;
+import com.google.gerrit.extensions.api.projects.ChildProjectApi;
import com.google.gerrit.extensions.api.projects.ProjectApi;
import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.api.projects.PutDescriptionInput;
import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.IdString;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.TopLevelResource;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.server.project.ChildProjectsCollection;
import com.google.gerrit.server.project.CreateProject;
+import com.google.gerrit.server.project.GetDescription;
+import com.google.gerrit.server.project.ListChildProjects;
import com.google.gerrit.server.project.ProjectJson;
import com.google.gerrit.server.project.ProjectResource;
import com.google.gerrit.server.project.ProjectsCollection;
+import com.google.gerrit.server.project.PutDescription;
import com.google.inject.Provider;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject;
import java.io.IOException;
+import java.util.List;
-public class ProjectApiImpl extends ProjectApi.NotImplemented implements ProjectApi {
+public class ProjectApiImpl implements ProjectApi {
interface Factory {
ProjectApiImpl create(ProjectResource project);
ProjectApiImpl create(String name);
@@ -45,6 +52,10 @@
private final Provider<CreateProject.Factory> createProjectFactory;
private final ProjectApiImpl.Factory projectApi;
private final ProjectsCollection projects;
+ private final GetDescription getDescription;
+ private final PutDescription putDescription;
+ private final ChildProjectApiImpl.Factory childApi;
+ private final ChildProjectsCollection children;
private final ProjectResource project;
private final ProjectJson projectJson;
private final String name;
@@ -54,27 +65,41 @@
ProjectApiImpl(Provider<CreateProject.Factory> createProjectFactory,
ProjectApiImpl.Factory projectApi,
ProjectsCollection projects,
+ GetDescription getDescription,
+ PutDescription putDescription,
+ ChildProjectApiImpl.Factory childApi,
+ ChildProjectsCollection children,
ProjectJson projectJson,
BranchApiImpl.Factory branchApiFactory,
@Assisted ProjectResource project) {
- this(createProjectFactory, projectApi, projects, projectJson,
- branchApiFactory, project, null);
+ this(createProjectFactory, projectApi, projects, getDescription,
+ putDescription, childApi, children, projectJson, branchApiFactory,
+ project, null);
}
@AssistedInject
ProjectApiImpl(Provider<CreateProject.Factory> createProjectFactory,
ProjectApiImpl.Factory projectApi,
ProjectsCollection projects,
+ GetDescription getDescription,
+ PutDescription putDescription,
+ ChildProjectApiImpl.Factory childApi,
+ ChildProjectsCollection children,
ProjectJson projectJson,
BranchApiImpl.Factory branchApiFactory,
@Assisted String name) {
- this(createProjectFactory, projectApi, projects, projectJson,
- branchApiFactory, null, name);
+ this(createProjectFactory, projectApi, projects, getDescription,
+ putDescription, childApi, children, projectJson, branchApiFactory, null,
+ name);
}
private ProjectApiImpl(Provider<CreateProject.Factory> createProjectFactory,
ProjectApiImpl.Factory projectApi,
ProjectsCollection projects,
+ GetDescription getDescription,
+ PutDescription putDescription,
+ ChildProjectApiImpl.Factory childApi,
+ ChildProjectsCollection children,
ProjectJson projectJson,
BranchApiImpl.Factory branchApiFactory,
ProjectResource project,
@@ -82,6 +107,10 @@
this.createProjectFactory = createProjectFactory;
this.projectApi = projectApi;
this.projects = projects;
+ this.getDescription = getDescription;
+ this.putDescription = putDescription;
+ this.childApi = childApi;
+ this.children = children;
this.projectJson = projectJson;
this.project = project;
this.name = name;
@@ -113,13 +142,59 @@
}
@Override
- public ProjectInfo get() {
- Preconditions.checkNotNull(project);
+ public ProjectInfo get() throws RestApiException {
+ if (project == null) {
+ throw new ResourceNotFoundException(name);
+ }
return projectJson.format(project);
}
@Override
- public BranchApi branch(String ref) {
- return branchApi.create(project, ref);
+ public String description() throws RestApiException {
+ return getDescription.apply(checkExists());
+ }
+
+ @Override
+ public void description(PutDescriptionInput in)
+ throws RestApiException {
+ try {
+ putDescription.apply(checkExists(), in);
+ } catch (IOException e) {
+ throw new RestApiException("Cannot put project description", e);
+ }
+ }
+
+ @Override
+ public List<ProjectInfo> children() throws RestApiException {
+ return children(false);
+ }
+
+ @Override
+ public List<ProjectInfo> children(boolean recursive) throws RestApiException {
+ ListChildProjects list = children.list();
+ list.setRecursive(recursive);
+ return list.apply(checkExists());
+ }
+
+ @Override
+ public ChildProjectApi child(String name) throws RestApiException {
+ try {
+ return childApi.create(
+ children.parse(checkExists(), IdString.fromDecoded(name)));
+ } catch (IOException e) {
+ throw new RestApiException("Cannot parse child project", e);
+ }
+ }
+
+ @Override
+ public BranchApi branch(String ref) throws ResourceNotFoundException {
+ return branchApi.create(checkExists(), ref);
+ }
+
+ private ProjectResource checkExists() throws ResourceNotFoundException {
+ if (project == null) {
+ throw new ResourceNotFoundException(name);
+ }
+ return project;
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectsImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectsImpl.java
index 86baa1e..db31d42 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectsImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectsImpl.java
@@ -14,23 +14,25 @@
package com.google.gerrit.server.api.projects;
-import com.google.common.collect.ImmutableList;
import com.google.gerrit.extensions.api.projects.ProjectApi;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
import com.google.gerrit.extensions.api.projects.Projects;
import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.server.project.ListProjects;
+import com.google.gerrit.server.project.ListProjects.FilterType;
import com.google.gerrit.server.project.ProjectsCollection;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
import java.io.IOException;
-import java.util.List;
+import java.util.SortedMap;
@Singleton
-class ProjectsImpl extends Projects.NotImplemented implements Projects {
+class ProjectsImpl implements Projects {
private final ProjectsCollection projects;
private final ProjectApiImpl.Factory api;
private final Provider<ListProjects> listProvider;
@@ -56,22 +58,62 @@
}
@Override
+ public ProjectApi create(String name) throws RestApiException {
+ ProjectInput in = new ProjectInput();
+ in.name = name;
+ return create(in);
+ }
+
+ @Override
+ public ProjectApi create(ProjectInput in) throws RestApiException {
+ return name(in.name).create(in);
+ }
+
+ @Override
public ListRequest list() {
return new ListRequest() {
@Override
- public List<ProjectInfo> get() throws RestApiException {
+ public SortedMap<String, ProjectInfo> getAsMap() throws RestApiException {
return list(this);
}
};
}
- private List<ProjectInfo> list(ListRequest request) throws RestApiException {
+ private SortedMap<String, ProjectInfo> list(ListRequest request)
+ throws RestApiException {
ListProjects lp = listProvider.get();
lp.setShowDescription(request.getDescription());
lp.setLimit(request.getLimit());
lp.setStart(request.getStart());
lp.setMatchPrefix(request.getPrefix());
- return ImmutableList.copyOf(lp.apply().values());
+ lp.setMatchSubstring(request.getSubstring());
+ lp.setMatchRegex(request.getRegex());
+ lp.setShowTree(request.getShowTree());
+ for (String branch : request.getBranches()) {
+ lp.addShowBranch(branch);
+ }
+
+ FilterType type;
+ switch (request.getFilterType()) {
+ case ALL:
+ type = FilterType.ALL;
+ break;
+ case CODE:
+ type = FilterType.CODE;
+ break;
+ case PARENT_CANDIDATES:
+ type = FilterType.PARENT_CANDIDATES;
+ break;
+ case PERMISSIONS:
+ type = FilterType.PERMISSIONS;
+ break;
+ default:
+ throw new BadRequestException(
+ "Unknown filter type: " + request.getFilterType());
+ }
+ lp.setFilterType(type);
+
+ return lp.apply();
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java
index 9060108..3607e34 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java
@@ -134,7 +134,7 @@
static List<String> optionalList(final Config config,
final String name) {
- String s[] = config.getStringList("ldap", null, name);
+ String[] s = config.getStringList("ldap", null, name);
return Arrays.asList(s);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java
index 76cf49c..23039aa 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java
@@ -189,8 +189,7 @@
return ChangeKind.NO_CODE_CHANGE;
}
- RevWalk walk = new RevWalk(key.repo);
- try {
+ try (RevWalk walk = new RevWalk(key.repo)) {
RevCommit prior = walk.parseCommit(key.prior);
walk.parseBody(prior);
RevCommit next = walk.parseCommit(key.next);
@@ -227,7 +226,6 @@
}
} finally {
key.repo = null;
- walk.release();
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeResource.java
index 16472e3..1555cdd 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeResource.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeResource.java
@@ -57,17 +57,15 @@
return getControl().getNotes();
}
- @Override
- public String getETag() {
- CurrentUser user = control.getCurrentUser();
- Hasher h = Hashing.md5().newHasher()
- .putLong(getChange().getLastUpdatedOn().getTime())
+
+ // This includes all information relevant for ETag computation
+ // unrelated to the UI.
+ public void prepareETag(Hasher h, CurrentUser user) {
+ h.putLong(getChange().getLastUpdatedOn().getTime())
.putInt(getChange().getRowVersion())
- .putBoolean(user.getStarredChanges().contains(getChange().getId()))
.putInt(user.isIdentifiedUser()
? ((IdentifiedUser) user).getAccountId().get()
: 0);
-
byte[] buf = new byte[20];
ObjectId noteId;
try {
@@ -82,6 +80,14 @@
for (ProjectState p : control.getProjectControl().getProjectState().tree()) {
hashObjectId(h, p.getConfig().getRevision(), buf);
}
+ }
+
+ @Override
+ public String getETag() {
+ CurrentUser user = control.getCurrentUser();
+ Hasher h = Hashing.md5().newHasher()
+ .putBoolean(user.getStarredChanges().contains(getChange().getId()));
+ prepareETag(h, user);
return h.hash().toString();
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPick.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPick.java
index efcd6d9..f4d1e0a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPick.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPick.java
@@ -102,6 +102,7 @@
return new UiAction.Description()
.setLabel("Cherry Pick")
.setTitle("Cherry pick change to a different branch")
- .setVisible(resource.getControl().getProjectControl().canUpload());
+ .setVisible(resource.getControl().getProjectControl().canUpload()
+ && resource.isCurrent());
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPickChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPickChange.java
index 48944fa..b386894 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPickChange.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPickChange.java
@@ -121,96 +121,82 @@
Project.NameKey project = change.getProject();
IdentifiedUser identifiedUser = (IdentifiedUser) currentUser.get();
- final Repository git;
- try {
- git = gitManager.openRepository(project);
+ try (Repository git = gitManager.openRepository(project);
+ RevWalk revWalk = new RevWalk(git)) {
+ Ref destRef = git.getRef(destinationBranch);
+ if (destRef == null) {
+ throw new InvalidChangeOperationException("Branch "
+ + destinationBranch + " does not exist.");
+ }
+
+ final RevCommit mergeTip = revWalk.parseCommit(destRef.getObjectId());
+
+ RevCommit commitToCherryPick =
+ revWalk.parseCommit(ObjectId.fromString(patch.getRevision().get()));
+
+ PersonIdent committerIdent =
+ identifiedUser.newCommitterIdent(TimeUtil.nowTs(),
+ serverTimeZone);
+
+ final ObjectId computedChangeId =
+ ChangeIdUtil
+ .computeChangeId(commitToCherryPick.getTree(), mergeTip,
+ commitToCherryPick.getAuthorIdent(), committerIdent, message);
+ String commitMessage =
+ ChangeIdUtil.insertId(message, computedChangeId).trim() + '\n';
+
+ RevCommit cherryPickCommit;
+ try (ObjectInserter oi = git.newObjectInserter()) {
+ ProjectState projectState = refControl.getProjectControl().getProjectState();
+ cherryPickCommit =
+ mergeUtilFactory.create(projectState).createCherryPickFromCommit(git, oi, mergeTip,
+ commitToCherryPick, committerIdent, commitMessage, revWalk);
+ } catch (MergeIdenticalTreeException | MergeConflictException e) {
+ throw new MergeException("Cherry pick failed: " + e.getMessage());
+ }
+
+ Change.Key changeKey;
+ final List<String> idList = cherryPickCommit.getFooterLines(
+ FooterConstants.CHANGE_ID);
+ if (!idList.isEmpty()) {
+ final String idStr = idList.get(idList.size() - 1).trim();
+ changeKey = new Change.Key(idStr);
+ } else {
+ changeKey = new Change.Key("I" + computedChangeId.name());
+ }
+
+ Branch.NameKey newDest =
+ new Branch.NameKey(change.getProject(), destRef.getName());
+ List<ChangeData> destChanges = queryProvider.get()
+ .setLimit(2)
+ .byBranchKey(newDest, changeKey);
+ if (destChanges.size() > 1) {
+ throw new InvalidChangeOperationException("Several changes with key "
+ + changeKey + " reside on the same branch. "
+ + "Cannot create a new patch set.");
+ } else if (destChanges.size() == 1) {
+ // The change key exists on the destination branch. The cherry pick
+ // will be added as a new patch set.
+ return insertPatchSet(git, revWalk, destChanges.get(0).change(),
+ cherryPickCommit, refControl, identifiedUser);
+ } else {
+ // Change key not found on destination branch. We can create a new
+ // change.
+ Change newChange = createNewChange(git, revWalk, changeKey, project,
+ destRef, cherryPickCommit, refControl,
+ identifiedUser, change.getTopic());
+
+ addMessageToSourceChange(change, patch.getId(), destinationBranch,
+ cherryPickCommit, identifiedUser, refControl);
+
+ addMessageToDestinationChange(newChange, change.getDest().getShortName(),
+ identifiedUser, refControl);
+
+ return newChange.getId();
+ }
} catch (RepositoryNotFoundException e) {
throw new NoSuchChangeException(change.getId(), e);
}
-
- try {
- RevWalk revWalk = new RevWalk(git);
- try {
- Ref destRef = git.getRef(destinationBranch);
- if (destRef == null) {
- throw new InvalidChangeOperationException("Branch "
- + destinationBranch + " does not exist.");
- }
-
- final RevCommit mergeTip = revWalk.parseCommit(destRef.getObjectId());
-
- RevCommit commitToCherryPick =
- revWalk.parseCommit(ObjectId.fromString(patch.getRevision().get()));
-
- PersonIdent committerIdent =
- identifiedUser.newCommitterIdent(TimeUtil.nowTs(),
- serverTimeZone);
-
- final ObjectId computedChangeId =
- ChangeIdUtil
- .computeChangeId(commitToCherryPick.getTree(), mergeTip,
- commitToCherryPick.getAuthorIdent(), committerIdent, message);
- String commitMessage =
- ChangeIdUtil.insertId(message, computedChangeId).trim() + '\n';
-
- RevCommit cherryPickCommit;
- ObjectInserter oi = git.newObjectInserter();
- try {
- ProjectState projectState = refControl.getProjectControl().getProjectState();
- cherryPickCommit =
- mergeUtilFactory.create(projectState).createCherryPickFromCommit(git, oi, mergeTip,
- commitToCherryPick, committerIdent, commitMessage, revWalk);
- } catch (MergeIdenticalTreeException | MergeConflictException e) {
- throw new MergeException("Cherry pick failed: " + e.getMessage());
- } finally {
- oi.release();
- }
-
- Change.Key changeKey;
- final List<String> idList = cherryPickCommit.getFooterLines(
- FooterConstants.CHANGE_ID);
- if (!idList.isEmpty()) {
- final String idStr = idList.get(idList.size() - 1).trim();
- changeKey = new Change.Key(idStr);
- } else {
- changeKey = new Change.Key("I" + computedChangeId.name());
- }
-
- Branch.NameKey newDest =
- new Branch.NameKey(change.getProject(), destRef.getName());
- List<ChangeData> destChanges = queryProvider.get()
- .setLimit(2)
- .byBranchKey(newDest, changeKey);
- if (destChanges.size() > 1) {
- throw new InvalidChangeOperationException("Several changes with key "
- + changeKey + " reside on the same branch. "
- + "Cannot create a new patch set.");
- } else if (destChanges.size() == 1) {
- // The change key exists on the destination branch. The cherry pick
- // will be added as a new patch set.
- return insertPatchSet(git, revWalk, destChanges.get(0).change(),
- cherryPickCommit, refControl, identifiedUser);
- } else {
- // Change key not found on destination branch. We can create a new
- // change.
- Change newChange = createNewChange(git, revWalk, changeKey, project,
- destRef, cherryPickCommit, refControl,
- identifiedUser, change.getTopic());
-
- addMessageToSourceChange(change, patch.getId(), destinationBranch,
- cherryPickCommit, identifiedUser, refControl);
-
- addMessageToDestinationChange(newChange, change.getDest().getShortName(),
- identifiedUser, refControl);
-
- return newChange.getId();
- }
- } finally {
- revWalk.release();
- }
- } finally {
- git.close();
- }
}
private Change.Id insertPatchSet(Repository git, RevWalk revWalk, Change change,
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ConsistencyChecker.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ConsistencyChecker.java
index ad1e160..ee28ed2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ConsistencyChecker.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ConsistencyChecker.java
@@ -153,7 +153,7 @@
return Result.create(c, problems);
} finally {
if (rw != null) {
- rw.release();
+ rw.close();
}
if (repo != null) {
repo.close();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java
index 1855202..4dffd67 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java
@@ -158,71 +158,63 @@
}
Project.NameKey project = rsrc.getNameKey();
- Repository git = gitManager.openRepository(project);
-
- try {
- RevWalk rw = new RevWalk(git);
- try {
- ObjectId parentCommit;
- if (input.baseChange != null) {
- List<Change> changes = changeUtil.findChanges(input.baseChange);
- if (changes.size() != 1) {
- throw new InvalidChangeOperationException(
- "Base change not found: " + input.baseChange);
- }
- Change change = Iterables.getOnlyElement(changes);
- if (!rsrc.getControl().controlFor(change).isVisible(db.get())) {
- throw new InvalidChangeOperationException(
- "Base change not found: " + input.baseChange);
- }
- PatchSet ps = db.get().patchSets().get(
- new PatchSet.Id(change.getId(),
- change.currentPatchSetId().get()));
- parentCommit = ObjectId.fromString(ps.getRevision().get());
- } else {
- Ref destRef = git.getRef(refName);
- if (destRef == null) {
- throw new UnprocessableEntityException(String.format(
- "Branch %s does not exist.", refName));
- }
- parentCommit = destRef.getObjectId();
+ try (Repository git = gitManager.openRepository(project);
+ RevWalk rw = new RevWalk(git)) {
+ ObjectId parentCommit;
+ if (input.baseChange != null) {
+ List<Change> changes = changeUtil.findChanges(input.baseChange);
+ if (changes.size() != 1) {
+ throw new InvalidChangeOperationException(
+ "Base change not found: " + input.baseChange);
}
- RevCommit mergeTip = rw.parseCommit(parentCommit);
-
- Timestamp now = TimeUtil.nowTs();
- IdentifiedUser me = (IdentifiedUser) userProvider.get();
- PersonIdent author = me.newCommitterIdent(now, serverTimeZone);
-
- ObjectId id = ChangeIdUtil.computeChangeId(mergeTip.getTree(),
- mergeTip, author, author, input.subject);
- String commitMessage = ChangeIdUtil.insertId(input.subject, id);
-
- RevCommit c = newCommit(git, rw, author, mergeTip, commitMessage);
-
- Change change = new Change(
- getChangeId(id, c),
- new Change.Id(db.get().nextChangeId()),
- me.getAccountId(),
- new Branch.NameKey(project, refName),
- now);
-
- ChangeInserter ins =
- changeInserterFactory.create(refControl.getProjectControl(),
- change, c);
-
- validateCommit(git, refControl, c, me, ins);
- updateRef(git, rw, c, change, ins.getPatchSet());
-
- change.setTopic(input.topic);
- ins.setDraft(input.status != null && input.status == ChangeStatus.DRAFT);
- ins.insert();
-
- return Response.created(json.format(change.getId()));
- } finally {
- rw.release();
+ Change change = Iterables.getOnlyElement(changes);
+ if (!rsrc.getControl().controlFor(change).isVisible(db.get())) {
+ throw new InvalidChangeOperationException(
+ "Base change not found: " + input.baseChange);
+ }
+ PatchSet ps = db.get().patchSets().get(
+ new PatchSet.Id(change.getId(),
+ change.currentPatchSetId().get()));
+ parentCommit = ObjectId.fromString(ps.getRevision().get());
+ } else {
+ Ref destRef = git.getRef(refName);
+ if (destRef == null) {
+ throw new UnprocessableEntityException(String.format(
+ "Branch %s does not exist.", refName));
+ }
+ parentCommit = destRef.getObjectId();
}
- } finally {
- git.close();
+ RevCommit mergeTip = rw.parseCommit(parentCommit);
+
+ Timestamp now = TimeUtil.nowTs();
+ IdentifiedUser me = (IdentifiedUser) userProvider.get();
+ PersonIdent author = me.newCommitterIdent(now, serverTimeZone);
+
+ ObjectId id = ChangeIdUtil.computeChangeId(mergeTip.getTree(),
+ mergeTip, author, author, input.subject);
+ String commitMessage = ChangeIdUtil.insertId(input.subject, id);
+
+ RevCommit c = newCommit(git, rw, author, mergeTip, commitMessage);
+
+ Change change = new Change(
+ getChangeId(id, c),
+ new Change.Id(db.get().nextChangeId()),
+ me.getAccountId(),
+ new Branch.NameKey(project, refName),
+ now);
+
+ ChangeInserter ins =
+ changeInserterFactory.create(refControl.getProjectControl(),
+ change, c);
+
+ validateCommit(git, refControl, c, me, ins);
+ updateRef(git, rw, c, change, ins.getPatchSet());
+
+ change.setTopic(input.topic);
+ ins.setDraft(input.status != null && input.status == ChangeStatus.DRAFT);
+ ins.insert();
+
+ return Response.created(json.format(change.getId()));
}
}
@@ -275,8 +267,7 @@
PersonIdent authorIdent, RevCommit mergeTip, String commitMessage)
throws IOException {
RevCommit emptyCommit;
- ObjectInserter oi = git.newObjectInserter();
- try {
+ try (ObjectInserter oi = git.newObjectInserter()) {
CommitBuilder commit = new CommitBuilder();
commit.setTreeId(mergeTip.getTree().getId());
commit.setParentId(mergeTip);
@@ -284,8 +275,6 @@
commit.setCommitter(authorIdent);
commit.setMessage(commitMessage);
emptyCommit = rw.parseCommit(insert(oi, commit));
- } finally {
- oi.release();
}
return emptyCommit;
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/FileContentUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/FileContentUtil.java
index 5335cb9..a8e1793 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/FileContentUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/FileContentUtil.java
@@ -58,64 +58,57 @@
public BinaryResult getContent(ProjectState project, ObjectId revstr,
String path) throws ResourceNotFoundException, IOException {
- Repository repo = openRepository(project);
- try {
- RevWalk rw = new RevWalk(repo);
- try {
- RevCommit commit = rw.parseCommit(revstr);
- ObjectReader reader = rw.getObjectReader();
- TreeWalk tw = TreeWalk.forPath(reader, path, commit.getTree());
- if (tw == null) {
- throw new ResourceNotFoundException();
- }
-
- org.eclipse.jgit.lib.FileMode mode = tw.getFileMode(0);
- ObjectId id = tw.getObjectId(0);
- if (mode == org.eclipse.jgit.lib.FileMode.GITLINK) {
- return BinaryResult.create(id.name())
- .setContentType(X_GIT_GITLINK)
- .base64();
- }
-
- final ObjectLoader obj = repo.open(id, OBJ_BLOB);
- byte[] raw;
- try {
- raw = obj.getCachedBytes(MAX_SIZE);
- } catch (LargeObjectException e) {
- raw = null;
- }
-
- BinaryResult result;
- if (raw != null) {
- result = BinaryResult.create(raw);
- } else {
- result = asBinaryResult(obj);
- }
-
- String type;
- if (mode == org.eclipse.jgit.lib.FileMode.SYMLINK) {
- type = X_GIT_SYMLINK;
- } else {
- type = registry.getMimeType(path, raw).toString();
- type = resolveContentType(project, path, FileMode.FILE, type);
- }
- return result.setContentType(type).base64();
- } finally {
- rw.release();
+ try (Repository repo = openRepository(project);
+ RevWalk rw = new RevWalk(repo)) {
+ RevCommit commit = rw.parseCommit(revstr);
+ ObjectReader reader = rw.getObjectReader();
+ TreeWalk tw = TreeWalk.forPath(reader, path, commit.getTree());
+ if (tw == null) {
+ throw new ResourceNotFoundException();
}
- } finally {
- repo.close();
+
+ org.eclipse.jgit.lib.FileMode mode = tw.getFileMode(0);
+ ObjectId id = tw.getObjectId(0);
+ if (mode == org.eclipse.jgit.lib.FileMode.GITLINK) {
+ return BinaryResult.create(id.name())
+ .setContentType(X_GIT_GITLINK)
+ .base64();
+ }
+
+ final ObjectLoader obj = repo.open(id, OBJ_BLOB);
+ byte[] raw;
+ try {
+ raw = obj.getCachedBytes(MAX_SIZE);
+ } catch (LargeObjectException e) {
+ raw = null;
+ }
+
+ BinaryResult result;
+ if (raw != null) {
+ result = BinaryResult.create(raw);
+ } else {
+ result = asBinaryResult(obj);
+ }
+
+ String type;
+ if (mode == org.eclipse.jgit.lib.FileMode.SYMLINK) {
+ type = X_GIT_SYMLINK;
+ } else {
+ type = registry.getMimeType(path, raw).toString();
+ type = resolveContentType(project, path, FileMode.FILE, type);
+ }
+ return result.setContentType(type).base64();
}
}
private static BinaryResult asBinaryResult(final ObjectLoader obj) {
- @SuppressWarnings("resource")
BinaryResult result = new BinaryResult() {
@Override
public void writeTo(OutputStream os) throws IOException {
obj.copyTo(os);
}
- }.setContentLength(obj.getSize());
+ };
+ result.setContentLength(obj.getSize());
return result;
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Files.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Files.java
index 1c0b0a4..e19b6a9 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Files.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Files.java
@@ -31,6 +31,7 @@
import com.google.gerrit.reviewdb.client.AccountPatchReview;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.IdentifiedUser;
@@ -178,30 +179,24 @@
private List<String> query(RevisionResource resource)
throws RepositoryNotFoundException, IOException {
- Repository git =
- gitManager.openRepository(resource.getChange().getProject());
- try {
- TreeWalk tw = new TreeWalk(git);
- try {
- RevCommit c = new RevWalk(tw.getObjectReader())
- .parseCommit(ObjectId.fromString(
- resource.getPatchSet().getRevision().get()));
+ Project.NameKey project = resource.getChange().getProject();
+ try (Repository git = gitManager.openRepository(project);
+ ObjectReader or = git.newObjectReader();
+ RevWalk rw = new RevWalk(or);
+ TreeWalk tw = new TreeWalk(or)) {
+ RevCommit c = rw.parseCommit(
+ ObjectId.fromString(resource.getPatchSet().getRevision().get()));
- tw.addTree(c.getTree());
- tw.setRecursive(true);
- List<String> paths = new ArrayList<>();
- while (tw.next() && paths.size() < 20) {
- String s = tw.getPathString();
- if (s.contains(query)) {
- paths.add(s);
- }
+ tw.addTree(c.getTree());
+ tw.setRecursive(true);
+ List<String> paths = new ArrayList<>();
+ while (tw.next() && paths.size() < 20) {
+ String s = tw.getPathString();
+ if (s.contains(query)) {
+ paths.add(s);
}
- return paths;
- } finally {
- tw.release();
}
- } finally {
- git.close();
+ return paths;
}
}
@@ -261,76 +256,69 @@
private List<String> copy(Set<String> paths, PatchSet.Id old,
RevisionResource resource, Account.Id userId) throws IOException,
PatchListNotAvailableException, OrmException {
- Repository git =
- gitManager.openRepository(resource.getChange().getProject());
- try {
- ObjectReader reader = git.newObjectReader();
- try {
- PatchList oldList = patchListCache.get(
- resource.getChange(),
- db.get().patchSets().get(old));
-
- PatchList curList = patchListCache.get(
- resource.getChange(),
- resource.getPatchSet());
-
- int sz = paths.size();
- List<AccountPatchReview> inserts = Lists.newArrayListWithCapacity(sz);
- List<String> pathList = Lists.newArrayListWithCapacity(sz);
-
+ Project.NameKey project = resource.getChange().getProject();
+ try (Repository git = gitManager.openRepository(project);
+ ObjectReader reader = git.newObjectReader();
RevWalk rw = new RevWalk(reader);
- TreeWalk tw = new TreeWalk(reader);
- tw.setFilter(PathFilterGroup.createFromStrings(paths));
- tw.setRecursive(true);
- int o = tw.addTree(rw.parseCommit(oldList.getNewId()).getTree());
- int c = tw.addTree(rw.parseCommit(curList.getNewId()).getTree());
+ TreeWalk tw = new TreeWalk(reader)) {
+ PatchList oldList = patchListCache.get(
+ resource.getChange(),
+ db.get().patchSets().get(old));
- int op = -1;
- if (oldList.getOldId() != null) {
- op = tw.addTree(rw.parseTree(oldList.getOldId()));
- }
+ PatchList curList = patchListCache.get(
+ resource.getChange(),
+ resource.getPatchSet());
- int cp = -1;
- if (curList.getOldId() != null) {
- cp = tw.addTree(rw.parseTree(curList.getOldId()));
- }
+ int sz = paths.size();
+ List<AccountPatchReview> inserts = Lists.newArrayListWithCapacity(sz);
+ List<String> pathList = Lists.newArrayListWithCapacity(sz);
- while (tw.next()) {
- String path = tw.getPathString();
- if (tw.getRawMode(o) != 0 && tw.getRawMode(c) != 0
- && tw.idEqual(o, c)
- && paths.contains(path)) {
- // File exists in previously reviewed oldList and in curList.
- // File content is identical.
- inserts.add(new AccountPatchReview(
- new Patch.Key(
- resource.getPatchSet().getId(),
- path),
- userId));
- pathList.add(path);
- } else if (op >= 0 && cp >= 0
- && tw.getRawMode(o) == 0 && tw.getRawMode(c) == 0
- && tw.getRawMode(op) != 0 && tw.getRawMode(cp) != 0
- && tw.idEqual(op, cp)
- && paths.contains(path)) {
- // File was deleted in previously reviewed oldList and curList.
- // File exists in ancestor of oldList and curList.
- // File content is identical in ancestors.
- inserts.add(new AccountPatchReview(
- new Patch.Key(
- resource.getPatchSet().getId(),
- path),
- userId));
- pathList.add(path);
- }
- }
- db.get().accountPatchReviews().insert(inserts);
- return pathList;
- } finally {
- reader.release();
+ tw.setFilter(PathFilterGroup.createFromStrings(paths));
+ tw.setRecursive(true);
+ int o = tw.addTree(rw.parseCommit(oldList.getNewId()).getTree());
+ int c = tw.addTree(rw.parseCommit(curList.getNewId()).getTree());
+
+ int op = -1;
+ if (oldList.getOldId() != null) {
+ op = tw.addTree(rw.parseTree(oldList.getOldId()));
}
- } finally {
- git.close();
+
+ int cp = -1;
+ if (curList.getOldId() != null) {
+ cp = tw.addTree(rw.parseTree(curList.getOldId()));
+ }
+
+ while (tw.next()) {
+ String path = tw.getPathString();
+ if (tw.getRawMode(o) != 0 && tw.getRawMode(c) != 0
+ && tw.idEqual(o, c)
+ && paths.contains(path)) {
+ // File exists in previously reviewed oldList and in curList.
+ // File content is identical.
+ inserts.add(new AccountPatchReview(
+ new Patch.Key(
+ resource.getPatchSet().getId(),
+ path),
+ userId));
+ pathList.add(path);
+ } else if (op >= 0 && cp >= 0
+ && tw.getRawMode(o) == 0 && tw.getRawMode(c) == 0
+ && tw.getRawMode(op) != 0 && tw.getRawMode(cp) != 0
+ && tw.idEqual(op, cp)
+ && paths.contains(path)) {
+ // File was deleted in previously reviewed oldList and curList.
+ // File exists in ancestor of oldList and curList.
+ // File content is identical in ancestors.
+ inserts.add(new AccountPatchReview(
+ new Patch.Key(
+ resource.getPatchSet().getId(),
+ path),
+ userId));
+ pathList.add(path);
+ }
+ }
+ db.get().accountPatchReviews().insert(inserts);
+ return pathList;
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetArchive.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetArchive.java
index d602c47..913f69e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetArchive.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetArchive.java
@@ -126,7 +126,7 @@
@Override
public void close() throws IOException {
- rw.release();
+ rw.close();
repo.close();
}
};
@@ -139,7 +139,7 @@
return bin;
} finally {
if (close) {
- rw.release();
+ rw.close();
}
}
} finally {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPatch.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPatch.java
index 4a8be84..afd11569 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPatch.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPatch.java
@@ -94,15 +94,16 @@
private void format(OutputStream out) throws IOException {
out.write(formatEmailHeader(commit).getBytes(UTF_8));
- DiffFormatter fmt = new DiffFormatter(out);
- fmt.setRepository(repo);
- fmt.format(base.getTree(), commit.getTree());
- fmt.flush();
+ try (DiffFormatter fmt = new DiffFormatter(out)) {
+ fmt.setRepository(repo);
+ fmt.format(base.getTree(), commit.getTree());
+ fmt.flush();
+ }
}
@Override
public void close() throws IOException {
- rw.release();
+ rw.close();
repo.close();
}
};
@@ -123,7 +124,7 @@
return bin;
} finally {
if (close) {
- rw.release();
+ rw.close();
}
}
} finally {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRelated.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRelated.java
index f58a2a0..6cdae44 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRelated.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRelated.java
@@ -20,13 +20,11 @@
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.client.ChangeStatus;
import com.google.gerrit.extensions.common.CommitInfo;
import com.google.gerrit.extensions.restapi.RestReadView;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetAncestor;
-import com.google.gerrit.reviewdb.client.RevId;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.CommonConverters;
import com.google.gerrit.server.git.GitRepositoryManager;
@@ -80,19 +78,12 @@
@Override
public RelatedInfo apply(RevisionResource rsrc)
throws RepositoryNotFoundException, IOException, OrmException {
- Repository git = gitMgr.openRepository(rsrc.getChange().getProject());
- try {
+ try (Repository git = gitMgr.openRepository(rsrc.getChange().getProject());
+ RevWalk rw = new RevWalk(git)) {
Ref ref = git.getRef(rsrc.getChange().getDest().get());
- RevWalk rw = new RevWalk(git);
- try {
- RelatedInfo info = new RelatedInfo();
- info.changes = walk(rsrc, rw, ref);
- return info;
- } finally {
- rw.release();
- }
- } finally {
- git.close();
+ RelatedInfo info = new RelatedInfo();
+ info.changes = walk(rsrc, rw, ref);
+ return info;
}
}
@@ -127,18 +118,6 @@
if (p != null) {
g = changes.get(p.getId().getParentKey()).change();
added.add(p.getId().getParentKey());
- } else {
- // check if there is a merged or abandoned change for this commit
- ReviewDb db = dbProvider.get();
- for (PatchSet ps : db.patchSets().byRevision(new RevId(c.name())).toList()) {
- Change change = db.changes().get(ps.getId().getParentKey());
- if (change != null && change.getDest().equals(rsrc.getChange().getDest())) {
- p = ps;
- g = change;
- added.add(g.getId());
- break;
- }
- }
}
parents.add(new ChangeAndCommit(g, p, c));
}
@@ -293,7 +272,6 @@
public static class ChangeAndCommit {
public String changeId;
- public ChangeStatus status;
public CommitInfo commit;
public Integer _changeNumber;
public Integer _revisionNumber;
@@ -302,7 +280,6 @@
ChangeAndCommit(@Nullable Change change, @Nullable PatchSet ps, RevCommit c) {
if (change != null) {
changeId = change.getKey().get();
- status = change.getStatus().asChangeStatus();
_changeNumber = change.getChangeId();
_revisionNumber = ps != null ? ps.getPatchSetId() : null;
PatchSet.Id curr = change.currentPatchSetId();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRevisionActions.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRevisionActions.java
index d58c8d2..cd57a3e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRevisionActions.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRevisionActions.java
@@ -14,22 +14,62 @@
package com.google.gerrit.server.change;
+import com.google.common.base.Strings;
+import com.google.common.hash.Hasher;
+import com.google.common.hash.Hashing;
+import com.google.gerrit.extensions.common.ActionInfo;
+import com.google.gerrit.extensions.restapi.ETagView;
import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.OrmRuntimeException;
import com.google.inject.Inject;
+import com.google.inject.Provider;
import com.google.inject.Singleton;
-@Singleton
-public class GetRevisionActions implements RestReadView<RevisionResource> {
- private final ActionJson delegate;
+import org.eclipse.jgit.lib.Config;
+import java.util.Map;
+
+@Singleton
+public class GetRevisionActions implements ETagView<RevisionResource> {
+ private final ActionJson delegate;
+ private final Provider<InternalChangeQuery> queryProvider;
+ private final Config config;
@Inject
- GetRevisionActions(ActionJson delegate) {
+ GetRevisionActions(
+ ActionJson delegate,
+ Provider<InternalChangeQuery> queryProvider,
+ @GerritServerConfig Config config) {
this.delegate = delegate;
+ this.queryProvider = queryProvider;
+ this.config = config;
}
@Override
- public Object apply(RevisionResource rsrc) {
+ public Response<Map<String, ActionInfo>> apply(RevisionResource rsrc) {
return Response.withMustRevalidate(delegate.format(rsrc));
}
+
+ @Override
+ public String getETag(RevisionResource rsrc) {
+ String topic = rsrc.getChange().getTopic();
+ if (!Submit.wholeTopicEnabled(config)
+ || Strings.isNullOrEmpty(topic)) {
+ return rsrc.getETag();
+ }
+ Hasher h = Hashing.md5().newHasher();
+ CurrentUser user = rsrc.getControl().getCurrentUser();
+ try {
+ for (ChangeData c : queryProvider.get().byTopicOpen(topic)) {
+ new ChangeResource(c.changeControl()).prepareETag(h, user);
+ }
+ } catch (OrmException e){
+ throw new OrmRuntimeException(e);
+ }
+ return h.hash().toString();
+ }
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedIn.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedIn.java
index e0cdebb..7e9bb14 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedIn.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedIn.java
@@ -19,6 +19,7 @@
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.RestReadView;
import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.project.ChangeControl;
@@ -55,26 +56,19 @@
ChangeControl ctl = rsrc.getControl();
PatchSet ps =
db.get().patchSets().get(ctl.getChange().currentPatchSetId());
- Repository r =
- repoManager.openRepository(ctl.getProject().getNameKey());
- try {
- RevWalk rw = new RevWalk(r);
+ Project.NameKey project = ctl.getProject().getNameKey();
+ try (Repository r = repoManager.openRepository(project);
+ RevWalk rw = new RevWalk(r)) {
+ rw.setRetainBody(false);
+ RevCommit rev;
try {
- rw.setRetainBody(false);
- RevCommit rev;
- try {
- rev = rw.parseCommit(ObjectId.fromString(ps.getRevision().get()));
- } catch (IncorrectObjectTypeException err) {
- throw new BadRequestException(err.getMessage());
- } catch (MissingObjectException err) {
- throw new ResourceConflictException(err.getMessage());
- }
- return new IncludedInInfo(IncludedInResolver.resolve(r, rw, rev));
- } finally {
- rw.release();
+ rev = rw.parseCommit(ObjectId.fromString(ps.getRevision().get()));
+ } catch (IncorrectObjectTypeException err) {
+ throw new BadRequestException(err.getMessage());
+ } catch (MissingObjectException err) {
+ throw new ResourceConflictException(err.getMessage());
}
- } finally {
- r.close();
+ return new IncludedInInfo(IncludedInResolver.resolve(r, rw, rev));
}
}
@@ -87,4 +81,4 @@
tags = in.getTags();
}
}
-}
\ No newline at end of file
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityCacheImpl.java
index 5f1ed5b..d6b6ab8 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityCacheImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityCacheImpl.java
@@ -225,8 +225,7 @@
}
try {
Map<String, Ref> refs = key.load.repo.getAllRefs();
- RevWalk rw = CodeReviewCommit.newRevWalk(key.load.repo);
- try {
+ try (RevWalk rw = CodeReviewCommit.newRevWalk(key.load.repo)) {
RevFlag canMerge = rw.newFlag("CAN_MERGE");
CodeReviewCommit rev = parse(rw, key.commit);
rev.add(canMerge);
@@ -243,8 +242,6 @@
canMerge,
accepted,
key.load.dest).dryRun(tip, rev);
- } finally {
- rw.release();
}
} finally {
key.load = null;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebase.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebase.java
index 4141c24..ce4776f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebase.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebase.java
@@ -218,6 +218,7 @@
.setLabel("Rebase")
.setTitle("Rebase onto tip of branch or parent change")
.setVisible(resource.getChange().getStatus().isOpen()
+ && resource.isCurrent()
&& resource.getControl().canRebase()
&& hasOneParent(resource.getPatchSet().getId()));
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionResource.java
index e58d1a1..a18df5b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionResource.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionResource.java
@@ -104,4 +104,8 @@
}
return s;
}
+
+ public boolean isCurrent() {
+ return ps.getId().equals(getChange().currentPatchSetId());
+ }
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java
index 41151ae..306b515 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java
@@ -35,6 +35,7 @@
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.extensions.webui.UiAction;
@@ -133,6 +134,7 @@
private final ParameterizedString submitTopicTooltip;
private final boolean submitWholeTopic;
private final Provider<InternalChangeQuery> queryProvider;
+ private final Provider<Mergeable> mergeableProvider;
@Inject
Submit(@GerritPersonIdent PersonIdent serverIdent,
@@ -149,7 +151,8 @@
ChangeIndexer indexer,
LabelNormalizer labelNormalizer,
@GerritServerConfig Config cfg,
- Provider<InternalChangeQuery> queryProvider) {
+ Provider<InternalChangeQuery> queryProvider,
+ Provider<Mergeable> mergeableProvider) {
this.serverIdent = serverIdent;
this.dbProvider = dbProvider;
this.repoManager = repoManager;
@@ -169,7 +172,7 @@
this.titlePattern = new ParameterizedString(MoreObjects.firstNonNull(
cfg.getString("change", null, "submitTooltip"),
DEFAULT_TOOLTIP));
- submitWholeTopic = cfg.getBoolean("change", null, "submitWholeTopic" , false);
+ submitWholeTopic = wholeTopicEnabled(cfg);
this.submitTopicLabel = MoreObjects.firstNonNull(
Strings.emptyToNull(cfg.getString("change", null, "submitTopicLabel")),
"Submit whole topic");
@@ -177,6 +180,7 @@
cfg.getString("change", null, "submitTopicTooltip"),
DEFAULT_TOPIC_TOOLTIP));
this.queryProvider = queryProvider;
+ this.mergeableProvider = mergeableProvider;
}
@Override
@@ -206,17 +210,19 @@
rsrc.getPatchSet().getRevision().get()));
}
- change = submit(rsrc, caller, false);
- if (change == null) {
- throw new ResourceConflictException("change is "
- + status(dbProvider.get().changes().get(rsrc.getChange().getId())));
- }
+ List<Change> submittedChanges = submit(rsrc, caller, false);
if (input.waitForMerge) {
- mergeQueue.merge(change.getDest());
+ for (Change c : submittedChanges) {
+ // TODO(sbeller): We should make schedule return a Future, then we
+ // could do these all in parallel and still block until they're done.
+ mergeQueue.merge(c.getDest());
+ }
change = dbProvider.get().changes().get(change.getId());
} else {
- mergeQueue.schedule(change.getDest());
+ for (Change c : submittedChanges) {
+ mergeQueue.schedule(c.getDest());
+ }
}
if (change == null) {
@@ -288,13 +294,21 @@
.setTitle("")
.setVisible(false);
}
+
+ boolean enabled;
+ try {
+ enabled = mergeableProvider.get().apply(resource).mergeable;
+ } catch (RestApiException | OrmException | IOException e) {
+ throw new OrmRuntimeException("Could not determine mergeability", e);
+ }
+
+ List<ChangeData> changesByTopic = null;
if (submitWholeTopic && !Strings.isNullOrEmpty(topic)) {
- List<ChangeData> changesByTopic = null;
- try {
- changesByTopic = queryProvider.get().byTopicOpen(topic);
- } catch (OrmException e) {
- throw new OrmRuntimeException(e);
- }
+ changesByTopic = getChangesByTopic(topic);
+ }
+ if (submitWholeTopic
+ && !Strings.isNullOrEmpty(topic)
+ && changesByTopic.size() > 1) {
Map<String, String> params = ImmutableMap.of(
"topicSize", String.valueOf(changesByTopic.size()));
String topicProblems = problemsForSubmittingChanges(changesByTopic,
@@ -311,7 +325,7 @@
.setTitle(Strings.emptyToNull(
submitTopicTooltip.replace(params)))
.setVisible(true)
- .setEnabled(true);
+ .setEnabled(enabled);
}
} else {
RevId revId = resource.getPatchSet().getRevision();
@@ -322,7 +336,8 @@
return new UiAction.Description()
.setLabel(label)
.setTitle(Strings.emptyToNull(titlePattern.replace(params)))
- .setVisible(true);
+ .setVisible(true)
+ .setEnabled(enabled);
}
}
@@ -345,9 +360,10 @@
.orNull();
}
- private Change submitToDatabase(ReviewDb db, Change.Id changeId,
- final Timestamp timestamp) throws OrmException {
- return db.changes().atomicUpdate(changeId,
+ private Change submitToDatabase(final ReviewDb db, final Change.Id changeId,
+ final Timestamp timestamp) throws OrmException,
+ ResourceConflictException {
+ Change ret = db.changes().atomicUpdate(changeId,
new AtomicUpdate<Change>() {
@Override
public Change update(Change change) {
@@ -359,6 +375,12 @@
return null;
}
});
+ if (ret != null) {
+ return ret;
+ } else {
+ throw new ResourceConflictException("change " + changeId + " is "
+ + status(db.changes().get(changeId)));
+ }
}
private Change submitThisChange(RevisionResource rsrc, IdentifiedUser caller,
@@ -376,13 +398,11 @@
db.changes().beginTransaction(change.getId());
try {
- BatchMetaDataUpdate batch = approve(rsrc, update, caller, timestamp);
+ BatchMetaDataUpdate batch = approve(rsrc.getPatchSet().getId(),
+ cd.changeControl(), update, caller, timestamp);
// Write update commit after all normalized label commits.
batch.write(update, new CommitBuilder());
change = submitToDatabase(db, change.getId(), timestamp);
- if (change == null) {
- return null;
- }
db.commit();
} finally {
db.rollback();
@@ -391,7 +411,7 @@
return change;
}
- private Change submitWholeTopic(RevisionResource rsrc, IdentifiedUser caller,
+ private List<Change> submitWholeTopic(RevisionResource rsrc, IdentifiedUser caller,
boolean force, String topic) throws ResourceConflictException, OrmException,
IOException {
Preconditions.checkNotNull(topic);
@@ -415,45 +435,45 @@
db.changes().beginTransaction(change.getId());
try {
- BatchMetaDataUpdate batch = approve(rsrc, update, caller, timestamp);
- // Write update commit after all normalized label commits.
- batch.write(update, new CommitBuilder());
-
for (ChangeData c : changesByTopic) {
- if (submitToDatabase(db, c.getId(), timestamp) == null) {
- return null;
- }
+ BatchMetaDataUpdate batch = approve(c.currentPatchSet().getId(),
+ c.changeControl(), update, caller, timestamp);
+ // Write update commit after all normalized label commits.
+ batch.write(update, new CommitBuilder());
+ submitToDatabase(db, c.getId(), timestamp);
}
db.commit();
} finally {
db.rollback();
}
List<Change.Id> ids = new ArrayList<>(changesByTopic.size());
+ List<Change> ret = new ArrayList<>(changesByTopic.size());
for (ChangeData c : changesByTopic) {
ids.add(c.getId());
+ ret.add(c.change());
}
indexer.indexAsync(ids).checkedGet();
- return change;
+
+ return ret;
}
- public Change submit(RevisionResource rsrc, IdentifiedUser caller,
+ public List<Change> submit(RevisionResource rsrc, IdentifiedUser caller,
boolean force) throws ResourceConflictException, OrmException,
IOException {
String topic = rsrc.getChange().getTopic();
if (submitWholeTopic && !Strings.isNullOrEmpty(topic)) {
return submitWholeTopic(rsrc, caller, force, topic);
} else {
- return submitThisChange(rsrc, caller, force);
+ return Arrays.asList(submitThisChange(rsrc, caller, force));
}
}
- private BatchMetaDataUpdate approve(RevisionResource rsrc,
+ private BatchMetaDataUpdate approve(PatchSet.Id psId, ChangeControl control,
ChangeUpdate update, IdentifiedUser caller, Timestamp timestamp)
throws OrmException {
- PatchSet.Id psId = rsrc.getPatchSet().getId();
Map<PatchSetApproval.Key, PatchSetApproval> byKey = Maps.newHashMap();
for (PatchSetApproval psa :
- approvalsUtil.byPatchSet(dbProvider.get(), rsrc.getControl(), psId)) {
+ approvalsUtil.byPatchSet(dbProvider.get(), control, psId)) {
if (!byKey.containsKey(psa.getKey())) {
byKey.put(psa.getKey(), psa);
}
@@ -464,7 +484,7 @@
|| !submit.getAccountId().equals(caller.getAccountId())) {
submit = new PatchSetApproval(
new PatchSetApproval.Key(
- rsrc.getPatchSet().getId(),
+ psId,
caller.getAccountId(),
LabelId.SUBMIT),
(short) 1, TimeUtil.nowTs());
@@ -479,7 +499,7 @@
// was added. So we need to make sure votes are accurate now. This way if
// permissions get modified in the future, historical records stay accurate.
LabelNormalizer.Result normalized =
- labelNormalizer.normalize(rsrc.getControl(), byKey.values());
+ labelNormalizer.normalize(control, byKey.values());
// TODO(dborowitz): Don't use a label in notedb; just check when status
// change happened.
@@ -489,13 +509,13 @@
dbProvider.get().patchSetApprovals().delete(normalized.deleted());
try {
- return saveToBatch(rsrc, update, normalized, timestamp);
+ return saveToBatch(control, update, normalized, timestamp);
} catch (IOException e) {
throw new OrmException(e);
}
}
- private BatchMetaDataUpdate saveToBatch(RevisionResource rsrc,
+ private BatchMetaDataUpdate saveToBatch(ChangeControl ctl,
ChangeUpdate callerUpdate, LabelNormalizer.Result normalized,
Timestamp timestamp) throws IOException {
Table<Account.Id, String, Optional<Short>> byUser = HashBasedTable.create();
@@ -507,7 +527,6 @@
byUser.put(psa.getAccountId(), psa.getLabel(), Optional.<Short> absent());
}
- ChangeControl ctl = rsrc.getControl();
BatchMetaDataUpdate batch = callerUpdate.openUpdate();
for (Account.Id accountId : byUser.rowKeySet()) {
if (!accountId.equals(callerUpdate.getUser().getAccountId())) {
@@ -654,6 +673,18 @@
return new RevisionResource(changes.parse(target), rsrc.getPatchSet());
}
+ static boolean wholeTopicEnabled(Config config) {
+ return config.getBoolean("change", null, "submitWholeTopic" , false);
+ }
+
+ private List<ChangeData> getChangesByTopic(String topic) {
+ try {
+ return queryProvider.get().byTopicOpen(topic);
+ } catch (OrmException e) {
+ throw new OrmRuntimeException(e);
+ }
+ }
+
public static class CurrentRevision implements
RestModifyView<ChangeResource, SubmitInput> {
private final Provider<ReviewDb> dbProvider;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitRule.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitRule.java
index c17136a..b037931 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitRule.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitRule.java
@@ -106,7 +106,7 @@
Map<String, None> need;
Map<String, AccountInfo> may;
Map<String, None> impossible;
- Integer prologReductionCount;
+ Long prologReductionCount;
Record(SubmitRecord r, AccountLoader accounts) {
this.status = r.status;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/changedetail/RebaseChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/changedetail/RebaseChange.java
index f80a474..6b49206 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/changedetail/RebaseChange.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/changedetail/RebaseChange.java
@@ -119,14 +119,9 @@
"Cannot rebase: New patch sets are not allowed to be added to change: "
+ changeId.toString());
}
- Repository git = null;
- RevWalk rw = null;
- ObjectInserter inserter = null;
- try {
- git = gitManager.openRepository(change.getProject());
- rw = new RevWalk(git);
- inserter = git.newObjectInserter();
-
+ try (Repository git = gitManager.openRepository(change.getProject());
+ RevWalk rw = new RevWalk(git);
+ ObjectInserter inserter = git.newObjectInserter()) {
String baseRev = newBaseRev;
if (baseRev == null) {
baseRev = findBaseRevision(patchSetId, db.get(),
@@ -149,16 +144,6 @@
committerIdent, true, ValidatePolicy.GERRIT);
} catch (MergeConflictException e) {
throw new IOException(e.getMessage());
- } finally {
- if (inserter != null) {
- inserter.release();
- }
- if (rw != null) {
- rw.release();
- }
- if (git != null) {
- git.close();
- }
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GcConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GcConfig.java
index 54096bb..572b56e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GcConfig.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GcConfig.java
@@ -23,14 +23,19 @@
@Singleton
public class GcConfig {
private final ScheduleConfig scheduleConfig;
+ private final boolean aggressive;
@Inject
GcConfig(@GerritServerConfig Config cfg) {
scheduleConfig = new ScheduleConfig(cfg, ConfigConstants.CONFIG_GC_SECTION);
+ aggressive = cfg.getBoolean(ConfigConstants.CONFIG_GC_SECTION, "aggressive", false);
}
public ScheduleConfig getScheduleConfig() {
return scheduleConfig;
}
+ public boolean isAggressive() {
+ return aggressive;
+ }
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigProvider.java
index aa699c5..4b1236b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigProvider.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigProvider.java
@@ -44,10 +44,11 @@
@Override
public Config get() {
- FileBasedConfig cfg = new FileBasedConfig(site.gerrit_config, FS.DETECTED);
+ FileBasedConfig cfg =
+ new FileBasedConfig(site.gerrit_config.toFile(), FS.DETECTED);
if (!cfg.getFile().exists()) {
- log.info("No " + site.gerrit_config.getAbsolutePath()
+ log.info("No " + site.gerrit_config.toAbsolutePath()
+ "; assuming defaults");
return new GerritConfig(cfg, secureStore);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetSummary.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetSummary.java
index 9aa8590..2d19f65 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetSummary.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetSummary.java
@@ -24,7 +24,6 @@
import org.eclipse.jgit.internal.storage.file.WindowCacheStatAccessor;
import org.kohsuke.args4j.Option;
-import java.io.File;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
@@ -33,6 +32,8 @@
import java.lang.management.ThreadMXBean;
import java.net.InetAddress;
import java.net.UnknownHostException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
@@ -43,7 +44,7 @@
public class GetSummary implements RestReadView<ConfigResource> {
private final WorkQueue workQueue;
- private final File sitePath;
+ private final Path sitePath;
@Option(name = "--gc", usage = "perform Java GC before retrieving memory stats")
private boolean gc;
@@ -62,7 +63,7 @@
}
@Inject
- public GetSummary(WorkQueue workQueue, @SitePath File sitePath) {
+ public GetSummary(WorkQueue workQueue, @SitePath Path sitePath) {
this.workQueue = workQueue;
this.sitePath = sitePath;
}
@@ -88,7 +89,9 @@
private TaskSummaryInfo getTaskSummary() {
Collection<Task<?>> pending = workQueue.getTasks();
int tasksTotal = pending.size();
- int tasksRunning = 0, tasksReady = 0, tasksSleeping = 0;
+ int tasksRunning = 0;
+ int tasksReady = 0;
+ int tasksSleeping = 0;
for (Task<?> task : pending) {
switch (task.getState()) {
case RUNNING: tasksRunning++; break;
@@ -186,7 +189,8 @@
} catch (UnknownHostException e) {
}
- jvmSummary.currentWorkingDirectory = path(new File(".").getAbsoluteFile().getParentFile());
+ jvmSummary.currentWorkingDirectory =
+ path(Paths.get(".").toAbsolutePath().getParent());
jvmSummary.site = path(sitePath);
return jvmSummary;
}
@@ -210,11 +214,11 @@
return String.format("%1$6.2f%2$s", value, suffix).trim();
}
- private static String path(File file) {
+ private static String path(Path path) {
try {
- return file.getCanonicalPath();
+ return path.toRealPath().normalize().toString();
} catch (IOException err) {
- return file.getAbsolutePath();
+ return path.toAbsolutePath().normalize().toString();
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfigFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfigFactory.java
index 76f5323..3754674 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfigFactory.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfigFactory.java
@@ -35,6 +35,7 @@
import java.io.File;
import java.io.IOException;
+import java.nio.file.Path;
import java.util.Map;
@Singleton
@@ -61,7 +62,7 @@
this.projectStateFactory = projectStateFactory;
this.pluginConfigs = Maps.newHashMap();
- this.cfgSnapshot = FileSnapshot.save(site.gerrit_config);
+ this.cfgSnapshot = FileSnapshot.save(site.gerrit_config.toFile());
this.cfg = cfgProvider.get();
}
@@ -103,8 +104,9 @@
* @return the plugin configuration from the 'gerrit.config' file
*/
public PluginConfig getFromGerritConfig(String pluginName, boolean refresh) {
- if (refresh && cfgSnapshot.isModified(site.gerrit_config)) {
- cfgSnapshot = FileSnapshot.save(site.gerrit_config);
+ File configFile = site.gerrit_config.toFile();
+ if (refresh && cfgSnapshot.isModified(configFile)) {
+ cfgSnapshot = FileSnapshot.save(configFile);
cfg = cfgProvider.get();
}
return new PluginConfig(pluginName, cfg);
@@ -250,20 +252,21 @@
return pluginConfigs.get(pluginName);
}
- File pluginConfigFile = new File(site.etc_dir, pluginName + ".config");
- FileBasedConfig cfg = new FileBasedConfig(pluginConfigFile, FS.DETECTED);
+ Path pluginConfigFile = site.etc_dir.resolve(pluginName + ".config");
+ FileBasedConfig cfg =
+ new FileBasedConfig(pluginConfigFile.toFile(), FS.DETECTED);
pluginConfigs.put(pluginName, cfg);
if (!cfg.getFile().exists()) {
- log.info("No " + pluginConfigFile.getAbsolutePath() + "; assuming defaults");
+ log.info("No " + pluginConfigFile.toAbsolutePath() + "; assuming defaults");
return cfg;
}
try {
cfg.load();
} catch (IOException e) {
- log.warn("Failed to load " + pluginConfigFile.getAbsolutePath(), e);
+ log.warn("Failed to load " + pluginConfigFile.toAbsolutePath(), e);
} catch (ConfigInvalidException e) {
- log.warn("Failed to load " + pluginConfigFile.getAbsolutePath(), e);
+ log.warn("Failed to load " + pluginConfigFile.toAbsolutePath(), e);
}
return cfg;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/SitePaths.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/SitePaths.java
index fbff7c4..a6a3e53 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/SitePaths.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/SitePaths.java
@@ -14,12 +14,15 @@
package com.google.gerrit.server.config;
+import com.google.common.collect.Iterables;
import com.google.inject.Inject;
import com.google.inject.Singleton;
-import java.io.File;
-import java.io.FileNotFoundException;
import java.io.IOException;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
/** Important paths within a {@link SitePath}. */
@Singleton
@@ -28,88 +31,84 @@
public static final String HEADER_FILENAME = "GerritSiteHeader.html";
public static final String FOOTER_FILENAME = "GerritSiteFooter.html";
- public final File site_path;
- public final File bin_dir;
- public final File etc_dir;
- public final File lib_dir;
- public final File tmp_dir;
- public final File logs_dir;
- public final File plugins_dir;
- public final File data_dir;
- public final File mail_dir;
- public final File hooks_dir;
- public final File static_dir;
- public final File themes_dir;
- public final File index_dir;
+ public final Path site_path;
+ public final Path bin_dir;
+ public final Path etc_dir;
+ public final Path lib_dir;
+ public final Path tmp_dir;
+ public final Path logs_dir;
+ public final Path plugins_dir;
+ public final Path data_dir;
+ public final Path mail_dir;
+ public final Path hooks_dir;
+ public final Path static_dir;
+ public final Path themes_dir;
+ public final Path index_dir;
- public final File gerrit_sh;
- public final File gerrit_war;
+ public final Path gerrit_sh;
+ public final Path gerrit_war;
- public final File gerrit_config;
- public final File secure_config;
- public final File contact_information_pub;
+ public final Path gerrit_config;
+ public final Path secure_config;
+ public final Path contact_information_pub;
- public final File ssl_keystore;
- public final File ssh_key;
- public final File ssh_rsa;
- public final File ssh_dsa;
- public final File peer_keys;
+ public final Path ssl_keystore;
+ public final Path ssh_key;
+ public final Path ssh_rsa;
+ public final Path ssh_dsa;
+ public final Path peer_keys;
- public final File site_css;
- public final File site_header;
- public final File site_footer;
- public final File site_gitweb;
+ public final Path site_css;
+ public final Path site_header;
+ public final Path site_footer;
+ public final Path site_gitweb;
/** {@code true} if {@link #site_path} has not been initialized. */
public final boolean isNew;
@Inject
- public SitePaths(final @SitePath File sitePath) throws FileNotFoundException {
+ public SitePaths(@SitePath Path sitePath) throws IOException {
site_path = sitePath;
+ Path p = sitePath;
- bin_dir = new File(site_path, "bin");
- etc_dir = new File(site_path, "etc");
- lib_dir = new File(site_path, "lib");
- tmp_dir = new File(site_path, "tmp");
- plugins_dir = new File(site_path, "plugins");
- data_dir = new File(site_path, "data");
- logs_dir = new File(site_path, "logs");
- mail_dir = new File(etc_dir, "mail");
- hooks_dir = new File(site_path, "hooks");
- static_dir = new File(site_path, "static");
- themes_dir = new File(site_path, "themes");
- index_dir = new File(site_path, "index");
+ bin_dir = p.resolve("bin");
+ etc_dir = p.resolve("etc");
+ lib_dir = p.resolve("lib");
+ tmp_dir = p.resolve("tmp");
+ plugins_dir = p.resolve("plugins");
+ data_dir = p.resolve("data");
+ logs_dir = p.resolve("logs");
+ mail_dir = etc_dir.resolve("mail");
+ hooks_dir = p.resolve("hooks");
+ static_dir = p.resolve("static");
+ themes_dir = p.resolve("themes");
+ index_dir = p.resolve("index");
- gerrit_sh = new File(bin_dir, "gerrit.sh");
- gerrit_war = new File(bin_dir, "gerrit.war");
+ gerrit_sh = bin_dir.resolve("gerrit.sh");
+ gerrit_war = bin_dir.resolve("gerrit.war");
- gerrit_config = new File(etc_dir, "gerrit.config");
- secure_config = new File(etc_dir, "secure.config");
- contact_information_pub = new File(etc_dir, "contact_information.pub");
+ gerrit_config = etc_dir.resolve("gerrit.config");
+ secure_config = etc_dir.resolve("secure.config");
+ contact_information_pub = etc_dir.resolve("contact_information.pub");
- ssl_keystore = new File(etc_dir, "keystore");
- ssh_key = new File(etc_dir, "ssh_host_key");
- ssh_rsa = new File(etc_dir, "ssh_host_rsa_key");
- ssh_dsa = new File(etc_dir, "ssh_host_dsa_key");
- peer_keys = new File(etc_dir, "peer_keys");
+ ssl_keystore = etc_dir.resolve("keystore");
+ ssh_key = etc_dir.resolve("ssh_host_key");
+ ssh_rsa = etc_dir.resolve("ssh_host_rsa_key");
+ ssh_dsa = etc_dir.resolve("ssh_host_dsa_key");
+ peer_keys = etc_dir.resolve("peer_keys");
- site_css = new File(etc_dir, CSS_FILENAME);
- site_header = new File(etc_dir, HEADER_FILENAME);
- site_footer = new File(etc_dir, FOOTER_FILENAME);
- site_gitweb = new File(etc_dir, "gitweb_config.perl");
+ site_css = etc_dir.resolve(CSS_FILENAME);
+ site_header = etc_dir.resolve(HEADER_FILENAME);
+ site_footer = etc_dir.resolve(FOOTER_FILENAME);
+ site_gitweb = etc_dir.resolve("gitweb_config.perl");
- if (site_path.exists()) {
- final String[] contents = site_path.list();
- if (contents != null) {
- isNew = contents.length == 0;
- } else if (site_path.isDirectory()) {
- throw new FileNotFoundException("Cannot access " + site_path);
- } else {
- throw new FileNotFoundException("Not a directory: " + site_path);
- }
- } else {
+ boolean isNew;
+ try (DirectoryStream<Path> files = Files.newDirectoryStream(site_path)) {
+ isNew = Iterables.isEmpty(files);
+ } catch (NoSuchFileException e) {
isNew = true;
}
+ this.isNew = isNew;
}
/**
@@ -120,16 +119,13 @@
* @param path the path string to resolve. May be null.
* @return the resolved path; null if {@code path} was null or empty.
*/
- public File resolve(final String path) {
+ public Path resolve(String path) {
if (path != null && !path.isEmpty()) {
- File loc = new File(path);
- if (!loc.isAbsolute()) {
- loc = new File(site_path, path);
- }
+ Path loc = site_path.resolve(path).normalize();
try {
- return loc.getCanonicalFile();
+ return loc.toRealPath();
} catch (IOException e) {
- return loc.getAbsoluteFile();
+ return loc.toAbsolutePath();
}
}
return null;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/contact/ContactStoreModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/contact/ContactStoreModule.java
index 6b195de..f6e08b8 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/contact/ContactStoreModule.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/contact/ContactStoreModule.java
@@ -28,11 +28,12 @@
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.util.StringUtils;
-import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.net.MalformedURLException;
import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.security.Security;
/** Creates the {@link ContactStore} based on the configuration. */
@@ -46,7 +47,7 @@
public ContactStore provideContactStore(@GerritServerConfig final Config config,
final SitePaths site, final SchemaFactory<ReviewDb> schema,
final ContactStoreConnection.Factory connFactory) {
- final String url = config.getString("contactstore", null, "url");
+ String url = config.getString("contactstore", null, "url");
if (StringUtils.isEmptyOrNull(url)) {
return new NoContactStore();
}
@@ -56,18 +57,18 @@
+ " needed to encrypt contact information");
}
- final URL storeUrl;
+ URL storeUrl;
try {
storeUrl = new URL(url);
} catch (MalformedURLException e) {
throw new ProvisionException("Invalid contactstore.url: " + url, e);
}
- final String storeAPPSEC = config.getString("contactstore", null, "appsec");
- final File pubkey = site.contact_information_pub;
- if (!pubkey.exists()) {
+ String storeAPPSEC = config.getString("contactstore", null, "appsec");
+ Path pubkey = site.contact_information_pub;
+ if (!Files.exists(pubkey)) {
throw new ProvisionException("PGP public key file \""
- + pubkey.getAbsolutePath() + "\" not found");
+ + pubkey.toAbsolutePath() + "\" not found");
}
return new EncryptedContactStore(storeUrl, storeAPPSEC, pubkey, schema,
connFactory);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/contact/EncryptedContactStore.java b/gerrit-server/src/main/java/com/google/gerrit/server/contact/EncryptedContactStore.java
index d8dbfed..e27f63d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/contact/EncryptedContactStore.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/contact/EncryptedContactStore.java
@@ -42,12 +42,12 @@
import org.slf4j.LoggerFactory;
import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
@@ -72,7 +72,7 @@
private final ContactStoreConnection.Factory connFactory;
EncryptedContactStore(final URL storeUrl, final String storeAPPSEC,
- final File pubKey, final SchemaFactory<ReviewDb> schema,
+ final Path pubKey, final SchemaFactory<ReviewDb> schema,
final ContactStoreConnection.Factory connFactory) {
this.storeUrl = storeUrl;
this.storeAPPSEC = storeAPPSEC;
@@ -104,8 +104,8 @@
return true;
}
- private static PGPPublicKeyRingCollection readPubRing(final File pub) {
- try (InputStream fin = new FileInputStream(pub);
+ private static PGPPublicKeyRingCollection readPubRing(Path pub) {
+ try (InputStream fin = Files.newInputStream(pub);
InputStream in = PGPUtil.getDecoderStream(fin)) {
return new PGPPublicKeyRingCollection(in);
} catch (IOException | PGPException e) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java
index 87895e9..d48d0e4 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java
@@ -29,6 +29,7 @@
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.GerritPersonIdent;
import com.google.gerrit.server.IdentifiedUser;
@@ -115,26 +116,20 @@
}
IdentifiedUser me = (IdentifiedUser) currentUser.get();
- Repository repo = gitManager.openRepository(change.getProject());
String refPrefix = editRefPrefix(me.getAccountId(), change.getId());
- try {
+ try (Repository repo = gitManager.openRepository(change.getProject())) {
Map<String, Ref> refs = repo.getRefDatabase().getRefs(refPrefix);
if (!refs.isEmpty()) {
throw new ResourceConflictException("edit already exists");
}
- RevWalk rw = new RevWalk(repo);
- try {
+ try (RevWalk rw = new RevWalk(repo)) {
ObjectId revision = ObjectId.fromString(ps.getRevision().get());
String editRefName = editRefName(me.getAccountId(), change.getId(),
ps.getId());
return update(repo, me, editRefName, rw, ObjectId.zeroId(), revision);
- } finally {
- rw.release();
}
- } finally {
- repo.close();
}
}
@@ -159,59 +154,51 @@
IdentifiedUser me = (IdentifiedUser) currentUser.get();
String refName = editRefName(me.getAccountId(), change.getId(),
current.getId());
- Repository repo = gitManager.openRepository(change.getProject());
- try {
- RevWalk rw = new RevWalk(repo);
+ try (Repository repo = gitManager.openRepository(change.getProject());
+ RevWalk rw = new RevWalk(repo);
+ ObjectInserter inserter = repo.newObjectInserter()) {
BatchRefUpdate ru = repo.getRefDatabase().newBatchUpdate();
- ObjectInserter inserter = repo.newObjectInserter();
- try {
- RevCommit editCommit = edit.getEditCommit();
- if (editCommit.getParentCount() == 0) {
- throw new InvalidChangeOperationException(
- "Rebase edit against root commit not supported");
- }
- RevCommit tip = rw.parseCommit(ObjectId.fromString(
- current.getRevision().get()));
- ThreeWayMerger m = MergeStrategy.RESOLVE.newMerger(repo, true);
- m.setObjectInserter(inserter);
- m.setBase(ObjectId.fromString(
- edit.getBasePatchSet().getRevision().get()));
-
- if (m.merge(tip, editCommit)) {
- ObjectId tree = m.getResultTreeId();
-
- CommitBuilder commit = new CommitBuilder();
- commit.setTreeId(tree);
- for (int i = 0; i < tip.getParentCount(); i++) {
- commit.addParentId(tip.getParent(i));
- }
- commit.setAuthor(editCommit.getAuthorIdent());
- commit.setCommitter(new PersonIdent(
- editCommit.getCommitterIdent(), TimeUtil.nowTs()));
- commit.setMessage(editCommit.getFullMessage());
- ObjectId newEdit = inserter.insert(commit);
- inserter.flush();
-
- ru.addCommand(new ReceiveCommand(ObjectId.zeroId(), newEdit,
- refName));
- ru.addCommand(new ReceiveCommand(edit.getRef().getObjectId(),
- ObjectId.zeroId(), edit.getRefName()));
- ru.execute(rw, NullProgressMonitor.INSTANCE);
- for (ReceiveCommand cmd : ru.getCommands()) {
- if (cmd.getResult() != ReceiveCommand.Result.OK) {
- throw new IOException("failed: " + cmd);
- }
- }
- } else {
- // TODO(davido): Allow to resolve conflicts inline
- throw new ResourceConflictException("merge conflict");
- }
- } finally {
- rw.release();
- inserter.release();
+ RevCommit editCommit = edit.getEditCommit();
+ if (editCommit.getParentCount() == 0) {
+ throw new InvalidChangeOperationException(
+ "Rebase edit against root commit not supported");
}
- } finally {
- repo.close();
+ RevCommit tip = rw.parseCommit(ObjectId.fromString(
+ current.getRevision().get()));
+ ThreeWayMerger m = MergeStrategy.RESOLVE.newMerger(repo, true);
+ m.setObjectInserter(inserter);
+ m.setBase(ObjectId.fromString(
+ edit.getBasePatchSet().getRevision().get()));
+
+ if (m.merge(tip, editCommit)) {
+ ObjectId tree = m.getResultTreeId();
+
+ CommitBuilder commit = new CommitBuilder();
+ commit.setTreeId(tree);
+ for (int i = 0; i < tip.getParentCount(); i++) {
+ commit.addParentId(tip.getParent(i));
+ }
+ commit.setAuthor(editCommit.getAuthorIdent());
+ commit.setCommitter(new PersonIdent(
+ editCommit.getCommitterIdent(), TimeUtil.nowTs()));
+ commit.setMessage(editCommit.getFullMessage());
+ ObjectId newEdit = inserter.insert(commit);
+ inserter.flush();
+
+ ru.addCommand(new ReceiveCommand(ObjectId.zeroId(), newEdit,
+ refName));
+ ru.addCommand(new ReceiveCommand(edit.getRef().getObjectId(),
+ ObjectId.zeroId(), edit.getRefName()));
+ ru.execute(rw, NullProgressMonitor.INSTANCE);
+ for (ReceiveCommand cmd : ru.getCommands()) {
+ if (cmd.getResult() != ReceiveCommand.Result.OK) {
+ throw new IOException("failed: " + cmd);
+ }
+ }
+ } else {
+ // TODO(davido): Allow to resolve conflicts inline
+ throw new ResourceConflictException("merge conflict");
+ }
}
}
@@ -240,23 +227,16 @@
}
IdentifiedUser me = (IdentifiedUser) currentUser.get();
- Repository repo = gitManager.openRepository(edit.getChange().getProject());
- try {
- RevWalk rw = new RevWalk(repo);
- ObjectInserter inserter = repo.newObjectInserter();
- try {
- String refName = edit.getRefName();
- ObjectId commit = createCommit(me, inserter, prevEdit,
- prevEdit.getTree(),
- msg);
- inserter.flush();
- return update(repo, me, refName, rw, prevEdit, commit);
- } finally {
- rw.release();
- inserter.release();
- }
- } finally {
- repo.close();
+ Project.NameKey project = edit.getChange().getProject();
+ try (Repository repo = gitManager.openRepository(project);
+ RevWalk rw = new RevWalk(repo);
+ ObjectInserter inserter = repo.newObjectInserter()) {
+ String refName = edit.getRefName();
+ ObjectId commit = createCommit(me, inserter, prevEdit,
+ prevEdit.getTree(),
+ msg);
+ inserter.flush();
+ return update(repo, me, refName, rw, prevEdit, commit);
}
}
@@ -333,36 +313,28 @@
throw new AuthException("Authentication required");
}
IdentifiedUser me = (IdentifiedUser) currentUser.get();
- Repository repo = gitManager.openRepository(edit.getChange().getProject());
- try {
- RevWalk rw = new RevWalk(repo);
- ObjectInserter inserter = repo.newObjectInserter();
- ObjectReader reader = repo.newObjectReader();
- try {
- String refName = edit.getRefName();
- RevCommit prevEdit = edit.getEditCommit();
- ObjectId newTree = writeNewTree(op,
- rw,
- inserter,
- prevEdit,
- reader,
- file,
- newFile,
- toBlob(inserter, content));
- if (ObjectId.equals(newTree, prevEdit.getTree())) {
- throw new InvalidChangeOperationException("no changes were made");
- }
-
- ObjectId commit = createCommit(me, inserter, prevEdit, newTree);
- inserter.flush();
- return update(repo, me, refName, rw, prevEdit, commit);
- } finally {
- rw.release();
- inserter.release();
- reader.release();
+ Project.NameKey project = edit.getChange().getProject();
+ try (Repository repo = gitManager.openRepository(project);
+ RevWalk rw = new RevWalk(repo);
+ ObjectInserter inserter = repo.newObjectInserter();
+ ObjectReader reader = repo.newObjectReader()) {
+ String refName = edit.getRefName();
+ RevCommit prevEdit = edit.getEditCommit();
+ ObjectId newTree = writeNewTree(op,
+ rw,
+ inserter,
+ prevEdit,
+ reader,
+ file,
+ newFile,
+ toBlob(inserter, content));
+ if (ObjectId.equals(newTree, prevEdit.getTree())) {
+ throw new InvalidChangeOperationException("no changes were made");
}
- } finally {
- repo.close();
+
+ ObjectId commit = createCommit(me, inserter, prevEdit, newTree);
+ inserter.flush();
+ return update(repo, me, refName, rw, prevEdit, commit);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java
index 3635b56..f24340f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java
@@ -109,8 +109,7 @@
*/
public Optional<ChangeEdit> byChange(Change change, IdentifiedUser user)
throws IOException {
- Repository repo = gitManager.openRepository(change.getProject());
- try {
+ try (Repository repo = gitManager.openRepository(change.getProject())) {
String editRefPrefix = editRefPrefix(user.getAccountId(), change.getId());
Map<String, Ref> refs = repo.getRefDatabase().getRefs(editRefPrefix);
if (refs.isEmpty()) {
@@ -121,16 +120,11 @@
// where there is more than one ref, we could silently delete all but the
// current one.
Ref ref = Iterables.getOnlyElement(refs.values());
- RevWalk rw = new RevWalk(repo);
- try {
+ try (RevWalk rw = new RevWalk(repo)) {
RevCommit commit = rw.parseCommit(ref.getObjectId());
PatchSet basePs = getBasePatchSet(change, ref);
return Optional.of(new ChangeEdit(user, change, ref, commit, basePs));
- } finally {
- rw.release();
}
- } finally {
- repo.close();
}
}
@@ -150,29 +144,19 @@
NoSuchChangeException, IOException, InvalidChangeOperationException,
OrmException, ResourceConflictException {
Change change = edit.getChange();
- Repository repo = gitManager.openRepository(change.getProject());
- try {
- RevWalk rw = new RevWalk(repo);
- ObjectInserter inserter = repo.newObjectInserter();
- try {
-
- PatchSet basePatchSet = edit.getBasePatchSet();
- if (!basePatchSet.getId().equals(change.currentPatchSetId())) {
- throw new ResourceConflictException(
- "only edit for current patch set can be published");
- }
-
- insertPatchSet(edit, change, repo, rw, basePatchSet,
- squashEdit(rw, inserter, edit.getEditCommit(), basePatchSet));
- } finally {
- inserter.release();
- rw.release();
+ try (Repository repo = gitManager.openRepository(change.getProject());
+ RevWalk rw = new RevWalk(repo);
+ ObjectInserter inserter = repo.newObjectInserter()) {
+ PatchSet basePatchSet = edit.getBasePatchSet();
+ if (!basePatchSet.getId().equals(change.currentPatchSetId())) {
+ throw new ResourceConflictException(
+ "only edit for current patch set can be published");
}
+ insertPatchSet(edit, change, repo, rw, basePatchSet,
+ squashEdit(rw, inserter, edit.getEditCommit(), basePatchSet));
// TODO(davido): This should happen in the same BatchRefUpdate.
deleteRef(repo, edit);
- } finally {
- repo.close();
}
}
@@ -200,8 +184,8 @@
checkArgument(pos > 0, "invalid edit ref: %s", ref.getName());
String psId = ref.getName().substring(pos + 1);
return db.get().patchSets().get(new PatchSet.Id(
- change.getId(), Integer.valueOf(psId)));
- } catch (OrmException e) {
+ change.getId(), Integer.parseInt(psId)));
+ } catch (OrmException | NumberFormatException e) {
throw new IOException(e);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/BanCommit.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/BanCommit.java
index 21465ef..d8e56b3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/BanCommit.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/BanCommit.java
@@ -101,46 +101,38 @@
NoteMap banCommitNotes = NoteMap.newEmptyMap();
// Add a note for each banned commit to notes.
final Project.NameKey project = projectControl.getProject().getNameKey();
- final Repository repo = repoManager.openRepository(project);
- try {
- final RevWalk revWalk = new RevWalk(repo);
- final ObjectInserter inserter = repo.newObjectInserter();
- try {
- ObjectId noteId = null;
- for (final ObjectId commitToBan : commitsToBan) {
- try {
- revWalk.parseCommit(commitToBan);
- } catch (MissingObjectException e) {
- // Ignore exception, non-existing commits can be banned.
- } catch (IncorrectObjectTypeException e) {
- result.notACommit(commitToBan);
- continue;
- }
- if (noteId == null) {
- noteId = createNoteContent(reason, inserter);
- }
- banCommitNotes.set(commitToBan, noteId);
+ try (Repository repo = repoManager.openRepository(project);
+ RevWalk revWalk = new RevWalk(repo);
+ ObjectInserter inserter = repo.newObjectInserter()) {
+ ObjectId noteId = null;
+ for (final ObjectId commitToBan : commitsToBan) {
+ try {
+ revWalk.parseCommit(commitToBan);
+ } catch (MissingObjectException e) {
+ // Ignore exception, non-existing commits can be banned.
+ } catch (IncorrectObjectTypeException e) {
+ result.notACommit(commitToBan);
+ continue;
}
- NotesBranchUtil notesBranchUtil =
- notesBranchUtilFactory.create(project, repo, inserter);
- NoteMap newlyCreated =
- notesBranchUtil.commitNewNotes(banCommitNotes, REFS_REJECT_COMMITS,
- createPersonIdent(), buildCommitMessage(commitsToBan, reason));
-
- for (Note n : banCommitNotes) {
- if (newlyCreated.contains(n)) {
- result.commitBanned(n);
- } else {
- result.commitAlreadyBanned(n);
- }
+ if (noteId == null) {
+ noteId = createNoteContent(reason, inserter);
}
- return result;
- } finally {
- revWalk.release();
- inserter.release();
+ banCommitNotes.set(commitToBan, noteId);
}
- } finally {
- repo.close();
+ NotesBranchUtil notesBranchUtil =
+ notesBranchUtilFactory.create(project, repo, inserter);
+ NoteMap newlyCreated =
+ notesBranchUtil.commitNewNotes(banCommitNotes, REFS_REJECT_COMMITS,
+ createPersonIdent(), buildCommitMessage(commitsToBan, reason));
+
+ for (Note n : banCommitNotes) {
+ if (newlyCreated.contains(n)) {
+ result.commitBanned(n);
+ } else {
+ result.commitAlreadyBanned(n);
+ }
+ }
+ return result;
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollection.java
index 24af14d..0c39d67 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollection.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollection.java
@@ -17,6 +17,7 @@
import com.google.common.collect.Sets;
import com.google.gerrit.common.data.GarbageCollectionResult;
import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.GcConfig;
import com.google.inject.Inject;
import org.eclipse.jgit.api.GarbageCollectCommand;
@@ -46,15 +47,18 @@
private final GitRepositoryManager repoManager;
private final GarbageCollectionQueue gcQueue;
+ private final GcConfig gcConfig;
public interface Factory {
GarbageCollection create();
}
@Inject
- GarbageCollection(GitRepositoryManager repoManager, GarbageCollectionQueue gcQueue) {
+ GarbageCollection(GitRepositoryManager repoManager,
+ GarbageCollectionQueue gcQueue, GcConfig config) {
this.repoManager = repoManager;
this.gcQueue = gcQueue;
+ this.gcConfig = config;
}
public GarbageCollectionResult run(List<Project.NameKey> projectNames) {
@@ -63,6 +67,11 @@
public GarbageCollectionResult run(List<Project.NameKey> projectNames,
PrintWriter writer) {
+ return run(projectNames, gcConfig.isAggressive(), writer);
+ }
+
+ public GarbageCollectionResult run(List<Project.NameKey> projectNames,
+ boolean aggressive, PrintWriter writer) {
GarbageCollectionResult result = new GarbageCollectionResult();
Set<Project.NameKey> projectsToGc = gcQueue.addAll(projectNames);
for (Project.NameKey projectName : Sets.difference(
@@ -74,9 +83,10 @@
Repository repo = null;
try {
repo = repoManager.openRepository(p);
- logGcConfiguration(p, repo);
+ logGcConfiguration(p, repo, aggressive);
print(writer, "collecting garbage for \"" + p + "\":\n");
GarbageCollectCommand gc = Git.wrap(repo).gc();
+ gc.setAggressive(aggressive);
logGcInfo(p, "before:", gc.getStatistics());
gc.setProgressMonitor(writer != null ? new TextProgressMonitor(writer)
: NullProgressMonitor.INSTANCE);
@@ -123,9 +133,10 @@
}
private static void logGcConfiguration(Project.NameKey projectName,
- Repository repo) {
+ Repository repo, boolean aggressive) {
StringBuilder b = new StringBuilder();
Config cfg = repo.getConfig();
+ b.append("gc.aggressive=").append(aggressive).append("; ");
b.append(formatConfigValues(cfg, ConfigConstants.CONFIG_GC_SECTION, null));
for (String subsection : cfg.getSubsections(ConfigConstants.CONFIG_GC_SECTION)) {
b.append(formatConfigValues(cfg, ConfigConstants.CONFIG_GC_SECTION,
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/InsertException.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/InsertException.java
index 575ad52..cf18de0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/InsertException.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/InsertException.java
@@ -1,16 +1,16 @@
-//Copyright (C) 2014 The Android Open Source Project
+// Copyright (C) 2014 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
+// 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
+// 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.
+// 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.
package com.google.gerrit.server.git;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
index 633c3bb..ea9fabc 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
@@ -51,7 +51,14 @@
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
+import java.nio.file.FileVisitOption;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
import java.util.Collections;
+import java.util.EnumSet;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.concurrent.locks.Lock;
@@ -128,8 +135,8 @@
}
}
- private final File basePath;
- private final File noteDbPath;
+ private final Path basePath;
+ private final Path noteDbPath;
private final Lock namesUpdateLock;
private volatile SortedSet<Project.NameKey> names;
@@ -153,7 +160,7 @@
}
/** @return base directory under which all projects are stored. */
- public File getBasePath() {
+ public Path getBasePath() {
return basePath;
}
@@ -163,12 +170,12 @@
return openRepository(basePath, name);
}
- private Repository openRepository(File path, Project.NameKey name)
+ private Repository openRepository(Path path, Project.NameKey name)
throws RepositoryNotFoundException {
if (isUnreasonableName(name)) {
throw new RepositoryNotFoundException("Invalid name: " + name);
}
- File gitDir = new File(path, name.get());
+ File gitDir = path.resolve(name.get()).toFile();
if (!names.contains(name)) {
// The this.names list does not hold the project-name but it can still exist
// on disk; for instance when the project has been created directly on the
@@ -214,13 +221,13 @@
return repo;
}
- private Repository createRepository(File path, Project.NameKey name)
+ private Repository createRepository(Path path, Project.NameKey name)
throws RepositoryNotFoundException, RepositoryCaseMismatchException {
if (isUnreasonableName(name)) {
throw new RepositoryNotFoundException("Invalid name: " + name);
}
- File dir = FileKey.resolve(new File(path, name.get()), FS.DETECTED);
+ File dir = FileKey.resolve(path.resolve(name.get()).toFile(), FS.DETECTED);
FileKey loc;
if (dir != null) {
// Already exists on disk, use the repository we found.
@@ -235,7 +242,7 @@
// of the repository name, so prefer the standard bare name.
//
String n = name.get() + Constants.DOT_GIT_EXT;
- loc = FileKey.exact(new File(path, n), FS.DETECTED);
+ loc = FileKey.exact(path.resolve(n).toFile(), FS.DETECTED);
}
try {
@@ -366,28 +373,24 @@
private boolean isUnreasonableName(final Project.NameKey nameKey) {
final String name = nameKey.get();
- if (name.length() == 0) return true; // no empty paths
- if (name.charAt(name.length() -1) == '/') return true; // no suffix
-
- if (name.indexOf('\\') >= 0) return true; // no windows/dos style paths
- if (name.charAt(0) == '/') return true; // no absolute paths
- if (new File(name).isAbsolute()) return true; // no absolute paths
-
- if (name.startsWith("../")) return true; // no "l../etc/passwd"
- if (name.contains("/../")) return true; // no "foo/../etc/passwd"
- if (name.contains("/./")) return true; // "foo/./foo" is insane to ask
- if (name.contains("//")) return true; // windows UNC path can be "//..."
- if (name.contains("?")) return true; // common unix wildcard
- if (name.contains("%")) return true; // wildcard or string parameter
- if (name.contains("*")) return true; // wildcard
- if (name.contains(":")) return true; // Could be used for absolute paths in windows?
- if (name.contains("<")) return true; // redirect input
- if (name.contains(">")) return true; // redirect output
- if (name.contains("|")) return true; // pipe
- if (name.contains("$")) return true; // dollar sign
- if (name.contains("\r")) return true; // carriage return
-
- return false; // is a reasonable name
+ return name.length() == 0 // no empty paths
+ || name.charAt(name.length() -1) == '/' // no suffix
+ || name.indexOf('\\') >= 0 // no windows/dos style paths
+ || name.charAt(0) == '/' // no absolute paths
+ || new File(name).isAbsolute() // no absolute paths
+ || name.startsWith("../") // no "l../etc/passwd"
+ || name.contains("/../") // no "foo/../etc/passwd"
+ || name.contains("/./") // "foo/./foo" is insane to ask
+ || name.contains("//") // windows UNC path can be "//..."
+ || name.contains("?") // common unix wildcard
+ || name.contains("%") // wildcard or string parameter
+ || name.contains("*") // wildcard
+ || name.contains(":") // Could be used for absolute paths in windows?
+ || name.contains("<") // redirect input
+ || name.contains(">") // redirect output
+ || name.contains("|") // pipe
+ || name.contains("$") // dollar sign
+ || name.contains("\r"); // carriage return
}
@Override
@@ -397,51 +400,58 @@
// scanning the filesystem. Don't rely on the cached names collection.
namesUpdateLock.lock();
try {
- SortedSet<Project.NameKey> n = new TreeSet<>();
- scanProjects(basePath, "", n);
- names = Collections.unmodifiableSortedSet(n);
- return n;
+ ProjectVisitor visitor = new ProjectVisitor();
+ try {
+ Files.walkFileTree(basePath, EnumSet.of(FileVisitOption.FOLLOW_LINKS),
+ Integer.MAX_VALUE, visitor);
+ } catch (IOException e) {
+ log.error("Error walking repository tree " + basePath.toAbsolutePath(),
+ e);
+ }
+ return Collections.unmodifiableSortedSet(visitor.found);
} finally {
namesUpdateLock.unlock();
}
}
- private void scanProjects(final File dir, final String prefix,
- final SortedSet<Project.NameKey> names) {
- final File[] ls = dir.listFiles();
- if (ls == null) {
- return;
+ private class ProjectVisitor extends SimpleFileVisitor<Path> {
+ private final SortedSet<Project.NameKey> found = new TreeSet<>();
+
+ @Override
+ public FileVisitResult preVisitDirectory(Path dir,
+ BasicFileAttributes attrs) throws IOException {
+ if (!dir.equals(basePath) && isRepo(dir)) {
+ addProject(dir);
+ return FileVisitResult.SKIP_SUBTREE;
+ }
+ return FileVisitResult.CONTINUE;
}
- for (File f : ls) {
- String fileName = f.getName();
- if (fileName.equals(Constants.DOT_GIT)) {
- // Skip repositories named only `.git`
- } else if (FileKey.isGitRepository(f, FS.DETECTED)) {
- Project.NameKey nameKey = getProjectName(prefix, fileName);
- if (isUnreasonableName(nameKey)) {
- log.warn("Ignoring unreasonably named repository " + f.getAbsolutePath());
- } else {
- names.add(nameKey);
- }
+ private boolean isRepo(Path p) {
+ return !p.getFileName().toString().equals(Constants.DOT_GIT)
+ && FileKey.isGitRepository(p.toFile(), FS.DETECTED);
+ }
- } else if (f.isDirectory()) {
- scanProjects(f, prefix + f.getName() + "/", names);
+ private void addProject(Path p) {
+ Project.NameKey nameKey = getProjectName(p);
+ if (isUnreasonableName(nameKey)) {
+ log.warn(
+ "Ignoring unreasonably named repository " + p.toAbsolutePath());
+ } else {
+ found.add(nameKey);
}
}
- }
- private Project.NameKey getProjectName(final String prefix,
- final String fileName) {
- final String projectName;
- if (fileName.endsWith(Constants.DOT_GIT_EXT)) {
- int newLen = fileName.length() - Constants.DOT_GIT_EXT.length();
- projectName = prefix + fileName.substring(0, newLen);
-
- } else {
- projectName = prefix + fileName;
+ private Project.NameKey getProjectName(Path p) {
+ String projectName = basePath.relativize(p).toString();
+ if (File.separatorChar != '/') {
+ projectName = projectName.replace(File.separatorChar, '/');
+ }
+ if (projectName.endsWith(Constants.DOT_GIT_EXT)) {
+ int newLen = projectName.length() - Constants.DOT_GIT_EXT.length();
+ projectName = projectName.substring(0, newLen);
+ }
+ return new Project.NameKey(projectName);
}
-
- return new Project.NameKey(projectName);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
index 7d3e1b3..05e864b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
@@ -332,10 +332,10 @@
throw new MergeException("Cannot query the database", e);
} finally {
if (inserter != null) {
- inserter.release();
+ inserter.close();
}
if (rw != null) {
- rw.release();
+ rw.close();
}
if (repo != null) {
repo.close();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/NotesBranchUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/NotesBranchUtil.java
index f1b0a78..fb96a6b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/NotesBranchUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/NotesBranchUtil.java
@@ -153,8 +153,8 @@
}
updateRef(notesBranch);
} finally {
- revWalk.release();
- reader.release();
+ revWalk.close();
+ reader.close();
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
index cbf5701..96dcc9a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
@@ -1729,18 +1729,15 @@
throws OrmException, IOException {
Submit submit = submitProvider.get();
RevisionResource rsrc = new RevisionResource(changes.parse(changeCtl), ps);
- Change c;
+ List<Change> changes;
try {
// Force submit even if submit rule evaluation fails.
- c = submit.submit(rsrc, currentUser, true);
+ changes = submit.submit(rsrc, currentUser, true);
} catch (ResourceConflictException e) {
throw new IOException(e);
}
- if (c == null) {
- addError("Submitting change " + changeCtl.getChange().getChangeId()
- + " failed.");
- } else {
- addMessage("");
+ addMessage("");
+ for (Change c : changes) {
mergeQueue.merge(c.getDest());
c = db.changes().get(c.getId());
switch (c.getStatus()) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsAdvertiseRefsHook.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsAdvertiseRefsHook.java
index 7095552..b2d3632 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsAdvertiseRefsHook.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsAdvertiseRefsHook.java
@@ -154,9 +154,10 @@
RevCommit c;
try {
while ((c = rw.next()) != null && toInclude.size() < max) {
- if (alreadySending.contains(c)) {
- } else if (toInclude.contains(c)) {
- } else if (c.getParentCount() > 1) {
+ if (alreadySending.contains(c)
+ || toInclude.contains(c)
+ || c.getParentCount() > 1) {
+ // Do nothing
} else if (toInclude.size() < base) {
toInclude.add(c);
} else {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
index 0e5d9fb..3cf9fed 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
@@ -382,7 +382,7 @@
+ subscriber.get(), e);
} finally {
if (recRw != null) {
- recRw.release();
+ recRw.close();
}
if (pdb != null) {
pdb.close();
@@ -392,8 +392,7 @@
private static DirCache readTree(final Repository pdb, final Ref branch)
throws MissingObjectException, IncorrectObjectTypeException, IOException {
- final RevWalk rw = new RevWalk(pdb);
- try {
+ try (RevWalk rw = new RevWalk(pdb)) {
final DirCache dc = DirCache.newInCore();
final DirCacheBuilder b = dc.builder();
b.addTree(new byte[0], // no prefix path
@@ -401,8 +400,6 @@
pdb.newObjectReader(), rw.parseTree(branch.getObjectId()));
b.finish();
return dc;
- } finally {
- rw.release();
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSet.java
index 799e220..a003235 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSet.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSet.java
@@ -147,7 +147,7 @@
}
} finally {
if (rw != null) {
- rw.release();
+ rw.close();
}
}
}
@@ -157,9 +157,8 @@
return;
}
- TagWalk rw = new TagWalk(git);
- rw.setRetainBody(false);
- try {
+ try (TagWalk rw = new TagWalk(git)) {
+ rw.setRetainBody(false);
for (Ref ref : git.getRefDatabase().getRefs(RefDatabase.ALL).values()) {
if (skip(ref)) {
continue;
@@ -188,8 +187,6 @@
}
} catch (IOException e) {
log.warn("Error building tags for repository " + projectName, e);
- } finally {
- rw.release();
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/VersionedMetaData.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/VersionedMetaData.java
index 8dab448..b905f67 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/VersionedMetaData.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/VersionedMetaData.java
@@ -122,7 +122,7 @@
revision = id != null ? new RevWalk(reader).parseCommit(id) : null;
onLoad();
} finally {
- reader.release();
+ reader.close();
reader = null;
}
}
@@ -319,13 +319,14 @@
public void close() {
newTree = null;
+ rw.close();
if (inserter != null) {
- inserter.release();
+ inserter.close();
inserter = null;
}
if (reader != null) {
- reader.release();
+ reader.close();
reader = null;
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidators.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidators.java
index d030a55..d8c3303 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidators.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidators.java
@@ -222,7 +222,7 @@
sb.append("ERROR: ").append(errMsg);
if (c.getFullMessage().indexOf(changeId) >= 0) {
- String lines[] = c.getFullMessage().trim().split("\n");
+ String[] lines = c.getFullMessage().trim().split("\n");
String lastLine = lines.length > 0 ? lines[lines.length - 1] : "";
if (lastLine.indexOf(changeId) == -1) {
@@ -387,7 +387,9 @@
final ProjectControl projectControl = refControl.getProjectControl();
if (projectControl.getProjectState().isUseSignedOffBy()) {
- boolean sboAuthor = false, sboCommitter = false, sboMe = false;
+ boolean sboAuthor = false;
+ boolean sboCommitter = false;
+ boolean sboMe = false;
for (final FooterLine footer : receiveEvent.commit.getFooterLines()) {
if (footer.matches(FooterKey.SIGNED_OFF_BY)) {
final String e = footer.getEmailAddress();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/SiteIndexer.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/SiteIndexer.java
index a0c27c4..c0522d5 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/SiteIndexer.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/SiteIndexer.java
@@ -323,41 +323,36 @@
getPathsAndIndex(id);
}
} finally {
- walk.release();
+ walk.close();
}
return null;
}
private void getPathsAndIndex(ObjectId b) throws Exception {
List<ChangeData> cds = Lists.newArrayList(byId.get(b));
- try {
+ try (DiffFormatter df = new DiffFormatter(DisabledOutputStream.INSTANCE)) {
RevCommit bCommit = walk.parseCommit(b);
RevTree bTree = bCommit.getTree();
RevTree aTree = aFor(bCommit, walk);
- DiffFormatter df = new DiffFormatter(DisabledOutputStream.INSTANCE);
- try {
- df.setRepository(repo);
- if (!cds.isEmpty()) {
- List<String> paths = (aTree != null)
- ? getPaths(df.scan(aTree, bTree))
- : Collections.<String>emptyList();
- Iterator<ChangeData> cdit = cds.iterator();
- for (ChangeData cd ; cdit.hasNext(); cdit.remove()) {
- cd = cdit.next();
- try {
- cd.setCurrentFilePaths(paths);
- indexer.index(cd);
- done.update(1);
- if (verboseWriter != null) {
- verboseWriter.println("Reindexed change " + cd.getId());
- }
- } catch (Exception e) {
- fail("Failed to index change " + cd.getId(), true, e);
+ df.setRepository(repo);
+ if (!cds.isEmpty()) {
+ List<String> paths = (aTree != null)
+ ? getPaths(df.scan(aTree, bTree))
+ : Collections.<String>emptyList();
+ Iterator<ChangeData> cdit = cds.iterator();
+ for (ChangeData cd ; cdit.hasNext(); cdit.remove()) {
+ cd = cdit.next();
+ try {
+ cd.setCurrentFilePaths(paths);
+ indexer.index(cd);
+ done.update(1);
+ if (verboseWriter != null) {
+ verboseWriter.println("Reindexed change " + cd.getId());
}
+ } catch (Exception e) {
+ fail("Failed to index change " + cd.getId(), true, e);
}
}
- } finally {
- df.release();
}
} catch (Exception e) {
fail("Failed to index commit " + b.name(), false, e);
@@ -396,13 +391,10 @@
}
private ObjectId emptyTree() throws IOException {
- ObjectInserter oi = repo.newObjectInserter();
- try {
+ try (ObjectInserter oi = repo.newObjectInserter()) {
ObjectId id = oi.insert(Constants.OBJ_TREE, new byte[] {});
oi.flush();
return id;
- } finally {
- oi.release();
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/ChangeEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/ChangeEmail.java
index 405b3a8..5642ec1 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/ChangeEmail.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/ChangeEmail.java
@@ -379,6 +379,8 @@
return args.settings.includeDiff;
}
+ private static int HEAP_EST_SIZE = 32 * 1024;
+
/** Show patch set as unified difference. */
public String getUnifiedDiff() {
PatchList patchList;
@@ -394,30 +396,31 @@
return "";
}
+ int maxSize = args.settings.maximumDiffSize;
TemporaryBuffer.Heap buf =
- new TemporaryBuffer.Heap(args.settings.maximumDiffSize);
- DiffFormatter fmt = new DiffFormatter(buf);
- Repository git;
- try {
- git = args.server.openRepository(change.getProject());
- } catch (IOException e) {
- log.error("Cannot open repository to format patch", e);
- return "";
- }
- try {
- fmt.setRepository(git);
- fmt.setDetectRenames(true);
- fmt.format(patchList.getOldId(), patchList.getNewId());
- return RawParseUtils.decode(buf.toByteArray());
- } catch (IOException e) {
- if (JGitText.get().inMemoryBufferLimitExceeded.equals(e.getMessage())) {
+ new TemporaryBuffer.Heap(Math.min(HEAP_EST_SIZE, maxSize), maxSize);
+ try (DiffFormatter fmt = new DiffFormatter(buf)) {
+ Repository git;
+ try {
+ git = args.server.openRepository(change.getProject());
+ } catch (IOException e) {
+ log.error("Cannot open repository to format patch", e);
return "";
}
- log.error("Cannot format patch", e);
- return "";
- } finally {
- fmt.release();
- git.close();
+ try {
+ fmt.setRepository(git);
+ fmt.setDetectRenames(true);
+ fmt.format(patchList.getOldId(), patchList.getNewId());
+ return RawParseUtils.decode(buf.toByteArray());
+ } catch (IOException e) {
+ if (JGitText.get().inMemoryBufferLimitExceeded.equals(e.getMessage())) {
+ return "";
+ }
+ log.error("Cannot format patch", e);
+ return "";
+ } finally {
+ git.close();
+ }
}
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/PatchSetNotificationSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/PatchSetNotificationSender.java
index 667d834..53efa1e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/PatchSetNotificationSender.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/PatchSetNotificationSender.java
@@ -82,15 +82,11 @@
final Change updatedChange, final PatchSet updatedPatchSet,
final LabelTypes labelTypes)
throws OrmException, IOException {
- final Repository git = repoManager.openRepository(updatedChange.getProject());
- try {
- final RevWalk revWalk = new RevWalk(git);
+ try (Repository git = repoManager.openRepository(updatedChange.getProject())) {
final RevCommit commit;
- try {
+ try (RevWalk revWalk = new RevWalk(git)) {
commit = revWalk.parseCommit(ObjectId.fromString(
updatedPatchSet.getRevision().get()));
- } finally {
- revWalk.release();
}
final PatchSetInfo info = patchSetInfoFactory.get(commit, updatedPatchSet.getId());
final List<FooterLine> footerLines = commit.getFooterLines();
@@ -134,8 +130,6 @@
log.error("Cannot send email for new patch set " + updatedPatchSet.getId(), e);
}
}
- } finally {
- git.close();
}
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/VelocityRuntimeProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/VelocityRuntimeProvider.java
index ace1f5b..101aaac 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/VelocityRuntimeProvider.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/VelocityRuntimeProvider.java
@@ -26,6 +26,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.nio.file.Files;
import java.util.Properties;
/** Configures Velocity template engine for sending email. */
@@ -49,10 +50,11 @@
p.setProperty(RuntimeConstants.RUNTIME_REFERENCES_STRICT, "true");
p.setProperty("runtime.log.logsystem.log4j.category", "velocity");
- if (site.mail_dir.isDirectory()) {
+ if (Files.isDirectory(site.mail_dir)) {
p.setProperty(rl, "file, class");
p.setProperty("file." + rl + ".class", pkg + ".FileResourceLoader");
- p.setProperty("file." + rl + ".path", site.mail_dir.getAbsolutePath());
+ p.setProperty("file." + rl + ".path",
+ site.mail_dir.toAbsolutePath().toString());
p.setProperty("class." + rl + ".class", pkg + ".ClasspathResourceLoader");
} else {
p.setProperty(rl, "class");
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java
index e97111d..6d4f3a4 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java
@@ -272,9 +272,9 @@
loadDefaults();
return;
}
- RevWalk walk = new RevWalk(reader);
- try (ChangeNotesParser parser =
- new ChangeNotesParser(change, rev, walk, repoManager)) {
+ try (RevWalk walk = new RevWalk(reader);
+ ChangeNotesParser parser =
+ new ChangeNotesParser(change, rev, walk, repoManager)) {
parser.parseAll();
if (parser.status != null) {
@@ -301,8 +301,6 @@
this.allPastReviewers = ImmutableList.copyOf(parser.allPastReviewers);
submitRecords = ImmutableList.copyOf(parser.submitRecords);
- } finally {
- walk.release();
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeRebuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeRebuilder.java
index 1053f09..76dfdc8 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeRebuilder.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeRebuilder.java
@@ -200,12 +200,9 @@
private void writeToBatch(BatchMetaDataUpdate batch,
AbstractChangeUpdate update, Repository repo) throws IOException,
OrmException {
- ObjectInserter inserter = repo.newObjectInserter();
- try {
+ try (ObjectInserter inserter = repo.newObjectInserter()) {
update.setInserter(inserter);
update.writeCommit(batch);
- } finally {
- inserter.release();
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/DraftCommentNotes.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/DraftCommentNotes.java
index d40358b..20d6c4a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/DraftCommentNotes.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/DraftCommentNotes.java
@@ -132,16 +132,14 @@
return;
}
- RevWalk walk = new RevWalk(reader);
- try (DraftCommentNotesParser parser = new DraftCommentNotesParser(
- getChangeId(), walk, rev, repoManager, draftsProject, author)) {
+ try (RevWalk walk = new RevWalk(reader);
+ DraftCommentNotesParser parser = new DraftCommentNotesParser(
+ getChangeId(), walk, rev, repoManager, draftsProject, author)) {
parser.parseDraftComments();
buildCommentTable(draftBaseComments, parser.draftBaseComments);
buildCommentTable(draftPsComments, parser.draftPsComments);
noteMap = parser.noteMap;
- } finally {
- walk.release();
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchFile.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchFile.java
index 2e63a76..8740a6b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchFile.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchFile.java
@@ -48,9 +48,8 @@
this.repo = repo;
this.entry = patchList.get(fileName);
- final ObjectReader reader = repo.newObjectReader();
- try {
- final RevWalk rw = new RevWalk(reader);
+ try (ObjectReader reader = repo.newObjectReader();
+ RevWalk rw = new RevWalk(reader)) {
final RevCommit bCommit = rw.parseCommit(patchList.getNewId());
if (Patch.COMMIT_MSG.equals(fileName)) {
@@ -74,8 +73,6 @@
}
bTree = bCommit.getTree();
}
- } finally {
- reader.release();
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java
index 0c8c5ec..bfb8c00 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java
@@ -116,9 +116,9 @@
private PatchList readPatchList(final PatchListKey key, final Repository repo)
throws IOException, PatchListNotAvailableException {
final RawTextComparator cmp = comparatorFor(key.getWhitespace());
- final ObjectReader reader = repo.newObjectReader();
- try {
- final RevWalk rw = new RevWalk(reader);
+ try (ObjectReader reader = repo.newObjectReader();
+ RevWalk rw = new RevWalk(reader);
+ DiffFormatter df = new DiffFormatter(DisabledOutputStream.INSTANCE)) {
final RevCommit b = rw.parseCommit(key.getNewId());
final RevObject a = aFor(key, repo, rw, b);
@@ -138,7 +138,6 @@
RevTree aTree = rw.parseTree(a);
RevTree bTree = b.getTree();
- DiffFormatter df = new DiffFormatter(DisabledOutputStream.INSTANCE);
df.setRepository(repo);
df.setDiffComparator(cmp);
df.setDetectRenames(true);
@@ -170,8 +169,6 @@
}
return new PatchList(a, b, againstParent,
entries.toArray(new PatchListEntry[entries.size()]));
- } finally {
- reader.release();
}
}
@@ -271,8 +268,7 @@
}
ResolveMerger m = (ResolveMerger) mergeStrategy.newMerger(repo, true);
- final ObjectInserter ins = repo.newObjectInserter();
- try {
+ try (ObjectInserter ins = repo.newObjectInserter()) {
DirCache dc = DirCache.newInCore();
m.setDirCache(dc);
m.setObjectInserter(new ObjectInserter.Filter() {
@@ -397,19 +393,14 @@
}
return rw.lookupTree(treeId);
- } finally {
- ins.release();
}
}
private static ObjectId emptyTree(final Repository repo) throws IOException {
- ObjectInserter oi = repo.newObjectInserter();
- try {
+ try (ObjectInserter oi = repo.newObjectInserter()) {
ObjectId id = oi.insert(Constants.OBJ_TREE, new byte[] {});
oi.flush();
return id;
- } finally {
- oi.release();
}
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java
index d231664..edbd9eb 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java
@@ -119,7 +119,7 @@
try {
return build(content, comments, history);
} finally {
- reader.release();
+ reader.close();
}
}
@@ -177,7 +177,7 @@
boolean hugeFile = false;
if (a.mode == FileMode.GITLINK || b.mode == FileMode.GITLINK) {
-
+ // Do nothing
} else if (a.src == b.src && a.size() <= context
&& content.getEdits().isEmpty()) {
// Odd special case; the files are identical (100% rename or copy)
@@ -514,9 +514,10 @@
if (path == null || within == null) {
return null;
}
- final RevWalk rw = new RevWalk(reader);
- final RevTree tree = rw.parseTree(within);
- return TreeWalk.forPath(reader, path, tree);
+ try (RevWalk rw = new RevWalk(reader)) {
+ final RevTree tree = rw.parseTree(within);
+ return TreeWalk.forPath(reader, path, tree);
+ }
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoFactory.java
index 340300a..1e4ffce 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoFactory.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoFactory.java
@@ -85,17 +85,12 @@
} catch (IOException e) {
throw new PatchSetInfoNotAvailableException(e);
}
- try {
- final RevWalk rw = new RevWalk(repo);
- try {
- final RevCommit src =
- rw.parseCommit(ObjectId.fromString(patchSet.getRevision().get()));
- PatchSetInfo info = get(src, patchSet.getId());
- info.setParents(toParentInfos(src.getParents(), rw));
- return info;
- } finally {
- rw.release();
- }
+ try (RevWalk rw = new RevWalk(repo)) {
+ final RevCommit src =
+ rw.parseCommit(ObjectId.fromString(patchSet.getRevision().get()));
+ PatchSetInfo info = get(src, patchSet.getId());
+ info.setParents(toParentInfos(src.getParents(), rw));
+ return info;
} catch (IOException e) {
throw new PatchSetInfoNotAvailableException(e);
} finally {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/Text.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/Text.java
index 1939c84..882e25f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/Text.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/Text.java
@@ -44,44 +44,45 @@
public static final Text EMPTY = new Text(NO_BYTES);
public static Text forCommit(ObjectReader reader, AnyObjectId commitId) throws IOException {
- RevWalk rw = new RevWalk(reader);
- RevCommit c;
- if (commitId instanceof RevCommit) {
- c = (RevCommit) commitId;
- } else {
- c = rw.parseCommit(commitId);
- }
-
- StringBuilder b = new StringBuilder();
- switch (c.getParentCount()) {
- case 0:
- break;
- case 1: {
- RevCommit p = c.getParent(0);
- rw.parseBody(p);
- b.append("Parent: ");
- b.append(reader.abbreviate(p, 8).name());
- b.append(" (");
- b.append(p.getShortMessage());
- b.append(")\n");
- break;
+ try (RevWalk rw = new RevWalk(reader)) {
+ RevCommit c;
+ if (commitId instanceof RevCommit) {
+ c = (RevCommit) commitId;
+ } else {
+ c = rw.parseCommit(commitId);
}
- default:
- for (int i = 0; i < c.getParentCount(); i++) {
- RevCommit p = c.getParent(i);
+
+ StringBuilder b = new StringBuilder();
+ switch (c.getParentCount()) {
+ case 0:
+ break;
+ case 1: {
+ RevCommit p = c.getParent(0);
rw.parseBody(p);
- b.append(i == 0 ? "Merge Of: " : " ");
+ b.append("Parent: ");
b.append(reader.abbreviate(p, 8).name());
b.append(" (");
b.append(p.getShortMessage());
b.append(")\n");
+ break;
}
+ default:
+ for (int i = 0; i < c.getParentCount(); i++) {
+ RevCommit p = c.getParent(i);
+ rw.parseBody(p);
+ b.append(i == 0 ? "Merge Of: " : " ");
+ b.append(reader.abbreviate(p, 8).name());
+ b.append(" (");
+ b.append(p.getShortMessage());
+ b.append(")\n");
+ }
+ }
+ appendPersonIdent(b, "Author", c.getAuthorIdent());
+ appendPersonIdent(b, "Commit", c.getCommitterIdent());
+ b.append("\n");
+ b.append(c.getFullMessage());
+ return new Text(b.toString().getBytes("UTF-8"));
}
- appendPersonIdent(b, "Author", c.getAuthorIdent());
- appendPersonIdent(b, "Commit", c.getCommitterIdent());
- b.append("\n");
- b.append(c.getFullMessage());
- return new Text(b.toString().getBytes("UTF-8"));
}
private static void appendPersonIdent(StringBuilder b, String field,
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/CleanupHandle.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/CleanupHandle.java
index 593f2c9..9827812 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/CleanupHandle.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/CleanupHandle.java
@@ -14,17 +14,17 @@
package com.google.gerrit.server.plugins;
-import java.io.File;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.jar.JarFile;
class CleanupHandle {
- private final File tmpFile;
+ private final Path tmp;
private final JarFile jarFile;
- CleanupHandle(File tmpFile,
- JarFile jarFile) {
- this.tmpFile = tmpFile;
+ CleanupHandle(Path tmp, JarFile jarFile) {
+ this.tmp = tmp;
this.jarFile = jarFile;
}
@@ -34,12 +34,13 @@
} catch (IOException err) {
PluginLoader.log.error("Cannot close " + jarFile.getName(), err);
}
- if (!tmpFile.delete() && tmpFile.exists()) {
- PluginLoader.log.warn("Cannot delete " + tmpFile.getAbsolutePath()
- + ", retrying to delete it on termination of the virtual machine");
- tmpFile.deleteOnExit();
- } else {
- PluginLoader.log.info("Cleaned plugin " + tmpFile.getName());
+ try {
+ Files.deleteIfExists(tmp);
+ PluginLoader.log.info("Cleaned plugin " + tmp.getFileName());
+ } catch (IOException e) {
+ PluginLoader.log.warn("Cannot delete " + tmp.toAbsolutePath()
+ + ", retrying to delete it on termination of the virtual machine", e);
+ tmp.toFile().deleteOnExit();
}
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/CopyConfigModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/CopyConfigModule.java
index 7252617..1d4233a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/CopyConfigModule.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/CopyConfigModule.java
@@ -33,7 +33,7 @@
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.PersonIdent;
-import java.io.File;
+import java.nio.file.Path;
/**
* Copies critical objects from the {@code dbInjector} into a plugin.
@@ -47,11 +47,11 @@
class CopyConfigModule extends AbstractModule {
@Inject
@SitePath
- private File sitePath;
+ private Path sitePath;
@Provides
@SitePath
- File getSitePath() {
+ Path getSitePath() {
return sitePath;
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarPluginProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarPluginProvider.java
index 53f39f1..dcfb52c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarPluginProvider.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarPluginProvider.java
@@ -24,13 +24,14 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
-import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
@@ -43,7 +44,7 @@
static final String JAR_EXTENSION = ".jar";
static final Logger log = LoggerFactory.getLogger(JarPluginProvider.class);
- private final File tmpDir;
+ private final Path tmpDir;
@Inject
JarPluginProvider(SitePaths sitePaths) {
@@ -51,42 +52,42 @@
}
@Override
- public boolean handles(File srcFile) {
- String fileName = srcFile.getName();
+ public boolean handles(Path srcPath) {
+ String fileName = srcPath.getFileName().toString();
return fileName.endsWith(JAR_EXTENSION)
|| fileName.endsWith(JAR_EXTENSION + ".disabled");
}
@Override
- public String getPluginName(File srcFile) {
+ public String getPluginName(Path srcPath) {
try {
- return MoreObjects.firstNonNull(getJarPluginName(srcFile),
- PluginLoader.nameOf(srcFile));
+ return MoreObjects.firstNonNull(getJarPluginName(srcPath),
+ PluginLoader.nameOf(srcPath));
} catch (IOException e) {
- throw new IllegalArgumentException("Invalid plugin file " + srcFile
+ throw new IllegalArgumentException("Invalid plugin file " + srcPath
+ ": cannot get plugin name", e);
}
}
- public static String getJarPluginName(File srcFile) throws IOException {
- try (JarFile jarFile = new JarFile(srcFile)) {
+ public static String getJarPluginName(Path srcPath) throws IOException {
+ try (JarFile jarFile = new JarFile(srcPath.toFile())) {
return jarFile.getManifest().getMainAttributes()
.getValue("Gerrit-PluginName");
}
}
@Override
- public ServerPlugin get(File srcFile, FileSnapshot snapshot,
+ public ServerPlugin get(Path srcPath, FileSnapshot snapshot,
PluginDescription description) throws InvalidPluginException {
try {
- String name = getPluginName(srcFile);
- String extension = getExtension(srcFile);
- try (FileInputStream in = new FileInputStream(srcFile)) {
- File tmp = asTemp(in, tempNameFor(name), extension, tmpDir);
- return loadJarPlugin(name, srcFile, snapshot, tmp, description);
+ String name = getPluginName(srcPath);
+ String extension = getExtension(srcPath);
+ try (InputStream in = Files.newInputStream(srcPath)) {
+ Path tmp = asTemp(in, tempNameFor(name), extension, tmpDir);
+ return loadJarPlugin(name, srcPath, snapshot, tmp, description);
}
} catch (IOException e) {
- throw new InvalidPluginException("Cannot load Jar plugin " + srcFile, e);
+ throw new InvalidPluginException("Cannot load Jar plugin " + srcPath, e);
}
}
@@ -95,8 +96,8 @@
return "gerrit";
}
- private static String getExtension(File file) {
- return getExtension(file.getName());
+ private static String getExtension(Path path) {
+ return getExtension(path.getFileName().toString());
}
private static String getExtension(String name) {
@@ -109,18 +110,18 @@
return PLUGIN_TMP_PREFIX + name + "_" + fmt.format(new Date()) + "_";
}
- public static File storeInTemp(String pluginName, InputStream in,
+ public static Path storeInTemp(String pluginName, InputStream in,
SitePaths sitePaths) throws IOException {
- if (!sitePaths.tmp_dir.exists()) {
- sitePaths.tmp_dir.mkdirs();
+ if (!Files.exists(sitePaths.tmp_dir)) {
+ Files.createDirectories(sitePaths.tmp_dir);
}
return asTemp(in, tempNameFor(pluginName), ".jar", sitePaths.tmp_dir);
}
- private ServerPlugin loadJarPlugin(String name, File srcJar,
- FileSnapshot snapshot, File tmp, PluginDescription description)
+ private ServerPlugin loadJarPlugin(String name, Path srcJar,
+ FileSnapshot snapshot, Path tmp, PluginDescription description)
throws IOException, InvalidPluginException, MalformedURLException {
- JarFile jarFile = new JarFile(tmp);
+ JarFile jarFile = new JarFile(tmp.toFile());
boolean keep = false;
try {
Manifest manifest = jarFile.getManifest();
@@ -129,24 +130,22 @@
List<URL> urls = new ArrayList<>(2);
String overlay = System.getProperty("gerrit.plugin-classes");
if (overlay != null) {
- File classes = new File(new File(new File(overlay), name), "main");
- if (classes.isDirectory()) {
- log.info(String.format("plugin %s: including %s", name,
- classes.getPath()));
- urls.add(classes.toURI().toURL());
+ Path classes = Paths.get(overlay).resolve(name).resolve("main");
+ if (Files.isDirectory(classes)) {
+ log.info(String.format("plugin %s: including %s", name, classes));
+ urls.add(classes.toUri().toURL());
}
}
- urls.add(tmp.toURI().toURL());
+ urls.add(tmp.toUri().toURL());
ClassLoader pluginLoader =
new URLClassLoader(urls.toArray(new URL[urls.size()]),
PluginLoader.parentFor(type));
JarScanner jarScanner = createJarScanner(srcJar);
- ServerPlugin plugin =
- new ServerPlugin(name, description.canonicalUrl, description.user,
- srcJar, snapshot, jarScanner, description.dataDir,
- pluginLoader);
+ ServerPlugin plugin = new ServerPlugin(name, description.canonicalUrl,
+ description.user, srcJar, snapshot, jarScanner,
+ description.dataDir, pluginLoader);
plugin.setCleanupHandle(new CleanupHandle(tmp, jarFile));
keep = true;
return plugin;
@@ -157,7 +156,7 @@
}
}
- private JarScanner createJarScanner(File srcJar)
+ private JarScanner createJarScanner(Path srcJar)
throws InvalidPluginException {
try {
return new JarScanner(srcJar);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java
index a8600fe..0f4aa6c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java
@@ -39,10 +39,10 @@
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
-import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -69,8 +69,8 @@
private final JarFile jarFile;
- public JarScanner(File srcFile) throws IOException {
- this.jarFile = new JarFile(srcFile);
+ public JarScanner(Path src) throws IOException {
+ this.jarFile = new JarFile(src.toFile());
}
@Override
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JsPlugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JsPlugin.java
index 63f69b5..8da8cc1 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JsPlugin.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JsPlugin.java
@@ -27,12 +27,12 @@
import org.eclipse.jgit.internal.storage.file.FileSnapshot;
-import java.io.File;
+import java.nio.file.Path;
class JsPlugin extends Plugin {
private Injector httpInjector;
- JsPlugin(String name, File srcFile, PluginUser pluginUser,
+ JsPlugin(String name, Path srcFile, PluginUser pluginUser,
FileSnapshot snapshot) {
super(name, srcFile, pluginUser, snapshot, ApiType.JS);
}
@@ -40,7 +40,7 @@
@Override
@Nullable
public String getVersion() {
- String fileName = getSrcFile().getName();
+ String fileName = getSrcFile().getFileName().toString();
int firstDash = fileName.indexOf("-");
if (firstDash > 0) {
return fileName.substring(firstDash + 1, fileName.lastIndexOf(".js"));
@@ -51,7 +51,7 @@
@Override
public void start(PluginGuiceEnvironment env) throws Exception {
manager = new LifecycleManager();
- String fileName = getSrcFile().getName();
+ String fileName = getSrcFile().getFileName().toString();
httpInjector =
Guice.createInjector(new StandaloneJsPluginModule(getName(), fileName));
manager.start();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ListPlugins.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ListPlugins.java
index 54f05f0..1d717ef 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ListPlugins.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ListPlugins.java
@@ -90,7 +90,7 @@
stdout.format("%-30s %-10s %-8s %s\n", p.getName(),
Strings.nullToEmpty(info.version),
p.isDisabled() ? "DISABLED" : "ENABLED",
- p.getSrcFile().getName());
+ p.getSrcFile().getFileName());
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/MultipleProvidersForPluginException.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/MultipleProvidersForPluginException.java
index 82a6ad9..cf38310 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/MultipleProvidersForPluginException.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/MultipleProvidersForPluginException.java
@@ -18,14 +18,14 @@
import com.google.common.base.Joiner;
import com.google.common.collect.Iterables;
-import java.io.File;
+import java.nio.file.Path;
class MultipleProvidersForPluginException extends IllegalArgumentException {
private static final long serialVersionUID = 1L;
- MultipleProvidersForPluginException(File pluginSrcFile,
+ MultipleProvidersForPluginException(Path pluginSrcPath,
Iterable<ServerPluginProvider> providersHandlers) {
- super(pluginSrcFile.getAbsolutePath()
+ super(pluginSrcPath.toAbsolutePath()
+ " is claimed to be handled by more than one plugin provider: "
+ providersListToString(providersHandlers));
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/Plugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/Plugin.java
index b227909..6b84c21 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/Plugin.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/Plugin.java
@@ -14,6 +14,8 @@
package com.google.gerrit.server.plugins;
+import static com.google.gerrit.common.FileUtil.lastModified;
+
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.gerrit.common.Nullable;
@@ -25,7 +27,7 @@
import org.eclipse.jgit.internal.storage.file.FileSnapshot;
-import java.io.File;
+import java.nio.file.Path;
import java.util.Collections;
import java.util.List;
import java.util.jar.Attributes;
@@ -67,7 +69,7 @@
}
private final String name;
- private final File srcFile;
+ private final Path srcFile;
private final ApiType apiType;
private final boolean disabled;
private final CacheKey cacheKey;
@@ -80,17 +82,17 @@
private List<ReloadableRegistrationHandle<?>> reloadableHandles;
public Plugin(String name,
- File srcFile,
+ Path srcPath,
PluginUser pluginUser,
FileSnapshot snapshot,
ApiType apiType) {
this.name = name;
- this.srcFile = srcFile;
+ this.srcFile = srcPath;
this.apiType = apiType;
this.snapshot = snapshot;
this.pluginUser = pluginUser;
this.cacheKey = new Plugin.CacheKey(name);
- this.disabled = srcFile.getName().endsWith(".disabled");
+ this.disabled = srcPath.getFileName().toString().endsWith(".disabled");
}
public CleanupHandle getCleanupHandle() {
@@ -105,7 +107,7 @@
return pluginUser;
}
- public File getSrcFile() {
+ public Path getSrcFile() {
return srcFile;
}
@@ -168,7 +170,7 @@
abstract boolean canReload();
- boolean isModified(File jar) {
- return snapshot.lastModified() != jar.lastModified();
+ boolean isModified(Path jar) {
+ return snapshot.lastModified() != lastModified(jar);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginContentScanner.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginContentScanner.java
index 0228509..1d9cd0e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginContentScanner.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginContentScanner.java
@@ -11,14 +11,15 @@
// 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.
+
package com.google.gerrit.server.plugins;
import com.google.common.base.Optional;
-import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
+import java.nio.file.NoSuchFileException;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Map;
@@ -57,7 +58,7 @@
@Override
public InputStream getInputStream(PluginEntry entry) throws IOException {
- throw new FileNotFoundException("Empty plugin");
+ throw new NoSuchFileException("Empty plugin");
}
@Override
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java
index b51359d..56233f0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java
@@ -18,6 +18,8 @@
import com.google.common.base.Joiner;
import com.google.common.base.MoreObjects;
import com.google.common.base.Predicate;
+import com.google.common.collect.ComparisonChain;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.Lists;
@@ -25,6 +27,7 @@
import com.google.common.collect.Multimap;
import com.google.common.collect.Queues;
import com.google.common.collect.Sets;
+import com.google.common.io.ByteStreams;
import com.google.gerrit.extensions.annotations.PluginName;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.extensions.systemstatus.ServerInformation;
@@ -45,14 +48,15 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
-import java.io.FileFilter;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.AbstractMap;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
@@ -71,13 +75,13 @@
static final String PLUGIN_TMP_PREFIX = "plugin_";
static final Logger log = LoggerFactory.getLogger(PluginLoader.class);
- public String getPluginName(File srcFile) {
- return MoreObjects.firstNonNull(getGerritPluginName(srcFile),
- nameOf(srcFile));
+ public String getPluginName(Path srcPath) {
+ return MoreObjects.firstNonNull(getGerritPluginName(srcPath),
+ nameOf(srcPath));
}
- private final File pluginsDir;
- private final File dataDir;
+ private final Path pluginsDir;
+ private final Path dataDir;
private final PluginGuiceEnvironment env;
private final ServerInformationImpl srvInfoImpl;
private final PluginUser.Factory pluginUserFactory;
@@ -158,7 +162,7 @@
checkRemoteInstall();
String fileName = originalName;
- File tmp = asTemp(in, ".next_" + fileName + "_", ".tmp", pluginsDir);
+ Path tmp = asTemp(in, ".next_" + fileName + "_", ".tmp", pluginsDir);
String name = MoreObjects.firstNonNull(getGerritPluginName(tmp),
nameOf(fileName));
if (!originalName.equals(name)) {
@@ -168,26 +172,26 @@
}
String fileExtension = getExtension(fileName);
- File dst = new File(pluginsDir, name + fileExtension);
+ Path dst = pluginsDir.resolve(name + fileExtension);
synchronized (this) {
Plugin active = running.get(name);
if (active != null) {
- fileName = active.getSrcFile().getName();
+ fileName = active.getSrcFile().getFileName().toString();
log.info(String.format("Replacing plugin %s", active.getName()));
- File old = new File(pluginsDir, ".last_" + fileName);
- old.delete();
- active.getSrcFile().renameTo(old);
+ Path old = pluginsDir.resolve(".last_" + fileName);
+ Files.deleteIfExists(old);
+ Files.move(active.getSrcFile(), old);
}
- new File(pluginsDir, fileName + ".disabled").delete();
- tmp.renameTo(dst);
+ Files.deleteIfExists(pluginsDir.resolve(fileName + ".disabled"));
+ Files.move(tmp, dst);
try {
Plugin plugin = runPlugin(name, dst, active);
if (active == null) {
log.info(String.format("Installed plugin %s", plugin.getName()));
}
} catch (PluginInstallException e) {
- dst.delete();
+ Files.deleteIfExists(dst);
throw e;
}
@@ -195,21 +199,17 @@
}
}
- static File asTemp(InputStream in, String prefix, String suffix, File dir)
+ static Path asTemp(InputStream in, String prefix, String suffix, Path dir)
throws IOException {
- File tmp = File.createTempFile(prefix, suffix, dir);
+ Path tmp = Files.createTempFile(dir, prefix, suffix);
boolean keep = false;
- try (FileOutputStream out = new FileOutputStream(tmp)) {
- byte[] data = new byte[8192];
- int n;
- while ((n = in.read(data)) > 0) {
- out.write(data, 0, n);
- }
+ try (OutputStream out = Files.newOutputStream(tmp)) {
+ ByteStreams.copy(in, out);
keep = true;
return tmp;
} finally {
if (!keep) {
- tmp.delete();
+ Files.delete(tmp);
}
}
}
@@ -240,12 +240,21 @@
}
log.info(String.format("Disabling plugin %s", active.getName()));
- File off = new File(active.getSrcFile() + ".disabled");
- active.getSrcFile().renameTo(off);
+ Path off = active.getSrcFile().resolveSibling(
+ active.getSrcFile().getFileName() + ".disabled");
+ try {
+ Files.move(active.getSrcFile(), off);
+ } catch (IOException e) {
+ log.error("Failed to disable plugin", e);
+ // In theory we could still unload the plugin even if the rename
+ // failed. However, it would be reloaded on the next server startup,
+ // which is probably not what the user expects.
+ continue;
+ }
unloadPlugin(active);
try {
- FileSnapshot snapshot = FileSnapshot.save(off);
+ FileSnapshot snapshot = FileSnapshot.save(off.toFile());
Plugin offPlugin = loadPlugin(name, off, snapshot);
disabled.put(name, offPlugin);
} catch (Throwable e) {
@@ -274,13 +283,17 @@
}
log.info(String.format("Enabling plugin %s", name));
- String n = off.getSrcFile().getName();
+ String n = off.getSrcFile().toFile().getName();
if (n.endsWith(".disabled")) {
n = n.substring(0, n.lastIndexOf('.'));
}
- File on = new File(pluginsDir, n);
- off.getSrcFile().renameTo(on);
-
+ Path on = pluginsDir.resolve(n);
+ try {
+ Files.move(off.getSrcFile(), on);
+ } catch (IOException e) {
+ log.error("Failed to move plugin " + name + " into place", e);
+ continue;
+ }
disabled.remove(name);
runPlugin(name, on, null);
}
@@ -290,7 +303,7 @@
@Override
public synchronized void start() {
- log.info("Loading plugins from " + pluginsDir.getAbsolutePath());
+ log.info("Loading plugins from " + pluginsDir.toAbsolutePath());
srvInfoImpl.state = ServerInformation.State.STARTUP;
rescan();
srvInfoImpl.state = ServerInformation.State.RUNNING;
@@ -354,30 +367,30 @@
}
public synchronized void rescan() {
- Multimap<String, File> pluginsFiles = prunePlugins(pluginsDir);
+ Multimap<String, Path> pluginsFiles = prunePlugins(pluginsDir);
if (pluginsFiles.isEmpty()) {
return;
}
syncDisabledPlugins(pluginsFiles);
- Map<String, File> activePlugins = filterDisabled(pluginsFiles);
- for (Map.Entry<String, File> entry : jarsFirstSortedPluginsSet(activePlugins)) {
+ Map<String, Path> activePlugins = filterDisabled(pluginsFiles);
+ for (Map.Entry<String, Path> entry : jarsFirstSortedPluginsSet(activePlugins)) {
String name = entry.getKey();
- File file = entry.getValue();
- String fileName = file.getName();
- if (!isJsPlugin(fileName) && !serverPluginFactory.handles(file)) {
+ Path path = entry.getValue();
+ String fileName = path.getFileName().toString();
+ if (!isJsPlugin(fileName) && !serverPluginFactory.handles(path)) {
log.warn("No Plugin provider was found that handles this file format: {}", fileName);
continue;
}
FileSnapshot brokenTime = broken.get(name);
- if (brokenTime != null && !brokenTime.isModified(file)) {
+ if (brokenTime != null && !brokenTime.isModified(path.toFile())) {
continue;
}
Plugin active = running.get(name);
- if (active != null && !active.isModified(file)) {
+ if (active != null && !active.isModified(path)) {
continue;
}
@@ -387,7 +400,7 @@
}
try {
- Plugin loadedPlugin = runPlugin(name, file, active);
+ Plugin loadedPlugin = runPlugin(name, path, active);
if (active == null && !loadedPlugin.isDisabled()) {
log.info(String.format("Loaded plugin %s, version %s",
loadedPlugin.getName(), loadedPlugin.getVersion()));
@@ -400,31 +413,32 @@
cleanInBackground();
}
- private void addAllEntries(Map<String, File> from,
- TreeSet<Entry<String, File>> to) {
- Iterator<Entry<String, File>> it = from.entrySet().iterator();
+ private void addAllEntries(Map<String, Path> from,
+ TreeSet<Entry<String, Path>> to) {
+ Iterator<Entry<String, Path>> it = from.entrySet().iterator();
while (it.hasNext()) {
- Entry<String,File> entry = it.next();
+ Entry<String,Path> entry = it.next();
to.add(new AbstractMap.SimpleImmutableEntry<>(
entry.getKey(), entry.getValue()));
}
}
- private TreeSet<Entry<String, File>> jarsFirstSortedPluginsSet(
- Map<String, File> activePlugins) {
- TreeSet<Entry<String, File>> sortedPlugins =
- Sets.newTreeSet(new Comparator<Entry<String, File>>() {
+ private TreeSet<Entry<String, Path>> jarsFirstSortedPluginsSet(
+ Map<String, Path> activePlugins) {
+ TreeSet<Entry<String, Path>> sortedPlugins =
+ Sets.newTreeSet(new Comparator<Entry<String, Path>>() {
@Override
- public int compare(Entry<String, File> entry1,
- Entry<String, File> entry2) {
- String file1 = entry1.getValue().getName();
- String file2 = entry2.getValue().getName();
- int cmp = file1.compareTo(file2);
- if (file1.endsWith(".jar")) {
- return (file2.endsWith(".jar") ? cmp : -1);
- } else {
- return (file2.endsWith(".jar") ? +1 : cmp);
- }
+ public int compare(Entry<String, Path> e1, Entry<String, Path> e2) {
+ Path n1 = e1.getValue().getFileName();
+ Path n2 = e2.getValue().getFileName();
+ return ComparisonChain.start()
+ .compareTrueFirst(isJar(n1), isJar(n2))
+ .compare(n1, n2)
+ .result();
+ }
+
+ private boolean isJar(Path n1) {
+ return n1.toString().endsWith(".jar");
}
});
@@ -432,14 +446,14 @@
return sortedPlugins;
}
- private void syncDisabledPlugins(Multimap<String, File> jars) {
+ private void syncDisabledPlugins(Multimap<String, Path> jars) {
stopRemovedPlugins(jars);
dropRemovedDisabledPlugins(jars);
}
- private Plugin runPlugin(String name, File plugin, Plugin oldPlugin)
+ private Plugin runPlugin(String name, Path plugin, Plugin oldPlugin)
throws PluginInstallException {
- FileSnapshot snapshot = FileSnapshot.save(plugin);
+ FileSnapshot snapshot = FileSnapshot.save(plugin.toFile());
try {
Plugin newPlugin = loadPlugin(name, plugin, snapshot);
if (newPlugin.getCleanupHandle() != null) {
@@ -479,11 +493,11 @@
}
}
- private void stopRemovedPlugins(Multimap<String, File> jars) {
+ private void stopRemovedPlugins(Multimap<String, Path> jars) {
Set<String> unload = Sets.newHashSet(running.keySet());
- for (Map.Entry<String, Collection<File>> entry : jars.asMap().entrySet()) {
- for (File file : entry.getValue()) {
- if (!file.getName().endsWith(".disabled")) {
+ for (Map.Entry<String, Collection<Path>> entry : jars.asMap().entrySet()) {
+ for (Path path : entry.getValue()) {
+ if (!path.getFileName().toString().endsWith(".disabled")) {
unload.remove(entry.getKey());
}
}
@@ -493,11 +507,11 @@
}
}
- private void dropRemovedDisabledPlugins(Multimap<String, File> jars) {
+ private void dropRemovedDisabledPlugins(Multimap<String, Path> jars) {
Set<String> unload = Sets.newHashSet(disabled.keySet());
- for (Map.Entry<String, Collection<File>> entry : jars.asMap().entrySet()) {
- for (File file : entry.getValue()) {
- if (file.getName().endsWith(".disabled")) {
+ for (Map.Entry<String, Collection<Path>> entry : jars.asMap().entrySet()) {
+ for (Path path : entry.getValue()) {
+ if (path.getFileName().toString().endsWith(".disabled")) {
unload.remove(entry.getKey());
}
}
@@ -528,8 +542,8 @@
}
}
- public static String nameOf(File plugin) {
- return nameOf(plugin.getName());
+ public static String nameOf(Path plugin) {
+ return nameOf(plugin.getFileName().toString());
}
private static String nameOf(String name) {
@@ -545,21 +559,21 @@
return 0 < ext ? name.substring(ext) : "";
}
- private Plugin loadPlugin(String name, File srcPlugin, FileSnapshot snapshot)
+ private Plugin loadPlugin(String name, Path srcPlugin, FileSnapshot snapshot)
throws InvalidPluginException {
- String pluginName = srcPlugin.getName();
+ String pluginName = srcPlugin.getFileName().toString();
if (isJsPlugin(pluginName)) {
return loadJsPlugin(name, srcPlugin, snapshot);
} else if (serverPluginFactory.handles(srcPlugin)) {
return loadServerPlugin(srcPlugin, snapshot);
} else {
throw new InvalidPluginException(String.format(
- "Unsupported plugin type: %s", srcPlugin.getName()));
+ "Unsupported plugin type: %s", srcPlugin.getFileName()));
}
}
- private File getPluginDataDir(String name) {
- return new File(dataDir, name);
+ private Path getPluginDataDir(String name) {
+ return dataDir.resolve(name);
}
private String getPluginCanonicalWebUrl(String name) {
@@ -569,11 +583,11 @@
return url;
}
- private Plugin loadJsPlugin(String name, File srcJar, FileSnapshot snapshot) {
+ private Plugin loadJsPlugin(String name, Path srcJar, FileSnapshot snapshot) {
return new JsPlugin(name, srcJar, pluginUserFactory.create(name), snapshot);
}
- private ServerPlugin loadServerPlugin(File scriptFile,
+ private ServerPlugin loadServerPlugin(Path scriptFile,
FileSnapshot snapshot) throws InvalidPluginException {
String name = serverPluginFactory.getPluginName(scriptFile);
return serverPluginFactory.get(scriptFile, snapshot, new PluginDescription(
@@ -597,15 +611,15 @@
// Only one active plugin per plugin name can exist for each plugin name.
// Filter out disabled plugins and transform the multimap to a map
- private static Map<String, File> filterDisabled(
- Multimap<String, File> pluginFiles) {
- Map<String, File> activePlugins = Maps.newHashMapWithExpectedSize(
- pluginFiles.keys().size());
- for (String name : pluginFiles.keys()) {
- for (File pluginFile : pluginFiles.asMap().get(name)) {
- if (!pluginFile.getName().endsWith(".disabled")) {
+ private static Map<String, Path> filterDisabled(
+ Multimap<String, Path> pluginPaths) {
+ Map<String, Path> activePlugins = Maps.newHashMapWithExpectedSize(
+ pluginPaths.keys().size());
+ for (String name : pluginPaths.keys()) {
+ for (Path pluginPath : pluginPaths.asMap().get(name)) {
+ if (!pluginPath.getFileName().toString().endsWith(".disabled")) {
assert(!activePlugins.containsKey(name));
- activePlugins.put(name, pluginFile);
+ activePlugins.put(name, pluginPath);
}
}
}
@@ -621,37 +635,40 @@
//
// NOTE: Bear in mind that the plugin name can be reassigned after load by the
// Server plugin provider.
- public Multimap<String, File> prunePlugins(File pluginsDir) {
- List<File> pluginFiles = scanFilesInPluginsDirectory(pluginsDir);
- Multimap<String, File> map;
- map = asMultimap(pluginFiles);
+ public Multimap<String, Path> prunePlugins(Path pluginsDir) {
+ List<Path> pluginPaths = scanPathsInPluginsDirectory(pluginsDir);
+ Multimap<String, Path> map;
+ map = asMultimap(pluginPaths);
for (String plugin : map.keySet()) {
- Collection<File> files = map.asMap().get(plugin);
+ Collection<Path> files = map.asMap().get(plugin);
if (files.size() == 1) {
continue;
}
// retrieve enabled plugins
- Iterable<File> enabled = filterDisabledPlugins(
- files);
+ Iterable<Path> enabled = filterDisabledPlugins(files);
// If we have only one (the winner) plugin, nothing to do
if (!Iterables.skip(enabled, 1).iterator().hasNext()) {
continue;
}
- File winner = Iterables.getFirst(enabled, null);
+ Path winner = Iterables.getFirst(enabled, null);
assert(winner != null);
// Disable all loser plugins by renaming their file names to
// "file.disabled" and replace the disabled files in the multimap.
- Collection<File> elementsToRemove = Lists.newArrayList();
- Collection<File> elementsToAdd = Lists.newArrayList();
- for (File loser : Iterables.skip(enabled, 1)) {
+ Collection<Path> elementsToRemove = Lists.newArrayList();
+ Collection<Path> elementsToAdd = Lists.newArrayList();
+ for (Path loser : Iterables.skip(enabled, 1)) {
log.warn(String.format("Plugin <%s> was disabled, because"
+ " another plugin <%s>"
+ " with the same name <%s> already exists",
loser, winner, plugin));
- File disabledPlugin = new File(loser + ".disabled");
+ Path disabledPlugin = Paths.get(loser + ".disabled");
elementsToAdd.add(disabledPlugin);
elementsToRemove.add(loser);
- loser.renameTo(disabledPlugin);
+ try {
+ Files.move(loser, disabledPlugin);
+ } catch (IOException e) {
+ log.warn("Failed to fully disable plugin " + loser, e);
+ }
}
Iterables.removeAll(files, elementsToRemove);
Iterables.addAll(files, elementsToAdd);
@@ -659,50 +676,52 @@
return map;
}
- private List<File> scanFilesInPluginsDirectory(File pluginsDir) {
- if (pluginsDir == null || !pluginsDir.exists()) {
+ private List<Path> scanPathsInPluginsDirectory(Path pluginsDir) {
+ if (pluginsDir == null || !Files.exists(pluginsDir)) {
return Collections.emptyList();
}
- File[] matches = pluginsDir.listFiles(new FileFilter() {
+ DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
@Override
- public boolean accept(File pathname) {
- String n = pathname.getName();
+ public boolean accept(Path entry) throws IOException {
+ String n = entry.getFileName().toString();
return !n.startsWith(".last_")
&& !n.startsWith(".next_");
}
- });
- if (matches == null) {
- log.error("Cannot list " + pluginsDir.getAbsolutePath());
- return Collections.emptyList();
+ };
+ try (DirectoryStream<Path> files
+ = Files.newDirectoryStream(pluginsDir, filter)) {
+ return ImmutableList.copyOf(files);
+ } catch (IOException e) {
+ log.error("Cannot list " + pluginsDir.toAbsolutePath(), e);
+ return ImmutableList.of();
}
- return Arrays.asList(matches);
}
- private static Iterable<File> filterDisabledPlugins(
- Collection<File> files) {
- return Iterables.filter(files, new Predicate<File>() {
+ private static Iterable<Path> filterDisabledPlugins(
+ Collection<Path> paths) {
+ return Iterables.filter(paths, new Predicate<Path>() {
@Override
- public boolean apply(File file) {
- return !file.getName().endsWith(".disabled");
+ public boolean apply(Path p) {
+ return !p.getFileName().toString().endsWith(".disabled");
}
});
}
- public String getGerritPluginName(File srcFile) {
- String fileName = srcFile.getName();
+ public String getGerritPluginName(Path srcPath) {
+ String fileName = srcPath.getFileName().toString();
if (isJsPlugin(fileName)) {
return fileName.substring(0, fileName.length() - 3);
}
- if (serverPluginFactory.handles(srcFile)) {
- return serverPluginFactory.getPluginName(srcFile);
+ if (serverPluginFactory.handles(srcPath)) {
+ return serverPluginFactory.getPluginName(srcPath);
}
return null;
}
- private Multimap<String, File> asMultimap(List<File> plugins) {
- Multimap<String, File> map = LinkedHashMultimap.create();
- for (File srcFile : plugins) {
- map.put(getPluginName(srcFile), srcFile);
+ private Multimap<String, Path> asMultimap(List<Path> plugins) {
+ Multimap<String, Path> map = LinkedHashMultimap.create();
+ for (Path srcPath : plugins) {
+ map.put(getPluginName(srcPath), srcPath);
}
return map;
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPlugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPlugin.java
index 0b037fb..28d57b2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPlugin.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPlugin.java
@@ -17,25 +17,19 @@
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.annotations.PluginCanonicalWebUrl;
-import com.google.gerrit.extensions.annotations.PluginData;
-import com.google.gerrit.extensions.annotations.PluginName;
import com.google.gerrit.extensions.registration.RegistrationHandle;
import com.google.gerrit.extensions.registration.ReloadableRegistrationHandle;
import com.google.gerrit.lifecycle.LifecycleManager;
import com.google.gerrit.server.PluginUser;
import com.google.gerrit.server.util.RequestContext;
-import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
-import com.google.inject.Provider;
-import com.google.inject.ProvisionException;
import org.eclipse.jgit.internal.storage.file.FileSnapshot;
-import java.io.File;
import java.io.IOException;
+import java.nio.file.Path;
import java.util.List;
import java.util.jar.Attributes;
import java.util.jar.Manifest;
@@ -59,7 +53,7 @@
private final Manifest manifest;
private final PluginContentScanner scanner;
- private final File dataDir;
+ private final Path dataDir;
private final String pluginCanonicalWebUrl;
private final ClassLoader classLoader;
private Class<? extends Module> sysModule;
@@ -75,12 +69,13 @@
public ServerPlugin(String name,
String pluginCanonicalWebUrl,
PluginUser pluginUser,
- File srcJar,
+ Path srcJar,
FileSnapshot snapshot,
PluginContentScanner scanner,
- File dataDir,
+ Path dataDir,
ClassLoader classLoader) throws InvalidPluginException {
- super(name, srcJar, pluginUser, snapshot, Plugin.getApiType(getPluginManifest(scanner)));
+ super(name, srcJar, pluginUser, snapshot,
+ Plugin.getApiType(getPluginManifest(scanner)));
this.pluginCanonicalWebUrl = pluginCanonicalWebUrl;
this.scanner = scanner;
this.dataDir = dataDir;
@@ -127,10 +122,18 @@
return (Class<? extends Module>) clazz;
}
- File getSrcJar() {
+ Path getSrcJar() {
return getSrcFile();
}
+ Path getDataDir() {
+ return dataDir;
+ }
+
+ String getPluginCanonicalWebUrl() {
+ return pluginCanonicalWebUrl;
+ }
+
private static Manifest getPluginManifest(PluginContentScanner scanner)
throws InvalidPluginException {
try {
@@ -229,45 +232,11 @@
}
private Injector newRootInjector(final PluginGuiceEnvironment env) {
- List<Module> modules = Lists.newArrayListWithCapacity(4);
+ List<Module> modules = Lists.newArrayListWithCapacity(2);
if (getApiType() == ApiType.PLUGIN) {
modules.add(env.getSysModule());
}
- modules.add(new AbstractModule() {
- @Override
- protected void configure() {
- bind(PluginUser.class).toInstance(getPluginUser());
- bind(String.class)
- .annotatedWith(PluginName.class)
- .toInstance(getName());
- bind(String.class)
- .annotatedWith(PluginCanonicalWebUrl.class)
- .toInstance(pluginCanonicalWebUrl);
-
- bind(File.class)
- .annotatedWith(PluginData.class)
- .toProvider(new Provider<File>() {
- private volatile boolean ready;
-
- @Override
- public File get() {
- if (!ready) {
- synchronized (dataDir) {
- if (!ready) {
- if (!dataDir.exists() && !dataDir.mkdirs()) {
- throw new ProvisionException(String.format(
- "Cannot create %s for plugin %s",
- dataDir.getAbsolutePath(), getName()));
- }
- ready = true;
- }
- }
- }
- return dataDir;
- }
- });
- }
- });
+ modules.add(new ServerPluginInfoModule(this));
return Guice.createInjector(modules);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPluginInfoModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPluginInfoModule.java
new file mode 100644
index 0000000..b0e9453
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPluginInfoModule.java
@@ -0,0 +1,77 @@
+// Copyright (C) 2015 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.
+
+package com.google.gerrit.server.plugins;
+
+import com.google.gerrit.extensions.annotations.PluginCanonicalWebUrl;
+import com.google.gerrit.extensions.annotations.PluginData;
+import com.google.gerrit.extensions.annotations.PluginName;
+import com.google.gerrit.server.PluginUser;
+import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
+import com.google.inject.ProvisionException;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+class ServerPluginInfoModule extends AbstractModule {
+ private final ServerPlugin plugin;
+ private final Path dataDir;
+
+ private volatile boolean ready;
+
+ ServerPluginInfoModule(ServerPlugin plugin) {
+ this.plugin = plugin;
+ this.dataDir = plugin.getDataDir();
+ }
+
+ @Override
+ protected void configure() {
+ bind(PluginUser.class).toInstance(plugin.getPluginUser());
+ bind(String.class)
+ .annotatedWith(PluginName.class)
+ .toInstance(plugin.getName());
+ bind(String.class)
+ .annotatedWith(PluginCanonicalWebUrl.class)
+ .toInstance(plugin.getPluginCanonicalWebUrl());
+ }
+
+ @Provides
+ @PluginData
+ Path getPluginData() {
+ if (!ready) {
+ synchronized (dataDir) {
+ if (!ready) {
+ try {
+ Files.createDirectories(dataDir);
+ } catch (IOException e) {
+ throw new ProvisionException(String.format(
+ "Cannot create %s for plugin %s",
+ dataDir.toAbsolutePath(), plugin.getName()), e);
+ }
+ ready = true;
+ }
+ }
+ }
+ return dataDir;
+ }
+
+ @Provides
+ @PluginData
+ File getPluginDataAsFile(@PluginData Path pluginData) {
+ return pluginData.toFile();
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPluginProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPluginProvider.java
index 37fed9b..bc2432b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPluginProvider.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPluginProvider.java
@@ -19,7 +19,7 @@
import org.eclipse.jgit.internal.storage.file.FileSnapshot;
-import java.io.File;
+import java.nio.file.Path;
/**
* Provider of one Server plugin from one external file
@@ -40,7 +40,7 @@
public class PluginDescription {
public final PluginUser user;
public final String canonicalUrl;
- public final File dataDir;
+ public final Path dataDir;
/**
* Creates a new PluginDescription for ServerPluginProvider.
@@ -49,7 +49,7 @@
* @param canonicalUrl plugin root Web URL
* @param dataDir directory for plugin data
*/
- public PluginDescription(PluginUser user, String canonicalUrl, File dataDir) {
+ public PluginDescription(PluginUser user, String canonicalUrl, Path dataDir) {
this.user = user;
this.canonicalUrl = canonicalUrl;
this.dataDir = dataDir;
@@ -59,39 +59,39 @@
/**
* Declares the availability to manage an external file or directory
*
- * @param srcFile the external file or directory
+ * @param srcPath the external file or directory
* @return true if file or directory can be loaded into a Server Plugin
*/
- boolean handles(File srcFile);
+ boolean handles(Path srcPath);
/**
* Returns the plugin name of an external file or directory
*
- * Should be called only if {@link #handles(File) handles(srcFile)}
+ * Should be called only if {@link #handles(Path) handles(srcFile)}
* returns true and thus srcFile is a supported plugin format.
* An IllegalArgumentException is thrown otherwise as srcFile
* is not a valid file format for extracting its plugin name.
*
- * @param srcFile external file or directory
+ * @param srcPath external file or directory
* @return plugin name
*/
- String getPluginName(File srcFile);
+ String getPluginName(Path srcPath);
/**
* Loads an external file or directory into a Server plugin.
*
- * Should be called only if {@link #handles(File) handles(srcFile)}
+ * Should be called only if {@link #handles(Path) handles(srcFile)}
* returns true and thus srcFile is a supported plugin format.
* An IllegalArgumentException is thrown otherwise as srcFile
* is not a valid file format for extracting its plugin name.
*
- * @param srcFile external file or directory
+ * @param srcPath external file or directory
* @param snapshot snapshot of the external file
* @param pluginDescriptor descriptor of the ServerPlugin to load
* @throws InvalidPluginException if plugin is supposed to be handled
* but cannot be loaded for any other reason
*/
- ServerPlugin get(File srcFile, FileSnapshot snapshot,
+ ServerPlugin get(Path srcPath, FileSnapshot snapshot,
PluginDescription pluginDescriptor) throws InvalidPluginException;
/**
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/UniversalServerPluginProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/UniversalServerPluginProvider.java
index 0e8bd87..afdc5b3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/UniversalServerPluginProvider.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/UniversalServerPluginProvider.java
@@ -22,7 +22,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
@@ -38,27 +38,26 @@
}
@Override
- public ServerPlugin get(File srcFile, FileSnapshot snapshot,
+ public ServerPlugin get(Path srcPath, FileSnapshot snapshot,
PluginDescription pluginDescription) throws InvalidPluginException {
- return providerOf(srcFile).get(srcFile, snapshot, pluginDescription);
+ return providerOf(srcPath).get(srcPath, snapshot, pluginDescription);
}
@Override
- public String getPluginName(File srcFile) {
- return providerOf(srcFile).getPluginName(srcFile);
+ public String getPluginName(Path srcPath) {
+ return providerOf(srcPath).getPluginName(srcPath);
}
@Override
- public boolean handles(File srcFile) {
- List<ServerPluginProvider> providers =
- providersForHandlingPlugin(srcFile);
+ public boolean handles(Path srcPath) {
+ List<ServerPluginProvider> providers = providersForHandlingPlugin(srcPath);
switch (providers.size()) {
case 1:
return true;
case 0:
return false;
default:
- throw new MultipleProvidersForPluginException(srcFile, providers);
+ throw new MultipleProvidersForPluginException(srcPath, providers);
}
}
@@ -67,27 +66,27 @@
return "gerrit";
}
- private ServerPluginProvider providerOf(File srcFile) {
+ private ServerPluginProvider providerOf(Path srcPath) {
List<ServerPluginProvider> providers =
- providersForHandlingPlugin(srcFile);
+ providersForHandlingPlugin(srcPath);
switch (providers.size()) {
case 1:
return providers.get(0);
case 0:
throw new IllegalArgumentException(
"No ServerPluginProvider found/loaded to handle plugin file "
- + srcFile.getAbsolutePath());
+ + srcPath.toAbsolutePath());
default:
- throw new MultipleProvidersForPluginException(srcFile, providers);
+ throw new MultipleProvidersForPluginException(srcPath, providers);
}
}
private List<ServerPluginProvider> providersForHandlingPlugin(
- final File srcFile) {
+ final Path srcPath) {
List<ServerPluginProvider> providers = new ArrayList<>();
for (ServerPluginProvider serverPluginProvider : serverPluginProviders) {
- boolean handles = serverPluginProvider.handles(srcFile);
- log.debug("File {} handled by {} ? => {}", srcFile,
+ boolean handles = serverPluginProvider.handles(srcPath);
+ log.debug("File {} handled by {} ? => {}", srcPath,
serverPluginProvider.getProviderPluginName(), handles);
if (handles) {
providers.add(serverPluginProvider);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectResource.java
index f68acdd..4257825 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectResource.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectResource.java
@@ -15,28 +15,34 @@
package com.google.gerrit.server.project;
import com.google.common.collect.Iterables;
+import com.google.gerrit.extensions.restapi.RestResource;
import com.google.gerrit.extensions.restapi.RestView;
import com.google.inject.TypeLiteral;
-public class ChildProjectResource extends ProjectResource {
+public class ChildProjectResource implements RestResource {
public static final TypeLiteral<RestView<ChildProjectResource>> CHILD_PROJECT_KIND =
new TypeLiteral<RestView<ChildProjectResource>>() {};
+ private final ProjectResource parent;
private final ProjectControl child;
- public ChildProjectResource(ProjectResource project, ProjectControl child) {
- super(project);
+ public ChildProjectResource(ProjectResource parent, ProjectControl child) {
+ this.parent = parent;
this.child = child;
}
+ public ProjectResource getParent() {
+ return parent;
+ }
+
public ProjectControl getChild() {
return child;
}
public boolean isDirectChild() {
- ProjectState parent =
+ ProjectState firstParent =
Iterables.getFirst(child.getProjectState().parents(), null);
- return parent != null
- && getNameKey().equals(parent.getProject().getNameKey());
+ return firstParent != null
+ && parent.getNameKey().equals(firstParent.getProject().getNameKey());
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectsCollection.java
index ca98cf6..faba87a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectsCollection.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectsCollection.java
@@ -44,7 +44,7 @@
}
@Override
- public RestView<ProjectResource> list() throws ResourceNotFoundException,
+ public ListChildProjects list() throws ResourceNotFoundException,
AuthException {
return list.get();
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitsCollection.java
index e5e7bed..4879bb7 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitsCollection.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitsCollection.java
@@ -65,26 +65,19 @@
throw new ResourceNotFoundException(id);
}
- Repository repo = repoManager.openRepository(parent.getNameKey());
- try {
- RevWalk rw = new RevWalk(repo);
- try {
- RevCommit commit = rw.parseCommit(objectId);
- rw.parseBody(commit);
- if (!parent.getControl().canReadCommit(db.get(), rw, commit)) {
- throw new ResourceNotFoundException(id);
- }
- for (int i = 0; i < commit.getParentCount(); i++) {
- rw.parseBody(rw.parseCommit(commit.getParent(i)));
- }
- return new CommitResource(parent, commit);
- } catch (MissingObjectException | IncorrectObjectTypeException e) {
+ try (Repository repo = repoManager.openRepository(parent.getNameKey());
+ RevWalk rw = new RevWalk(repo)) {
+ RevCommit commit = rw.parseCommit(objectId);
+ rw.parseBody(commit);
+ if (!parent.getControl().canReadCommit(db.get(), rw, commit)) {
throw new ResourceNotFoundException(id);
- } finally {
- rw.release();
}
- } finally {
- repo.close();
+ for (int i = 0; i < commit.getParentCount(); i++) {
+ rw.parseBody(rw.parseCommit(commit.getParent(i)));
+ }
+ return new CommitResource(parent, commit);
+ } catch (MissingObjectException | IncorrectObjectTypeException e) {
+ throw new ResourceNotFoundException(id);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranches.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranches.java
index bdc67ac..d6e93f0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranches.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranches.java
@@ -99,11 +99,8 @@
for (String branch : input.branches) {
batchUpdate.addCommand(createDeleteCommand(project, r, branch));
}
- RevWalk rw = new RevWalk(r);
- try {
+ try (RevWalk rw = new RevWalk(r)) {
batchUpdate.execute(rw, NullProgressMonitor.INSTANCE);
- } finally {
- rw.release();
}
StringBuilder errorMessages = new StringBuilder();
for (ReceiveCommand command : batchUpdate.getCommands()) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GarbageCollect.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GarbageCollect.java
index fe1086b..a5a96b1 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GarbageCollect.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GarbageCollect.java
@@ -41,6 +41,7 @@
UiAction<ProjectResource> {
public static class Input {
public boolean showProgress;
+ public boolean aggressive;
}
private final boolean canGC;
@@ -68,8 +69,10 @@
}
};
try {
- GarbageCollectionResult result = garbageCollectionFactory.create().run(
- Collections.singletonList(rsrc.getNameKey()), input.showProgress ? writer : null);
+ GarbageCollectionResult result =
+ garbageCollectionFactory.create().run(
+ Collections.singletonList(rsrc.getNameKey()), input.aggressive,
+ input.showProgress ? writer : null);
String msg = "Garbage collection completed successfully.";
if (result.hasErrors()) {
for (GarbageCollectionResult.Error e : result.getErrors()) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetChildProject.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetChildProject.java
index 815653f..7737d8c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetChildProject.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetChildProject.java
@@ -23,9 +23,12 @@
public class GetChildProject implements RestReadView<ChildProjectResource> {
@Option(name = "--recursive", usage = "to list child projects recursively")
- private boolean recursive;
+ public void setRecursive(boolean recursive) {
+ this.recursive = recursive;
+ }
private final ProjectJson json;
+ private boolean recursive;
@Inject
GetChildProject(ProjectJson json) {
@@ -38,6 +41,6 @@
if (recursive || rsrc.isDirectChild()) {
return json.format(rsrc.getChild().getProject());
}
- throw new ResourceNotFoundException(rsrc.getName());
+ throw new ResourceNotFoundException(rsrc.getChild().getProject().getName());
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDescription.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDescription.java
index 5241c69..bace0a8 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDescription.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDescription.java
@@ -20,7 +20,7 @@
import com.google.inject.Singleton;
@Singleton
-class GetDescription implements RestReadView<ProjectResource> {
+public class GetDescription implements RestReadView<ProjectResource> {
@Override
public String apply(ProjectResource resource) {
Project project = resource.getControl().getProject();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetHead.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetHead.java
index 0530a4c..2efd257 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetHead.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetHead.java
@@ -49,9 +49,7 @@
@Override
public String apply(ProjectResource rsrc) throws AuthException,
ResourceNotFoundException, IOException {
- Repository repo = null;
- try {
- repo = repoManager.openRepository(rsrc.getNameKey());
+ try (Repository repo = repoManager.openRepository(rsrc.getNameKey())) {
Ref head = repo.getRef(Constants.HEAD);
if (head == null) {
throw new ResourceNotFoundException(Constants.HEAD);
@@ -62,8 +60,7 @@
}
throw new AuthException("not allowed to see HEAD");
} else if (head.getObjectId() != null) {
- RevWalk rw = new RevWalk(repo);
- try {
+ try (RevWalk rw = new RevWalk(repo)) {
RevCommit commit = rw.parseCommit(head.getObjectId());
if (rsrc.getControl().canReadCommit(db.get(), rw, commit)) {
return head.getObjectId().name();
@@ -74,17 +71,11 @@
return head.getObjectId().name();
}
throw new AuthException("not allowed to see HEAD");
- } finally {
- rw.release();
}
}
throw new ResourceNotFoundException(Constants.HEAD);
} catch (RepositoryNotFoundException e) {
throw new ResourceNotFoundException(rsrc.getName());
- } finally {
- if (repo != null) {
- repo.close();
- }
}
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListBranches.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListBranches.java
index a8eda97..922c2c4 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListBranches.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListBranches.java
@@ -15,9 +15,9 @@
package com.google.gerrit.server.project;
import com.google.common.base.Predicate;
+import com.google.common.base.Strings;
+import com.google.common.collect.ComparisonChain;
import com.google.common.collect.FluentIterable;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.gerrit.extensions.common.ActionInfo;
import com.google.gerrit.extensions.common.WebLinkInfo;
@@ -34,9 +34,6 @@
import com.google.inject.Inject;
import com.google.inject.util.Providers;
-import dk.brics.automaton.RegExp;
-import dk.brics.automaton.RunAutomaton;
-
import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Ref;
@@ -45,6 +42,7 @@
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
@@ -53,6 +51,9 @@
import java.util.Set;
import java.util.TreeMap;
+import dk.brics.automaton.RegExp;
+import dk.brics.automaton.RunAutomaton;
+
public class ListBranches implements RestReadView<ProjectResource> {
private final GitRepositoryManager repoManager;
private final DynamicMap<RestView<BranchResource>> branchViews;
@@ -82,164 +83,151 @@
@Override
public List<BranchInfo> apply(ProjectResource rsrc)
throws ResourceNotFoundException, IOException, BadRequestException {
- List<BranchInfo> branches = Lists.newArrayList();
+ FluentIterable<BranchInfo> branches = allBranches(rsrc);
+ branches = filterBranches(branches);
+ if (start > 0) {
+ branches = branches.skip(start);
+ }
+ if (limit > 0) {
+ branches = branches.limit(limit);
+ }
+ return branches.toList();
+ }
- BranchInfo headBranch = null;
- BranchInfo configBranch = null;
- final Set<String> targets = Sets.newHashSet();
-
- final Repository db;
- try {
- db = repoManager.openRepository(rsrc.getNameKey());
+ private FluentIterable<BranchInfo> allBranches(ProjectResource rsrc)
+ throws IOException, ResourceNotFoundException {
+ List<Ref> refs;
+ try (Repository db = repoManager.openRepository(rsrc.getNameKey())) {
+ Collection<Ref> heads =
+ db.getRefDatabase().getRefs(Constants.R_HEADS).values();
+ refs = new ArrayList<>(heads.size() + 2);
+ refs.addAll(heads);
+ addRef(db, refs, Constants.HEAD);
+ addRef(db, refs, RefNames.REFS_CONFIG);
} catch (RepositoryNotFoundException noGitRepository) {
throw new ResourceNotFoundException();
}
- try {
- List<Ref> refs =
- new ArrayList<>(db.getRefDatabase().getRefs(Constants.R_HEADS)
- .values());
-
- try {
- Ref head = db.getRef(Constants.HEAD);
- if (head != null) {
- refs.add(head);
- }
- } catch (IOException e) {
- // Ignore the failure reading HEAD.
- }
- try {
- Ref config = db.getRef(RefNames.REFS_CONFIG);
- if (config != null) {
- refs.add(config);
- }
- } catch (IOException e) {
- // Ignore the failure reading refs/meta/config.
- }
-
- for (Ref ref : refs) {
- if (ref.isSymbolic()) {
- targets.add(ref.getTarget().getName());
- }
+ Set<String> targets = Sets.newHashSetWithExpectedSize(1);
+ for (Ref ref : refs) {
+ if (ref.isSymbolic()) {
+ targets.add(ref.getTarget().getName());
}
+ }
- for (Ref ref : refs) {
- if (ref.isSymbolic()) {
- // A symbolic reference to another branch, instead of
- // showing the resolved value, show the name it references.
- //
- String target = ref.getTarget().getName();
- RefControl targetRefControl = rsrc.getControl().controlForRef(target);
- if (!targetRefControl.isVisible()) {
- continue;
- }
- if (target.startsWith(Constants.R_HEADS)) {
- target = target.substring(Constants.R_HEADS.length());
- }
-
- BranchInfo b = new BranchInfo(ref.getName(), target, false);
-
- if (Constants.HEAD.equals(ref.getName())) {
- headBranch = b;
- } else {
- b.setCanDelete(targetRefControl.canDelete());
- branches.add(b);
- }
+ List<BranchInfo> branches = new ArrayList<>(refs.size());
+ for (Ref ref : refs) {
+ if (ref.isSymbolic()) {
+ // A symbolic reference to another branch, instead of
+ // showing the resolved value, show the name it references.
+ //
+ String target = ref.getTarget().getName();
+ RefControl targetRefControl = rsrc.getControl().controlForRef(target);
+ if (!targetRefControl.isVisible()) {
continue;
}
-
- final RefControl refControl = rsrc.getControl().controlForRef(ref.getName());
- if (refControl.isVisible()) {
- if (RefNames.REFS_CONFIG.equals(ref.getName())) {
- configBranch = createBranchInfo(ref, refControl, targets);
- } else {
- branches.add(createBranchInfo(ref, refControl, targets));
- }
+ if (target.startsWith(Constants.R_HEADS)) {
+ target = target.substring(Constants.R_HEADS.length());
}
- }
- } finally {
- db.close();
- }
- Collections.sort(branches, new Comparator<BranchInfo>() {
- @Override
- public int compare(final BranchInfo a, final BranchInfo b) {
- return a.ref.compareTo(b.ref);
- }
- });
- if (configBranch != null) {
- branches.add(0, configBranch);
- }
- if (headBranch != null) {
- branches.add(0, headBranch);
- }
- List<BranchInfo> filteredBranches;
- if ((matchSubstring != null && !matchSubstring.isEmpty())
- || (matchRegex != null && !matchRegex.isEmpty())) {
- filteredBranches = filterBranches(branches);
- } else {
- filteredBranches = branches;
- }
- if (!filteredBranches.isEmpty()) {
- int end = filteredBranches.size();
- if (limit > 0 && start + limit < end) {
- end = start + limit;
+ BranchInfo b = new BranchInfo(ref.getName(), target, false);
+ branches.add(b);
+
+ if (!Constants.HEAD.equals(ref.getName())) {
+ b.setCanDelete(targetRefControl.canDelete());
+ }
+ continue;
}
- if (start <= end) {
- filteredBranches = filteredBranches.subList(start, end);
- } else {
- filteredBranches = Collections.emptyList();
+
+ RefControl refControl = rsrc.getControl().controlForRef(ref.getName());
+ if (refControl.isVisible()) {
+ branches.add(createBranchInfo(ref, refControl, targets));
}
}
- return filteredBranches;
+ Collections.sort(branches, new BranchComparator());
+ return FluentIterable.from(branches);
}
- private List<BranchInfo> filterBranches(List<BranchInfo> branches)
- throws BadRequestException {
- if (matchSubstring != null) {
- return Lists.newArrayList(Iterables.filter(branches,
- new Predicate<BranchInfo>() {
- @Override
- public boolean apply(BranchInfo in) {
- if (!in.ref.startsWith(Constants.R_HEADS)){
- return in.ref.toLowerCase(Locale.US).contains(
- matchSubstring.toLowerCase(Locale.US));
- } else {
- return in.ref.substring(Constants.R_HEADS.length())
- .toLowerCase(Locale.US)
- .contains(matchSubstring.toLowerCase(Locale.US));
- }
- }
- }));
- } else if (matchRegex != null) {
- if (matchRegex.startsWith("^")) {
- matchRegex = matchRegex.substring(1);
- if (matchRegex.endsWith("$") && !matchRegex.endsWith("\\$")) {
- matchRegex = matchRegex.substring(0, matchRegex.length() - 1);
+ private static class BranchComparator implements Comparator<BranchInfo> {
+ @Override
+ public int compare(BranchInfo a, BranchInfo b) {
+ return ComparisonChain.start()
+ .compareTrueFirst(isHead(a), isHead(b))
+ .compareTrueFirst(isConfig(a), isConfig(b))
+ .compare(a.ref, b.ref)
+ .result();
+ }
+
+ private static boolean isHead(BranchInfo i) {
+ return Constants.HEAD.equals(i.ref);
+ }
+
+ private static boolean isConfig(BranchInfo i) {
+ return RefNames.REFS_CONFIG.equals(i.ref);
+ }
+ }
+
+ private static void addRef(Repository db, List<Ref> refs, String name)
+ throws IOException {
+ Ref ref = db.getRef(name);
+ if (ref != null) {
+ refs.add(ref);
+ }
+ }
+
+ private FluentIterable<BranchInfo> filterBranches(
+ FluentIterable<BranchInfo> branches) throws BadRequestException {
+ if (!Strings.isNullOrEmpty(matchSubstring)) {
+ branches = branches.filter(new SubstringPredicate(matchSubstring));
+ } else if (!Strings.isNullOrEmpty(matchRegex)) {
+ branches = branches.filter(new RegexPredicate(matchRegex));
+ }
+ return branches;
+ }
+
+ private static class SubstringPredicate implements Predicate<BranchInfo> {
+ private final String substring;
+
+ private SubstringPredicate(String substring) {
+ this.substring = substring.toLowerCase(Locale.US);
+ }
+
+ @Override
+ public boolean apply(BranchInfo in) {
+ String ref = in.ref;
+ if (ref.startsWith(Constants.R_HEADS)) {
+ ref = ref.substring(Constants.R_HEADS.length());
+ }
+ ref = ref.toLowerCase(Locale.US);
+ return ref.contains(substring);
+ }
+ }
+
+ private static class RegexPredicate implements Predicate<BranchInfo> {
+ private final RunAutomaton a;
+
+ private RegexPredicate(String regex) throws BadRequestException {
+ if (regex.startsWith("^")) {
+ regex = regex.substring(1);
+ if (regex.endsWith("$") && !regex.endsWith("\\$")) {
+ regex = regex.substring(0, regex.length() - 1);
}
}
- if (matchRegex.equals(".*")) {
- return branches;
- }
try {
- final RunAutomaton a =
- new RunAutomaton(new RegExp(matchRegex).toAutomaton());
- return Lists.newArrayList(Iterables.filter(
- branches, new Predicate<BranchInfo>() {
- @Override
- public boolean apply(BranchInfo in) {
- if (!in.ref.startsWith(Constants.R_HEADS)){
- return a.run(in.ref);
- } else {
- return a.run(in.ref.substring(Constants.R_HEADS.length()));
- }
- }
- }));
+ a = new RunAutomaton(new RegExp(regex).toAutomaton());
} catch (IllegalArgumentException e) {
throw new BadRequestException(e.getMessage());
}
}
- return branches;
+
+ @Override
+ public boolean apply(BranchInfo in) {
+ if (!in.ref.startsWith(Constants.R_HEADS)){
+ return a.run(in.ref);
+ } else {
+ return a.run(in.ref.substring(Constants.R_HEADS.length()));
+ }
+ }
}
private BranchInfo createBranchInfo(Ref ref, RefControl refControl,
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListDashboards.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListDashboards.java
index 07fd095..456abfc 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListDashboards.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListDashboards.java
@@ -82,53 +82,45 @@
private List<DashboardInfo> scan(ProjectControl ctl, String project,
boolean setDefault) throws ResourceNotFoundException, IOException {
- Repository git;
- try {
- git = gitManager.openRepository(ctl.getProject().getNameKey());
+ Project.NameKey projectName = ctl.getProject().getNameKey();
+ try (Repository git = gitManager.openRepository(projectName);
+ RevWalk rw = new RevWalk(git)) {
+ List<DashboardInfo> all = Lists.newArrayList();
+ for (Ref ref : git.getRefDatabase().getRefs(REFS_DASHBOARDS).values()) {
+ if (ctl.controlForRef(ref.getName()).canRead()) {
+ all.addAll(scanDashboards(ctl.getProject(), git, rw, ref,
+ project, setDefault));
+ }
+ }
+ return all;
} catch (RepositoryNotFoundException e) {
throw new ResourceNotFoundException();
}
- try {
- RevWalk rw = new RevWalk(git);
- try {
- List<DashboardInfo> all = Lists.newArrayList();
- for (Ref ref : git.getRefDatabase().getRefs(REFS_DASHBOARDS).values()) {
- if (ctl.controlForRef(ref.getName()).canRead()) {
- all.addAll(scanDashboards(ctl.getProject(), git, rw, ref,
- project, setDefault));
- }
- }
- return all;
- } finally {
- rw.release();
- }
- } finally {
- git.close();
- }
}
private List<DashboardInfo> scanDashboards(Project definingProject,
Repository git, RevWalk rw, Ref ref, String project, boolean setDefault)
throws IOException {
List<DashboardInfo> list = Lists.newArrayList();
- TreeWalk tw = new TreeWalk(rw.getObjectReader());
- tw.addTree(rw.parseTree(ref.getObjectId()));
- tw.setRecursive(true);
- while (tw.next()) {
- if (tw.getFileMode(0) == FileMode.REGULAR_FILE) {
- try {
- list.add(DashboardsCollection.parse(
- definingProject,
- ref.getName().substring(REFS_DASHBOARDS.length()),
- tw.getPathString(),
- new BlobBasedConfig(null, git, tw.getObjectId(0)),
- project,
- setDefault));
- } catch (ConfigInvalidException e) {
- log.warn(String.format(
- "Cannot parse dashboard %s:%s:%s: %s",
- definingProject.getName(), ref.getName(), tw.getPathString(),
- e.getMessage()));
+ try (TreeWalk tw = new TreeWalk(rw.getObjectReader())) {
+ tw.addTree(rw.parseTree(ref.getObjectId()));
+ tw.setRecursive(true);
+ while (tw.next()) {
+ if (tw.getFileMode(0) == FileMode.REGULAR_FILE) {
+ try {
+ list.add(DashboardsCollection.parse(
+ definingProject,
+ ref.getName().substring(REFS_DASHBOARDS.length()),
+ tw.getPathString(),
+ new BlobBasedConfig(null, git, tw.getObjectId(0)),
+ project,
+ setDefault));
+ } catch (ConfigInvalidException e) {
+ log.warn(String.format(
+ "Cannot parse dashboard %s:%s:%s: %s",
+ definingProject.getName(), ref.getName(), tw.getPathString(),
+ e.getMessage()));
+ }
}
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java
index a9851e4..2d8757e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java
@@ -66,6 +66,7 @@
import java.util.Locale;
import java.util.Map;
import java.util.Set;
+import java.util.SortedMap;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;
@@ -236,12 +237,12 @@
return apply();
}
- public Map<String, ProjectInfo> apply() throws BadRequestException {
+ public SortedMap<String, ProjectInfo> apply() throws BadRequestException {
format = OutputFormat.JSON;
return display(null);
}
- public Map<String, ProjectInfo> display(OutputStream displayOutputStream)
+ public SortedMap<String, ProjectInfo> display(OutputStream displayOutputStream)
throws BadRequestException {
PrintWriter stdout = null;
if (displayOutputStream != null) {
@@ -255,7 +256,7 @@
int foundIndex = 0;
int found = 0;
- Map<String, ProjectInfo> output = Maps.newTreeMap();
+ TreeMap<String, ProjectInfo> output = Maps.newTreeMap();
Map<String, String> hiddenNames = Maps.newHashMap();
Set<String> rejected = new HashSet<>();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListTags.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListTags.java
index e12b38a..b01e563 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListTags.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListTags.java
@@ -98,26 +98,17 @@
public TagInfo get(ProjectResource resource, IdString id)
throws ResourceNotFoundException, IOException {
- Repository repo = getRepository(resource.getNameKey());
-
- String tagName = id.get();
- if (!tagName.startsWith(Constants.R_TAGS)) {
- tagName = Constants.R_TAGS + tagName;
- }
-
- try {
- RevWalk rw = new RevWalk(repo);
- try {
- Ref ref = repo.getRefDatabase().getRef(tagName);
- if (ref != null && !visibleTags(resource.getControl(), repo,
- ImmutableMap.of(ref.getName(), ref)).isEmpty()) {
- return createTagInfo(ref, rw);
- }
- } finally {
- rw.dispose();
+ try (Repository repo = getRepository(resource.getNameKey());
+ RevWalk rw = new RevWalk(repo)) {
+ String tagName = id.get();
+ if (!tagName.startsWith(Constants.R_TAGS)) {
+ tagName = Constants.R_TAGS + tagName;
}
- } finally {
- repo.close();
+ Ref ref = repo.getRefDatabase().getRef(tagName);
+ if (ref != null && !visibleTags(resource.getControl(), repo,
+ ImmutableMap.of(ref.getName(), ref)).isEmpty()) {
+ return createTagInfo(ref, rw);
+ }
}
throw new ResourceNotFoundException(id);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PerformCreateProject.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PerformCreateProject.java
index 03c954b..689920b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PerformCreateProject.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/PerformCreateProject.java
@@ -270,8 +270,7 @@
private void createEmptyCommits(final Repository repo,
final Project.NameKey project, final List<String> refs)
throws IOException {
- ObjectInserter oi = repo.newObjectInserter();
- try {
+ try (ObjectInserter oi = repo.newObjectInserter()) {
CommitBuilder cb = new CommitBuilder();
cb.setTreeId(oi.insert(Constants.OBJ_TREE, new byte[] {}));
cb.setAuthor(metaDataUpdateFactory.getUserPersonIdent());
@@ -300,8 +299,6 @@
"Cannot create empty commit for "
+ createProjectArgs.getProjectName(), e);
throw e;
- } finally {
- oi.release();
}
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java
index 558b572..467b024 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java
@@ -22,7 +22,6 @@
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
-import com.google.common.io.Files;
import com.google.gerrit.common.data.AccessSection;
import com.google.gerrit.common.data.GroupReference;
import com.google.gerrit.common.data.LabelType;
@@ -46,7 +45,7 @@
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
-import com.googlecode.prolog_cafe.compiler.CompileException;
+import com.googlecode.prolog_cafe.exceptions.CompileException;
import com.googlecode.prolog_cafe.lang.PrologMachineCopy;
import org.eclipse.jgit.errors.ConfigInvalidException;
@@ -55,9 +54,10 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
import java.io.IOException;
import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -488,25 +488,25 @@
private ThemeInfo loadTheme() {
String name = getConfig().getProject().getName();
- File dir = new File(sitePaths.themes_dir, name);
- if (!dir.exists()) {
+ Path dir = sitePaths.themes_dir.resolve(name);
+ if (!Files.exists(dir)) {
return ThemeInfo.INHERIT;
- } else if (!dir.isDirectory()) {
+ } else if (!Files.isDirectory(dir)) {
log.warn("Bad theme for {}: not a directory", name);
return ThemeInfo.INHERIT;
}
try {
- return new ThemeInfo(readFile(new File(dir, SitePaths.CSS_FILENAME)),
- readFile(new File(dir, SitePaths.HEADER_FILENAME)),
- readFile(new File(dir, SitePaths.FOOTER_FILENAME)));
+ return new ThemeInfo(readFile(dir.resolve(SitePaths.CSS_FILENAME)),
+ readFile(dir.resolve(SitePaths.HEADER_FILENAME)),
+ readFile(dir.resolve(SitePaths.FOOTER_FILENAME)));
} catch (IOException e) {
log.error("Error reading theme for " + name, e);
return ThemeInfo.INHERIT;
}
}
- private String readFile(File f) throws IOException {
- return f.exists() ? Files.toString(f, UTF_8) : null;
+ private String readFile(Path p) throws IOException {
+ return Files.exists(p) ? new String(Files.readAllBytes(p), UTF_8) : null;
}
private boolean getInheritableBoolean(Function<Project, InheritableBoolean> func) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutDescription.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutDescription.java
index 536bfa7..1d7c724 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutDescription.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutDescription.java
@@ -17,8 +17,8 @@
import com.google.common.base.MoreObjects;
import com.google.common.base.Strings;
import com.google.gerrit.common.ChangeHooks;
+import com.google.gerrit.extensions.api.projects.PutDescriptionInput;
import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.DefaultInput;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.Response;
@@ -30,7 +30,6 @@
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.MetaDataUpdate;
import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.project.PutDescription.Input;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -42,13 +41,7 @@
import java.util.Objects;
@Singleton
-class PutDescription implements RestModifyView<ProjectResource, Input> {
- static class Input {
- @DefaultInput
- String description;
- String commitMessage;
- }
-
+public class PutDescription implements RestModifyView<ProjectResource, PutDescriptionInput> {
private final ProjectCache cache;
private final MetaDataUpdate.Server updateFactory;
private final GitRepositoryManager gitMgr;
@@ -66,11 +59,11 @@
}
@Override
- public Response<String> apply(ProjectResource resource, Input input)
- throws AuthException, ResourceConflictException,
- ResourceNotFoundException, IOException {
+ public Response<String> apply(ProjectResource resource,
+ PutDescriptionInput input) throws AuthException,
+ ResourceConflictException, ResourceNotFoundException, IOException {
if (input == null) {
- input = new Input(); // Delete would set description to null.
+ input = new PutDescriptionInput(); // Delete would set description to null.
}
ProjectControl ctl = resource.getControl();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionSortCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionSortCache.java
index 9009aad..7b6b5c8 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionSortCache.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionSortCache.java
@@ -86,7 +86,7 @@
Collections.sort(sections, new MostSpecificComparator(ref));
- int srcIdx[];
+ int[] srcIdx;
if (isIdentityTransform(sections, srcMap)) {
srcIdx = null;
} else {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetHead.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetHead.java
index 77c221c..ac21646 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetHead.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetHead.java
@@ -43,9 +43,9 @@
public class SetHead implements RestModifyView<ProjectResource, Input> {
private static final Logger log = LoggerFactory.getLogger(SetHead.class);
- static class Input {
+ public static class Input {
@DefaultInput
- String ref;
+ public String ref;
}
private final GitRepositoryManager repoManager;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleEvaluator.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleEvaluator.java
index ba9e6b1..8ee04d5 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleEvaluator.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleEvaluator.java
@@ -27,13 +27,13 @@
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.rules.PrologEnvironment;
-import com.google.gerrit.rules.ReductionLimitException;
import com.google.gerrit.rules.StoredValues;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gwtorm.server.OrmException;
-import com.googlecode.prolog_cafe.compiler.CompileException;
+import com.googlecode.prolog_cafe.exceptions.CompileException;
+import com.googlecode.prolog_cafe.exceptions.ReductionLimitException;
import com.googlecode.prolog_cafe.lang.IntegerTerm;
import com.googlecode.prolog_cafe.lang.ListTerm;
import com.googlecode.prolog_cafe.lang.Prolog;
@@ -107,7 +107,7 @@
private boolean skipFilters;
private String rule;
private boolean logErrors = true;
- private int reductionsConsumed;
+ private long reductionsConsumed;
private Term submitRule;
@@ -185,7 +185,7 @@
}
/** @return Prolog reductions consumed during evaluation. */
- public int getReductionsConsumed() {
+ public long getReductionsConsumed() {
return reductionsConsumed;
}
@@ -266,7 +266,7 @@
SubmitRecord rec = new SubmitRecord();
out.add(rec);
- if (!submitRecord.isStructure() || 1 != submitRecord.arity()) {
+ if (!(submitRecord instanceof StructureTerm) || 1 != submitRecord.arity()) {
return invalidResult(submitRule, submitRecord);
}
@@ -285,14 +285,16 @@
//
submitRecord = submitRecord.arg(0);
- if (!submitRecord.isStructure()) {
+ if (!(submitRecord instanceof StructureTerm)) {
return invalidResult(submitRule, submitRecord);
}
rec.labels = new ArrayList<>(submitRecord.arity());
for (Term state : ((StructureTerm) submitRecord).args()) {
- if (!state.isStructure() || 2 != state.arity() || !"label".equals(state.name())) {
+ if (!(state instanceof StructureTerm)
+ || 2 != state.arity()
+ || !"label".equals(state.name())) {
return invalidResult(submitRule, submitRecord);
}
@@ -410,7 +412,7 @@
}
Term typeTerm = results.get(0);
- if (!typeTerm.isSymbol()) {
+ if (!(typeTerm instanceof SymbolTerm)) {
return typeError("Submit rule '" + getSubmitRule() + "' for change "
+ cd.getId() + " of " + getProjectName()
+ " did not return a symbol.");
@@ -481,9 +483,9 @@
resultsTerm, env, filterRuleLocatorName, filterRuleWrapperName);
}
List<Term> r;
- if (resultsTerm.isList()) {
+ if (resultsTerm instanceof ListTerm) {
r = Lists.newArrayList();
- for (Term t = resultsTerm; t.isList();) {
+ for (Term t = resultsTerm; t instanceof ListTerm;) {
ListTerm l = (ListTerm) t;
r.add(l.car().dereference());
t = l.cdr().dereference();
@@ -577,7 +579,7 @@
private void appliedBy(SubmitRecord.Label label, Term status)
throws UserTermExpected {
- if (status.isStructure() && status.arity() == 1) {
+ if (status instanceof StructureTerm && status.arity() == 1) {
Term who = status.arg(0);
if (isUser(who)) {
label.appliedBy = new Account.Id(((IntegerTerm) who.arg(0)).intValue());
@@ -588,10 +590,10 @@
}
private static boolean isUser(Term who) {
- return who.isStructure()
+ return who instanceof StructureTerm
&& who.arity() == 1
&& who.name().equals("user")
- && who.arg(0).isInteger();
+ && who.arg(0) instanceof IntegerTerm;
}
public Term getSubmitRule() {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/IntPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/IntPredicate.java
index e3750fa..d336bb5 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/IntPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/IntPredicate.java
@@ -39,8 +39,9 @@
@Override
public boolean equals(final Object other) {
- if (other == null)
+ if (other == null) {
return false;
+ }
if (getClass() == other.getClass()) {
final IntPredicate<?> p = (IntPredicate<?>) other;
return getOperator().equals(p.getOperator())
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/NotPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/NotPredicate.java
index 6a9a877..248fb9c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/NotPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/NotPredicate.java
@@ -74,8 +74,9 @@
@Override
public boolean equals(final Object other) {
- if (other == null)
+ if (other == null) {
return false;
+ }
return getClass() == other.getClass()
&& getChildren().equals(((Predicate<?>) other).getChildren());
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/OperatorPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/OperatorPredicate.java
index 899fc3b..87460d2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/OperatorPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/OperatorPredicate.java
@@ -50,8 +50,9 @@
@Override
public boolean equals(final Object other) {
- if (other == null)
+ if (other == null) {
return false;
+ }
if (getClass() == other.getClass()) {
final OperatorPredicate<?> p = (OperatorPredicate<?>) other;
return getOperator().equals(p.getOperator())
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/OrPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/OrPredicate.java
index 845c805..2432a41 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/OrPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/OrPredicate.java
@@ -92,8 +92,9 @@
@Override
public boolean equals(final Object other) {
- if (other == null)
+ if (other == null) {
return false;
+ }
return getClass() == other.getClass()
&& getChildren().equals(((Predicate<?>) other).getChildren());
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/VariablePredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/VariablePredicate.java
index d6d0f9c..e298e5f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/VariablePredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/VariablePredicate.java
@@ -81,8 +81,9 @@
@Override
public boolean equals(final Object other) {
- if (other == null)
+ if (other == null) {
return false;
+ }
if (getClass() == other.getClass()) {
final VariablePredicate<?> v = (VariablePredicate<?>) other;
return getName().equals(v.getName())
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/WildPatternPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/WildPatternPredicate.java
index 48f3898..981051b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/WildPatternPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/WildPatternPredicate.java
@@ -45,8 +45,9 @@
@Override
public boolean equals(final Object other) {
- if (other == null)
+ if (other == null) {
return false;
+ }
if (getClass() == other.getClass()) {
final WildPatternPredicate<?> p = (WildPatternPredicate<?>) other;
return getOperator().equals(p.getOperator());
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java
index ecc3f30..3c24dd2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java
@@ -523,18 +523,11 @@
return false;
}
String sha1 = ps.getRevision().get();
- Repository repo = repoManager.openRepository(change().getProject());
- try {
- RevWalk walk = new RevWalk(repo);
- try {
- RevCommit c = walk.parseCommit(ObjectId.fromString(sha1));
- commitMessage = c.getFullMessage();
- commitFooters = c.getFooterLines();
- } finally {
- walk.release();
- }
- } finally {
- repo.close();
+ try (Repository repo = repoManager.openRepository(change().getProject());
+ RevWalk walk = new RevWalk(repo)) {
+ RevCommit c = walk.parseCommit(ObjectId.fromString(sha1));
+ commitMessage = c.getFullMessage();
+ commitFooters = c.getFooterLines();
}
return true;
}
@@ -626,9 +619,7 @@
if (ps == null || !changeControl().isPatchVisible(ps, db)) {
return null;
}
- Repository repo = null;
- try {
- repo = repoManager.openRepository(c.getProject());
+ try (Repository repo = repoManager.openRepository(c.getProject())) {
Ref ref = repo.getRef(c.getDest().get());
SubmitTypeRecord rec = new SubmitRuleEvaluator(this)
.getSubmitType();
@@ -644,10 +635,6 @@
ref, rec.type, mergeStrategy, c.getDest(), repo, db);
} catch (IOException e) {
throw new OrmException(e);
- } finally {
- if (repo != null) {
- repo.close();
- }
}
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
index c9d7e6cd..82c3569 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
@@ -426,8 +426,9 @@
@Operator
public Predicate<ChangeData> project(String name) {
- if (name.startsWith("^"))
+ if (name.startsWith("^")) {
return new RegexProjectPredicate(name);
+ }
return new ProjectPredicate(name);
}
@@ -444,14 +445,16 @@
@Operator
public Predicate<ChangeData> branch(String name) {
- if (name.startsWith("^"))
+ if (name.startsWith("^")) {
return ref("^" + branchToRef(name.substring(1)));
+ }
return ref(branchToRef(name));
}
private static String branchToRef(String name) {
- if (!name.startsWith(Branch.R_HEADS))
+ if (!name.startsWith(Branch.R_HEADS)) {
return Branch.R_HEADS + name;
+ }
return name;
}
@@ -462,15 +465,17 @@
@Operator
public Predicate<ChangeData> topic(String name) {
- if (name.startsWith("^"))
+ if (name.startsWith("^")) {
return new RegexTopicPredicate(name);
+ }
return new TopicPredicate(name);
}
@Operator
public Predicate<ChangeData> ref(String ref) {
- if (ref.startsWith("^"))
+ if (ref.startsWith("^")) {
return new RegexRefPredicate(ref);
+ }
return new RefPredicate(ref);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsPredicate.java
index 87c33a2..2070746 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsPredicate.java
@@ -107,37 +107,24 @@
if (conflicts != null) {
return conflicts;
}
- try {
- Repository repo =
+ try (Repository repo =
args.repoManager.openRepository(otherChange.getProject());
- try {
- RevWalk rw = CodeReviewCommit.newRevWalk(repo);
- try {
- RevFlag canMergeFlag = rw.newFlag("CAN_MERGE");
- CodeReviewCommit commit =
- (CodeReviewCommit) rw.parseCommit(changeDataCache.getTestAgainst());
- SubmitStrategy strategy =
- args.submitStrategyFactory.create(submitType,
- db.get(), repo, rw, null, canMergeFlag,
- getAlreadyAccepted(repo, rw, commit),
- otherChange.getDest());
- CodeReviewCommit otherCommit =
- (CodeReviewCommit) rw.parseCommit(other);
- otherCommit.add(canMergeFlag);
- conflicts = !strategy.dryRun(commit, otherCommit);
- args.conflictsCache.put(conflictsKey, conflicts);
- return conflicts;
- } catch (MergeException e) {
- throw new IllegalStateException(e);
- } catch (NoSuchProjectException e) {
- throw new IllegalStateException(e);
- } finally {
- rw.release();
- }
- } finally {
- repo.close();
- }
- } catch (IOException e) {
+ RevWalk rw = CodeReviewCommit.newRevWalk(repo)) {
+ RevFlag canMergeFlag = rw.newFlag("CAN_MERGE");
+ CodeReviewCommit commit =
+ (CodeReviewCommit) rw.parseCommit(changeDataCache.getTestAgainst());
+ SubmitStrategy strategy =
+ args.submitStrategyFactory.create(submitType,
+ db.get(), repo, rw, null, canMergeFlag,
+ getAlreadyAccepted(repo, rw, commit),
+ otherChange.getDest());
+ CodeReviewCommit otherCommit =
+ (CodeReviewCommit) rw.parseCommit(other);
+ otherCommit.add(canMergeFlag);
+ conflicts = !strategy.dryRun(commit, otherCommit);
+ args.conflictsCache.put(conflictsKey, conflicts);
+ return conflicts;
+ } catch (MergeException | NoSuchProjectException | IOException e) {
throw new IllegalStateException(e);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java
index e08847a..c552a7b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java
@@ -25,6 +25,9 @@
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
+import org.eclipse.jgit.lib.AbbreviatedObjectId;
+import org.eclipse.jgit.lib.ObjectId;
+
import java.util.List;
/**
@@ -56,6 +59,10 @@
return new TopicPredicate(topic);
}
+ private static Predicate<ChangeData> commit(AbbreviatedObjectId id) {
+ return new CommitPredicate(id);
+ }
+
private final QueryProcessor qp;
@Inject
@@ -123,6 +130,14 @@
return query(and(topic(topic), open()));
}
+ public List<ChangeData> byCommitPrefix(String prefix) throws OrmException {
+ return query(commit(AbbreviatedObjectId.fromString(prefix)));
+ }
+
+ public List<ChangeData> byCommit(ObjectId id) throws OrmException {
+ return query(commit(AbbreviatedObjectId.fromObjectId(id)));
+ }
+
private List<ChangeData> query(Predicate<ChangeData> p) throws OrmException {
try {
return qp.queryChanges(p).changes();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RevWalkPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RevWalkPredicate.java
index fd57a44..0947fae 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RevWalkPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RevWalkPredicate.java
@@ -102,18 +102,9 @@
Arguments args = new Arguments(patchSet, revision, objectId, change, projectName);
- try {
- final Repository repo = repoManager.openRepository(projectName);
- try {
- final RevWalk rw = new RevWalk(repo);
- try {
- return match(repo, rw, args);
- } finally {
- rw.release();
- }
- } finally {
- repo.close();
- }
+ try (Repository repo = repoManager.openRepository(projectName);
+ RevWalk rw = new RevWalk(repo)) {
+ return match(repo, rw, args);
} catch (RepositoryNotFoundException e) {
log.error("Repository \"" + projectName.get() + "\" unknown.", e);
} catch (IOException e) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/H2.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/H2.java
index f43530f..66f2f1d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/H2.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/H2.java
@@ -20,9 +20,6 @@
import org.eclipse.jgit.lib.Config;
-import java.io.File;
-import java.io.IOException;
-
class H2 extends BaseDataSourceType {
protected final Config cfg;
@@ -41,12 +38,6 @@
if (database == null || database.isEmpty()) {
database = "db/ReviewDB";
}
- File db = site.resolve(database);
- try {
- db = db.getCanonicalFile();
- } catch (IOException e) {
- db = db.getAbsoluteFile();
- }
- return "jdbc:h2:" + db.toURI().toString();
+ return "jdbc:h2:" + site.resolve(database).toUri().toString();
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaCreator.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaCreator.java
index daf1d4d..98e3937 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaCreator.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaCreator.java
@@ -32,14 +32,14 @@
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.PersonIdent;
-import java.io.File;
import java.io.IOException;
+import java.nio.file.Path;
import java.util.Collections;
/** Creates the current database schema and populates initial code rows. */
public class SchemaCreator {
private final @SitePath
- File site_path;
+ Path site_path;
private final AllProjectsCreator allProjectsCreator;
private final AllUsersCreator allUsersCreator;
@@ -58,7 +58,7 @@
this(site.site_path, ap, auc, au, dst);
}
- public SchemaCreator(@SitePath File site,
+ public SchemaCreator(@SitePath Path site,
AllProjectsCreator ap,
AllUsersCreator auc,
@GerritPersonIdent PersonIdent au,
@@ -117,9 +117,9 @@
final SystemConfig s = SystemConfig.create();
try {
- s.sitePath = site_path.getCanonicalPath();
+ s.sitePath = site_path.toRealPath().normalize().toString();
} catch (IOException e) {
- s.sitePath = site_path.getAbsolutePath();
+ s.sitePath = site_path.toAbsolutePath().normalize().toString();
}
c.systemConfig().insert(Collections.singleton(s));
return s;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaUpdater.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaUpdater.java
index 2b9d4b4..fe5b992 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaUpdater.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaUpdater.java
@@ -131,9 +131,9 @@
throw new OrmException("No record in system_config table");
}
try {
- sc.sitePath = site.site_path.getCanonicalPath();
+ sc.sitePath = site.site_path.toRealPath().normalize().toString();
} catch (IOException e) {
- sc.sitePath = site.site_path.getAbsolutePath();
+ sc.sitePath = site.site_path.toAbsolutePath().normalize().toString();
}
db.systemConfig().update(Collections.singleton(sc));
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java
index 945baa8..e7359fd 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java
@@ -49,8 +49,9 @@
public static int guessVersion(Class<?> c) {
String n = c.getName();
n = n.substring(n.lastIndexOf('_') + 1);
- while (n.startsWith("0"))
+ while (n.startsWith("0")) {
n = n.substring(1);
+ }
return Integer.parseInt(n);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersionCheck.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersionCheck.java
index 591601d..c809af4 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersionCheck.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersionCheck.java
@@ -58,14 +58,14 @@
throw new ProvisionException("Schema not yet initialized."
+ " Run init to initialize the schema:\n"
+ "$ java -jar gerrit.war init -d "
- + site.site_path.getAbsolutePath());
+ + site.site_path.toAbsolutePath());
}
if (currentVer.versionNbr < expectedVer) {
throw new ProvisionException("Unsupported schema version "
+ currentVer.versionNbr + "; expected schema version " + expectedVer
+ ". Run init to upgrade:\n"
- + "$ java -jar " + site.gerrit_war.getAbsolutePath() + " init -d "
- + site.site_path.getAbsolutePath());
+ + "$ java -jar " + site.gerrit_war.toAbsolutePath() + " init -d "
+ + site.site_path.toAbsolutePath());
} else if (currentVer.versionNbr > expectedVer) {
throw new ProvisionException("Unsupported schema version "
+ currentVer.versionNbr + "; expected schema version " + expectedVer
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/securestore/DefaultSecureStore.java b/gerrit-server/src/main/java/com/google/gerrit/server/securestore/DefaultSecureStore.java
index b852217..7665c64 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/securestore/DefaultSecureStore.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/securestore/DefaultSecureStore.java
@@ -26,6 +26,7 @@
import java.io.File;
import java.io.IOException;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
@@ -35,8 +36,8 @@
@Inject
DefaultSecureStore(SitePaths site) {
- File secureConfig = new File(site.etc_dir, "secure.config");
- sec = new FileBasedConfig(secureConfig, FS.DETECTED);
+ Path secureConfig = site.etc_dir.resolve("secure.config");
+ sec = new FileBasedConfig(secureConfig.toFile(), FS.DETECTED);
try {
sec.load();
} catch (Exception e) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreProvider.java
index e830590..99127d8 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreProvider.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreProvider.java
@@ -26,14 +26,14 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
+import java.nio.file.Path;
@Singleton
public class SecureStoreProvider implements Provider<SecureStore> {
private static final Logger log = LoggerFactory
.getLogger(SecureStoreProvider.class);
- private final File libdir;
+ private final Path libdir;
private final Injector injector;
private final String className;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/RangeUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/RangeUtil.java
index 5c5e2f9..adacb21 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/util/RangeUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/RangeUtil.java
@@ -83,7 +83,8 @@
*/
public static Range getRange(
String prefix, String test, int queryInt, int minValue, int maxValue) {
- int min, max;
+ int min;
+ int max;
switch (test) {
case "=":
default:
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/RegexListSearcher.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/RegexListSearcher.java
index 4b0fd35..0a99a8a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/util/RegexListSearcher.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/RegexListSearcher.java
@@ -75,7 +75,8 @@
public Iterable<T> search(List<T> list) {
checkNotNull(list);
- int begin, end;
+ int begin;
+ int end;
if (0 < prefixLen) {
// Assumes many consecutive elements may have the same prefix, so the cost
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/SystemLog.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/SystemLog.java
index ba31f56..d4b8457 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/util/SystemLog.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/SystemLog.java
@@ -33,8 +33,8 @@
import org.eclipse.jgit.lib.Config;
import org.slf4j.LoggerFactory;
-import java.io.File;
import java.io.IOException;
+import java.nio.file.Path;
@Singleton
public class SystemLog {
@@ -55,12 +55,12 @@
return Strings.isNullOrEmpty(System.getProperty(LOG4J_CONFIGURATION));
}
- public static Appender createAppender(File logdir, String name, Layout layout) {
+ public static Appender createAppender(Path logdir, String name, Layout layout) {
final DailyRollingFileAppender dst = new DailyRollingFileAppender();
dst.setName(name);
dst.setLayout(layout);
dst.setEncoding("UTF-8");
- dst.setFile(new File(resolve(logdir), name).getPath());
+ dst.setFile(resolve(logdir).resolve(name).toString());
dst.setImmediateFlush(true);
dst.setAppend(true);
dst.setErrorHandler(new DieErrorHandler());
@@ -90,11 +90,11 @@
return async;
}
- private static File resolve(final File logs_dir) {
+ private static Path resolve(Path p) {
try {
- return logs_dir.getCanonicalFile();
+ return p.toRealPath().normalize();
} catch (IOException e) {
- return logs_dir.getAbsoluteFile();
+ return p.toAbsolutePath().normalize();
}
}
diff --git a/gerrit-server/src/main/java/gerrit/AbstractCommitUserIdentityPredicate.java b/gerrit-server/src/main/java/gerrit/AbstractCommitUserIdentityPredicate.java
index 606e883..32713d1 100644
--- a/gerrit-server/src/main/java/gerrit/AbstractCommitUserIdentityPredicate.java
+++ b/gerrit-server/src/main/java/gerrit/AbstractCommitUserIdentityPredicate.java
@@ -17,11 +17,11 @@
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.UserIdentity;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
import com.googlecode.prolog_cafe.lang.IntegerTerm;
import com.googlecode.prolog_cafe.lang.Operation;
import com.googlecode.prolog_cafe.lang.Predicate;
import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.PrologException;
import com.googlecode.prolog_cafe.lang.StructureTerm;
import com.googlecode.prolog_cafe.lang.SymbolTerm;
import com.googlecode.prolog_cafe.lang.Term;
diff --git a/gerrit-server/src/main/java/gerrit/PRED__load_commit_labels_1.java b/gerrit-server/src/main/java/gerrit/PRED__load_commit_labels_1.java
index f0806a5..b9b6c5a 100644
--- a/gerrit-server/src/main/java/gerrit/PRED__load_commit_labels_1.java
+++ b/gerrit-server/src/main/java/gerrit/PRED__load_commit_labels_1.java
@@ -9,13 +9,13 @@
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gwtorm.server.OrmException;
+import com.googlecode.prolog_cafe.exceptions.JavaException;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
import com.googlecode.prolog_cafe.lang.IntegerTerm;
-import com.googlecode.prolog_cafe.lang.JavaException;
import com.googlecode.prolog_cafe.lang.ListTerm;
import com.googlecode.prolog_cafe.lang.Operation;
import com.googlecode.prolog_cafe.lang.Predicate;
import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.PrologException;
import com.googlecode.prolog_cafe.lang.StructureTerm;
import com.googlecode.prolog_cafe.lang.SymbolTerm;
import com.googlecode.prolog_cafe.lang.Term;
diff --git a/gerrit-server/src/main/java/gerrit/PRED__user_label_range_4.java b/gerrit-server/src/main/java/gerrit/PRED__user_label_range_4.java
index a955307..8efc2f1 100644
--- a/gerrit-server/src/main/java/gerrit/PRED__user_label_range_4.java
+++ b/gerrit-server/src/main/java/gerrit/PRED__user_label_range_4.java
@@ -20,15 +20,17 @@
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.project.ChangeControl;
-import com.googlecode.prolog_cafe.lang.IllegalTypeException;
+import com.googlecode.prolog_cafe.exceptions.IllegalTypeException;
+import com.googlecode.prolog_cafe.exceptions.PInstantiationException;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
import com.googlecode.prolog_cafe.lang.IntegerTerm;
import com.googlecode.prolog_cafe.lang.JavaObjectTerm;
import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.PInstantiationException;
import com.googlecode.prolog_cafe.lang.Predicate;
import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.PrologException;
+import com.googlecode.prolog_cafe.lang.SymbolTerm;
import com.googlecode.prolog_cafe.lang.Term;
+import com.googlecode.prolog_cafe.lang.VariableTerm;
/**
* Resolves the valid range for a label on a CurrentUser.
@@ -54,18 +56,18 @@
Term a3 = arg3.dereference();
Term a4 = arg4.dereference();
- if (a1.isVariable()) {
+ if (a1 instanceof VariableTerm) {
throw new PInstantiationException(this, 1);
}
- if (!a1.isSymbol()) {
+ if (!(a1 instanceof SymbolTerm)) {
throw new IllegalTypeException(this, 1, "atom", a1);
}
String label = a1.name();
- if (a2.isVariable()) {
+ if (a2 instanceof VariableTerm) {
throw new PInstantiationException(this, 2);
}
- if (!a2.isJavaObject() || !a2.convertible(CurrentUser.class)) {
+ if (!(a2 instanceof JavaObjectTerm) || !a2.convertible(CurrentUser.class)) {
throw new IllegalTypeException(this, 2, "CurrentUser)", a2);
}
CurrentUser user = (CurrentUser) ((JavaObjectTerm) a2).object();
diff --git a/gerrit-server/src/main/java/gerrit/PRED_change_branch_1.java b/gerrit-server/src/main/java/gerrit/PRED_change_branch_1.java
index b835b34..ee5bdc9 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_change_branch_1.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_change_branch_1.java
@@ -17,10 +17,10 @@
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.rules.StoredValues;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
import com.googlecode.prolog_cafe.lang.Operation;
import com.googlecode.prolog_cafe.lang.Predicate;
import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.PrologException;
import com.googlecode.prolog_cafe.lang.SymbolTerm;
import com.googlecode.prolog_cafe.lang.Term;
diff --git a/gerrit-server/src/main/java/gerrit/PRED_change_owner_1.java b/gerrit-server/src/main/java/gerrit/PRED_change_owner_1.java
index 51502f8..b56b036 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_change_owner_1.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_change_owner_1.java
@@ -17,11 +17,11 @@
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.rules.StoredValues;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
import com.googlecode.prolog_cafe.lang.IntegerTerm;
import com.googlecode.prolog_cafe.lang.Operation;
import com.googlecode.prolog_cafe.lang.Predicate;
import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.PrologException;
import com.googlecode.prolog_cafe.lang.StructureTerm;
import com.googlecode.prolog_cafe.lang.SymbolTerm;
import com.googlecode.prolog_cafe.lang.Term;
diff --git a/gerrit-server/src/main/java/gerrit/PRED_change_project_1.java b/gerrit-server/src/main/java/gerrit/PRED_change_project_1.java
index 29c6704..e131605 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_change_project_1.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_change_project_1.java
@@ -17,10 +17,10 @@
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.rules.StoredValues;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
import com.googlecode.prolog_cafe.lang.Operation;
import com.googlecode.prolog_cafe.lang.Predicate;
import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.PrologException;
import com.googlecode.prolog_cafe.lang.SymbolTerm;
import com.googlecode.prolog_cafe.lang.Term;
diff --git a/gerrit-server/src/main/java/gerrit/PRED_change_topic_1.java b/gerrit-server/src/main/java/gerrit/PRED_change_topic_1.java
index 7ba648f..d1a91d9 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_change_topic_1.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_change_topic_1.java
@@ -17,10 +17,10 @@
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.rules.StoredValues;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
import com.googlecode.prolog_cafe.lang.Operation;
import com.googlecode.prolog_cafe.lang.Predicate;
import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.PrologException;
import com.googlecode.prolog_cafe.lang.SymbolTerm;
import com.googlecode.prolog_cafe.lang.Term;
diff --git a/gerrit-server/src/main/java/gerrit/PRED_commit_author_3.java b/gerrit-server/src/main/java/gerrit/PRED_commit_author_3.java
index 3700909..59c4c18 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_commit_author_3.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_commit_author_3.java
@@ -18,9 +18,9 @@
import com.google.gerrit.reviewdb.client.UserIdentity;
import com.google.gerrit.rules.StoredValues;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
import com.googlecode.prolog_cafe.lang.Operation;
import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.PrologException;
import com.googlecode.prolog_cafe.lang.Term;
public class PRED_commit_author_3 extends AbstractCommitUserIdentityPredicate {
diff --git a/gerrit-server/src/main/java/gerrit/PRED_commit_committer_3.java b/gerrit-server/src/main/java/gerrit/PRED_commit_committer_3.java
index 64823df..77a668b 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_commit_committer_3.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_commit_committer_3.java
@@ -18,9 +18,9 @@
import com.google.gerrit.reviewdb.client.UserIdentity;
import com.google.gerrit.rules.StoredValues;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
import com.googlecode.prolog_cafe.lang.Operation;
import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.PrologException;
import com.googlecode.prolog_cafe.lang.Term;
public class PRED_commit_committer_3 extends AbstractCommitUserIdentityPredicate {
diff --git a/gerrit-server/src/main/java/gerrit/PRED_commit_delta_4.java b/gerrit-server/src/main/java/gerrit/PRED_commit_delta_4.java
index 51a871c..893c5bc 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_commit_delta_4.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_commit_delta_4.java
@@ -19,15 +19,16 @@
import com.google.gerrit.server.patch.PatchList;
import com.google.gerrit.server.patch.PatchListEntry;
-import com.googlecode.prolog_cafe.lang.IllegalTypeException;
+import com.googlecode.prolog_cafe.exceptions.IllegalTypeException;
+import com.googlecode.prolog_cafe.exceptions.PInstantiationException;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
import com.googlecode.prolog_cafe.lang.JavaObjectTerm;
import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.PInstantiationException;
import com.googlecode.prolog_cafe.lang.Predicate;
import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.PrologException;
import com.googlecode.prolog_cafe.lang.SymbolTerm;
import com.googlecode.prolog_cafe.lang.Term;
+import com.googlecode.prolog_cafe.lang.VariableTerm;
import java.util.Iterator;
import java.util.regex.Pattern;
@@ -66,22 +67,22 @@
engine.setB0();
Term a1 = arg1.dereference();
- if (a1.isVariable()) {
+ if (a1 instanceof VariableTerm) {
throw new PInstantiationException(this, 1);
}
- if (!a1.isSymbol()) {
+ if (!(a1 instanceof SymbolTerm)) {
throw new IllegalTypeException(this, 1, "symbol", a1);
}
Pattern regex = Pattern.compile(a1.name());
- engine.areg1 = new JavaObjectTerm(regex);
- engine.areg2 = arg2;
- engine.areg3 = arg3;
- engine.areg4 = arg4;
+ engine.r1 = new JavaObjectTerm(regex);
+ engine.r2 = arg2;
+ engine.r3 = arg3;
+ engine.r4 = arg4;
PatchList pl = StoredValues.PATCH_LIST.get(engine);
Iterator<PatchListEntry> iter = pl.getPatches().iterator();
- engine.areg5 = new JavaObjectTerm(iter);
+ engine.r5 = new JavaObjectTerm(iter);
return engine.jtry5(commit_delta_check, commit_delta_next);
}
@@ -89,11 +90,11 @@
private static final class PRED_commit_delta_check extends Operation {
@Override
public Operation exec(Prolog engine) {
- Term a1 = engine.areg1;
- Term a2 = engine.areg2;
- Term a3 = engine.areg3;
- Term a4 = engine.areg4;
- Term a5 = engine.areg5;
+ Term a1 = engine.r1;
+ Term a2 = engine.r2;
+ Term a3 = engine.r3;
+ Term a4 = engine.r4;
+ Term a5 = engine.r5;
Pattern regex = (Pattern)((JavaObjectTerm)a1).object();
@SuppressWarnings("unchecked")
@@ -144,7 +145,7 @@
private static final class PRED_commit_delta_empty extends Operation {
@Override
public Operation exec(Prolog engine) {
- Term a5 = engine.areg5;
+ Term a5 = engine.r5;
@SuppressWarnings("unchecked")
Iterator<PatchListEntry> iter =
diff --git a/gerrit-server/src/main/java/gerrit/PRED_commit_edits_2.java b/gerrit-server/src/main/java/gerrit/PRED_commit_edits_2.java
index 2c7949c..c97a964 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_commit_edits_2.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_commit_edits_2.java
@@ -19,14 +19,16 @@
import com.google.gerrit.server.patch.PatchListEntry;
import com.google.gerrit.server.patch.Text;
-import com.googlecode.prolog_cafe.lang.IllegalTypeException;
-import com.googlecode.prolog_cafe.lang.JavaException;
+import com.googlecode.prolog_cafe.exceptions.IllegalTypeException;
+import com.googlecode.prolog_cafe.exceptions.JavaException;
+import com.googlecode.prolog_cafe.exceptions.PInstantiationException;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.PInstantiationException;
import com.googlecode.prolog_cafe.lang.Predicate;
import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.PrologException;
+import com.googlecode.prolog_cafe.lang.SymbolTerm;
import com.googlecode.prolog_cafe.lang.Term;
+import com.googlecode.prolog_cafe.lang.VariableTerm;
import org.eclipse.jgit.diff.Edit;
import org.eclipse.jgit.errors.CorruptObjectException;
@@ -73,11 +75,10 @@
PatchList pl = StoredValues.PATCH_LIST.get(engine);
Repository repo = StoredValues.REPOSITORY.get(engine);
- final ObjectReader reader = repo.newObjectReader();
- final RevTree aTree;
- final RevTree bTree;
- try {
- final RevWalk rw = new RevWalk(reader);
+ try (ObjectReader reader = repo.newObjectReader();
+ RevWalk rw = new RevWalk(reader)) {
+ final RevTree aTree;
+ final RevTree bTree;
final RevCommit bCommit = rw.parseCommit(pl.getNewId());
if (pl.getOldId() != null) {
@@ -129,18 +130,16 @@
}
} catch (IOException err) {
throw new JavaException(this, 1, err);
- } finally {
- reader.release();
}
return engine.fail();
}
private Pattern getRegexParameter(Term term) {
- if (term.isVariable()) {
+ if (term instanceof VariableTerm) {
throw new PInstantiationException(this, 1);
}
- if (!term.isSymbol()) {
+ if (!(term instanceof SymbolTerm)) {
throw new IllegalTypeException(this, 1, "symbol", term);
}
return Pattern.compile(term.name(), Pattern.MULTILINE);
@@ -161,4 +160,4 @@
}
return new Text(reader.open(tw.getObjectId(0), Constants.OBJ_BLOB));
}
-}
\ No newline at end of file
+}
diff --git a/gerrit-server/src/main/java/gerrit/PRED_commit_message_1.java b/gerrit-server/src/main/java/gerrit/PRED_commit_message_1.java
index e2eb6b1..6e1dc91 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_commit_message_1.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_commit_message_1.java
@@ -17,10 +17,10 @@
import com.google.gerrit.reviewdb.client.PatchSetInfo;
import com.google.gerrit.rules.StoredValues;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
import com.googlecode.prolog_cafe.lang.Operation;
import com.googlecode.prolog_cafe.lang.Predicate;
import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.PrologException;
import com.googlecode.prolog_cafe.lang.SymbolTerm;
import com.googlecode.prolog_cafe.lang.Term;
diff --git a/gerrit-server/src/main/java/gerrit/PRED_commit_stats_3.java b/gerrit-server/src/main/java/gerrit/PRED_commit_stats_3.java
index 83878be..4f665ee 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_commit_stats_3.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_commit_stats_3.java
@@ -17,11 +17,11 @@
import com.google.gerrit.rules.StoredValues;
import com.google.gerrit.server.patch.PatchList;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
import com.googlecode.prolog_cafe.lang.IntegerTerm;
import com.googlecode.prolog_cafe.lang.Operation;
import com.googlecode.prolog_cafe.lang.Predicate;
import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.PrologException;
import com.googlecode.prolog_cafe.lang.Term;
/**
diff --git a/gerrit-server/src/main/java/gerrit/PRED_current_user_1.java b/gerrit-server/src/main/java/gerrit/PRED_current_user_1.java
index 6d0dd0f..a63b1e7 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_current_user_1.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_current_user_1.java
@@ -21,12 +21,12 @@
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.PeerDaemonUser;
-import com.googlecode.prolog_cafe.lang.EvaluationException;
+import com.googlecode.prolog_cafe.exceptions.EvaluationException;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
import com.googlecode.prolog_cafe.lang.IntegerTerm;
import com.googlecode.prolog_cafe.lang.Operation;
import com.googlecode.prolog_cafe.lang.Predicate;
import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.PrologException;
import com.googlecode.prolog_cafe.lang.StructureTerm;
import com.googlecode.prolog_cafe.lang.SymbolTerm;
import com.googlecode.prolog_cafe.lang.Term;
diff --git a/gerrit-server/src/main/java/gerrit/PRED_current_user_2.java b/gerrit-server/src/main/java/gerrit/PRED_current_user_2.java
index 62fe075..3ee8d82 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_current_user_2.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_current_user_2.java
@@ -24,17 +24,18 @@
import com.google.gerrit.server.IdentifiedUser;
import com.google.inject.util.Providers;
-import com.googlecode.prolog_cafe.lang.IllegalTypeException;
+import com.googlecode.prolog_cafe.exceptions.IllegalTypeException;
+import com.googlecode.prolog_cafe.exceptions.PInstantiationException;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
import com.googlecode.prolog_cafe.lang.IntegerTerm;
import com.googlecode.prolog_cafe.lang.JavaObjectTerm;
import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.PInstantiationException;
import com.googlecode.prolog_cafe.lang.Predicate;
import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.PrologException;
import com.googlecode.prolog_cafe.lang.StructureTerm;
import com.googlecode.prolog_cafe.lang.SymbolTerm;
import com.googlecode.prolog_cafe.lang.Term;
+import com.googlecode.prolog_cafe.lang.VariableTerm;
import java.util.Map;
@@ -64,7 +65,7 @@
Term a1 = arg1.dereference();
Term a2 = arg2.dereference();
- if (a1.isVariable()) {
+ if (a1 instanceof VariableTerm) {
throw new PInstantiationException(this, 1);
}
@@ -76,7 +77,7 @@
}
public Term createUser(Prolog engine, Term key) {
- if (!key.isStructure()
+ if (!(key instanceof StructureTerm)
|| key.arity() != 1
|| !((StructureTerm) key).functor().equals(user)) {
throw new IllegalTypeException(this, 1, "user(int)", key);
@@ -84,7 +85,7 @@
Term idTerm = key.arg(0);
CurrentUser user;
- if (idTerm.isInteger()) {
+ if (idTerm instanceof IntegerTerm) {
Map<Account.Id, IdentifiedUser> cache = StoredValues.USERS.get(engine);
Account.Id accountId = new Account.Id(((IntegerTerm) idTerm).intValue());
user = cache.get(accountId);
diff --git a/gerrit-server/src/main/java/gerrit/PRED_get_legacy_label_types_1.java b/gerrit-server/src/main/java/gerrit/PRED_get_legacy_label_types_1.java
index 698c11c..f93e424 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_get_legacy_label_types_1.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_get_legacy_label_types_1.java
@@ -18,12 +18,12 @@
import com.google.gerrit.common.data.LabelValue;
import com.google.gerrit.rules.StoredValues;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
import com.googlecode.prolog_cafe.lang.IntegerTerm;
import com.googlecode.prolog_cafe.lang.ListTerm;
import com.googlecode.prolog_cafe.lang.Operation;
import com.googlecode.prolog_cafe.lang.Predicate;
import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.PrologException;
import com.googlecode.prolog_cafe.lang.StructureTerm;
import com.googlecode.prolog_cafe.lang.SymbolTerm;
import com.googlecode.prolog_cafe.lang.Term;
diff --git a/gerrit-server/src/main/java/gerrit/PRED_project_default_submit_type_1.java b/gerrit-server/src/main/java/gerrit/PRED_project_default_submit_type_1.java
index 824c6ef..b1a8a74 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_project_default_submit_type_1.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_project_default_submit_type_1.java
@@ -18,10 +18,10 @@
import com.google.gerrit.rules.StoredValues;
import com.google.gerrit.server.project.ChangeControl;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
import com.googlecode.prolog_cafe.lang.Operation;
import com.googlecode.prolog_cafe.lang.Predicate;
import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.PrologException;
import com.googlecode.prolog_cafe.lang.SymbolTerm;
import com.googlecode.prolog_cafe.lang.Term;
diff --git a/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java b/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java
index f5dca09..74ab572 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java
@@ -33,7 +33,8 @@
import com.google.gerrit.testutil.InMemoryRepositoryManager;
import com.google.inject.AbstractModule;
-import com.googlecode.prolog_cafe.compiler.CompileException;
+import com.googlecode.prolog_cafe.exceptions.CompileException;
+import com.googlecode.prolog_cafe.exceptions.ReductionLimitException;
import com.googlecode.prolog_cafe.lang.JavaObjectTerm;
import com.googlecode.prolog_cafe.lang.Prolog;
import com.googlecode.prolog_cafe.lang.StructureTerm;
@@ -112,7 +113,6 @@
public void testReductionLimit() throws CompileException {
PrologEnvironment env = envFactory.create(machine);
setUpEnvironment(env);
- env.setEnabled(Prolog.Feature.IO, true);
String script = "loopy :- b(5).\n"
+ "b(N) :- N > 0, !, S = N - 1, b(S).\n"
diff --git a/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java b/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java
index aaab173..027d043 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java
@@ -22,7 +22,7 @@
import com.google.inject.Guice;
import com.google.inject.Module;
-import com.googlecode.prolog_cafe.compiler.CompileException;
+import com.googlecode.prolog_cafe.exceptions.CompileException;
import com.googlecode.prolog_cafe.lang.BufferingPrologControl;
import com.googlecode.prolog_cafe.lang.JavaObjectTerm;
import com.googlecode.prolog_cafe.lang.Prolog;
@@ -185,8 +185,8 @@
private Term removePackage(Term test) {
Term name = test;
- if (name.isStructure() && ":".equals(((StructureTerm) name).name())) {
- name = ((StructureTerm) name).args()[1];
+ if (name instanceof StructureTerm && ":".equals(name.name())) {
+ name = name.arg(1);
}
return name;
}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/change/IncludedInResolverTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/change/IncludedInResolverTest.java
index dc9724c..4cd31ab 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/change/IncludedInResolverTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/change/IncludedInResolverTest.java
@@ -86,6 +86,8 @@
*/
+ // TODO(dborowitz): Use try/finally when this doesn't double-close the repo.
+ @SuppressWarnings("resource")
Git git = new Git(db);
revWalk = new RevWalk(db);
// Version 1.0
@@ -129,7 +131,7 @@
@Override
@After
public void tearDown() throws Exception {
- revWalk.release();
+ revWalk.close();
super.tearDown();
}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/config/SitePathsTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/config/SitePathsTest.java
index 5fdecf0..5533d53 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/config/SitePathsTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/config/SitePathsTest.java
@@ -25,88 +25,89 @@
import org.junit.Test;
-import java.io.File;
-import java.io.FileNotFoundException;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.NotDirectoryException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
public class SitePathsTest {
@Test
public void testCreate_NotExisting() throws IOException {
- final File root = random();
+ final Path root = random();
final SitePaths site = new SitePaths(root);
assertTrue(site.isNew);
assertEquals(root, site.site_path);
- assertEquals(new File(root, "etc"), site.etc_dir);
+ assertEquals(root.resolve("etc"), site.etc_dir);
}
@Test
public void testCreate_Empty() throws IOException {
- final File root = random();
+ final Path root = random();
try {
- assertTrue(root.mkdir());
+ Files.createDirectory(root);
final SitePaths site = new SitePaths(root);
assertTrue(site.isNew);
assertEquals(root, site.site_path);
} finally {
- root.delete();
+ Files.delete(root);
}
}
@Test
public void testCreate_NonEmpty() throws IOException {
- final File root = random();
- final File txt = new File(root, "test.txt");
+ final Path root = random();
+ final Path txt = root.resolve("test.txt");
try {
- assertTrue(root.mkdir());
- assertTrue(txt.createNewFile());
+ Files.createDirectory(root);
+ Files.createFile(txt);
final SitePaths site = new SitePaths(root);
assertFalse(site.isNew);
assertEquals(root, site.site_path);
} finally {
- txt.delete();
- root.delete();
+ Files.delete(txt);
+ Files.delete(root);
}
}
@Test
public void testCreate_NotDirectory() throws IOException {
- final File root = random();
+ final Path root = random();
try {
- assertTrue(root.createNewFile());
+ Files.createFile(root);
try {
new SitePaths(root);
fail("Did not throw exception");
- } catch (FileNotFoundException e) {
- assertEquals("Not a directory: " + root.getPath(), e.getMessage());
+ } catch (NotDirectoryException e) {
+ // Expected.
}
} finally {
- root.delete();
+ Files.delete(root);
}
}
@Test
public void testResolve() throws IOException {
- final File root = random();
+ final Path root = random();
final SitePaths site = new SitePaths(root);
assertNull(site.resolve(null));
assertNull(site.resolve(""));
assertNotNull(site.resolve("a"));
- assertEquals(new File(root, "a").getCanonicalFile(), site.resolve("a"));
+ assertEquals(root.resolve("a").toAbsolutePath().normalize(),
+ site.resolve("a"));
final String pfx = HostPlatform.isWin32() ? "C:/" : "/";
assertNotNull(site.resolve(pfx + "a"));
- assertEquals(new File(pfx + "a").getCanonicalFile(), site.resolve(pfx + "a"));
+ assertEquals(Paths.get(pfx + "a"), site.resolve(pfx + "a"));
}
- private static File random() throws IOException {
- File tmp = File.createTempFile("gerrit_test_", "_site");
- if (!tmp.delete()) {
- throw new IOException("Cannot create " + tmp.getPath());
- }
+ private static Path random() throws IOException {
+ Path tmp = Files.createTempFile("gerrit_test_", "_site");
+ Files.deleteIfExists(tmp);
return tmp;
}
}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/SubmoduleOpTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/git/SubmoduleOpTest.java
index f4f989f..c2f3f6f 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/git/SubmoduleOpTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/git/SubmoduleOpTest.java
@@ -118,34 +118,37 @@
public void testEmptyCommit() throws Exception {
expect(schemaFactory.open()).andReturn(schema);
- final Repository realDb = createWorkRepository();
- final Git git = new Git(realDb);
+ try (Repository realDb = createWorkRepository()) {
+ // TODO(dborowitz): Use try/finally when this doesn't double-close the repo.
+ @SuppressWarnings("resource")
+ final Git git = new Git(realDb);
- final RevCommit mergeTip = git.commit().setMessage("test").call();
+ final RevCommit mergeTip = git.commit().setMessage("test").call();
- final Branch.NameKey branchNameKey =
- new Branch.NameKey(new Project.NameKey("test-project"), "test-branch");
+ final Branch.NameKey branchNameKey =
+ new Branch.NameKey(new Project.NameKey("test-project"), "test-branch");
- expect(urlProvider.get()).andReturn("http://localhost:8080");
+ expect(urlProvider.get()).andReturn("http://localhost:8080");
- expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
- final ResultSet<SubmoduleSubscription> emptySubscriptions =
- new ListResultSet<>(new ArrayList<SubmoduleSubscription>());
- expect(subscriptions.bySubmodule(branchNameKey)).andReturn(
- emptySubscriptions);
+ expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
+ final ResultSet<SubmoduleSubscription> emptySubscriptions =
+ new ListResultSet<>(new ArrayList<SubmoduleSubscription>());
+ expect(subscriptions.bySubmodule(branchNameKey)).andReturn(
+ emptySubscriptions);
- schema.close();
+ schema.close();
- doReplay();
+ doReplay();
- final SubmoduleOp submoduleOp =
- new SubmoduleOp(branchNameKey, mergeTip, new RevWalk(realDb), urlProvider,
- schemaFactory, realDb, null, new ArrayList<Change>(), null, null,
- null, null, null, null);
+ final SubmoduleOp submoduleOp =
+ new SubmoduleOp(branchNameKey, mergeTip, new RevWalk(realDb), urlProvider,
+ schemaFactory, realDb, null, new ArrayList<Change>(), null, null,
+ null, null, null, null);
- submoduleOp.update();
+ submoduleOp.update();
- doVerify();
+ doVerify();
+ }
}
/**
@@ -588,85 +591,89 @@
public void testOneSubscriberToUpdate() throws Exception {
expect(schemaFactory.open()).andReturn(schema);
- final Repository sourceRepository = createWorkRepository();
- final Git sourceGit = new Git(sourceRepository);
+ try (Repository sourceRepository = createWorkRepository();
+ Repository targetRepository = createWorkRepository()) {
+ // TODO(dborowitz): Use try/finally when this doesn't double-close the repo.
+ @SuppressWarnings("resource")
+ final Git sourceGit = new Git(sourceRepository);
+ // TODO(dborowitz): Use try/finally when this doesn't double-close the repo.
+ @SuppressWarnings("resource")
+ final Git targetGit = new Git(targetRepository);
- addRegularFileToIndex("file.txt", "test content", sourceRepository);
+ addRegularFileToIndex("file.txt", "test content", sourceRepository);
- final RevCommit sourceMergeTip =
- sourceGit.commit().setMessage("test").call();
+ final RevCommit sourceMergeTip =
+ sourceGit.commit().setMessage("test").call();
- final Branch.NameKey sourceBranchNameKey =
- new Branch.NameKey(new Project.NameKey("source-project"),
- "refs/heads/master");
+ final Branch.NameKey sourceBranchNameKey =
+ new Branch.NameKey(new Project.NameKey("source-project"),
+ "refs/heads/master");
- final CodeReviewCommit codeReviewCommit =
- new CodeReviewCommit(sourceMergeTip.toObjectId());
- final Change submittedChange = new Change(
- new Change.Key(sourceMergeTip.toObjectId().getName()), new Change.Id(1),
- new Account.Id(1), sourceBranchNameKey, TimeUtil.nowTs());
+ final CodeReviewCommit codeReviewCommit =
+ new CodeReviewCommit(sourceMergeTip.toObjectId());
+ final Change submittedChange = new Change(
+ new Change.Key(sourceMergeTip.toObjectId().getName()), new Change.Id(1),
+ new Account.Id(1), sourceBranchNameKey, TimeUtil.nowTs());
- final Map<Change.Id, CodeReviewCommit> mergedCommits = new HashMap<>();
- mergedCommits.put(submittedChange.getId(), codeReviewCommit);
+ final Map<Change.Id, CodeReviewCommit> mergedCommits = new HashMap<>();
+ mergedCommits.put(submittedChange.getId(), codeReviewCommit);
- final List<Change> submitted = new ArrayList<>();
- submitted.add(submittedChange);
+ final List<Change> submitted = new ArrayList<>();
+ submitted.add(submittedChange);
- final Repository targetRepository = createWorkRepository();
- final Git targetGit = new Git(targetRepository);
+ addGitLinkToIndex("a", sourceMergeTip.copy(), targetRepository);
- addGitLinkToIndex("a", sourceMergeTip.copy(), targetRepository);
+ targetGit.commit().setMessage("test").call();
- targetGit.commit().setMessage("test").call();
+ final Branch.NameKey targetBranchNameKey =
+ new Branch.NameKey(new Project.NameKey("target-project"),
+ sourceBranchNameKey.get());
- final Branch.NameKey targetBranchNameKey =
- new Branch.NameKey(new Project.NameKey("target-project"),
- sourceBranchNameKey.get());
+ expect(urlProvider.get()).andReturn("http://localhost:8080");
- expect(urlProvider.get()).andReturn("http://localhost:8080");
+ expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
+ final ResultSet<SubmoduleSubscription> subscribers =
+ new ListResultSet<>(Collections
+ .singletonList(new SubmoduleSubscription(targetBranchNameKey,
+ sourceBranchNameKey, "source-project")));
+ expect(subscriptions.bySubmodule(sourceBranchNameKey)).andReturn(
+ subscribers);
- expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
- final ResultSet<SubmoduleSubscription> subscribers =
- new ListResultSet<>(Collections
- .singletonList(new SubmoduleSubscription(targetBranchNameKey,
- sourceBranchNameKey, "source-project")));
- expect(subscriptions.bySubmodule(sourceBranchNameKey)).andReturn(
- subscribers);
+ expect(repoManager.openRepository(targetBranchNameKey.getParentKey()))
+ .andReturn(targetRepository).anyTimes();
- expect(repoManager.openRepository(targetBranchNameKey.getParentKey()))
- .andReturn(targetRepository).anyTimes();
+ Capture<RefUpdate> ruCapture = new Capture<>();
+ gitRefUpdated.fire(eq(targetBranchNameKey.getParentKey()),
+ capture(ruCapture));
+ changeHooks.doRefUpdatedHook(eq(targetBranchNameKey),
+ anyObject(RefUpdate.class), EasyMock.<Account>isNull());
- Capture<RefUpdate> ruCapture = new Capture<>();
- gitRefUpdated.fire(eq(targetBranchNameKey.getParentKey()),
- capture(ruCapture));
- changeHooks.doRefUpdatedHook(eq(targetBranchNameKey),
- anyObject(RefUpdate.class), EasyMock.<Account>isNull());
+ expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
+ final ResultSet<SubmoduleSubscription> emptySubscriptions =
+ new ListResultSet<>(new ArrayList<SubmoduleSubscription>());
+ expect(subscriptions.bySubmodule(targetBranchNameKey)).andReturn(
+ emptySubscriptions);
- expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
- final ResultSet<SubmoduleSubscription> emptySubscriptions =
- new ListResultSet<>(new ArrayList<SubmoduleSubscription>());
- expect(subscriptions.bySubmodule(targetBranchNameKey)).andReturn(
- emptySubscriptions);
+ schema.close();
- schema.close();
+ final PersonIdent myIdent =
+ new PersonIdent("test-user", "test-user@email.com");
- final PersonIdent myIdent =
- new PersonIdent("test-user", "test-user@email.com");
+ doReplay();
- doReplay();
+ final SubmoduleOp submoduleOp =
+ new SubmoduleOp(sourceBranchNameKey, sourceMergeTip, new RevWalk(
+ sourceRepository), urlProvider, schemaFactory, sourceRepository,
+ new Project(sourceBranchNameKey.getParentKey()), submitted,
+ mergedCommits, myIdent, repoManager, gitRefUpdated, null,
+ changeHooks);
- final SubmoduleOp submoduleOp =
- new SubmoduleOp(sourceBranchNameKey, sourceMergeTip, new RevWalk(
- sourceRepository), urlProvider, schemaFactory, sourceRepository,
- new Project(sourceBranchNameKey.getParentKey()), submitted,
- mergedCommits, myIdent, repoManager, gitRefUpdated, null,
- changeHooks);
+ submoduleOp.update();
- submoduleOp.update();
-
- doVerify();
- RefUpdate ru = ruCapture.getValue();
- assertEquals(ru.getName(), targetBranchNameKey.get());
+ doVerify();
+ RefUpdate ru = ruCapture.getValue();
+ assertEquals(ru.getName(), targetBranchNameKey.get());
+ }
}
/**
@@ -693,86 +700,90 @@
public void testAvoidingCircularReference() throws Exception {
expect(schemaFactory.open()).andReturn(schema);
- final Repository sourceRepository = createWorkRepository();
- final Git sourceGit = new Git(sourceRepository);
+ try (Repository sourceRepository = createWorkRepository();
+ Repository targetRepository = createWorkRepository()) {
+ // TODO(dborowitz): Use try/finally when this doesn't double-close the repo.
+ @SuppressWarnings("resource")
+ final Git sourceGit = new Git(sourceRepository);
+ // TODO(dborowitz): Use try/finally when this doesn't double-close the repo.
+ @SuppressWarnings("resource")
+ final Git targetGit = new Git(targetRepository);
- addRegularFileToIndex("file.txt", "test content", sourceRepository);
+ addRegularFileToIndex("file.txt", "test content", sourceRepository);
- final RevCommit sourceMergeTip =
- sourceGit.commit().setMessage("test").call();
+ final RevCommit sourceMergeTip =
+ sourceGit.commit().setMessage("test").call();
- final Branch.NameKey sourceBranchNameKey =
- new Branch.NameKey(new Project.NameKey("source-project"),
- "refs/heads/master");
+ final Branch.NameKey sourceBranchNameKey =
+ new Branch.NameKey(new Project.NameKey("source-project"),
+ "refs/heads/master");
- final CodeReviewCommit codeReviewCommit =
- new CodeReviewCommit(sourceMergeTip.toObjectId());
- final Change submittedChange = new Change(
- new Change.Key(sourceMergeTip.toObjectId().getName()), new Change.Id(1),
- new Account.Id(1), sourceBranchNameKey, TimeUtil.nowTs());
+ final CodeReviewCommit codeReviewCommit =
+ new CodeReviewCommit(sourceMergeTip.toObjectId());
+ final Change submittedChange = new Change(
+ new Change.Key(sourceMergeTip.toObjectId().getName()), new Change.Id(1),
+ new Account.Id(1), sourceBranchNameKey, TimeUtil.nowTs());
- final Map<Change.Id, CodeReviewCommit> mergedCommits = new HashMap<>();
- mergedCommits.put(submittedChange.getId(), codeReviewCommit);
+ final Map<Change.Id, CodeReviewCommit> mergedCommits = new HashMap<>();
+ mergedCommits.put(submittedChange.getId(), codeReviewCommit);
- final List<Change> submitted = new ArrayList<>();
- submitted.add(submittedChange);
+ final List<Change> submitted = new ArrayList<>();
+ submitted.add(submittedChange);
- final Repository targetRepository = createWorkRepository();
- final Git targetGit = new Git(targetRepository);
+ addGitLinkToIndex("a", sourceMergeTip.copy(), targetRepository);
- addGitLinkToIndex("a", sourceMergeTip.copy(), targetRepository);
+ targetGit.commit().setMessage("test").call();
- targetGit.commit().setMessage("test").call();
+ final Branch.NameKey targetBranchNameKey =
+ new Branch.NameKey(new Project.NameKey("target-project"),
+ sourceBranchNameKey.get());
- final Branch.NameKey targetBranchNameKey =
- new Branch.NameKey(new Project.NameKey("target-project"),
- sourceBranchNameKey.get());
+ expect(urlProvider.get()).andReturn("http://localhost:8080");
- expect(urlProvider.get()).andReturn("http://localhost:8080");
+ expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
+ final ResultSet<SubmoduleSubscription> subscribers =
+ new ListResultSet<>(Collections
+ .singletonList(new SubmoduleSubscription(targetBranchNameKey,
+ sourceBranchNameKey, "source-project")));
+ expect(subscriptions.bySubmodule(sourceBranchNameKey)).andReturn(
+ subscribers);
- expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
- final ResultSet<SubmoduleSubscription> subscribers =
- new ListResultSet<>(Collections
- .singletonList(new SubmoduleSubscription(targetBranchNameKey,
- sourceBranchNameKey, "source-project")));
- expect(subscriptions.bySubmodule(sourceBranchNameKey)).andReturn(
- subscribers);
+ expect(repoManager.openRepository(targetBranchNameKey.getParentKey()))
+ .andReturn(targetRepository).anyTimes();
- expect(repoManager.openRepository(targetBranchNameKey.getParentKey()))
- .andReturn(targetRepository).anyTimes();
+ Capture<RefUpdate> ruCapture = new Capture<>();
+ gitRefUpdated.fire(eq(targetBranchNameKey.getParentKey()),
+ capture(ruCapture));
+ changeHooks.doRefUpdatedHook(eq(targetBranchNameKey),
+ anyObject(RefUpdate.class), EasyMock.<Account>isNull());
- Capture<RefUpdate> ruCapture = new Capture<>();
- gitRefUpdated.fire(eq(targetBranchNameKey.getParentKey()),
- capture(ruCapture));
- changeHooks.doRefUpdatedHook(eq(targetBranchNameKey),
- anyObject(RefUpdate.class), EasyMock.<Account>isNull());
+ expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
+ final ResultSet<SubmoduleSubscription> incorrectSubscriptions =
+ new ListResultSet<>(Collections
+ .singletonList(new SubmoduleSubscription(sourceBranchNameKey,
+ targetBranchNameKey, "target-project")));
+ expect(subscriptions.bySubmodule(targetBranchNameKey)).andReturn(
+ incorrectSubscriptions);
- expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
- final ResultSet<SubmoduleSubscription> incorrectSubscriptions =
- new ListResultSet<>(Collections
- .singletonList(new SubmoduleSubscription(sourceBranchNameKey,
- targetBranchNameKey, "target-project")));
- expect(subscriptions.bySubmodule(targetBranchNameKey)).andReturn(
- incorrectSubscriptions);
+ schema.close();
- schema.close();
+ final PersonIdent myIdent =
+ new PersonIdent("test-user", "test-user@email.com");
- final PersonIdent myIdent =
- new PersonIdent("test-user", "test-user@email.com");
+ doReplay();
- doReplay();
+ final SubmoduleOp submoduleOp =
+ new SubmoduleOp(sourceBranchNameKey, sourceMergeTip, new RevWalk(
+ sourceRepository), urlProvider, schemaFactory, sourceRepository,
+ new Project(sourceBranchNameKey.getParentKey()), submitted,
+ mergedCommits, myIdent, repoManager, gitRefUpdated, null, changeHooks);
- final SubmoduleOp submoduleOp =
- new SubmoduleOp(sourceBranchNameKey, sourceMergeTip, new RevWalk(
- sourceRepository), urlProvider, schemaFactory, sourceRepository,
- new Project(sourceBranchNameKey.getParentKey()), submitted,
- mergedCommits, myIdent, repoManager, gitRefUpdated, null, changeHooks);
+ submoduleOp.update();
- submoduleOp.update();
-
- doVerify();
- RefUpdate ru = ruCapture.getValue();
- assertEquals(ru.getName(), targetBranchNameKey.get());
+ doVerify();
+ RefUpdate ru = ruCapture.getValue();
+ assertEquals(ru.getName(), targetBranchNameKey.get());
+ }
}
/**
@@ -862,67 +873,70 @@
final List<SubmoduleSubscription> previousSubscriptions) throws Exception {
expect(schemaFactory.open()).andReturn(schema);
- final Repository realDb = createWorkRepository();
- final Git git = new Git(realDb);
+ try (Repository realDb = createWorkRepository()) {
+ // TODO(dborowitz): Use try/finally when this doesn't double-close the repo.
+ @SuppressWarnings("resource")
+ final Git git = new Git(realDb);
- addRegularFileToIndex(".gitmodules", gitModulesFileContent, realDb);
+ addRegularFileToIndex(".gitmodules", gitModulesFileContent, realDb);
- final RevCommit mergeTip = git.commit().setMessage("test").call();
+ final RevCommit mergeTip = git.commit().setMessage("test").call();
- expect(urlProvider.get()).andReturn("http://localhost:8080").times(2);
+ expect(urlProvider.get()).andReturn("http://localhost:8080").times(2);
- expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
- expect(subscriptions.bySuperProject(mergedBranch)).andReturn(
- new ListResultSet<>(previousSubscriptions));
-
- SortedSet<Project.NameKey> existingProjects = new TreeSet<>();
-
- for (SubmoduleSubscription extracted : extractedSubscriptions) {
- existingProjects.add(extracted.getSubmodule().getParentKey());
- }
-
- for (int index = 0; index < extractedSubscriptions.size(); index++) {
- expect(repoManager.list()).andReturn(existingProjects);
- }
-
- final Set<SubmoduleSubscription> alreadySubscribeds = new HashSet<>();
- for (SubmoduleSubscription s : extractedSubscriptions) {
- if (previousSubscriptions.contains(s)) {
- alreadySubscribeds.add(s);
- }
- }
-
- final Set<SubmoduleSubscription> subscriptionsToRemove =
- new HashSet<>(previousSubscriptions);
- final List<SubmoduleSubscription> subscriptionsToInsert =
- new ArrayList<>(extractedSubscriptions);
-
- subscriptionsToRemove.removeAll(subscriptionsToInsert);
- subscriptionsToInsert.removeAll(alreadySubscribeds);
-
- if (!subscriptionsToRemove.isEmpty()) {
expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
- subscriptions.delete(subscriptionsToRemove);
+ expect(subscriptions.bySuperProject(mergedBranch)).andReturn(
+ new ListResultSet<>(previousSubscriptions));
+
+ SortedSet<Project.NameKey> existingProjects = new TreeSet<>();
+
+ for (SubmoduleSubscription extracted : extractedSubscriptions) {
+ existingProjects.add(extracted.getSubmodule().getParentKey());
+ }
+
+ for (int index = 0; index < extractedSubscriptions.size(); index++) {
+ expect(repoManager.list()).andReturn(existingProjects);
+ }
+
+ final Set<SubmoduleSubscription> alreadySubscribeds = new HashSet<>();
+ for (SubmoduleSubscription s : extractedSubscriptions) {
+ if (previousSubscriptions.contains(s)) {
+ alreadySubscribeds.add(s);
+ }
+ }
+
+ final Set<SubmoduleSubscription> subscriptionsToRemove =
+ new HashSet<>(previousSubscriptions);
+ final List<SubmoduleSubscription> subscriptionsToInsert =
+ new ArrayList<>(extractedSubscriptions);
+
+ subscriptionsToRemove.removeAll(subscriptionsToInsert);
+ subscriptionsToInsert.removeAll(alreadySubscribeds);
+
+ if (!subscriptionsToRemove.isEmpty()) {
+ expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
+ subscriptions.delete(subscriptionsToRemove);
+ }
+
+ expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
+ subscriptions.insert(subscriptionsToInsert);
+
+ expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
+ expect(subscriptions.bySubmodule(mergedBranch)).andReturn(
+ new ListResultSet<>(new ArrayList<SubmoduleSubscription>()));
+
+ schema.close();
+
+ doReplay();
+
+ final SubmoduleOp submoduleOp =
+ new SubmoduleOp(mergedBranch, mergeTip, new RevWalk(realDb),
+ urlProvider, schemaFactory, realDb, new Project(mergedBranch
+ .getParentKey()), new ArrayList<Change>(), null, null,
+ repoManager, null, null, null);
+
+ submoduleOp.update();
}
-
- expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
- subscriptions.insert(subscriptionsToInsert);
-
- expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
- expect(subscriptions.bySubmodule(mergedBranch)).andReturn(
- new ListResultSet<>(new ArrayList<SubmoduleSubscription>()));
-
- schema.close();
-
- doReplay();
-
- final SubmoduleOp submoduleOp =
- new SubmoduleOp(mergedBranch, mergeTip, new RevWalk(realDb),
- urlProvider, schemaFactory, realDb, new Project(mergedBranch
- .getParentKey()), new ArrayList<Change>(), null, null,
- repoManager, null, null, null);
-
- submoduleOp.update();
}
/**
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesParserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesParserTest.java
index 53d9fb1..c41c4ec 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesParserTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesParserTest.java
@@ -43,7 +43,7 @@
@After
public void tearDownTestRepo() throws Exception {
- walk.release();
+ walk.close();
}
@Test
@@ -176,8 +176,7 @@
private RevCommit writeCommit(String body, PersonIdent author)
throws Exception {
- ObjectInserter ins = testRepo.getRepository().newObjectInserter();
- try {
+ try (ObjectInserter ins = testRepo.getRepository().newObjectInserter()) {
CommitBuilder cb = new CommitBuilder();
cb.setAuthor(author);
cb.setCommitter(new PersonIdent(serverIdent, author.getWhen()));
@@ -188,8 +187,6 @@
RevCommit commit = walk.parseCommit(id);
walk.parseBody(commit);
return commit;
- } finally {
- ins.release();
}
}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java
index db17f80..aea966a 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java
@@ -348,13 +348,10 @@
hashtags.add("tag2");
update.setHashtags(hashtags);
update.commit();
- RevWalk walk = new RevWalk(repo);
- try {
+ try (RevWalk walk = new RevWalk(repo)) {
RevCommit commit = walk.parseCommit(update.getRevision());
walk.parseBody(commit);
assertTrue(commit.getFullMessage().endsWith("Hashtags: tag1,tag2\n"));
- } finally {
- walk.release();
}
}
@@ -433,8 +430,7 @@
update2.putApproval("Code-Review", (short) 2);
update2.writeCommit(batch);
- RevWalk rw = new RevWalk(repo);
- try {
+ try (RevWalk rw = new RevWalk(repo)) {
batch.commit();
bru.execute(rw, NullProgressMonitor.INSTANCE);
@@ -464,7 +460,6 @@
notesWithApprovals.close();
} finally {
batch.close();
- rw.release();
}
}
@@ -506,11 +501,8 @@
assertEquals(update1.getRefName(), cmds.get(0).getRefName());
assertEquals(update2.getRefName(), cmds.get(1).getRefName());
- RevWalk rw = new RevWalk(repo);
- try {
+ try (RevWalk rw = new RevWalk(repo)) {
bru.execute(rw, NullProgressMonitor.INSTANCE);
- } finally {
- rw.release();
}
assertEquals(ReceiveCommand.Result.OK, cmds.get(0).getResult());
@@ -712,43 +704,44 @@
ChangeNotes notes = newNotes(c);
- RevWalk walk = new RevWalk(repo);
- ArrayList<Note> notesInTree =
- Lists.newArrayList(notes.getNoteMap().iterator());
- Note note = Iterables.getOnlyElement(notesInTree);
+ try (RevWalk walk = new RevWalk(repo)) {
+ ArrayList<Note> notesInTree =
+ Lists.newArrayList(notes.getNoteMap().iterator());
+ Note note = Iterables.getOnlyElement(notesInTree);
- byte[] bytes =
- walk.getObjectReader().open(
- note.getData(), Constants.OBJ_BLOB).getBytes();
- String noteString = new String(bytes, UTF_8);
- assertEquals("Patch-set: 1\n"
- + "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n"
- + "File: file1\n"
- + "\n"
- + "1:1-2:1\n"
- + CommentsInNotesUtil.formatTime(serverIdent, time1) + "\n"
- + "Author: Other Account <2@gerrit>\n"
- + "UUID: uuid1\n"
- + "Bytes: 9\n"
- + "comment 1\n"
- + "\n"
- + "2:1-3:1\n"
- + CommentsInNotesUtil.formatTime(serverIdent, time2) + "\n"
- + "Author: Other Account <2@gerrit>\n"
- + "UUID: uuid2\n"
- + "Bytes: 9\n"
- + "comment 2\n"
- + "\n"
- + "File: file2\n"
- + "\n"
- + "3:1-4:1\n"
- + CommentsInNotesUtil.formatTime(serverIdent, time3) + "\n"
- + "Author: Other Account <2@gerrit>\n"
- + "UUID: uuid3\n"
- + "Bytes: 9\n"
- + "comment 3\n"
- + "\n",
- noteString);
+ byte[] bytes =
+ walk.getObjectReader().open(
+ note.getData(), Constants.OBJ_BLOB).getBytes();
+ String noteString = new String(bytes, UTF_8);
+ assertEquals("Patch-set: 1\n"
+ + "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n"
+ + "File: file1\n"
+ + "\n"
+ + "1:1-2:1\n"
+ + CommentsInNotesUtil.formatTime(serverIdent, time1) + "\n"
+ + "Author: Other Account <2@gerrit>\n"
+ + "UUID: uuid1\n"
+ + "Bytes: 9\n"
+ + "comment 1\n"
+ + "\n"
+ + "2:1-3:1\n"
+ + CommentsInNotesUtil.formatTime(serverIdent, time2) + "\n"
+ + "Author: Other Account <2@gerrit>\n"
+ + "UUID: uuid2\n"
+ + "Bytes: 9\n"
+ + "comment 2\n"
+ + "\n"
+ + "File: file2\n"
+ + "\n"
+ + "3:1-4:1\n"
+ + CommentsInNotesUtil.formatTime(serverIdent, time3) + "\n"
+ + "Author: Other Account <2@gerrit>\n"
+ + "UUID: uuid3\n"
+ + "Bytes: 9\n"
+ + "comment 3\n"
+ + "\n",
+ noteString);
+ }
}
@Test
@@ -782,34 +775,35 @@
ChangeNotes notes = newNotes(c);
- RevWalk walk = new RevWalk(repo);
- ArrayList<Note> notesInTree =
- Lists.newArrayList(notes.getNoteMap().iterator());
- Note note = Iterables.getOnlyElement(notesInTree);
+ try (RevWalk walk = new RevWalk(repo)) {
+ ArrayList<Note> notesInTree =
+ Lists.newArrayList(notes.getNoteMap().iterator());
+ Note note = Iterables.getOnlyElement(notesInTree);
- byte[] bytes =
- walk.getObjectReader().open(
- note.getData(), Constants.OBJ_BLOB).getBytes();
- String noteString = new String(bytes, UTF_8);
- assertEquals("Base-for-patch-set: 1\n"
- + "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n"
- + "File: file1\n"
- + "\n"
- + "1:1-2:1\n"
- + CommentsInNotesUtil.formatTime(serverIdent, time1) + "\n"
- + "Author: Other Account <2@gerrit>\n"
- + "UUID: uuid1\n"
- + "Bytes: 9\n"
- + "comment 1\n"
- + "\n"
- + "2:1-3:1\n"
- + CommentsInNotesUtil.formatTime(serverIdent, time2) + "\n"
- + "Author: Other Account <2@gerrit>\n"
- + "UUID: uuid2\n"
- + "Bytes: 9\n"
- + "comment 2\n"
- + "\n",
- noteString);
+ byte[] bytes =
+ walk.getObjectReader().open(
+ note.getData(), Constants.OBJ_BLOB).getBytes();
+ String noteString = new String(bytes, UTF_8);
+ assertEquals("Base-for-patch-set: 1\n"
+ + "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n"
+ + "File: file1\n"
+ + "\n"
+ + "1:1-2:1\n"
+ + CommentsInNotesUtil.formatTime(serverIdent, time1) + "\n"
+ + "Author: Other Account <2@gerrit>\n"
+ + "UUID: uuid1\n"
+ + "Bytes: 9\n"
+ + "comment 1\n"
+ + "\n"
+ + "2:1-3:1\n"
+ + CommentsInNotesUtil.formatTime(serverIdent, time2) + "\n"
+ + "Author: Other Account <2@gerrit>\n"
+ + "UUID: uuid2\n"
+ + "Bytes: 9\n"
+ + "comment 2\n"
+ + "\n",
+ noteString);
+ }
}
@Test
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/CommitMessageOutputTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/CommitMessageOutputTest.java
index 86f9702..328509a 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/CommitMessageOutputTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/CommitMessageOutputTest.java
@@ -242,13 +242,10 @@
if (id instanceof RevCommit) {
return (RevCommit) id;
}
- RevWalk walk = new RevWalk(repo);
- try {
+ try (RevWalk walk = new RevWalk(repo)) {
RevCommit commit = walk.parseCommit(id);
walk.parseBody(commit);
return commit;
- } finally {
- walk.release();
}
}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java
index 4c123fd..c7aabc9 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java
@@ -285,7 +285,8 @@
public void testUsernamePatternNonRegex() {
allow(local, READ, DEVS, "refs/sb/${username}/heads/*");
- ProjectControl u = util.user(local, "u", DEVS), d = util.user(local, "d", DEVS);
+ ProjectControl u = util.user(local, "u", DEVS);
+ ProjectControl d = util.user(local, "d", DEVS);
assertFalse("u can't read", u.controlForRef("refs/sb/d/heads/foobar").isVisible());
assertTrue("d can read", d.controlForRef("refs/sb/d/heads/foobar").isVisible());
}
@@ -294,7 +295,8 @@
public void testUsernamePatternWithRegex() {
allow(local, READ, DEVS, "^refs/sb/${username}/heads/.*");
- ProjectControl u = util.user(local, "d.v", DEVS), d = util.user(local, "dev", DEVS);
+ ProjectControl u = util.user(local, "d.v", DEVS);
+ ProjectControl d = util.user(local, "dev", DEVS);
assertFalse("u can't read", u.controlForRef("refs/sb/dev/heads/foobar").isVisible());
assertTrue("d can read", d.controlForRef("refs/sb/dev/heads/foobar").isVisible());
}
@@ -316,7 +318,8 @@
allow(local, READ, DEVS, "^refs/heads/.*");
allow(parent, READ, ANONYMOUS_USERS, "^refs/heads/.*-QA-.*");
- ProjectControl u = util.user(local, DEVS), d = util.user(local, DEVS);
+ ProjectControl u = util.user(local, DEVS);
+ ProjectControl d = util.user(local, DEVS);
assertTrue("u can read", u.controlForRef("refs/heads/foo-QA-bar").isVisible());
assertTrue("d can read", d.controlForRef("refs/heads/foo-QA-bar").isVisible());
}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/project/Util.java b/gerrit-server/src/test/java/com/google/gerrit/server/project/Util.java
index e39700c..46223f1 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/project/Util.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/project/Util.java
@@ -81,8 +81,8 @@
import java.util.Set;
public class Util {
- public static AccountGroup.UUID ADMIN = new AccountGroup.UUID("test.admin");
- public static AccountGroup.UUID DEVS = new AccountGroup.UUID("test.devs");
+ public static final AccountGroup.UUID ADMIN = new AccountGroup.UUID("test.admin");
+ public static final AccountGroup.UUID DEVS = new AccountGroup.UUID("test.devs");
public static final LabelType CR = category("Code-Review",
value(2, "Looks good to me, approved"),
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java
index 8686fe6..806dca6 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java
@@ -43,9 +43,10 @@
import org.junit.Before;
import org.junit.Test;
-import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.List;
import java.util.UUID;
@@ -67,7 +68,7 @@
IOException {
db.create();
- final File site = new File(UUID.randomUUID().toString());
+ final Path site = Paths.get(UUID.randomUUID().toString());
final SitePaths paths = new SitePaths(site);
SchemaUpdater u = Guice.createInjector(new FactoryModule() {
@Override
@@ -129,6 +130,6 @@
db.assertSchemaVersion();
final SystemConfig sc = db.getSystemConfig();
- assertEquals(paths.site_path.getCanonicalPath(), sc.sitePath);
+ assertEquals(paths.site_path.toAbsolutePath().toString(), sc.sitePath);
}
}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/tools/hooks/CommitMsgHookTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/tools/hooks/CommitMsgHookTest.java
index 17fe068..9c8e86a 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/tools/hooks/CommitMsgHookTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/tools/hooks/CommitMsgHookTest.java
@@ -423,21 +423,17 @@
}
private DirCacheEntry file(final String name) throws IOException {
- final ObjectInserter oi = repository.newObjectInserter();
- try {
+ try (ObjectInserter oi = repository.newObjectInserter()) {
final DirCacheEntry e = new DirCacheEntry(name);
e.setFileMode(FileMode.REGULAR_FILE);
e.setObjectId(oi.insert(Constants.OBJ_BLOB, Constants.encode(name)));
oi.flush();
return e;
- } finally {
- oi.release();
}
}
private void setHEAD() throws Exception {
- final ObjectInserter oi = repository.newObjectInserter();
- try {
+ try (ObjectInserter oi = repository.newObjectInserter()) {
final CommitBuilder commit = new CommitBuilder();
commit.setTreeId(oi.insert(Constants.OBJ_TREE, new byte[] {}));
commit.setAuthor(author);
@@ -456,8 +452,6 @@
default:
fail(Constants.HEAD + " did not change: " + ref.getResult());
}
- } finally {
- oi.release();
}
}
}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryModule.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryModule.java
index 72495b3..f33cfb2 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryModule.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryModule.java
@@ -69,11 +69,12 @@
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.PersonIdent;
-import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
+import java.nio.file.Path;
+import java.nio.file.Paths;
public class InMemoryModule extends FactoryModule {
public static Config newDefaultConfig() {
@@ -125,7 +126,8 @@
bindScope(RequestScoped.class, PerThreadRequestScope.REQUEST);
- bind(File.class).annotatedWith(SitePath.class).toInstance(new File("."));
+ // TODO(dborowitz): Use jimfs.
+ bind(Path.class).annotatedWith(SitePath.class).toInstance(Paths.get("."));
bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(cfg);
bind(SocketAddress.class).annotatedWith(RemotePeer.class).toInstance(
new InetSocketAddress(InetAddresses.forString("127.0.0.1"), 1234));
diff --git a/gerrit-solr/src/main/java/com/google/gerrit/solr/IndexVersionCheck.java b/gerrit-solr/src/main/java/com/google/gerrit/solr/IndexVersionCheck.java
index ddb86c3..0faa691 100644
--- a/gerrit-solr/src/main/java/com/google/gerrit/solr/IndexVersionCheck.java
+++ b/gerrit-solr/src/main/java/com/google/gerrit/solr/IndexVersionCheck.java
@@ -25,8 +25,8 @@
import org.eclipse.jgit.storage.file.FileBasedConfig;
import org.eclipse.jgit.util.FS;
-import java.io.File;
import java.io.IOException;
+import java.nio.file.Path;
import java.util.Map;
class IndexVersionCheck implements LifecycleListener {
@@ -34,8 +34,8 @@
SolrChangeIndex.CHANGES_OPEN, ChangeSchemas.getLatest().getVersion(),
SolrChangeIndex.CHANGES_CLOSED, ChangeSchemas.getLatest().getVersion());
- public static File solrIndexConfig(SitePaths sitePaths) {
- return new File(sitePaths.index_dir, "gerrit_index.config");
+ public static Path solrIndexConfig(SitePaths sitePaths) {
+ return sitePaths.index_dir.resolve("gerrit_index.config");
}
private final SitePaths sitePaths;
@@ -48,9 +48,9 @@
@Override
public void start() {
// TODO Query schema version from a special meta-document
- File file = solrIndexConfig(sitePaths);
+ Path path = solrIndexConfig(sitePaths);
try {
- FileBasedConfig cfg = new FileBasedConfig(file, FS.detect());
+ FileBasedConfig cfg = new FileBasedConfig(path.toFile(), FS.detect());
cfg.load();
for (Map.Entry<String, Integer> e : SCHEMA_VERSIONS.entrySet()) {
int schemaVersion = cfg.getInt("index", e.getKey(), "schemaVersion", 0);
@@ -61,9 +61,9 @@
}
}
} catch (IOException e) {
- throw new ProvisionException("unable to read " + file);
+ throw new ProvisionException("unable to read " + path);
} catch (ConfigInvalidException e) {
- throw new ProvisionException("invalid config file " + file);
+ throw new ProvisionException("invalid config file " + path);
}
}
@@ -75,6 +75,6 @@
private final String upgrade() {
return "\nRun reindex to rebuild the index:\n"
+ "$ java -jar gerrit.war reindex -d "
- + sitePaths.site_path.getAbsolutePath();
+ + sitePaths.site_path.toAbsolutePath();
}
}
diff --git a/gerrit-solr/src/main/java/com/google/gerrit/solr/SolrChangeIndex.java b/gerrit-solr/src/main/java/com/google/gerrit/solr/SolrChangeIndex.java
index 78f5265..ab95ae4 100644
--- a/gerrit-solr/src/main/java/com/google/gerrit/solr/SolrChangeIndex.java
+++ b/gerrit-solr/src/main/java/com/google/gerrit/solr/SolrChangeIndex.java
@@ -327,7 +327,7 @@
public void markReady(boolean ready) throws IOException {
// TODO Move the schema version information to a special meta-document
FileBasedConfig cfg = new FileBasedConfig(
- solrIndexConfig(sitePaths),
+ solrIndexConfig(sitePaths).toFile(),
FS.detect());
for (Map.Entry<String, Integer> e : SCHEMA_VERSIONS.entrySet()) {
cfg.setInt("index", e.getKey(), "schemaVersion",
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java
index c0fd2ac..c38394a 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java
@@ -338,8 +338,7 @@
return 127;
}
- if (e instanceof UnloggedFailure) {
- } else {
+ if (!(e instanceof UnloggedFailure)) {
final StringBuilder m = new StringBuilder();
m.append("Internal server error");
if (userProvider.get().isIdentifiedUser()) {
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandFactoryProvider.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandFactoryProvider.java
index 56441fba..6bd9c4c 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandFactoryProvider.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandFactoryProvider.java
@@ -263,30 +263,33 @@
switch (b) {
case '\t':
case ' ':
- if (inquote || inDblQuote)
+ if (inquote || inDblQuote) {
r.append(b);
- else if (r.length() > 0) {
+ } else if (r.length() > 0) {
list.add(r.toString());
r = new StringBuilder();
}
continue;
case '\"':
- if (inquote)
+ if (inquote) {
r.append(b);
- else
+ } else {
inDblQuote = !inDblQuote;
+ }
continue;
case '\'':
- if (inDblQuote)
+ if (inDblQuote) {
r.append(b);
- else
+ } else {
inquote = !inquote;
+ }
continue;
case '\\':
- if (inquote || ip == commandLine.length())
+ if (inquote || ip == commandLine.length()) {
r.append(b); // literal within a quote
- else
+ } else {
r.append(commandLine.charAt(ip++));
+ }
continue;
default:
r.append(b);
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DatabasePubKeyAuth.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DatabasePubKeyAuth.java
index 93d2e5b..ab3b446 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DatabasePubKeyAuth.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DatabasePubKeyAuth.java
@@ -14,6 +14,9 @@
package com.google.gerrit.sshd;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.gerrit.common.FileUtil;
import com.google.gerrit.reviewdb.client.AccountSshKey;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.PeerDaemonUser;
@@ -33,10 +36,10 @@
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
import java.security.KeyPair;
import java.security.PublicKey;
import java.util.Collection;
@@ -170,56 +173,50 @@
}
private static class PeerKeyCache {
- private final File path;
+ private final Path path;
private final long modified;
final Set<PublicKey> keys;
- PeerKeyCache(final File path) {
+ PeerKeyCache(Path path) {
this.path = path;
- this.modified = path.lastModified();
+ this.modified = FileUtil.lastModified(path);
this.keys = read(path);
}
- private static Set<PublicKey> read(File path) {
- try {
- final BufferedReader br = new BufferedReader(new FileReader(path));
- try {
- final Set<PublicKey> keys = new HashSet<>();
- String line;
- while ((line = br.readLine()) != null) {
- line = line.trim();
- if (line.startsWith("#") || line.isEmpty()) {
- continue;
- }
-
- try {
- byte[] bin = Base64.decodeBase64(line.getBytes("ISO-8859-1"));
- keys.add(new Buffer(bin).getRawPublicKey());
- } catch (RuntimeException e) {
- logBadKey(path, line, e);
- } catch (SshException e) {
- logBadKey(path, line, e);
- }
+ private static Set<PublicKey> read(Path path) {
+ try (BufferedReader br = Files.newBufferedReader(path, UTF_8)) {
+ final Set<PublicKey> keys = new HashSet<>();
+ String line;
+ while ((line = br.readLine()) != null) {
+ line = line.trim();
+ if (line.startsWith("#") || line.isEmpty()) {
+ continue;
}
- return Collections.unmodifiableSet(keys);
- } finally {
- br.close();
- }
- } catch (FileNotFoundException noFile) {
- return Collections.emptySet();
+ try {
+ byte[] bin = Base64.decodeBase64(line.getBytes("ISO-8859-1"));
+ keys.add(new Buffer(bin).getRawPublicKey());
+ } catch (RuntimeException e) {
+ logBadKey(path, line, e);
+ } catch (SshException e) {
+ logBadKey(path, line, e);
+ }
+ }
+ return Collections.unmodifiableSet(keys);
+ } catch (NoSuchFileException noFile) {
+ return Collections.emptySet();
} catch (IOException err) {
log.error("Cannot read " + path, err);
return Collections.emptySet();
}
}
- private static void logBadKey(File path, String line, Exception e) {
+ private static void logBadKey(Path path, String line, Exception e) {
log.warn("Invalid key in " + path + ":\n " + line, e);
}
boolean isCurrent() {
- return path.lastModified() == modified;
+ return modified == FileUtil.lastModified(path);
}
PeerKeyCache reload() {
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommand.java
index a7748ff..09222b7 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommand.java
@@ -88,10 +88,11 @@
checkRequiresCapability(cmd);
if (cmd instanceof BaseCommand) {
final BaseCommand bc = (BaseCommand) cmd;
- if (getName().isEmpty())
+ if (getName().isEmpty()) {
bc.setName(commandName);
- else
+ } else {
bc.setName(getName() + " " + commandName);
+ }
bc.setArguments(args.toArray(new String[args.size()]));
} else if (!args.isEmpty()) {
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/HostKeyProvider.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/HostKeyProvider.java
index 241f853..3e6e2f5 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/HostKeyProvider.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/HostKeyProvider.java
@@ -24,7 +24,8 @@
import org.apache.sshd.common.util.SecurityUtils;
import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
-import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
@@ -38,29 +39,29 @@
@Override
public KeyPairProvider get() {
- final File objKey = site.ssh_key;
- final File rsaKey = site.ssh_rsa;
- final File dsaKey = site.ssh_dsa;
+ Path objKey = site.ssh_key;
+ Path rsaKey = site.ssh_rsa;
+ Path dsaKey = site.ssh_dsa;
final List<String> stdKeys = new ArrayList<>(2);
- if (rsaKey.exists()) {
- stdKeys.add(rsaKey.getAbsolutePath());
+ if (Files.exists(rsaKey)) {
+ stdKeys.add(rsaKey.toAbsolutePath().toString());
}
- if (dsaKey.exists()) {
- stdKeys.add(dsaKey.getAbsolutePath());
+ if (Files.exists(dsaKey)) {
+ stdKeys.add(dsaKey.toAbsolutePath().toString());
}
- if (objKey.exists()) {
+ if (Files.exists(objKey)) {
if (stdKeys.isEmpty()) {
SimpleGeneratorHostKeyProvider p = new SimpleGeneratorHostKeyProvider();
- p.setPath(objKey.getAbsolutePath());
+ p.setPath(objKey.toAbsolutePath().toString());
return p;
} else {
// Both formats of host key exist, we don't know which format
// should be authoritative. Complain and abort.
//
- stdKeys.add(objKey.getAbsolutePath());
+ stdKeys.add(objKey.toAbsolutePath().toString());
throw new ProvisionException("Multiple host keys exist: " + stdKeys);
}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshLog.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshLog.java
index 439b8c8..4d6a790 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshLog.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshLog.java
@@ -220,7 +220,8 @@
event.setProperty(P_SESSION, id(sd.getSessionId()));
- String userName = "-", accountId = "-";
+ String userName = "-";
+ String accountId = "-";
if (user != null && user.isIdentifiedUser()) {
IdentifiedUser u = (IdentifiedUser) user;
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateBranchCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateBranchCommand.java
index 55f6158..b1d09e9 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateBranchCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateBranchCommand.java
@@ -26,7 +26,7 @@
/** Create a new branch. **/
@CommandMetaData(name = "create-branch", description = "Create a new branch")
-final public class CreateBranchCommand extends SshCommand {
+public final class CreateBranchCommand extends SshCommand {
@Argument(index = 0, required = true, metaVar = "PROJECT", usage = "name of the project")
private ProjectControl project;
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java
index 4e151b3..7dc558e 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java
@@ -109,7 +109,8 @@
requireChangeID = InheritableBoolean.TRUE;
}
- @Option(name = "--create-new-change-for-all-not-in-target", aliases = {"--ncfa"}, usage = "if a new change will be created for every commit not in target branch")
+ @Option(name = "--create-new-change-for-all-not-in-target", aliases = {"--ncfa"},
+ usage = "if a new change will be created for every commit not in target branch")
void setNewChangeForAllNotInTarget(@SuppressWarnings("unused") boolean on) {
createNewChangeForAllNotInTarget = InheritableBoolean.TRUE;
}
@@ -124,7 +125,8 @@
@Option(name = "--max-object-size-limit", usage = "max Git object size for this project")
private String maxObjectSizeLimit;
- @Option(name = "--plugin-config", usage = "plugin configuration parameter with format '<plugin-name>.<parameter-name>=<value>'")
+ @Option(name = "--plugin-config",
+ usage = "plugin configuration parameter with format '<plugin-name>.<parameter-name>=<value>'")
private List<String> pluginConfigValues;
private String projectName;
@@ -181,7 +183,7 @@
input.pluginConfigValues = parsePluginConfigValues(pluginConfigValues);
}
- gApi.projects().name(projectName).create(input);
+ gApi.projects().create(input);
} else {
List<Project.NameKey> parentCandidates =
suggestParentCandidates.getNameKeys();
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/DefaultCommandModule.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/DefaultCommandModule.java
index f75eb2b..e4b21d1 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/DefaultCommandModule.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/DefaultCommandModule.java
@@ -73,12 +73,18 @@
command("suexec").to(SuExec.class);
listener().to(ShowCaches.StartupListener.class);
- // The following commands can only be ran on a server in Master mode
+ // The following commands can only be run on a server in Master mode
command(gerrit, CreateAccountCommand.class);
command(gerrit, CreateGroupCommand.class);
command(gerrit, CreateProjectCommand.class);
+ command(gerrit, SetHeadCommand.class);
command(gerrit, AdminQueryShell.class);
- if (!slaveMode) {
+ if (slaveMode) {
+ command("git-receive-pack").to(NotSupportedInSlaveModeFailureCommand.class);
+ command("gerrit-receive-pack").to(NotSupportedInSlaveModeFailureCommand.class);
+ command(git, "receive-pack").to(NotSupportedInSlaveModeFailureCommand.class);
+ command(gerrit, "test-submit").to(NotSupportedInSlaveModeFailureCommand.class);
+ } else {
command("git-receive-pack").to(Commands.key(git, "receive-pack"));
command("gerrit-receive-pack").to(Commands.key(git, "receive-pack"));
command(git, "receive-pack").to(Commands.key(gerrit, "receive-pack"));
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java
index c533f4f..d02fb4c 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java
@@ -46,6 +46,9 @@
@Option(name = "--show-progress", usage = "progress information is shown")
private boolean showProgress;
+ @Option(name = "--aggressive", usage = "run aggressive garbage collection")
+ private boolean aggressive;
+
@Argument(index = 0, required = false, multiValued = true, metaVar = "NAME",
usage = "projects for which the Git garbage collection should be run")
private List<ProjectControl> projects = new ArrayList<>();
@@ -85,7 +88,8 @@
}
GarbageCollectionResult result =
- garbageCollectionFactory.create().run(projectNames, showProgress ? stdout : null);
+ garbageCollectionFactory.create().run(projectNames, aggressive,
+ showProgress ? stdout : null);
if (result.hasErrors()) {
for (GarbageCollectionResult.Error e : result.getErrors()) {
String msg;
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/NotSupportedInSlaveModeFailureCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/NotSupportedInSlaveModeFailureCommand.java
new file mode 100644
index 0000000..39e6d4a
--- /dev/null
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/NotSupportedInSlaveModeFailureCommand.java
@@ -0,0 +1,25 @@
+// Copyright (C) 2015 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.
+
+package com.google.gerrit.sshd.commands;
+
+import com.google.gerrit.sshd.SshCommand;
+
+/* Failure command, that produces verbose failure message in slave mode */
+public class NotSupportedInSlaveModeFailureCommand extends SshCommand {
+ @Override
+ protected void run() throws UnloggedFailure {
+ throw die(getName() + ": is not supported in slave mode");
+ }
+}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/QueryShell.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/QueryShell.java
index 8f26bba..6a71176 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/QueryShell.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/QueryShell.java
@@ -758,7 +758,9 @@
r.append(" (");
boolean first = true;
for (String c : columns.values()) {
- if (!first) r.append(", ");
+ if (!first) {
+ r.append(", ");
+ }
r.append(c);
first = false;
}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ReviewCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ReviewCommand.java
index 3ac72a7..bc820a4 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ReviewCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ReviewCommand.java
@@ -73,7 +73,9 @@
private final Set<PatchSet> patchSets = new HashSet<>();
- @Argument(index = 0, required = true, multiValued = true, metaVar = "{COMMIT | CHANGE,PATCHSET}", usage = "list of commits or patch sets to review")
+ @Argument(index = 0, required = true, multiValued = true,
+ metaVar = "{COMMIT | CHANGE,PATCHSET}",
+ usage = "list of commits or patch sets to review")
void addPatchSetId(final String token) {
try {
PatchSet ps = CommandUtils.parsePatchSet(token, db, projectControl,
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetHeadCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetHeadCommand.java
new file mode 100644
index 0000000..b1d1605
--- /dev/null
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetHeadCommand.java
@@ -0,0 +1,55 @@
+// Copyright (C) 2015 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.
+
+package com.google.gerrit.sshd.commands;
+
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.server.project.ProjectControl;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.SetHead;
+import com.google.gerrit.server.project.SetHead.Input;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.inject.Inject;
+
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
+
+@CommandMetaData(name = "set-head", description = "Change HEAD reference for a project")
+public class SetHeadCommand extends SshCommand {
+
+ @Argument(index = 0, required = true, metaVar = "NAME", usage = "name of the project")
+ private ProjectControl project;
+
+ @Option(name = "--new-head", required = true, metaVar = "REF", usage = "new HEAD reference")
+ private String newHead;
+
+ private final SetHead setHead;
+
+ @Inject
+ SetHeadCommand(SetHead setHead) {
+ this.setHead = setHead;
+ }
+
+ @Override
+ protected void run() throws Exception {
+ Input input = new SetHead.Input();
+ input.ref = newHead;
+ try {
+ setHead.apply(new ProjectResource(project), input);
+ } catch (UnprocessableEntityException e) {
+ throw new UnloggedFailure("fatal: " + e.getMessage());
+ }
+ }
+}
diff --git a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java b/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java
index 734b7045..e70ab72 100644
--- a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java
+++ b/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java
@@ -202,8 +202,9 @@
for (int argi = 0; argi < args.length; argi++) {
final String str = args[argi];
if (str.equals("--")) {
- while (argi < args.length)
+ while (argi < args.length) {
tmp.add(args[argi++]);
+ }
break;
}
diff --git a/gerrit-util-http/src/main/java/com/google/gerrit/util/http/RequestUtil.java b/gerrit-util-http/src/main/java/com/google/gerrit/util/http/RequestUtil.java
index 922a8d5..888ad2f 100644
--- a/gerrit-util-http/src/main/java/com/google/gerrit/util/http/RequestUtil.java
+++ b/gerrit-util-http/src/main/java/com/google/gerrit/util/http/RequestUtil.java
@@ -35,6 +35,7 @@
* without decoding URL-encoded characters.
*/
public static String getEncodedPathInfo(HttpServletRequest req) {
+ // CS IGNORE LineLength FOR NEXT 3 LINES. REASON: URL.
// Based on com.google.guice.ServletDefinition$1#getPathInfo() from:
// https://github.com/google/guice/blob/41c126f99d6309886a0ded2ac729033d755e1593/extensions/servlet/src/com/google/inject/servlet/ServletDefinition.java
String servletPath = req.getServletPath();
diff --git a/gerrit-war/pom.xml b/gerrit-war/pom.xml
index 81d8498..17e8286 100644
--- a/gerrit-war/pom.xml
+++ b/gerrit-war/pom.xml
@@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.google.gerrit</groupId>
<artifactId>gerrit-war</artifactId>
- <version>2.11-SNAPSHOT</version>
+ <version>2.12-SNAPSHOT</version>
<packaging>war</packaging>
<name>Gerrit Code Review - WAR</name>
<description>Gerrit WAR</description>
diff --git a/gerrit-war/src/main/java/com/google/gerrit/httpd/SiteInitializer.java b/gerrit-war/src/main/java/com/google/gerrit/httpd/SiteInitializer.java
index 6bbbd8f..ea4a3ea 100644
--- a/gerrit-war/src/main/java/com/google/gerrit/httpd/SiteInitializer.java
+++ b/gerrit-war/src/main/java/com/google/gerrit/httpd/SiteInitializer.java
@@ -20,7 +20,8 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -47,21 +48,19 @@
public void init() {
try {
if (sitePath != null) {
- File site = new File(sitePath);
- LOG.info(String.format("Initializing site at %s",
- site.getAbsolutePath()));
+ Path site = Paths.get(sitePath);
+ LOG.info("Initializing site at " + site.toRealPath().normalize());
new BaseInit(site, false, true, pluginsDistribution, pluginsToInstall).run();
return;
}
try (Connection conn = connectToDb()) {
- File site = getSiteFromReviewDb(conn);
+ Path site = getSiteFromReviewDb(conn);
if (site == null && initPath != null) {
- site = new File(initPath);
+ site = Paths.get(initPath);
}
if (site != null) {
- LOG.info(String.format("Initializing site at %s",
- site.getAbsolutePath()));
+ LOG.info("Initializing site at " + site.toRealPath().normalize());
new BaseInit(site, new ReviewDbDataSourceProvider(), false, false,
pluginsDistribution, pluginsToInstall).run();
}
@@ -76,12 +75,12 @@
return new ReviewDbDataSourceProvider().get().getConnection();
}
- private File getSiteFromReviewDb(Connection conn) {
+ private Path getSiteFromReviewDb(Connection conn) {
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(
"SELECT site_path FROM system_config")) {
if (rs.next()) {
- return new File(rs.getString(1));
+ return Paths.get(rs.getString(1));
}
} catch (SQLException e) {
return null;
diff --git a/gerrit-war/src/main/java/com/google/gerrit/httpd/SitePathFromSystemConfigProvider.java b/gerrit-war/src/main/java/com/google/gerrit/httpd/SitePathFromSystemConfigProvider.java
index b97df3f..60f389e 100644
--- a/gerrit-war/src/main/java/com/google/gerrit/httpd/SitePathFromSystemConfigProvider.java
+++ b/gerrit-war/src/main/java/com/google/gerrit/httpd/SitePathFromSystemConfigProvider.java
@@ -22,12 +22,13 @@
import com.google.inject.Inject;
import com.google.inject.Provider;
-import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.List;
-/** Provides {@link java.io.File} annotated with {@link SitePath}. */
-class SitePathFromSystemConfigProvider implements Provider<File> {
- private final File path;
+/** Provides {@link Path} annotated with {@link SitePath}. */
+class SitePathFromSystemConfigProvider implements Provider<Path> {
+ private final Path path;
@Inject
SitePathFromSystemConfigProvider(SchemaFactory<ReviewDb> schemaFactory)
@@ -36,18 +37,18 @@
}
@Override
- public File get() {
+ public Path get() {
return path;
}
- private static File read(SchemaFactory<ReviewDb> schemaFactory)
+ private static Path read(SchemaFactory<ReviewDb> schemaFactory)
throws OrmException {
ReviewDb db = schemaFactory.open();
try {
List<SystemConfig> all = db.systemConfig().all().toList();
switch (all.size()) {
case 1:
- return new File(all.get(0).sitePath);
+ return Paths.get(all.get(0).sitePath);
case 0:
throw new OrmException("system_config table is empty");
default:
diff --git a/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java b/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java
index a395a3b..865dc67 100644
--- a/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java
+++ b/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java
@@ -79,8 +79,9 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -102,7 +103,7 @@
private static final Logger log =
LoggerFactory.getLogger(WebAppInitializer.class);
- private File sitePath;
+ private Path sitePath;
private Injector dbInjector;
private Injector cfgInjector;
private Injector sysInjector;
@@ -123,7 +124,7 @@
if (manager == null) {
final String path = System.getProperty("gerrit.site_path");
if (path != null) {
- sitePath = new File(path);
+ sitePath = Paths.get(path);
}
if (System.getProperty("gerrit.init") != null) {
@@ -210,7 +211,7 @@
Module sitePathModule = new AbstractModule() {
@Override
protected void configure() {
- bind(File.class).annotatedWith(SitePath.class).toInstance(sitePath);
+ bind(Path.class).annotatedWith(SitePath.class).toInstance(sitePath);
}
};
modules.add(sitePathModule);
@@ -262,7 +263,7 @@
modules.add(new AbstractModule() {
@Override
protected void configure() {
- bind(File.class).annotatedWith(SitePath.class).toProvider(
+ bind(Path.class).annotatedWith(SitePath.class).toProvider(
SitePathFromSystemConfigProvider.class).in(SINGLETON);
}
});
diff --git a/lib/BUCK b/lib/BUCK
index a880f06..2760acc 100644
--- a/lib/BUCK
+++ b/lib/BUCK
@@ -45,8 +45,8 @@
maven_jar(
name = 'gson',
- id = 'com.google.code.gson:gson:2.1',
- sha1 = '2e66da15851f9f5b5079228f856c2f090ba98c38',
+ id = 'com.google.code.gson:gson:2.3.1',
+ sha1 = 'ecb6e1f8e4b0e84c4b886c2f14a1500caf309757',
license = 'Apache2.0',
)
diff --git a/lib/codemirror/BUCK b/lib/codemirror/BUCK
index dc163c2..cfb43ff 100644
--- a/lib/codemirror/BUCK
+++ b/lib/codemirror/BUCK
@@ -2,12 +2,19 @@
include_defs('//lib/codemirror/cm.defs')
include_defs('//lib/codemirror/closure.defs')
+REPO = GERRIT
VERSION = 'd0a2ddaa04'
SHA1 = '1df573141fcceec039d0260d2d66a5b15d663f9a'
-URL = GERRIT + 'net/codemirror/codemirror-%s.zip' % VERSION
-ZIP = 'codemirror-%s.zip' % VERSION
-TOP = 'codemirror-%s' % VERSION
+if REPO == MAVEN_CENTRAL:
+ URL = REPO + 'org/webjars/codemirror/%s/codemirror-%s.jar' % (VERSION, VERSION)
+ TOP = 'META-INF/resources/webjars/codemirror/%s' % VERSION
+ ZIP = 'codemirror-%s.jar' % VERSION
+else:
+ URL = REPO + 'net/codemirror/codemirror-%s.zip' % VERSION
+ TOP = 'codemirror-%s' % VERSION
+ ZIP = 'codemirror-%s.zip' % VERSION
+
CLOSURE_VERSION = 'v20141120'
diff --git a/lib/jgit/BUCK b/lib/jgit/BUCK
index 8b2088c..a658fc3 100644
--- a/lib/jgit/BUCK
+++ b/lib/jgit/BUCK
@@ -1,13 +1,13 @@
include_defs('//lib/maven.defs')
REPO = GERRIT # Leave here even if set to MAVEN_CENTRAL.
-VERS = '3.6.2.201501210735-r.40-g23ad3a3'
+VERS = '3.7.0.201502260915-r.58-g65c379e'
maven_jar(
name = 'jgit',
id = 'org.eclipse.jgit:org.eclipse.jgit:' + VERS,
- bin_sha1 = '849c10fec9a9af15f57651b99a5cf6de6bd3077c',
- src_sha1 = '6fa857df4b73bf2fa222d3ad272e99e3c929453f',
+ bin_sha1 = '8fc9620ec499169facad3355f7417eb6a8aff511',
+ src_sha1 = '40bd9ae8af8e0b03eb4e43f44f5feda8b7325221',
license = 'jgit',
repository = REPO,
unsign = True,
@@ -22,7 +22,7 @@
maven_jar(
name = 'jgit-servlet',
id = 'org.eclipse.jgit:org.eclipse.jgit.http.server:' + VERS,
- sha1 = 'f4a2252fac9258479394a3be3318f88fc8a538e8',
+ sha1 = 'cecc2b9c0b94455348c3a0c63eb83f72cc595757',
license = 'jgit',
repository = REPO,
deps = [':jgit'],
@@ -36,7 +36,7 @@
maven_jar(
name = 'jgit-archive',
id = 'org.eclipse.jgit:org.eclipse.jgit.archive:' + VERS,
- sha1 = 'bb1cf790a4ca6760f99b1d86ad5d25857bf69dc2',
+ sha1 = '7ccc7c78bf47566045ea7a3c08508ba18e4684ca',
license = 'jgit',
repository = REPO,
deps = [':jgit',
@@ -53,7 +53,7 @@
maven_jar(
name = 'junit',
id = 'org.eclipse.jgit:org.eclipse.jgit.junit:' + VERS,
- sha1 = '9b9f2da56aacde9e58f905becc4780b4d64ee79e',
+ sha1 = '87d64d722447dc3971ace30d2a72593c72a4d05f',
license = 'DO_NOT_DISTRIBUTE',
repository = REPO,
unsign = True,
diff --git a/lib/maven.defs b/lib/maven.defs
index 4edba9c..cc45212 100644
--- a/lib/maven.defs
+++ b/lib/maven.defs
@@ -46,9 +46,14 @@
from os import path
parts = id.split(':')
- if len(parts) != 3:
- raise NameError('expected id="groupId:artifactId:version"')
- group, artifact, version = parts
+ if len(parts) not in [3, 4]:
+ raise NameError('%s:\nexpected id="groupId:artifactId:version[:classifier]"'
+ % id)
+ if len(parts) == 4:
+ group, artifact, version, classifier = parts
+ else:
+ group, artifact, version = parts
+ classifier = None
# SNAPSHOT artifacts are handled differently on Google storage bucket:
# 'SNAPSHOT' is discarded from the directory name. However on other
@@ -62,7 +67,11 @@
else:
file_version = version
+ if classifier is not None:
+ file_version += '-' + classifier
+
jar = path.join(name, artifact.lower() + '-' + file_version)
+
url = '/'.join([
repository,
group.replace('.', '/'), artifact, version,
diff --git a/lib/prolog/BUCK b/lib/prolog/BUCK
index 1f3e425..6c91530 100644
--- a/lib/prolog/BUCK
+++ b/lib/prolog/BUCK
@@ -1,15 +1,53 @@
include_defs('//lib/maven.defs')
+VERSION = '1.4'
+REPO = GERRIT
+
maven_jar(
- name = 'prolog-cafe',
- id = 'com.googlecode.prolog-cafe:PrologCafe:1.3',
- sha1 = '5e0fbf18e8c98c4113f9acc978306884a1152870',
+ name = 'runtime',
+ id = 'com.googlecode.prolog-cafe:prolog-runtime:' + VERSION,
+ sha1 = 'a99cde464f7ff75371751493ab821edd7a225bc3',
license = 'prologcafe',
- repository = GERRIT,
+ repository = REPO,
+)
+
+maven_jar(
+ name = 'compiler',
+ id = 'com.googlecode.prolog-cafe:prolog-compiler:' + VERSION,
+ sha1 = 'ced8f50f635486bc96fca6315cacb8b18a8ef68b',
+ license = 'prologcafe',
+ repository = REPO,
+ deps = [
+ ':io',
+ ':runtime',
+ ],
+)
+
+maven_jar(
+ name = 'io',
+ id = 'com.googlecode.prolog-cafe:prolog-io:' + VERSION,
+ sha1 = 'a4f71e4f7b80dd7a2ee5138d31f2c131ec672d15',
+ license = 'prologcafe',
+ repository = REPO,
+ deps = [':runtime'],
+ visibility = [],
+)
+
+maven_jar(
+ name = 'cafeteria',
+ id = 'com.googlecode.prolog-cafe:prolog-cafeteria:' + VERSION,
+ sha1 = '9d71fbbc1e4cb9280c5a5d68836a904f7abfd9f9',
+ license = 'prologcafe',
+ repository = REPO,
+ deps = [
+ ':io',
+ ':runtime',
+ ],
+ visibility = ['//gerrit-pgm:'],
)
java_binary(
- name = 'compiler',
+ name = 'compiler_bin',
main_class = 'BuckPrologCompiler',
deps = [':compiler_lib'],
visibility = ['PUBLIC'],
@@ -18,6 +56,9 @@
java_library(
name = 'compiler_lib',
srcs = ['java/BuckPrologCompiler.java'],
- deps = [':prolog-cafe'],
+ deps = [
+ ':compiler',
+ ':runtime',
+ ],
visibility = ['//tools/eclipse:classpath'],
)
diff --git a/lib/prolog/java/BuckPrologCompiler.java b/lib/prolog/java/BuckPrologCompiler.java
index 17d2d76..a01df59 100644
--- a/lib/prolog/java/BuckPrologCompiler.java
+++ b/lib/prolog/java/BuckPrologCompiler.java
@@ -12,8 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import com.googlecode.prolog_cafe.compiler.CompileException;
import com.googlecode.prolog_cafe.compiler.Compiler;
+import com.googlecode.prolog_cafe.exceptions.CompileException;
import java.io.File;
import java.io.FileInputStream;
diff --git a/lib/prolog/prolog.defs b/lib/prolog/prolog.defs
index d0636f5..677a9e2 100644
--- a/lib/prolog/prolog.defs
+++ b/lib/prolog/prolog.defs
@@ -19,7 +19,7 @@
visibility = []):
genrule(
name = name + '__pl2j',
- cmd = '$(exe //lib/prolog:compiler)' +
+ cmd = '$(exe //lib/prolog:compiler_bin)' +
' $TMP $OUT ' +
' '.join(srcs),
srcs = srcs,
@@ -28,7 +28,7 @@
java_library(
name = name + '__lib',
srcs = [':' + name + '__pl2j'],
- deps = ['//lib/prolog:prolog-cafe'] + deps,
+ deps = ['//lib/prolog:runtime'] + deps,
)
genrule(
name = name + '__ln',
diff --git a/plugins/commit-message-length-validator b/plugins/commit-message-length-validator
index 7923b67..ecec6df 160000
--- a/plugins/commit-message-length-validator
+++ b/plugins/commit-message-length-validator
@@ -1 +1 @@
-Subproject commit 7923b67392164dcc65ada85f723fa5111b265484
+Subproject commit ecec6dfe7ed67431d96acf9dabac3885463900e8
diff --git a/plugins/cookbook-plugin b/plugins/cookbook-plugin
index bb20992..de0c0d0 160000
--- a/plugins/cookbook-plugin
+++ b/plugins/cookbook-plugin
@@ -1 +1 @@
-Subproject commit bb209927b3cfc3073ce5af81c4a8436068be9e0d
+Subproject commit de0c0d019be1ce81b681ec4365bec169602c4b3c
diff --git a/plugins/replication b/plugins/replication
index eded645..e9b9874 160000
--- a/plugins/replication
+++ b/plugins/replication
@@ -1 +1 @@
-Subproject commit eded6451be8dc10945c110955d2bfcfe629eac32
+Subproject commit e9b987413e9bf59ced29f796e8c005161df47c1f
diff --git a/plugins/reviewnotes b/plugins/reviewnotes
index ba82486..603b7b3 160000
--- a/plugins/reviewnotes
+++ b/plugins/reviewnotes
@@ -1 +1 @@
-Subproject commit ba824869c6b24348647f26e04cf80e1ae82266ec
+Subproject commit 603b7b3885a1d2953ca891f58d2a6095e72e5313
diff --git a/tools/build.defs b/tools/build.defs
index 8b858cd..da07c1e 100644
--- a/tools/build.defs
+++ b/tools/build.defs
@@ -71,8 +71,8 @@
context = [
'//gerrit-main:main_bin',
'//gerrit-war:webapp_assets',
- '//gerrit-gwtui:' + ui,
- ] + context,
+ ] + (['//gerrit-gwtui:' + ui] if ui else []) +
+ context,
docs = docs,
visibility = visibility,
)
diff --git a/tools/checkstyle.xml b/tools/checkstyle.xml
index a9f8cfe..d887bb2 100644
--- a/tools/checkstyle.xml
+++ b/tools/checkstyle.xml
@@ -14,10 +14,12 @@
<property name="severity" value="warning"/>
<property name="charset" value="UTF-8"/>
<module name="TreeWalker">
+ <module name="FileContentsHolder"/>
<module name="OuterTypeFilename"/>
<module name="LineLength">
<property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
- <property name="max" value="100"/>
+ <property name="max" value="150"/>
+ <property name="tabWidth" value="2"/>
</module>
<module name="OneTopLevelClass"/>
<module name="NoLineWrap"/>
@@ -27,9 +29,8 @@
</module>
<module name="NeedBraces"/>
<module name="LeftCurly">
- <property name="maxLineLength" value="100"/>
+ <property name="maxLineLength" value="150"/>
</module>
- <module name="RightCurly"/>
<module name="RightCurly">
<property name="option" value="alone"/>
<property name="tokens" value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, LITERAL_DO, STATIC_INIT, INSTANCE_INIT"/>
@@ -100,4 +101,9 @@
<property name="eachLine" value="true"/>
<metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
</module>
+ <module name="SuppressWithNearbyCommentFilter">
+ <property name="commentFormat" value="CS IGNORE (\w+) FOR NEXT (\d+) LINES\. REASON\: \w+"/>
+ <property name="checkFormat" value="$1"/>
+ <property name="influenceFormat" value="$2"/>
+ </module>
</module>