Merge branch 'master' into stable-5.4
* master: Handle missing "ours" stage in WorkingTreeIterator.hasCrLfInIndex() Config: Add helper method to check for empty value ErrorProne: Increase severity of FutureReturnValueIgnored to ERROR FS_Win32: Add missing parentheses on if-blocks Upgrade spotbugs to 3.1.12 Abbreviated{Long}ObjectId: Make operator precedence explicit GC: Update TODO comments FS_POSIX: Fix reference comparison of Boolean.FALSE Increase bazel timeout for long running tests Use bazelisk to switch between used bazel version Bump minimum Bazel version to 0.26.1 Bazel: Bump skylib library version to 0.8.0 Retry loading config when locked by another process Make pull --rebase on an unborn branch do a checkout Warn if configured cookie file is missing Handle escaped CR-LF in git config files DescribeCommand: use glob match instead of path match Fix off-by-one error in RebaseTodoFile when reading a todo file Consistently use "!isEmpty()" to detect non-empty list TransportHttp: Check for non-empty list with "!isEmpty()" rather than "size() > 0" TransportHttp: Fix comparison of size with ">= 0" NetscapeCookieFileTest: Split HttpCookiesMatcher to own class Bazel: Add missing dependency on mockito for TransportHttpTest Determine hard-linking and nlink support per FileStore Support reading and writing cookies. Repository: Add getIdentifier() method to avoid instanceof operator Update to Orbit R20190602212107 PacketLineIn: Deprecate the END constant PacketLineIn: Add an iterator over strings in the input stream Replace most usages of PacketLineIn.END with PacketLineIn.end() PacketLineIn: Deprecate DELIM constant Replace trivial reference comparison of PacketLineIn.{DELIM,END} PacketLineIn: Rename isDelim to isDelimiter ProtocolV2ParserTest: Fix typo in comment Upgrade Bouncy Castle to 1.61 Update to Orbit R20190531194818 and rollback update to Ant 1.10.6 cli: Add the --always option to describe DescribeCommand: Support the "always" option cli: Add the --tags option to describe DescribeCommand: Consistenly omit the default value Remove excess blank line in FileUtilsTest PacketLineIn: Add helper methods to check for END and DELIM UploadPackTest: Rename variable to avoid hiding class member UploadPackTest: Add missing <> operator on instantiation of ArrayList BitmapCalculator: javadoc fixes RevWalkUtils: add progress callback to findBranchesReachableFrom Upgrade maven-source-plugin to 3.1.0 Upgrade maven-jar-plugin to 3.1.2 Upgrade jacoco-maven-plugin to 0.8.4 BitmapCalculator and its test: add missing license header RevWalk: new method createReachabilityChecker() Change-Id: I4d76c7c0dbe6411c842f3468b709f7df51789c08 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
This commit is contained in:
commit
c177c6f4c5
|
@ -0,0 +1 @@
|
||||||
|
0.26.1
|
22
WORKSPACE
22
WORKSPACE
|
@ -4,14 +4,14 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
|
||||||
|
|
||||||
http_archive(
|
http_archive(
|
||||||
name = "bazel_skylib",
|
name = "bazel_skylib",
|
||||||
sha256 = "bbccf674aa441c266df9894182d80de104cabd19be98be002f6d478aaa31574d",
|
sha256 = "2ea8a5ed2b448baf4a6855d3ce049c4c452a6470b1efd1504fdb7c1c134d220a",
|
||||||
strip_prefix = "bazel-skylib-2169ae1c374aab4a09aa90e65efe1a3aad4e279b",
|
strip_prefix = "bazel-skylib-0.8.0",
|
||||||
urls = ["https://github.com/bazelbuild/bazel-skylib/archive/2169ae1c374aab4a09aa90e65efe1a3aad4e279b.tar.gz"],
|
urls = ["https://github.com/bazelbuild/bazel-skylib/archive/0.8.0.tar.gz"],
|
||||||
)
|
)
|
||||||
|
|
||||||
load("@bazel_skylib//lib:versions.bzl", "versions")
|
load("@bazel_skylib//lib:versions.bzl", "versions")
|
||||||
|
|
||||||
versions.check(minimum_bazel_version = "0.19.0")
|
versions.check(minimum_bazel_version = "0.26.1")
|
||||||
|
|
||||||
load("//tools:bazlets.bzl", "load_bazlets")
|
load("//tools:bazlets.bzl", "load_bazlets")
|
||||||
|
|
||||||
|
@ -212,25 +212,25 @@ maven_jar(
|
||||||
src_sha1 = "94e89a8c9f82e38555e95b9f7f58344a247e862c",
|
src_sha1 = "94e89a8c9f82e38555e95b9f7f58344a247e862c",
|
||||||
)
|
)
|
||||||
|
|
||||||
BOUNCYCASTLE_VER = "1.60"
|
BOUNCYCASTLE_VER = "1.61"
|
||||||
|
|
||||||
maven_jar(
|
maven_jar(
|
||||||
name = "bcpg",
|
name = "bcpg",
|
||||||
artifact = "org.bouncycastle:bcpg-jdk15on:" + BOUNCYCASTLE_VER,
|
artifact = "org.bouncycastle:bcpg-jdk15on:" + BOUNCYCASTLE_VER,
|
||||||
sha1 = "13c7a199c484127daad298996e95818478431a2c",
|
sha1 = "422656435514ab8a28752b117d5d2646660a0ace",
|
||||||
src_sha1 = "edcd9e86d95e39b4da39bb295efd93bc4f56266e",
|
src_sha1 = "836da34e11114cbce8fa99f54175f8f3278d1cce",
|
||||||
)
|
)
|
||||||
|
|
||||||
maven_jar(
|
maven_jar(
|
||||||
name = "bcprov",
|
name = "bcprov",
|
||||||
artifact = "org.bouncycastle:bcprov-jdk15on:" + BOUNCYCASTLE_VER,
|
artifact = "org.bouncycastle:bcprov-jdk15on:" + BOUNCYCASTLE_VER,
|
||||||
sha1 = "bd47ad3bd14b8e82595c7adaa143501e60842a84",
|
sha1 = "00df4b474e71be02c1349c3292d98886f888d1f7",
|
||||||
src_sha1 = "7c57a4d13fe53d9abb967bba600dd0b293dafd6a",
|
src_sha1 = "3bf88046a16098ea6cc41576dd50d512854d39e1",
|
||||||
)
|
)
|
||||||
|
|
||||||
maven_jar(
|
maven_jar(
|
||||||
name = "bcpkix",
|
name = "bcpkix",
|
||||||
artifact = "org.bouncycastle:bcpkix-jdk15on:" + BOUNCYCASTLE_VER,
|
artifact = "org.bouncycastle:bcpkix-jdk15on:" + BOUNCYCASTLE_VER,
|
||||||
sha1 = "d0c46320fbc07be3a24eb13a56cee4e3d38e0c75",
|
sha1 = "89bb3aa5b98b48e584eee2a7401b7682a46779b4",
|
||||||
src_sha1 = "a25f041293f401af08efba63ff4bbdce98134a03",
|
src_sha1 = "a0498d09200a18737eccc05aa81bbd05c1be0f8c",
|
||||||
)
|
)
|
||||||
|
|
|
@ -64,7 +64,6 @@
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
|
|
||||||
import org.eclipse.jgit.lib.Constants;
|
import org.eclipse.jgit.lib.Constants;
|
||||||
import org.eclipse.jgit.lib.ObjectId;
|
import org.eclipse.jgit.lib.ObjectId;
|
||||||
import org.eclipse.jgit.lib.Repository;
|
import org.eclipse.jgit.lib.Repository;
|
||||||
|
@ -276,13 +275,12 @@ private static String etag(byte[] content) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static String identify(Repository git) {
|
static String identify(Repository git) {
|
||||||
if (git instanceof DfsRepository) {
|
String identifier = git.getIdentifier();
|
||||||
return ((DfsRepository) git).getDescription().getRepositoryName();
|
if (identifier == null) {
|
||||||
} else if (git.getDirectory() != null) {
|
|
||||||
return git.getDirectory().getPath();
|
|
||||||
}
|
|
||||||
return "unknown";
|
return "unknown";
|
||||||
}
|
}
|
||||||
|
return identifier;
|
||||||
|
}
|
||||||
|
|
||||||
private ServletUtils() {
|
private ServletUtils() {
|
||||||
// static utility class only
|
// static utility class only
|
||||||
|
|
|
@ -44,7 +44,6 @@
|
||||||
package org.eclipse.jgit.http.test;
|
package org.eclipse.jgit.http.test;
|
||||||
|
|
||||||
import static org.hamcrest.Matchers.is;
|
import static org.hamcrest.Matchers.is;
|
||||||
import static org.hamcrest.Matchers.theInstance;
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
@ -366,7 +365,7 @@ public void testHttpClientWantsV2ButServerNotConfigured() throws Exception {
|
||||||
|
|
||||||
// Check that we get a v0 response.
|
// Check that we get a v0 response.
|
||||||
assertThat(pckIn.readString(), is("# service=git-upload-pack"));
|
assertThat(pckIn.readString(), is("# service=git-upload-pack"));
|
||||||
assertThat(pckIn.readString(), theInstance(PacketLineIn.END));
|
assertTrue(PacketLineIn.isEnd(pckIn.readString()));
|
||||||
assertTrue(pckIn.readString().matches("[0-9a-f]{40} HEAD.*"));
|
assertTrue(pckIn.readString().matches("[0-9a-f]{40} HEAD.*"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -388,8 +387,7 @@ public void testV2HttpFirstResponse() throws Exception {
|
||||||
|
|
||||||
// What remains are capabilities - ensure that all of them are
|
// What remains are capabilities - ensure that all of them are
|
||||||
// non-empty strings, and that we see END at the end.
|
// non-empty strings, and that we see END at the end.
|
||||||
String s;
|
for (String s : pckIn.readStrings()) {
|
||||||
while ((s = pckIn.readString()) != PacketLineIn.END) {
|
|
||||||
assertTrue(!s.isEmpty());
|
assertTrue(!s.isEmpty());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -422,8 +420,7 @@ public void testV2HttpSubsequentResponse() throws Exception {
|
||||||
PacketLineIn pckIn = new PacketLineIn(c.getInputStream());
|
PacketLineIn pckIn = new PacketLineIn(c.getInputStream());
|
||||||
|
|
||||||
// Just check that we get what looks like a ref advertisement.
|
// Just check that we get what looks like a ref advertisement.
|
||||||
String s;
|
for (String s : pckIn.readStrings()) {
|
||||||
while ((s = pckIn.readString()) != PacketLineIn.END) {
|
|
||||||
assertTrue(s.matches("[0-9a-f]{40} [A-Za-z/]*"));
|
assertTrue(s.matches("[0-9a-f]{40} [A-Za-z/]*"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
package org.eclipse.jgit.http.test;
|
package org.eclipse.jgit.http.test;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertSame;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -157,7 +157,7 @@ public void testPush_UnpackError_TruncatedPack() throws Exception {
|
||||||
pckin.readString());
|
pckin.readString());
|
||||||
assertEquals("ng refs/objects/A n/a (unpacker error)",
|
assertEquals("ng refs/objects/A n/a (unpacker error)",
|
||||||
pckin.readString());
|
pckin.readString());
|
||||||
assertSame(PacketLineIn.END, pckin.readString());
|
assertTrue(PacketLineIn.isEnd(pckin.readString()));
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
c.disconnect();
|
c.disconnect();
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
|
@ -56,6 +57,7 @@
|
||||||
import java.util.concurrent.CyclicBarrier;
|
import java.util.concurrent.CyclicBarrier;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.eclipse.jgit.lfs.lib.AnyLongObjectId;
|
import org.eclipse.jgit.lfs.lib.AnyLongObjectId;
|
||||||
|
@ -122,11 +124,12 @@ public void testParallelUploads() throws Exception {
|
||||||
ExecutorService e = Executors.newFixedThreadPool(count);
|
ExecutorService e = Executors.newFixedThreadPool(count);
|
||||||
try {
|
try {
|
||||||
for (Path p : paths) {
|
for (Path p : paths) {
|
||||||
e.submit(() -> {
|
Future<Object> result = e.submit(() -> {
|
||||||
barrier.await();
|
barrier.await();
|
||||||
putContent(p);
|
putContent(p);
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
|
assertNotNull(result);
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
e.shutdown();
|
e.shutdown();
|
||||||
|
|
|
@ -84,7 +84,7 @@ private static class Upload extends TransferHandler {
|
||||||
@Override
|
@Override
|
||||||
Body process() throws IOException {
|
Body process() throws IOException {
|
||||||
Response.Body body = new Response.Body();
|
Response.Body body = new Response.Body();
|
||||||
if (objects.size() > 0) {
|
if (!objects.isEmpty()) {
|
||||||
body.objects = new ArrayList<>();
|
body.objects = new ArrayList<>();
|
||||||
for (LfsObject o : objects) {
|
for (LfsObject o : objects) {
|
||||||
addObjectInfo(body, o);
|
addObjectInfo(body, o);
|
||||||
|
@ -122,7 +122,7 @@ private static class Download extends TransferHandler {
|
||||||
@Override
|
@Override
|
||||||
Body process() throws IOException {
|
Body process() throws IOException {
|
||||||
Response.Body body = new Response.Body();
|
Response.Body body = new Response.Body();
|
||||||
if (objects.size() > 0) {
|
if (!objects.isEmpty()) {
|
||||||
body.objects = new ArrayList<>();
|
body.objects = new ArrayList<>();
|
||||||
for (LfsObject o : objects) {
|
for (LfsObject o : objects) {
|
||||||
addObjectInfo(body, o);
|
addObjectInfo(body, o);
|
||||||
|
|
|
@ -170,7 +170,7 @@ private static final long hexUInt64(final byte[] bs, int p, final int end) {
|
||||||
r |= RawParseUtils.parseHexInt4(bs[p++]);
|
r |= RawParseUtils.parseHexInt4(bs[p++]);
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
return r << (16 - n) * 4;
|
return r << ((16 - n) * 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
static long mask(int nibbles, long word, long v) {
|
static long mask(int nibbles, long word, long v) {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<?pde?>
|
<?pde?>
|
||||||
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
|
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
|
||||||
<target name="jgit-4.10" sequenceNumber="1558537043">
|
<target name="jgit-4.10" sequenceNumber="1559548426">
|
||||||
<locations>
|
<locations>
|
||||||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
||||||
<unit id="org.eclipse.jetty.client" version="9.4.14.v20181114"/>
|
<unit id="org.eclipse.jetty.client" version="9.4.14.v20181114"/>
|
||||||
|
@ -23,8 +23,8 @@
|
||||||
<repository id="jetty-9.4.14" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.14.v20181114"/>
|
<repository id="jetty-9.4.14" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.14.v20181114"/>
|
||||||
</location>
|
</location>
|
||||||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
||||||
<unit id="org.apache.ant" version="1.10.6.v20190516-0412"/>
|
<unit id="org.apache.ant" version="1.10.5.v20190526-1402"/>
|
||||||
<unit id="org.apache.ant.source" version="1.10.6.v20190516-0412"/>
|
<unit id="org.apache.ant.source" version="1.10.5.v20190526-1402"/>
|
||||||
<unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
|
<unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
|
||||||
<unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
|
<unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
|
||||||
<unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
|
<unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
|
||||||
|
@ -37,12 +37,12 @@
|
||||||
<unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
|
<unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
|
||||||
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
|
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
|
||||||
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
|
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
|
||||||
<unit id="org.bouncycastle.bcpg" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpg" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcpg.source" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpg.source" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcpkix" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpkix" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcpkix.source" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpkix.source" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcprov" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcprov" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcprov.source" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcprov.source" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
|
<unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
|
||||||
<unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
|
<unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
|
||||||
<unit id="org.hamcrest" version="1.1.0.v20090501071000"/>
|
<unit id="org.hamcrest" version="1.1.0.v20090501071000"/>
|
||||||
|
@ -82,7 +82,7 @@
|
||||||
<unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
|
<unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
|
||||||
<unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
|
<unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
|
||||||
<unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
|
<unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
|
||||||
<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/S20190521195709/repository"/>
|
<repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20190602212107/repository"/>
|
||||||
</location>
|
</location>
|
||||||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
||||||
<unit id="org.eclipse.osgi" version="0.0.0"/>
|
<unit id="org.eclipse.osgi" version="0.0.0"/>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
target "jgit-4.10" with source configurePhase
|
target "jgit-4.10" with source configurePhase
|
||||||
|
|
||||||
include "projects/jetty-9.4.14.tpd"
|
include "projects/jetty-9.4.14.tpd"
|
||||||
include "orbit/S20190521195709.tpd"
|
include "orbit/R20190602212107-2019-06.tpd"
|
||||||
|
|
||||||
location "http://download.eclipse.org/releases/2018-12/" {
|
location "http://download.eclipse.org/releases/2018-12/" {
|
||||||
org.eclipse.osgi lazy
|
org.eclipse.osgi lazy
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<?pde?>
|
<?pde?>
|
||||||
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
|
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
|
||||||
<target name="jgit-4.11" sequenceNumber="1558539017">
|
<target name="jgit-4.11" sequenceNumber="1559548429">
|
||||||
<locations>
|
<locations>
|
||||||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
||||||
<unit id="org.eclipse.jetty.client" version="9.4.14.v20181114"/>
|
<unit id="org.eclipse.jetty.client" version="9.4.14.v20181114"/>
|
||||||
|
@ -23,8 +23,8 @@
|
||||||
<repository id="jetty-9.4.14" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.14.v20181114"/>
|
<repository id="jetty-9.4.14" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.14.v20181114"/>
|
||||||
</location>
|
</location>
|
||||||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
||||||
<unit id="org.apache.ant" version="1.10.6.v20190516-0412"/>
|
<unit id="org.apache.ant" version="1.10.5.v20190526-1402"/>
|
||||||
<unit id="org.apache.ant.source" version="1.10.6.v20190516-0412"/>
|
<unit id="org.apache.ant.source" version="1.10.5.v20190526-1402"/>
|
||||||
<unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
|
<unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
|
||||||
<unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
|
<unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
|
||||||
<unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
|
<unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
|
||||||
|
@ -37,12 +37,12 @@
|
||||||
<unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
|
<unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
|
||||||
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
|
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
|
||||||
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
|
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
|
||||||
<unit id="org.bouncycastle.bcpg" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpg" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcpg.source" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpg.source" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcpkix" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpkix" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcpkix.source" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpkix.source" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcprov" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcprov" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcprov.source" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcprov.source" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
|
<unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
|
||||||
<unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
|
<unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
|
||||||
<unit id="org.hamcrest" version="1.1.0.v20090501071000"/>
|
<unit id="org.hamcrest" version="1.1.0.v20090501071000"/>
|
||||||
|
@ -82,7 +82,7 @@
|
||||||
<unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
|
<unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
|
||||||
<unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
|
<unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
|
||||||
<unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
|
<unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
|
||||||
<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/S20190521195709/repository"/>
|
<repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20190602212107/repository"/>
|
||||||
</location>
|
</location>
|
||||||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
||||||
<unit id="org.eclipse.osgi" version="0.0.0"/>
|
<unit id="org.eclipse.osgi" version="0.0.0"/>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
target "jgit-4.11" with source configurePhase
|
target "jgit-4.11" with source configurePhase
|
||||||
|
|
||||||
include "projects/jetty-9.4.14.tpd"
|
include "projects/jetty-9.4.14.tpd"
|
||||||
include "orbit/S20190521195709.tpd"
|
include "orbit/R20190602212107-2019-06.tpd"
|
||||||
|
|
||||||
location "http://download.eclipse.org/releases/2019-03/" {
|
location "http://download.eclipse.org/releases/2019-03/" {
|
||||||
org.eclipse.osgi lazy
|
org.eclipse.osgi lazy
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<?pde?>
|
<?pde?>
|
||||||
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
|
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
|
||||||
<target name="jgit-4.12-staging" sequenceNumber="1558539043">
|
<target name="jgit-4.12-staging" sequenceNumber="1559548433">
|
||||||
<locations>
|
<locations>
|
||||||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
||||||
<unit id="org.eclipse.jetty.client" version="9.4.14.v20181114"/>
|
<unit id="org.eclipse.jetty.client" version="9.4.14.v20181114"/>
|
||||||
|
@ -23,8 +23,8 @@
|
||||||
<repository id="jetty-9.4.14" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.14.v20181114"/>
|
<repository id="jetty-9.4.14" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.14.v20181114"/>
|
||||||
</location>
|
</location>
|
||||||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
||||||
<unit id="org.apache.ant" version="1.10.6.v20190516-0412"/>
|
<unit id="org.apache.ant" version="1.10.5.v20190526-1402"/>
|
||||||
<unit id="org.apache.ant.source" version="1.10.6.v20190516-0412"/>
|
<unit id="org.apache.ant.source" version="1.10.5.v20190526-1402"/>
|
||||||
<unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
|
<unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
|
||||||
<unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
|
<unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
|
||||||
<unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
|
<unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
|
||||||
|
@ -37,12 +37,12 @@
|
||||||
<unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
|
<unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
|
||||||
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
|
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
|
||||||
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
|
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
|
||||||
<unit id="org.bouncycastle.bcpg" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpg" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcpg.source" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpg.source" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcpkix" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpkix" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcpkix.source" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpkix.source" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcprov" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcprov" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcprov.source" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcprov.source" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
|
<unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
|
||||||
<unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
|
<unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
|
||||||
<unit id="org.hamcrest" version="1.1.0.v20090501071000"/>
|
<unit id="org.hamcrest" version="1.1.0.v20090501071000"/>
|
||||||
|
@ -82,7 +82,7 @@
|
||||||
<unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
|
<unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
|
||||||
<unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
|
<unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
|
||||||
<unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
|
<unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
|
||||||
<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/S20190521195709/repository"/>
|
<repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20190602212107/repository"/>
|
||||||
</location>
|
</location>
|
||||||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
||||||
<unit id="org.eclipse.osgi" version="0.0.0"/>
|
<unit id="org.eclipse.osgi" version="0.0.0"/>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
target "jgit-4.12-staging" with source configurePhase
|
target "jgit-4.12-staging" with source configurePhase
|
||||||
|
|
||||||
include "projects/jetty-9.4.14.tpd"
|
include "projects/jetty-9.4.14.tpd"
|
||||||
include "orbit/S20190521195709.tpd"
|
include "orbit/R20190602212107-2019-06.tpd"
|
||||||
|
|
||||||
location "http://download.eclipse.org/staging/2019-06/" {
|
location "http://download.eclipse.org/staging/2019-06/" {
|
||||||
org.eclipse.osgi lazy
|
org.eclipse.osgi lazy
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<?pde?>
|
<?pde?>
|
||||||
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
|
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
|
||||||
<target name="jgit-4.6" sequenceNumber="1558539043">
|
<target name="jgit-4.6" sequenceNumber="1559548436">
|
||||||
<locations>
|
<locations>
|
||||||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
||||||
<unit id="org.eclipse.jetty.client" version="9.4.14.v20181114"/>
|
<unit id="org.eclipse.jetty.client" version="9.4.14.v20181114"/>
|
||||||
|
@ -23,8 +23,8 @@
|
||||||
<repository id="jetty-9.4.14" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.14.v20181114"/>
|
<repository id="jetty-9.4.14" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.14.v20181114"/>
|
||||||
</location>
|
</location>
|
||||||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
||||||
<unit id="org.apache.ant" version="1.10.6.v20190516-0412"/>
|
<unit id="org.apache.ant" version="1.10.5.v20190526-1402"/>
|
||||||
<unit id="org.apache.ant.source" version="1.10.6.v20190516-0412"/>
|
<unit id="org.apache.ant.source" version="1.10.5.v20190526-1402"/>
|
||||||
<unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
|
<unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
|
||||||
<unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
|
<unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
|
||||||
<unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
|
<unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
|
||||||
|
@ -37,12 +37,12 @@
|
||||||
<unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
|
<unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
|
||||||
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
|
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
|
||||||
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
|
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
|
||||||
<unit id="org.bouncycastle.bcpg" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpg" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcpg.source" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpg.source" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcpkix" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpkix" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcpkix.source" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpkix.source" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcprov" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcprov" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcprov.source" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcprov.source" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
|
<unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
|
||||||
<unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
|
<unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
|
||||||
<unit id="org.hamcrest" version="1.1.0.v20090501071000"/>
|
<unit id="org.hamcrest" version="1.1.0.v20090501071000"/>
|
||||||
|
@ -82,7 +82,7 @@
|
||||||
<unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
|
<unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
|
||||||
<unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
|
<unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
|
||||||
<unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
|
<unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
|
||||||
<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/S20190521195709/repository"/>
|
<repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20190602212107/repository"/>
|
||||||
</location>
|
</location>
|
||||||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
||||||
<unit id="org.eclipse.osgi" version="0.0.0"/>
|
<unit id="org.eclipse.osgi" version="0.0.0"/>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
target "jgit-4.6" with source configurePhase
|
target "jgit-4.6" with source configurePhase
|
||||||
|
|
||||||
include "projects/jetty-9.4.14.tpd"
|
include "projects/jetty-9.4.14.tpd"
|
||||||
include "orbit/S20190521195709.tpd"
|
include "orbit/R20190602212107-2019-06.tpd"
|
||||||
|
|
||||||
location "http://download.eclipse.org/releases/neon/" {
|
location "http://download.eclipse.org/releases/neon/" {
|
||||||
org.eclipse.osgi lazy
|
org.eclipse.osgi lazy
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<?pde?>
|
<?pde?>
|
||||||
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
|
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
|
||||||
<target name="jgit-4.7" sequenceNumber="1558539038">
|
<target name="jgit-4.7" sequenceNumber="1559548440">
|
||||||
<locations>
|
<locations>
|
||||||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
||||||
<unit id="org.eclipse.jetty.client" version="9.4.14.v20181114"/>
|
<unit id="org.eclipse.jetty.client" version="9.4.14.v20181114"/>
|
||||||
|
@ -23,8 +23,8 @@
|
||||||
<repository id="jetty-9.4.14" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.14.v20181114"/>
|
<repository id="jetty-9.4.14" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.14.v20181114"/>
|
||||||
</location>
|
</location>
|
||||||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
||||||
<unit id="org.apache.ant" version="1.10.6.v20190516-0412"/>
|
<unit id="org.apache.ant" version="1.10.5.v20190526-1402"/>
|
||||||
<unit id="org.apache.ant.source" version="1.10.6.v20190516-0412"/>
|
<unit id="org.apache.ant.source" version="1.10.5.v20190526-1402"/>
|
||||||
<unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
|
<unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
|
||||||
<unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
|
<unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
|
||||||
<unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
|
<unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
|
||||||
|
@ -37,12 +37,12 @@
|
||||||
<unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
|
<unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
|
||||||
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
|
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
|
||||||
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
|
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
|
||||||
<unit id="org.bouncycastle.bcpg" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpg" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcpg.source" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpg.source" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcpkix" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpkix" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcpkix.source" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpkix.source" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcprov" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcprov" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcprov.source" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcprov.source" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
|
<unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
|
||||||
<unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
|
<unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
|
||||||
<unit id="org.hamcrest" version="1.1.0.v20090501071000"/>
|
<unit id="org.hamcrest" version="1.1.0.v20090501071000"/>
|
||||||
|
@ -82,7 +82,7 @@
|
||||||
<unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
|
<unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
|
||||||
<unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
|
<unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
|
||||||
<unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
|
<unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
|
||||||
<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/S20190521195709/repository"/>
|
<repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20190602212107/repository"/>
|
||||||
</location>
|
</location>
|
||||||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
||||||
<unit id="org.eclipse.osgi" version="0.0.0"/>
|
<unit id="org.eclipse.osgi" version="0.0.0"/>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
target "jgit-4.7" with source configurePhase
|
target "jgit-4.7" with source configurePhase
|
||||||
|
|
||||||
include "projects/jetty-9.4.14.tpd"
|
include "projects/jetty-9.4.14.tpd"
|
||||||
include "orbit/S20190521195709.tpd"
|
include "orbit/R20190602212107-2019-06.tpd"
|
||||||
|
|
||||||
location "http://download.eclipse.org/releases/oxygen/" {
|
location "http://download.eclipse.org/releases/oxygen/" {
|
||||||
org.eclipse.osgi lazy
|
org.eclipse.osgi lazy
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<?pde?>
|
<?pde?>
|
||||||
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
|
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
|
||||||
<target name="jgit-4.8" sequenceNumber="1558539037">
|
<target name="jgit-4.8" sequenceNumber="1559548443">
|
||||||
<locations>
|
<locations>
|
||||||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
||||||
<unit id="org.eclipse.jetty.client" version="9.4.14.v20181114"/>
|
<unit id="org.eclipse.jetty.client" version="9.4.14.v20181114"/>
|
||||||
|
@ -23,8 +23,8 @@
|
||||||
<repository id="jetty-9.4.14" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.14.v20181114"/>
|
<repository id="jetty-9.4.14" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.14.v20181114"/>
|
||||||
</location>
|
</location>
|
||||||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
||||||
<unit id="org.apache.ant" version="1.10.6.v20190516-0412"/>
|
<unit id="org.apache.ant" version="1.10.5.v20190526-1402"/>
|
||||||
<unit id="org.apache.ant.source" version="1.10.6.v20190516-0412"/>
|
<unit id="org.apache.ant.source" version="1.10.5.v20190526-1402"/>
|
||||||
<unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
|
<unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
|
||||||
<unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
|
<unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
|
||||||
<unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
|
<unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
|
||||||
|
@ -37,12 +37,12 @@
|
||||||
<unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
|
<unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
|
||||||
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
|
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
|
||||||
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
|
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
|
||||||
<unit id="org.bouncycastle.bcpg" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpg" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcpg.source" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpg.source" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcpkix" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpkix" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcpkix.source" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpkix.source" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcprov" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcprov" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcprov.source" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcprov.source" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
|
<unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
|
||||||
<unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
|
<unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
|
||||||
<unit id="org.hamcrest" version="1.1.0.v20090501071000"/>
|
<unit id="org.hamcrest" version="1.1.0.v20090501071000"/>
|
||||||
|
@ -82,7 +82,7 @@
|
||||||
<unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
|
<unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
|
||||||
<unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
|
<unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
|
||||||
<unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
|
<unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
|
||||||
<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/S20190521195709/repository"/>
|
<repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20190602212107/repository"/>
|
||||||
</location>
|
</location>
|
||||||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
||||||
<unit id="org.eclipse.osgi" version="0.0.0"/>
|
<unit id="org.eclipse.osgi" version="0.0.0"/>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
target "jgit-4.8" with source configurePhase
|
target "jgit-4.8" with source configurePhase
|
||||||
|
|
||||||
include "projects/jetty-9.4.14.tpd"
|
include "projects/jetty-9.4.14.tpd"
|
||||||
include "orbit/S20190521195709.tpd"
|
include "orbit/R20190602212107-2019-06.tpd"
|
||||||
|
|
||||||
location "http://download.eclipse.org/releases/photon/" {
|
location "http://download.eclipse.org/releases/photon/" {
|
||||||
org.eclipse.osgi lazy
|
org.eclipse.osgi lazy
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<?pde?>
|
<?pde?>
|
||||||
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
|
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
|
||||||
<target name="jgit-4.9" sequenceNumber="1558539042">
|
<target name="jgit-4.9" sequenceNumber="1559548447">
|
||||||
<locations>
|
<locations>
|
||||||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
||||||
<unit id="org.eclipse.jetty.client" version="9.4.14.v20181114"/>
|
<unit id="org.eclipse.jetty.client" version="9.4.14.v20181114"/>
|
||||||
|
@ -23,8 +23,8 @@
|
||||||
<repository id="jetty-9.4.14" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.14.v20181114"/>
|
<repository id="jetty-9.4.14" location="http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.14.v20181114"/>
|
||||||
</location>
|
</location>
|
||||||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
||||||
<unit id="org.apache.ant" version="1.10.6.v20190516-0412"/>
|
<unit id="org.apache.ant" version="1.10.5.v20190526-1402"/>
|
||||||
<unit id="org.apache.ant.source" version="1.10.6.v20190516-0412"/>
|
<unit id="org.apache.ant.source" version="1.10.5.v20190526-1402"/>
|
||||||
<unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
|
<unit id="org.apache.commons.codec" version="1.10.0.v20180409-1845"/>
|
||||||
<unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
|
<unit id="org.apache.commons.codec.source" version="1.10.0.v20180409-1845"/>
|
||||||
<unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
|
<unit id="org.apache.commons.compress" version="1.18.0.v20181121-2221"/>
|
||||||
|
@ -37,12 +37,12 @@
|
||||||
<unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
|
<unit id="org.apache.httpcomponents.httpcore.source" version="4.4.10.v20190123-2214"/>
|
||||||
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
|
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
|
||||||
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
|
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
|
||||||
<unit id="org.bouncycastle.bcpg" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpg" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcpg.source" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpg.source" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcpkix" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpkix" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcpkix.source" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcpkix.source" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcprov" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcprov" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.bouncycastle.bcprov.source" version="1.60.0.v20181210-2057"/>
|
<unit id="org.bouncycastle.bcprov.source" version="1.61.0.v20190602-1335"/>
|
||||||
<unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
|
<unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
|
||||||
<unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
|
<unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
|
||||||
<unit id="org.hamcrest" version="1.1.0.v20090501071000"/>
|
<unit id="org.hamcrest" version="1.1.0.v20090501071000"/>
|
||||||
|
@ -82,7 +82,7 @@
|
||||||
<unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
|
<unit id="org.apache.sshd.osgi.source" version="2.2.0.v20190425-2127"/>
|
||||||
<unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
|
<unit id="org.apache.sshd.sftp" version="2.2.0.v20190425-2127"/>
|
||||||
<unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
|
<unit id="org.apache.sshd.sftp.source" version="2.2.0.v20190425-2127"/>
|
||||||
<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/S20190521195709/repository"/>
|
<repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20190602212107/repository"/>
|
||||||
</location>
|
</location>
|
||||||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
|
||||||
<unit id="org.eclipse.osgi" version="0.0.0"/>
|
<unit id="org.eclipse.osgi" version="0.0.0"/>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
target "jgit-4.9" with source configurePhase
|
target "jgit-4.9" with source configurePhase
|
||||||
|
|
||||||
include "projects/jetty-9.4.14.tpd"
|
include "projects/jetty-9.4.14.tpd"
|
||||||
include "orbit/S20190521195709.tpd"
|
include "orbit/R20190602212107-2019-06.tpd"
|
||||||
|
|
||||||
location "http://download.eclipse.org/releases/2018-09/" {
|
location "http://download.eclipse.org/releases/2018-09/" {
|
||||||
org.eclipse.osgi lazy
|
org.eclipse.osgi lazy
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
target "S20190521195709" with source configurePhase
|
target "R20190602212107-2019-06" with source configurePhase
|
||||||
// see http://download.eclipse.org/tools/orbit/downloads/
|
// see http://download.eclipse.org/tools/orbit/downloads/
|
||||||
|
|
||||||
location "http://download.eclipse.org/tools/orbit/downloads/drops/S20190521195709/repository" {
|
location "https://download.eclipse.org/tools/orbit/downloads/drops/R20190602212107/repository" {
|
||||||
org.apache.ant [1.10.6.v20190516-0412,1.10.6.v20190516-0412]
|
org.apache.ant [1.10.5.v20190526-1402,1.10.5.v20190526-1402]
|
||||||
org.apache.ant.source [1.10.6.v20190516-0412,1.10.6.v20190516-0412]
|
org.apache.ant.source [1.10.5.v20190526-1402,1.10.5.v20190526-1402]
|
||||||
org.apache.commons.codec [1.10.0.v20180409-1845,1.10.0.v20180409-1845]
|
org.apache.commons.codec [1.10.0.v20180409-1845,1.10.0.v20180409-1845]
|
||||||
org.apache.commons.codec.source [1.10.0.v20180409-1845,1.10.0.v20180409-1845]
|
org.apache.commons.codec.source [1.10.0.v20180409-1845,1.10.0.v20180409-1845]
|
||||||
org.apache.commons.compress [1.18.0.v20181121-2221,1.18.0.v20181121-2221]
|
org.apache.commons.compress [1.18.0.v20181121-2221,1.18.0.v20181121-2221]
|
||||||
|
@ -16,12 +16,12 @@ location "http://download.eclipse.org/tools/orbit/downloads/drops/S2019052119570
|
||||||
org.apache.httpcomponents.httpcore.source [4.4.10.v20190123-2214,4.4.10.v20190123-2214]
|
org.apache.httpcomponents.httpcore.source [4.4.10.v20190123-2214,4.4.10.v20190123-2214]
|
||||||
org.apache.log4j [1.2.15.v201012070815,1.2.15.v201012070815]
|
org.apache.log4j [1.2.15.v201012070815,1.2.15.v201012070815]
|
||||||
org.apache.log4j.source [1.2.15.v201012070815,1.2.15.v201012070815]
|
org.apache.log4j.source [1.2.15.v201012070815,1.2.15.v201012070815]
|
||||||
org.bouncycastle.bcpg [1.60.0.v20181210-2057,1.60.0.v20181210-2057]
|
org.bouncycastle.bcpg [1.61.0.v20190602-1335,1.61.0.v20190602-1335]
|
||||||
org.bouncycastle.bcpg.source [1.60.0.v20181210-2057,1.60.0.v20181210-2057]
|
org.bouncycastle.bcpg.source [1.61.0.v20190602-1335,1.61.0.v20190602-1335]
|
||||||
org.bouncycastle.bcpkix [1.60.0.v20181210-2057,1.60.0.v20181210-2057]
|
org.bouncycastle.bcpkix [1.61.0.v20190602-1335,1.61.0.v20190602-1335]
|
||||||
org.bouncycastle.bcpkix.source [1.60.0.v20181210-2057,1.60.0.v20181210-2057]
|
org.bouncycastle.bcpkix.source [1.61.0.v20190602-1335,1.61.0.v20190602-1335]
|
||||||
org.bouncycastle.bcprov [1.60.0.v20181210-2057,1.60.0.v20181210-2057]
|
org.bouncycastle.bcprov [1.61.0.v20190602-1335,1.61.0.v20190602-1335]
|
||||||
org.bouncycastle.bcprov.source [1.60.0.v20181210-2057,1.60.0.v20181210-2057]
|
org.bouncycastle.bcprov.source [1.61.0.v20190602-1335,1.61.0.v20190602-1335]
|
||||||
org.kohsuke.args4j [2.33.0.v20160323-2218,2.33.0.v20160323-2218]
|
org.kohsuke.args4j [2.33.0.v20160323-2218,2.33.0.v20160323-2218]
|
||||||
org.kohsuke.args4j.source [2.33.0.v20160323-2218,2.33.0.v20160323-2218]
|
org.kohsuke.args4j.source [2.33.0.v20160323-2218,2.33.0.v20160323-2218]
|
||||||
org.hamcrest [1.1.0.v20090501071000,1.1.0.v20090501071000]
|
org.hamcrest [1.1.0.v20090501071000,1.1.0.v20090501071000]
|
|
@ -222,6 +222,7 @@ unsupportedOperation=Unsupported operation: {0}
|
||||||
untrackedFiles=Untracked files:
|
untrackedFiles=Untracked files:
|
||||||
updating=Updating {0}..{1}
|
updating=Updating {0}..{1}
|
||||||
usage_Aggressive=This option will cause gc to more aggressively optimize the repository at the expense of taking much more time
|
usage_Aggressive=This option will cause gc to more aggressively optimize the repository at the expense of taking much more time
|
||||||
|
usage_AlwaysFallback=Show uniquely abbreviated commit object as fallback
|
||||||
usage_bareClone=Make a bare Git repository. That is, instead of creating [DIRECTORY] and placing the administrative files in [DIRECTORY]/.git, make the [DIRECTORY] itself the $GIT_DIR.
|
usage_bareClone=Make a bare Git repository. That is, instead of creating [DIRECTORY] and placing the administrative files in [DIRECTORY]/.git, make the [DIRECTORY] itself the $GIT_DIR.
|
||||||
usage_Blame=Show what revision and author last modified each line
|
usage_Blame=Show what revision and author last modified each line
|
||||||
usage_Clean=Remove untracked files from the working tree
|
usage_Clean=Remove untracked files from the working tree
|
||||||
|
@ -289,6 +290,7 @@ usage_Status=Show the working tree status
|
||||||
usage_StopTrackingAFile=Stop tracking a file
|
usage_StopTrackingAFile=Stop tracking a file
|
||||||
usage_TextHashFunctions=Scan repository to compute maximum number of collisions for hash functions
|
usage_TextHashFunctions=Scan repository to compute maximum number of collisions for hash functions
|
||||||
usage_UpdateRemoteRepositoryFromLocalRefs=Update remote repository from local refs
|
usage_UpdateRemoteRepositoryFromLocalRefs=Update remote repository from local refs
|
||||||
|
usage_UseTags=Use any tag including lightweight tags
|
||||||
usage_WriteDirCache=Write the DirCache
|
usage_WriteDirCache=Write the DirCache
|
||||||
usage_abbrevCommits=abbreviate commits to N + 1 digits
|
usage_abbrevCommits=abbreviate commits to N + 1 digits
|
||||||
usage_abortConnectionIfNoActivity=abort connection if no activity
|
usage_abortConnectionIfNoActivity=abort connection if no activity
|
||||||
|
|
|
@ -96,7 +96,7 @@ protected void run() throws Exception {
|
||||||
try (Git git = new Git(db)) {
|
try (Git git = new Git(db)) {
|
||||||
CheckoutCommand command = git.checkout()
|
CheckoutCommand command = git.checkout()
|
||||||
.setProgressMonitor(new TextProgressMonitor(errw));
|
.setProgressMonitor(new TextProgressMonitor(errw));
|
||||||
if (paths.size() > 0) {
|
if (!paths.isEmpty()) {
|
||||||
command.setStartPoint(name);
|
command.setStartPoint(name);
|
||||||
if (paths.size() == 1 && paths.get(0).equals(".")) { //$NON-NLS-1$
|
if (paths.size() == 1 && paths.get(0).equals(".")) { //$NON-NLS-1$
|
||||||
command.setAllPaths(true);
|
command.setAllPaths(true);
|
||||||
|
|
|
@ -65,6 +65,12 @@ class Describe extends TextBuiltin {
|
||||||
@Option(name = "--long", usage = "usage_LongFormat")
|
@Option(name = "--long", usage = "usage_LongFormat")
|
||||||
private boolean longDesc;
|
private boolean longDesc;
|
||||||
|
|
||||||
|
@Option(name = "--tags", usage = "usage_UseTags")
|
||||||
|
private boolean useTags;
|
||||||
|
|
||||||
|
@Option(name = "--always", usage = "usage_AlwaysFallback")
|
||||||
|
private boolean always;
|
||||||
|
|
||||||
@Option(name = "--match", usage = "usage_Match", metaVar = "metaVar_pattern")
|
@Option(name = "--match", usage = "usage_Match", metaVar = "metaVar_pattern")
|
||||||
private List<String> patterns = new ArrayList<>();
|
private List<String> patterns = new ArrayList<>();
|
||||||
|
|
||||||
|
@ -77,6 +83,8 @@ protected void run() {
|
||||||
cmd.setTarget(tree);
|
cmd.setTarget(tree);
|
||||||
}
|
}
|
||||||
cmd.setLong(longDesc);
|
cmd.setLong(longDesc);
|
||||||
|
cmd.setTags(useTags);
|
||||||
|
cmd.setAlways(always);
|
||||||
cmd.setMatch(patterns.toArray(new String[0]));
|
cmd.setMatch(patterns.toArray(new String[0]));
|
||||||
String result = null;
|
String result = null;
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -85,7 +85,7 @@ protected void run() {
|
||||||
CanonicalTreeParser p = new CanonicalTreeParser();
|
CanonicalTreeParser p = new CanonicalTreeParser();
|
||||||
p.reset(rw.getObjectReader(), c.getTree());
|
p.reset(rw.getObjectReader(), c.getTree());
|
||||||
tw.reset(); // drop the first empty tree, which we do not need here
|
tw.reset(); // drop the first empty tree, which we do not need here
|
||||||
if (paths.size() > 0) {
|
if (!paths.isEmpty()) {
|
||||||
tw.setFilter(PathFilterGroup.createFromStrings(paths));
|
tw.setFilter(PathFilterGroup.createFromStrings(paths));
|
||||||
}
|
}
|
||||||
tw.addTree(p);
|
tw.addTree(p);
|
||||||
|
|
|
@ -76,7 +76,7 @@ class LsTree extends TextBuiltin {
|
||||||
protected void run() {
|
protected void run() {
|
||||||
try (TreeWalk walk = new TreeWalk(db)) {
|
try (TreeWalk walk = new TreeWalk(db)) {
|
||||||
walk.reset(); // drop the first empty tree, which we do not need here
|
walk.reset(); // drop the first empty tree, which we do not need here
|
||||||
if (paths.size() > 0) {
|
if (!paths.isEmpty()) {
|
||||||
walk.setFilter(PathFilterGroup.createFromStrings(paths));
|
walk.setFilter(PathFilterGroup.createFromStrings(paths));
|
||||||
}
|
}
|
||||||
walk.setRecursive(recursive);
|
walk.setRecursive(recursive);
|
||||||
|
|
|
@ -80,7 +80,7 @@ protected void run() {
|
||||||
try (Git git = new Git(db)) {
|
try (Git git = new Git(db)) {
|
||||||
ResetCommand command = git.reset();
|
ResetCommand command = git.reset();
|
||||||
command.setRef(commit);
|
command.setRef(commit);
|
||||||
if (paths.size() > 0) {
|
if (!paths.isEmpty()) {
|
||||||
for (String path : paths) {
|
for (String path : paths) {
|
||||||
command.addPath(path);
|
command.addPath(path);
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,7 +93,7 @@ class Status extends TextBuiltin {
|
||||||
protected void run() {
|
protected void run() {
|
||||||
try (Git git = new Git(db)) {
|
try (Git git = new Git(db)) {
|
||||||
StatusCommand statusCommand = git.status();
|
StatusCommand statusCommand = git.status();
|
||||||
if (filterPaths != null && filterPaths.size() > 0) {
|
if (filterPaths != null) {
|
||||||
for (String path : filterPaths) {
|
for (String path : filterPaths) {
|
||||||
statusCommand.addPath(path);
|
statusCommand.addPath(path);
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ HELPERS = glob(
|
||||||
"treewalk/filter/AlwaysCloneTreeFilter.java",
|
"treewalk/filter/AlwaysCloneTreeFilter.java",
|
||||||
"test/resources/SampleDataRepositoryTestCase.java",
|
"test/resources/SampleDataRepositoryTestCase.java",
|
||||||
"util/CPUTimeStopWatch.java",
|
"util/CPUTimeStopWatch.java",
|
||||||
|
"util/http/HttpCookiesMatcher.java",
|
||||||
"util/io/Strings.java",
|
"util/io/Strings.java",
|
||||||
]]
|
]]
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.8
|
||||||
Import-Package: com.googlecode.javaewah;version="[1.1.6,2.0.0)",
|
Import-Package: com.googlecode.javaewah;version="[1.1.6,2.0.0)",
|
||||||
com.jcraft.jsch;version="[0.1.54,0.2.0)",
|
com.jcraft.jsch;version="[0.1.54,0.2.0)",
|
||||||
net.bytebuddy.dynamic.loading;version="[1.7.0,2.0.0)",
|
net.bytebuddy.dynamic.loading;version="[1.7.0,2.0.0)",
|
||||||
org.bouncycastle.util.encoders;version="[1.60.0,2.0.0)",
|
org.bouncycastle.util.encoders;version="[1.61.0,2.0.0)",
|
||||||
org.eclipse.jgit.annotations;version="[5.4.0,5.5.0)",
|
org.eclipse.jgit.annotations;version="[5.4.0,5.5.0)",
|
||||||
org.eclipse.jgit.api;version="[5.4.0,5.5.0)",
|
org.eclipse.jgit.api;version="[5.4.0,5.5.0)",
|
||||||
org.eclipse.jgit.api.errors;version="[5.4.0,5.5.0)",
|
org.eclipse.jgit.api.errors;version="[5.4.0,5.5.0)",
|
||||||
|
@ -35,6 +35,7 @@ Import-Package: com.googlecode.javaewah;version="[1.1.6,2.0.0)",
|
||||||
org.eclipse.jgit.internal.storage.pack;version="[5.4.0,5.5.0)",
|
org.eclipse.jgit.internal.storage.pack;version="[5.4.0,5.5.0)",
|
||||||
org.eclipse.jgit.internal.storage.reftable;version="[5.4.0,5.5.0)",
|
org.eclipse.jgit.internal.storage.reftable;version="[5.4.0,5.5.0)",
|
||||||
org.eclipse.jgit.internal.storage.reftree;version="[5.4.0,5.5.0)",
|
org.eclipse.jgit.internal.storage.reftree;version="[5.4.0,5.5.0)",
|
||||||
|
org.eclipse.jgit.internal.transport.http;version="[5.4.0,5.5.0)",
|
||||||
org.eclipse.jgit.internal.transport.parser;version="[5.4.0,5.5.0)",
|
org.eclipse.jgit.internal.transport.parser;version="[5.4.0,5.5.0)",
|
||||||
org.eclipse.jgit.junit;version="[5.4.0,5.5.0)",
|
org.eclipse.jgit.junit;version="[5.4.0,5.5.0)",
|
||||||
org.eclipse.jgit.junit.ssh;version="[5.4.0,5.5.0)",
|
org.eclipse.jgit.junit.ssh;version="[5.4.0,5.5.0)",
|
||||||
|
|
|
@ -7,6 +7,7 @@ def tests(tests):
|
||||||
for src in tests:
|
for src in tests:
|
||||||
name = src[len("tst/"):len(src) - len(".java")].replace("/", "_")
|
name = src[len("tst/"):len(src) - len(".java")].replace("/", "_")
|
||||||
labels = []
|
labels = []
|
||||||
|
timeout = "moderate"
|
||||||
if name.startswith("org_eclipse_jgit_"):
|
if name.startswith("org_eclipse_jgit_"):
|
||||||
l = name[len("org.eclipse.jgit_"):]
|
l = name[len("org.eclipse.jgit_"):]
|
||||||
if l.startswith("internal_storage_"):
|
if l.startswith("internal_storage_"):
|
||||||
|
@ -53,9 +54,15 @@ def tests(tests):
|
||||||
additional_deps = [
|
additional_deps = [
|
||||||
"//lib:mockito",
|
"//lib:mockito",
|
||||||
]
|
]
|
||||||
|
if src.endswith("TransportHttpTest.java"):
|
||||||
|
additional_deps = [
|
||||||
|
"//lib:mockito",
|
||||||
|
]
|
||||||
heap_size = "-Xmx256m"
|
heap_size = "-Xmx256m"
|
||||||
if src.endswith("HugeCommitMessageTest.java"):
|
if src.endswith("HugeCommitMessageTest.java"):
|
||||||
heap_size = "-Xmx512m"
|
heap_size = "-Xmx512m"
|
||||||
|
if src.endswith("EolRepositoryTest.java") or src.endswith("GcCommitSelectionTest.java"):
|
||||||
|
timeout = "long"
|
||||||
|
|
||||||
junit_tests(
|
junit_tests(
|
||||||
name = name,
|
name = name,
|
||||||
|
@ -73,4 +80,5 @@ def tests(tests):
|
||||||
],
|
],
|
||||||
flaky = flaky,
|
flaky = flaky,
|
||||||
jvm_flags = [heap_size, "-Dfile.encoding=UTF-8"],
|
jvm_flags = [heap_size, "-Dfile.encoding=UTF-8"],
|
||||||
|
timeout = timeout,
|
||||||
)
|
)
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
some-domain /some/path1 FALSE 0 key1 value1
|
|
@ -0,0 +1,2 @@
|
||||||
|
some-domain1 TRUE /some/path1 FALSE 1893499200000 key1 valueFromSimple1
|
||||||
|
some-domain1 TRUE /some/path1 FALSE 1893499200000 key2 valueFromSimple1
|
|
@ -0,0 +1,2 @@
|
||||||
|
some-domain1 TRUE /some/path1 FALSE 1893499200000 key1 valueFromSimple2
|
||||||
|
some-domain1 TRUE /some/path1 FALSE 1893499200000 key3 valueFromSimple2
|
|
@ -0,0 +1,8 @@
|
||||||
|
# first line is a comment
|
||||||
|
# the next cookie is supposed to be removed, because it has expired already
|
||||||
|
some-domain1 TRUE /some/path1 FALSE 0 key1 value1
|
||||||
|
|
||||||
|
# expires date is 01/01/2030 @ 12:00am (UTC)
|
||||||
|
#HttpOnly_.some-domain2 TRUE /some/path2 TRUE 1893499200000 key2 value2
|
||||||
|
|
||||||
|
some-domain3 TRUE /some/path3 FALSE 1893499200000 key3 value3
|
|
@ -98,7 +98,7 @@ public void testClean() throws NoWorkTreeException, GitAPIException {
|
||||||
StatusCommand command = git.status();
|
StatusCommand command = git.status();
|
||||||
Status status = command.call();
|
Status status = command.call();
|
||||||
Set<String> files = status.getUntracked();
|
Set<String> files = status.getUntracked();
|
||||||
assertTrue(files.size() > 0);
|
assertFalse(files.isEmpty());
|
||||||
|
|
||||||
// run clean
|
// run clean
|
||||||
Set<String> cleanedFiles = git.clean().call();
|
Set<String> cleanedFiles = git.clean().call();
|
||||||
|
@ -120,7 +120,7 @@ public void testCleanDirs() throws NoWorkTreeException, GitAPIException {
|
||||||
StatusCommand command = git.status();
|
StatusCommand command = git.status();
|
||||||
Status status = command.call();
|
Status status = command.call();
|
||||||
Set<String> files = status.getUntracked();
|
Set<String> files = status.getUntracked();
|
||||||
assertTrue(files.size() > 0);
|
assertFalse(files.isEmpty());
|
||||||
|
|
||||||
// run clean
|
// run clean
|
||||||
Set<String> cleanedFiles = git.clean().setCleanDirectories(true).call();
|
Set<String> cleanedFiles = git.clean().setCleanDirectories(true).call();
|
||||||
|
@ -143,7 +143,7 @@ public void testCleanWithPaths() throws NoWorkTreeException,
|
||||||
StatusCommand command = git.status();
|
StatusCommand command = git.status();
|
||||||
Status status = command.call();
|
Status status = command.call();
|
||||||
Set<String> files = status.getUntracked();
|
Set<String> files = status.getUntracked();
|
||||||
assertTrue(files.size() > 0);
|
assertFalse(files.isEmpty());
|
||||||
|
|
||||||
// run clean with setPaths
|
// run clean with setPaths
|
||||||
Set<String> paths = new TreeSet<>();
|
Set<String> paths = new TreeSet<>();
|
||||||
|
@ -164,7 +164,7 @@ public void testCleanWithDryRun() throws NoWorkTreeException,
|
||||||
StatusCommand command = git.status();
|
StatusCommand command = git.status();
|
||||||
Status status = command.call();
|
Status status = command.call();
|
||||||
Set<String> files = status.getUntracked();
|
Set<String> files = status.getUntracked();
|
||||||
assertTrue(files.size() > 0);
|
assertFalse(files.isEmpty());
|
||||||
|
|
||||||
// run clean
|
// run clean
|
||||||
Set<String> cleanedFiles = git.clean().setDryRun(true).call();
|
Set<String> cleanedFiles = git.clean().setDryRun(true).call();
|
||||||
|
@ -186,7 +186,7 @@ public void testCleanDirsWithDryRun() throws NoWorkTreeException,
|
||||||
StatusCommand command = git.status();
|
StatusCommand command = git.status();
|
||||||
Status status = command.call();
|
Status status = command.call();
|
||||||
Set<String> files = status.getUntracked();
|
Set<String> files = status.getUntracked();
|
||||||
assertTrue(files.size() > 0);
|
assertFalse(files.isEmpty());
|
||||||
|
|
||||||
// run clean
|
// run clean
|
||||||
Set<String> cleanedFiles = git.clean().setDryRun(true)
|
Set<String> cleanedFiles = git.clean().setDryRun(true)
|
||||||
|
|
|
@ -718,6 +718,34 @@ public void testCloneWithAutoSetupRebase() throws Exception {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCloneWithPullMerge() throws Exception {
|
||||||
|
File directory = createTempDirectory("testCloneRepository1");
|
||||||
|
try (Git g = Git.init().setDirectory(directory).setBare(false).call()) {
|
||||||
|
g.remoteAdd().setName(Constants.DEFAULT_REMOTE_NAME)
|
||||||
|
.setUri(new URIish(fileUri())).call();
|
||||||
|
PullResult result = g.pull().setRebase(false).call();
|
||||||
|
assertTrue(result.isSuccessful());
|
||||||
|
assertEquals("refs/heads/master",
|
||||||
|
g.getRepository().getFullBranch());
|
||||||
|
checkFile(new File(directory, "Test.txt"), "Hello world");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCloneWithPullRebase() throws Exception {
|
||||||
|
File directory = createTempDirectory("testCloneRepository1");
|
||||||
|
try (Git g = Git.init().setDirectory(directory).setBare(false).call()) {
|
||||||
|
g.remoteAdd().setName(Constants.DEFAULT_REMOTE_NAME)
|
||||||
|
.setUri(new URIish(fileUri())).call();
|
||||||
|
PullResult result = g.pull().setRebase(true).call();
|
||||||
|
assertTrue(result.isSuccessful());
|
||||||
|
assertEquals("refs/heads/master",
|
||||||
|
g.getRepository().getFullBranch());
|
||||||
|
checkFile(new File(directory, "Test.txt"), "Hello world");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private String fileUri() {
|
private String fileUri() {
|
||||||
return "file://" + git.getRepository().getWorkTree().getAbsolutePath();
|
return "file://" + git.getRepository().getWorkTree().getAbsolutePath();
|
||||||
}
|
}
|
||||||
|
|
|
@ -661,6 +661,54 @@ public void commitWithAutoCrlfAndNonNormalizedIndex() throws Exception {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDeletionConflictWithAutoCrlf() throws Exception {
|
||||||
|
try (Git git = new Git(db)) {
|
||||||
|
// Commit a file with CR/LF into the index
|
||||||
|
FileBasedConfig config = db.getConfig();
|
||||||
|
config.setString("core", null, "autocrlf", "false");
|
||||||
|
config.save();
|
||||||
|
File file = writeTrashFile("file.txt", "foo\r\n");
|
||||||
|
git.add().addFilepattern("file.txt").call();
|
||||||
|
git.commit().setMessage("Initial").call();
|
||||||
|
// Switch to side branch
|
||||||
|
git.checkout().setCreateBranch(true).setName("side").call();
|
||||||
|
assertTrue(file.delete());
|
||||||
|
git.rm().addFilepattern("file.txt").call();
|
||||||
|
git.commit().setMessage("Side").call();
|
||||||
|
// Switch on autocrlf=true
|
||||||
|
config.setString("core", null, "autocrlf", "true");
|
||||||
|
config.save();
|
||||||
|
// Switch back to master and commit a conflict
|
||||||
|
git.checkout().setName("master").call();
|
||||||
|
writeTrashFile("file.txt", "foob\r\n");
|
||||||
|
git.add().addFilepattern("file.txt").call();
|
||||||
|
assertEquals("[file.txt, mode:100644, content:foob\r\n]",
|
||||||
|
indexState(CONTENT));
|
||||||
|
writeTrashFile("g", "file2.txt", "anything");
|
||||||
|
git.add().addFilepattern("g/file2.txt");
|
||||||
|
RevCommit master = git.commit().setMessage("Second").call();
|
||||||
|
// Switch to side branch again so that the deletion is "ours"
|
||||||
|
git.checkout().setName("side").call();
|
||||||
|
// Cherry pick master: produces a delete-modify conflict.
|
||||||
|
CherryPickResult pick = git.cherryPick().include(master).call();
|
||||||
|
assertEquals("Expected a cherry-pick conflict",
|
||||||
|
CherryPickStatus.CONFLICTING, pick.getStatus());
|
||||||
|
// XXX: g/file2.txt should actually be staged already, but isn't.
|
||||||
|
git.add().addFilepattern("g/file2.txt").call();
|
||||||
|
// Resolve the conflict by taking the master version
|
||||||
|
writeTrashFile("file.txt", "foob\r\n");
|
||||||
|
git.add().addFilepattern("file.txt").call();
|
||||||
|
git.commit().setMessage("Cherry").call();
|
||||||
|
// We expect this to be committed with a single LF since there is no
|
||||||
|
// "ours" stage.
|
||||||
|
assertEquals(
|
||||||
|
"[file.txt, mode:100644, content:foob\n]"
|
||||||
|
+ "[g/file2.txt, mode:100644, content:anything]",
|
||||||
|
indexState(CONTENT));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void testConflictWithAutoCrlf(String baseLf, String lf)
|
private void testConflictWithAutoCrlf(String baseLf, String lf)
|
||||||
throws Exception {
|
throws Exception {
|
||||||
try (Git git = new Git(db)) {
|
try (Git git = new Git(db)) {
|
||||||
|
|
|
@ -109,7 +109,7 @@ public void testDescribe() throws Exception {
|
||||||
assertNameStartsWith(c4, "3e563c5");
|
assertNameStartsWith(c4, "3e563c5");
|
||||||
|
|
||||||
assertNull(describe(c1));
|
assertNull(describe(c1));
|
||||||
assertNull(describe(c1, true));
|
assertNull(describe(c1, true, false));
|
||||||
assertNull(describe(c1, "a*", "b*", "c*"));
|
assertNull(describe(c1, "a*", "b*", "c*"));
|
||||||
assertNull(describe(c2, "bob*"));
|
assertNull(describe(c2, "bob*"));
|
||||||
assertNull(describe(c2, "?ob*"));
|
assertNull(describe(c2, "?ob*"));
|
||||||
|
@ -120,7 +120,7 @@ public void testDescribe() throws Exception {
|
||||||
assertEquals("alice-t1", describe(c2, "a*", "b*", "c*"));
|
assertEquals("alice-t1", describe(c2, "a*", "b*", "c*"));
|
||||||
|
|
||||||
assertEquals("bob-t2", describe(c3));
|
assertEquals("bob-t2", describe(c3));
|
||||||
assertEquals("bob-t2-0-g44579eb", describe(c3, true));
|
assertEquals("bob-t2-0-g44579eb", describe(c3, true, false));
|
||||||
assertEquals("alice-t1-1-g44579eb", describe(c3, "alice*"));
|
assertEquals("alice-t1-1-g44579eb", describe(c3, "alice*"));
|
||||||
assertEquals("alice-t1-1-g44579eb", describe(c3, "a??c?-t*"));
|
assertEquals("alice-t1-1-g44579eb", describe(c3, "a??c?-t*"));
|
||||||
assertEquals("bob-t2", describe(c3, "bob*"));
|
assertEquals("bob-t2", describe(c3, "bob*"));
|
||||||
|
@ -129,7 +129,7 @@ public void testDescribe() throws Exception {
|
||||||
|
|
||||||
// the value verified with git-describe(1)
|
// the value verified with git-describe(1)
|
||||||
assertEquals("bob-t2-1-g3e563c5", describe(c4));
|
assertEquals("bob-t2-1-g3e563c5", describe(c4));
|
||||||
assertEquals("bob-t2-1-g3e563c5", describe(c4, true));
|
assertEquals("bob-t2-1-g3e563c5", describe(c4, true, false));
|
||||||
assertEquals("alice-t1-2-g3e563c5", describe(c4, "alice*"));
|
assertEquals("alice-t1-2-g3e563c5", describe(c4, "alice*"));
|
||||||
assertEquals("bob-t2-1-g3e563c5", describe(c4, "bob*"));
|
assertEquals("bob-t2-1-g3e563c5", describe(c4, "bob*"));
|
||||||
assertEquals("bob-t2-1-g3e563c5", describe(c4, "a*", "b*", "c*"));
|
assertEquals("bob-t2-1-g3e563c5", describe(c4, "a*", "b*", "c*"));
|
||||||
|
@ -137,6 +137,10 @@ public void testDescribe() throws Exception {
|
||||||
assertEquals(null, describe(c2));
|
assertEquals(null, describe(c2));
|
||||||
assertEquals(null, describe(c3));
|
assertEquals(null, describe(c3));
|
||||||
assertEquals(null, describe(c4));
|
assertEquals(null, describe(c4));
|
||||||
|
|
||||||
|
assertEquals("3747db3", describe(c2, false, true));
|
||||||
|
assertEquals("44579eb", describe(c3, false, true));
|
||||||
|
assertEquals("3e563c5", describe(c4, false, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
// test default target
|
// test default target
|
||||||
|
@ -169,6 +173,10 @@ public void testDescribeMultiMatch() throws Exception {
|
||||||
if (!useAnnotatedTags && !describeUseAllTags) {
|
if (!useAnnotatedTags && !describeUseAllTags) {
|
||||||
assertEquals(null, describe(c1));
|
assertEquals(null, describe(c1));
|
||||||
assertEquals(null, describe(c2));
|
assertEquals(null, describe(c2));
|
||||||
|
|
||||||
|
assertEquals("fd70040", describe(c1, false, true));
|
||||||
|
assertEquals("b89dead", describe(c2, false, true));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -235,9 +243,11 @@ public void testDescribeBranch() throws Exception {
|
||||||
assertEquals("2 commits: c4 and c3", "t-2-g119892b", describe(c4));
|
assertEquals("2 commits: c4 and c3", "t-2-g119892b", describe(c4));
|
||||||
} else {
|
} else {
|
||||||
assertEquals(null, describe(c4));
|
assertEquals(null, describe(c4));
|
||||||
|
|
||||||
|
assertEquals("119892b", describe(c4, false, true));
|
||||||
}
|
}
|
||||||
assertNull(describe(c3));
|
assertNull(describe(c3));
|
||||||
assertNull(describe(c3, true));
|
assertNull(describe(c3, true, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void branch(String name, ObjectId base) throws GitAPIException {
|
private void branch(String name, ObjectId base) throws GitAPIException {
|
||||||
|
@ -279,6 +289,9 @@ public void t1DominatesT2() throws Exception {
|
||||||
} else {
|
} else {
|
||||||
assertEquals(null, describe(c4));
|
assertEquals(null, describe(c4));
|
||||||
assertEquals(null, describe(c3));
|
assertEquals(null, describe(c3));
|
||||||
|
|
||||||
|
assertEquals("119892b", describe(c4, false, true));
|
||||||
|
assertEquals("0244e7f", describe(c3, false, true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -368,6 +381,8 @@ public void t1nearerT2() throws Exception {
|
||||||
assertEquals("t1-3-gbb389a4", describe(c4));
|
assertEquals("t1-3-gbb389a4", describe(c4));
|
||||||
} else {
|
} else {
|
||||||
assertEquals(null, describe(c4));
|
assertEquals(null, describe(c4));
|
||||||
|
|
||||||
|
assertEquals("bb389a4", describe(c4, false, true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -401,6 +416,25 @@ public void t1sameDepthT2() throws Exception {
|
||||||
assertEquals("t2-4-gbb389a4", describe(c4));
|
assertEquals("t2-4-gbb389a4", describe(c4));
|
||||||
} else {
|
} else {
|
||||||
assertEquals(null, describe(c4));
|
assertEquals(null, describe(c4));
|
||||||
|
|
||||||
|
assertEquals("bb389a4", describe(c4, false, true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void globMatchWithSlashes() throws Exception {
|
||||||
|
ObjectId c1 = modify("aaa");
|
||||||
|
tag("a/b/version");
|
||||||
|
ObjectId c2 = modify("bbb");
|
||||||
|
tag("a/b/version2");
|
||||||
|
if (useAnnotatedTags || describeUseAllTags) {
|
||||||
|
assertEquals("a/b/version", describe(c1, "*/version*"));
|
||||||
|
assertEquals("a/b/version2", describe(c2, "*/version*"));
|
||||||
|
} else {
|
||||||
|
assertNull(describe(c1));
|
||||||
|
assertNull(describe(c1, "*/version*"));
|
||||||
|
assertNull(describe(c2));
|
||||||
|
assertNull(describe(c2, "*/version*"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -433,14 +467,14 @@ private static void touch(File f, String contents) throws Exception {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private String describe(ObjectId c1, boolean longDesc)
|
private String describe(ObjectId c1, boolean longDesc, boolean always)
|
||||||
throws GitAPIException, IOException {
|
throws GitAPIException, IOException {
|
||||||
return git.describe().setTarget(c1).setTags(describeUseAllTags)
|
return git.describe().setTarget(c1).setTags(describeUseAllTags)
|
||||||
.setLong(longDesc).call();
|
.setLong(longDesc).setAlways(always).call();
|
||||||
}
|
}
|
||||||
|
|
||||||
private String describe(ObjectId c1) throws GitAPIException, IOException {
|
private String describe(ObjectId c1) throws GitAPIException, IOException {
|
||||||
return describe(c1, false);
|
return describe(c1, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String describe(ObjectId c1, String... patterns) throws Exception {
|
private String describe(ObjectId c1, String... patterns) throws Exception {
|
||||||
|
|
|
@ -176,12 +176,13 @@ public boolean isForceUpdate() {
|
||||||
return update.update();
|
return update.update();
|
||||||
});
|
});
|
||||||
|
|
||||||
pool.submit(() -> {
|
Future<Result> result2 = pool.submit(() -> {
|
||||||
refUpdateLockedRef.await();
|
refUpdateLockedRef.await();
|
||||||
gc.packRefs();
|
gc.packRefs();
|
||||||
packRefsDone.await();
|
packRefsDone.await();
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
|
assertNull(result2.get());
|
||||||
|
|
||||||
assertSame(result.get(), Result.FORCED);
|
assertSame(result.get(), Result.FORCED);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,339 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018, Konrad Windszus <konrad_w@gmx.de>
|
||||||
|
* and other copyright owners as documented in the project's IP log.
|
||||||
|
*
|
||||||
|
* This program and the accompanying materials are made available
|
||||||
|
* under the terms of the Eclipse Distribution License v1.0 which
|
||||||
|
* accompanies this distribution, is reproduced below, and is
|
||||||
|
* available at http://www.eclipse.org/org/documents/edl-v10.php
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or
|
||||||
|
* without modification, are permitted provided that the following
|
||||||
|
* conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following
|
||||||
|
* disclaimer in the documentation and/or other materials provided
|
||||||
|
* with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Eclipse Foundation, Inc. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote
|
||||||
|
* products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
package org.eclipse.jgit.internal.transport.http;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.Writer;
|
||||||
|
import java.net.HttpCookie;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.StandardCopyOption;
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import org.eclipse.jgit.internal.storage.file.LockFile;
|
||||||
|
import org.eclipse.jgit.internal.transport.http.NetscapeCookieFile;
|
||||||
|
import org.eclipse.jgit.util.http.HttpCookiesMatcher;
|
||||||
|
import org.hamcrest.CoreMatchers;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Rule;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.rules.TemporaryFolder;
|
||||||
|
|
||||||
|
public class NetscapeCookieFileTest {
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public TemporaryFolder folder = new TemporaryFolder();
|
||||||
|
|
||||||
|
private Path tmpFile;
|
||||||
|
|
||||||
|
private URL baseUrl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the expiration date that is used in the test cookie files
|
||||||
|
*/
|
||||||
|
private static long JAN_01_2030_NOON = Instant
|
||||||
|
.parse("2030-01-01T12:00:00.000Z").toEpochMilli();
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws IOException {
|
||||||
|
// this will not only return a new file name but also create new empty
|
||||||
|
// file!
|
||||||
|
tmpFile = folder.newFile().toPath();
|
||||||
|
baseUrl = new URL("http://domain.com/my/path");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMergeCookies() {
|
||||||
|
Set<HttpCookie> cookieSet1 = new LinkedHashSet<>();
|
||||||
|
HttpCookie cookie = new HttpCookie("key1", "valueFromSet1");
|
||||||
|
cookieSet1.add(cookie);
|
||||||
|
cookie = new HttpCookie("key2", "valueFromSet1");
|
||||||
|
cookieSet1.add(cookie);
|
||||||
|
|
||||||
|
Set<HttpCookie> cookieSet2 = new LinkedHashSet<>();
|
||||||
|
cookie = new HttpCookie("key1", "valueFromSet2");
|
||||||
|
cookieSet2.add(cookie);
|
||||||
|
cookie = new HttpCookie("key3", "valueFromSet2");
|
||||||
|
cookieSet2.add(cookie);
|
||||||
|
|
||||||
|
Set<HttpCookie> cookiesExpectedMergedSet = new LinkedHashSet<>();
|
||||||
|
cookie = new HttpCookie("key1", "valueFromSet1");
|
||||||
|
cookiesExpectedMergedSet.add(cookie);
|
||||||
|
cookie = new HttpCookie("key2", "valueFromSet1");
|
||||||
|
cookiesExpectedMergedSet.add(cookie);
|
||||||
|
cookie = new HttpCookie("key3", "valueFromSet2");
|
||||||
|
cookiesExpectedMergedSet.add(cookie);
|
||||||
|
|
||||||
|
Assert.assertThat(
|
||||||
|
NetscapeCookieFile.mergeCookies(cookieSet1, cookieSet2),
|
||||||
|
HttpCookiesMatcher.containsInOrder(cookiesExpectedMergedSet));
|
||||||
|
|
||||||
|
Assert.assertThat(NetscapeCookieFile.mergeCookies(cookieSet1, null),
|
||||||
|
HttpCookiesMatcher.containsInOrder(cookieSet1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testWriteToNewFile() throws IOException {
|
||||||
|
Set<HttpCookie> cookies = new LinkedHashSet<>();
|
||||||
|
cookies.add(new HttpCookie("key1", "value"));
|
||||||
|
// first cookie is a session cookie (and should be ignored)
|
||||||
|
|
||||||
|
HttpCookie cookie = new HttpCookie("key2", "value");
|
||||||
|
cookie.setSecure(true);
|
||||||
|
cookie.setDomain("mydomain.com");
|
||||||
|
cookie.setPath("/");
|
||||||
|
cookie.setMaxAge(1000);
|
||||||
|
cookies.add(cookie);
|
||||||
|
Date creationDate = new Date();
|
||||||
|
try (Writer writer = Files.newBufferedWriter(tmpFile,
|
||||||
|
StandardCharsets.US_ASCII)) {
|
||||||
|
NetscapeCookieFile.write(writer, cookies, baseUrl, creationDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
String expectedExpiration = String
|
||||||
|
.valueOf(creationDate.getTime() + (cookie.getMaxAge() * 1000));
|
||||||
|
|
||||||
|
Assert.assertThat(
|
||||||
|
Files.readAllLines(tmpFile, StandardCharsets.US_ASCII),
|
||||||
|
CoreMatchers
|
||||||
|
.equalTo(Arrays.asList("mydomain.com\tTRUE\t/\tTRUE\t"
|
||||||
|
+ expectedExpiration + "\tkey2\tvalue")));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testWriteToExistingFile() throws IOException {
|
||||||
|
try (InputStream input = this.getClass()
|
||||||
|
.getResourceAsStream("cookies-simple1.txt")) {
|
||||||
|
Files.copy(input, tmpFile, StandardCopyOption.REPLACE_EXISTING);
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<HttpCookie> cookies = new LinkedHashSet<>();
|
||||||
|
HttpCookie cookie = new HttpCookie("key2", "value2");
|
||||||
|
cookie.setMaxAge(1000);
|
||||||
|
cookies.add(cookie);
|
||||||
|
Date creationDate = new Date();
|
||||||
|
try (Writer writer = Files.newBufferedWriter(tmpFile,
|
||||||
|
StandardCharsets.US_ASCII)) {
|
||||||
|
NetscapeCookieFile.write(writer, cookies, baseUrl, creationDate);
|
||||||
|
}
|
||||||
|
String expectedExpiration = String
|
||||||
|
.valueOf(creationDate.getTime() + (cookie.getMaxAge() * 1000));
|
||||||
|
|
||||||
|
Assert.assertThat(
|
||||||
|
Files.readAllLines(tmpFile, StandardCharsets.US_ASCII),
|
||||||
|
CoreMatchers.equalTo(
|
||||||
|
Arrays.asList("domain.com\tTRUE\t/my/path\tFALSE\t"
|
||||||
|
+ expectedExpiration + "\tkey2\tvalue2")));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = IOException.class)
|
||||||
|
public void testWriteWhileSomeoneIsHoldingTheLock()
|
||||||
|
throws IllegalArgumentException, IOException, InterruptedException {
|
||||||
|
try (InputStream input = this.getClass()
|
||||||
|
.getResourceAsStream("cookies-simple1.txt")) {
|
||||||
|
Files.copy(input, tmpFile, StandardCopyOption.REPLACE_EXISTING);
|
||||||
|
}
|
||||||
|
NetscapeCookieFile cookieFile = new NetscapeCookieFile(tmpFile);
|
||||||
|
// now imitate another process/thread holding the lock file
|
||||||
|
LockFile lockFile = new LockFile(tmpFile.toFile());
|
||||||
|
try {
|
||||||
|
Assert.assertTrue("Could not acquire lock", lockFile.lock());
|
||||||
|
cookieFile.write(baseUrl);
|
||||||
|
} finally {
|
||||||
|
lockFile.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testWriteAfterAnotherJgitProcessModifiedTheFile()
|
||||||
|
throws IOException, InterruptedException {
|
||||||
|
try (InputStream input = this.getClass()
|
||||||
|
.getResourceAsStream("cookies-simple1.txt")) {
|
||||||
|
Files.copy(input, tmpFile, StandardCopyOption.REPLACE_EXISTING);
|
||||||
|
}
|
||||||
|
NetscapeCookieFile cookieFile = new NetscapeCookieFile(tmpFile);
|
||||||
|
cookieFile.getCookies(true);
|
||||||
|
// now modify file externally
|
||||||
|
try (InputStream input = this.getClass()
|
||||||
|
.getResourceAsStream("cookies-simple2.txt")) {
|
||||||
|
Files.copy(input, tmpFile, StandardCopyOption.REPLACE_EXISTING);
|
||||||
|
}
|
||||||
|
// now try to write
|
||||||
|
cookieFile.write(baseUrl);
|
||||||
|
|
||||||
|
// validate that the external changes are there as well
|
||||||
|
// due to rounding errors (conversion from ms to sec to ms)
|
||||||
|
// the expiration date might not be exact
|
||||||
|
List<String> lines = Files.readAllLines(tmpFile,
|
||||||
|
StandardCharsets.US_ASCII);
|
||||||
|
|
||||||
|
Assert.assertEquals("Expected 3 lines", 3, lines.size());
|
||||||
|
assertStringMatchesPatternWithInexactNumber(lines.get(0),
|
||||||
|
"some-domain1\tTRUE\t/some/path1\tFALSE\t(\\d*)\tkey1\tvalueFromSimple2",
|
||||||
|
JAN_01_2030_NOON, 1000);
|
||||||
|
assertStringMatchesPatternWithInexactNumber(lines.get(1),
|
||||||
|
"some-domain1\tTRUE\t/some/path1\tFALSE\t(\\d*)\tkey3\tvalueFromSimple2",
|
||||||
|
JAN_01_2030_NOON, 1000);
|
||||||
|
assertStringMatchesPatternWithInexactNumber(lines.get(2),
|
||||||
|
"some-domain1\tTRUE\t/some/path1\tFALSE\t(\\d*)\tkey2\tvalueFromSimple1",
|
||||||
|
JAN_01_2030_NOON, 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("boxing")
|
||||||
|
private static final void assertStringMatchesPatternWithInexactNumber(
|
||||||
|
String string, String pattern, long expectedNumericValue,
|
||||||
|
long delta) {
|
||||||
|
java.util.regex.Matcher matcher = Pattern.compile(pattern)
|
||||||
|
.matcher(string);
|
||||||
|
Assert.assertTrue("Given string '" + string + "' does not match '"
|
||||||
|
+ pattern + "'", matcher.matches());
|
||||||
|
// extract numeric value
|
||||||
|
Long actualNumericValue = Long.decode(matcher.group(1));
|
||||||
|
|
||||||
|
Assert.assertTrue(
|
||||||
|
"Value is supposed to be close to " + expectedNumericValue
|
||||||
|
+ " but is " + actualNumericValue + ".",
|
||||||
|
Math.abs(expectedNumericValue - actualNumericValue) <= delta);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testWriteAndReadCycle() throws IOException {
|
||||||
|
Set<HttpCookie> cookies = new LinkedHashSet<>();
|
||||||
|
|
||||||
|
HttpCookie cookie = new HttpCookie("key1", "value1");
|
||||||
|
cookie.setPath("/some/path1");
|
||||||
|
cookie.setDomain("some-domain1");
|
||||||
|
cookie.setMaxAge(1000);
|
||||||
|
cookies.add(cookie);
|
||||||
|
cookie = new HttpCookie("key2", "value2");
|
||||||
|
cookie.setSecure(true);
|
||||||
|
cookie.setPath("/some/path2");
|
||||||
|
cookie.setDomain("some-domain2");
|
||||||
|
cookie.setMaxAge(1000);
|
||||||
|
cookie.setHttpOnly(true);
|
||||||
|
cookies.add(cookie);
|
||||||
|
|
||||||
|
Date creationDate = new Date();
|
||||||
|
|
||||||
|
try (Writer writer = Files.newBufferedWriter(tmpFile,
|
||||||
|
StandardCharsets.US_ASCII)) {
|
||||||
|
NetscapeCookieFile.write(writer, cookies, baseUrl, creationDate);
|
||||||
|
}
|
||||||
|
Set<HttpCookie> actualCookies = new NetscapeCookieFile(tmpFile,
|
||||||
|
creationDate).getCookies(true);
|
||||||
|
Assert.assertThat(actualCookies,
|
||||||
|
HttpCookiesMatcher.containsInOrder(cookies));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testReadAndWriteCycle() throws IOException {
|
||||||
|
try (InputStream input = this.getClass()
|
||||||
|
.getResourceAsStream("cookies-simple1.txt")) {
|
||||||
|
Files.copy(input, tmpFile, StandardCopyOption.REPLACE_EXISTING);
|
||||||
|
}
|
||||||
|
// round up to the next second (to prevent rounding errors)
|
||||||
|
Date creationDate = new Date(
|
||||||
|
(System.currentTimeMillis() / 1000) * 1000);
|
||||||
|
Set<HttpCookie> cookies = new NetscapeCookieFile(tmpFile, creationDate)
|
||||||
|
.getCookies(true);
|
||||||
|
Path tmpFile2 = folder.newFile().toPath();
|
||||||
|
try (Writer writer = Files.newBufferedWriter(tmpFile2,
|
||||||
|
StandardCharsets.US_ASCII)) {
|
||||||
|
NetscapeCookieFile.write(writer, cookies, baseUrl, creationDate);
|
||||||
|
}
|
||||||
|
// compare original file with newly written one, they should not differ
|
||||||
|
Assert.assertEquals(Files.readAllLines(tmpFile),
|
||||||
|
Files.readAllLines(tmpFile2));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testReadWithEmptyAndCommentLines() throws IOException {
|
||||||
|
try (InputStream input = this.getClass().getResourceAsStream(
|
||||||
|
"cookies-with-empty-and-comment-lines.txt")) {
|
||||||
|
Files.copy(input, tmpFile, StandardCopyOption.REPLACE_EXISTING);
|
||||||
|
}
|
||||||
|
|
||||||
|
Date creationDate = new Date();
|
||||||
|
Set<HttpCookie> cookies = new LinkedHashSet<>();
|
||||||
|
|
||||||
|
HttpCookie cookie = new HttpCookie("key2", "value2");
|
||||||
|
cookie.setDomain("some-domain2");
|
||||||
|
cookie.setPath("/some/path2");
|
||||||
|
cookie.setMaxAge((JAN_01_2030_NOON - creationDate.getTime()) / 1000);
|
||||||
|
cookie.setSecure(true);
|
||||||
|
cookie.setHttpOnly(true);
|
||||||
|
cookies.add(cookie);
|
||||||
|
|
||||||
|
cookie = new HttpCookie("key3", "value3");
|
||||||
|
cookie.setDomain("some-domain3");
|
||||||
|
cookie.setPath("/some/path3");
|
||||||
|
cookie.setMaxAge((JAN_01_2030_NOON - creationDate.getTime()) / 1000);
|
||||||
|
cookies.add(cookie);
|
||||||
|
|
||||||
|
Set<HttpCookie> actualCookies = new NetscapeCookieFile(tmpFile, creationDate)
|
||||||
|
.getCookies(true);
|
||||||
|
Assert.assertThat(actualCookies,
|
||||||
|
HttpCookiesMatcher.containsInOrder(cookies));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testReadInvalidFile() throws IOException {
|
||||||
|
try (InputStream input = this.getClass()
|
||||||
|
.getResourceAsStream("cookies-invalid.txt")) {
|
||||||
|
Files.copy(input, tmpFile, StandardCopyOption.REPLACE_EXISTING);
|
||||||
|
}
|
||||||
|
|
||||||
|
new NetscapeCookieFile(tmpFile)
|
||||||
|
.getCookies(true);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1457,6 +1457,41 @@ public void testInvalidGroupHeader() throws ConfigInvalidException {
|
||||||
parse("[foo \"bar\" ]\nfoo=bar\n");
|
parse("[foo \"bar\" ]\nfoo=bar\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCrLf() throws ConfigInvalidException {
|
||||||
|
assertEquals("true", parseEscapedValue("true\r\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLfContinuation() throws ConfigInvalidException {
|
||||||
|
assertEquals("true", parseEscapedValue("tr\\\nue"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCrCharContinuation() throws ConfigInvalidException {
|
||||||
|
expectedEx.expect(ConfigInvalidException.class);
|
||||||
|
expectedEx.expectMessage("Bad escape: \\u000d");
|
||||||
|
parseEscapedValue("tr\\\rue");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCrEOFContinuation() throws ConfigInvalidException {
|
||||||
|
expectedEx.expect(ConfigInvalidException.class);
|
||||||
|
expectedEx.expectMessage("Bad escape: \\u000d");
|
||||||
|
parseEscapedValue("tr\\\r");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCrLfContinuation() throws ConfigInvalidException {
|
||||||
|
assertEquals("true", parseEscapedValue("tr\\\r\nue"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testWhitespaceContinuation() throws ConfigInvalidException {
|
||||||
|
assertEquals("tr ue", parseEscapedValue("tr \\\n ue"));
|
||||||
|
assertEquals("tr ue", parseEscapedValue("tr \\\r\n ue"));
|
||||||
|
}
|
||||||
|
|
||||||
private static void assertValueRoundTrip(String value)
|
private static void assertValueRoundTrip(String value)
|
||||||
throws ConfigInvalidException {
|
throws ConfigInvalidException {
|
||||||
assertValueRoundTrip(value, value);
|
assertValueRoundTrip(value, value);
|
||||||
|
|
|
@ -0,0 +1,142 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2019, Thomas Wolf <thomas.wolf@paranor.ch>
|
||||||
|
* and other copyright owners as documented in the project's IP log.
|
||||||
|
*
|
||||||
|
* This program and the accompanying materials are made available
|
||||||
|
* under the terms of the Eclipse Distribution License v1.0 which
|
||||||
|
* accompanies this distribution, is reproduced below, and is
|
||||||
|
* available at http://www.eclipse.org/org/documents/edl-v10.php
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or
|
||||||
|
* without modification, are permitted provided that the following
|
||||||
|
* conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following
|
||||||
|
* disclaimer in the documentation and/or other materials provided
|
||||||
|
* with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Eclipse Foundation, Inc. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote
|
||||||
|
* products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.eclipse.jgit.lib;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
|
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 org.eclipse.jgit.junit.RepositoryTestCase;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class RebaseTodoFileTest extends RepositoryTestCase {
|
||||||
|
|
||||||
|
private static final String TEST_TODO = "test.todo";
|
||||||
|
|
||||||
|
private void createTodoList(String... lines) throws IOException {
|
||||||
|
Path p = Paths.get(db.getDirectory().getAbsolutePath(), TEST_TODO);
|
||||||
|
Files.write(p, Arrays.asList(lines));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testReadTodoFile() throws Exception {
|
||||||
|
String[] expected = { "reword " + ObjectId.zeroId().name() + " Foo",
|
||||||
|
"# A comment in the the todo list",
|
||||||
|
"pick " + ObjectId.zeroId().name() + " Foo fie",
|
||||||
|
"squash " + ObjectId.zeroId().name() + " F",
|
||||||
|
"fixup " + ObjectId.zeroId().name(),
|
||||||
|
"edit " + ObjectId.zeroId().name() + " f",
|
||||||
|
"edit " + ObjectId.zeroId().name() + ' ' };
|
||||||
|
createTodoList(expected);
|
||||||
|
RebaseTodoFile todo = new RebaseTodoFile(db);
|
||||||
|
List<RebaseTodoLine> lines = todo.readRebaseTodo(TEST_TODO, true);
|
||||||
|
assertEquals("Expected 7 lines", 7, lines.size());
|
||||||
|
int i = 0;
|
||||||
|
for (RebaseTodoLine line : lines) {
|
||||||
|
switch (i) {
|
||||||
|
case 0:
|
||||||
|
assertEquals("Expected REWORD", RebaseTodoLine.Action.REWORD,
|
||||||
|
line.getAction());
|
||||||
|
assertEquals("Unexpected ID", ObjectId.zeroId().abbreviate(40),
|
||||||
|
line.getCommit());
|
||||||
|
assertEquals("Unexpected Message", "Foo",
|
||||||
|
line.getShortMessage());
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
assertEquals("Expected COMMENT", RebaseTodoLine.Action.COMMENT,
|
||||||
|
line.getAction());
|
||||||
|
assertEquals("Unexpected Message",
|
||||||
|
"# A comment in the the todo list",
|
||||||
|
line.getComment());
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
assertEquals("Expected PICK", RebaseTodoLine.Action.PICK,
|
||||||
|
line.getAction());
|
||||||
|
assertEquals("Unexpected ID", ObjectId.zeroId().abbreviate(40),
|
||||||
|
line.getCommit());
|
||||||
|
assertEquals("Unexpected Message", "Foo fie",
|
||||||
|
line.getShortMessage());
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
assertEquals("Expected SQUASH", RebaseTodoLine.Action.SQUASH,
|
||||||
|
line.getAction());
|
||||||
|
assertEquals("Unexpected ID", ObjectId.zeroId().abbreviate(40),
|
||||||
|
line.getCommit());
|
||||||
|
assertEquals("Unexpected Message", "F", line.getShortMessage());
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
assertEquals("Expected FIXUP", RebaseTodoLine.Action.FIXUP,
|
||||||
|
line.getAction());
|
||||||
|
assertEquals("Unexpected ID", ObjectId.zeroId().abbreviate(40),
|
||||||
|
line.getCommit());
|
||||||
|
assertEquals("Unexpected Message", "", line.getShortMessage());
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
assertEquals("Expected EDIT", RebaseTodoLine.Action.EDIT,
|
||||||
|
line.getAction());
|
||||||
|
assertEquals("Unexpected ID", ObjectId.zeroId().abbreviate(40),
|
||||||
|
line.getCommit());
|
||||||
|
assertEquals("Unexpected Message", "f", line.getShortMessage());
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
assertEquals("Expected EDIT", RebaseTodoLine.Action.EDIT,
|
||||||
|
line.getAction());
|
||||||
|
assertEquals("Unexpected ID", ObjectId.zeroId().abbreviate(40),
|
||||||
|
line.getCommit());
|
||||||
|
assertEquals("Unexpected Message", "", line.getShortMessage());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fail("Too many lines");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,3 +1,45 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2019, Google LLC.
|
||||||
|
* and other copyright owners as documented in the project's IP log.
|
||||||
|
*
|
||||||
|
* This program and the accompanying materials are made available
|
||||||
|
* under the terms of the Eclipse Distribution License v1.0 which
|
||||||
|
* accompanies this distribution, is reproduced below, and is
|
||||||
|
* available at http://www.eclipse.org/org/documents/edl-v10.php
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or
|
||||||
|
* without modification, are permitted provided that the following
|
||||||
|
* conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following
|
||||||
|
* disclaimer in the documentation and/or other materials provided
|
||||||
|
* with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Eclipse Foundation, Inc. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote
|
||||||
|
* products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
package org.eclipse.jgit.revwalk;
|
package org.eclipse.jgit.revwalk;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
|
@ -44,7 +44,8 @@
|
||||||
package org.eclipse.jgit.transport;
|
package org.eclipse.jgit.transport;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertNotSame;
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
import static org.junit.Assert.assertSame;
|
import static org.junit.Assert.assertSame;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
|
@ -142,21 +143,21 @@ public void testReadString_Len0004() throws IOException {
|
||||||
init("0004");
|
init("0004");
|
||||||
final String act = in.readString();
|
final String act = in.readString();
|
||||||
assertEquals("", act);
|
assertEquals("", act);
|
||||||
assertNotSame(PacketLineIn.END, act);
|
assertFalse(PacketLineIn.isEnd(act));
|
||||||
assertEOF();
|
assertEOF();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testReadString_End() throws IOException {
|
public void testReadString_End() throws IOException {
|
||||||
init("0000");
|
init("0000");
|
||||||
assertSame(PacketLineIn.END, in.readString());
|
assertTrue(PacketLineIn.isEnd(in.readString()));
|
||||||
assertEOF();
|
assertEOF();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testReadString_Delim() throws IOException {
|
public void testReadString_Delim() throws IOException {
|
||||||
init("0001");
|
init("0001");
|
||||||
assertSame(PacketLineIn.DELIM, in.readString());
|
assertTrue(PacketLineIn.isDelimiter(in.readString()));
|
||||||
assertEOF();
|
assertEOF();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,14 +184,14 @@ public void testReadStringRaw3() throws IOException {
|
||||||
init("0004");
|
init("0004");
|
||||||
final String act = in.readStringRaw();
|
final String act = in.readStringRaw();
|
||||||
assertEquals("", act);
|
assertEquals("", act);
|
||||||
assertNotSame(PacketLineIn.END, act);
|
assertFalse(PacketLineIn.isEnd(act));
|
||||||
assertEOF();
|
assertEOF();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testReadStringRaw_End() throws IOException {
|
public void testReadStringRaw_End() throws IOException {
|
||||||
init("0000");
|
init("0000");
|
||||||
assertSame(PacketLineIn.END, in.readStringRaw());
|
assertTrue(PacketLineIn.isEnd(in.readString()));
|
||||||
assertEOF();
|
assertEOF();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -64,9 +64,9 @@ private static PacketLineIn formatAsPacketLine(String... inputLines)
|
||||||
ByteArrayOutputStream send = new ByteArrayOutputStream();
|
ByteArrayOutputStream send = new ByteArrayOutputStream();
|
||||||
PacketLineOut pckOut = new PacketLineOut(send);
|
PacketLineOut pckOut = new PacketLineOut(send);
|
||||||
for (String line : inputLines) {
|
for (String line : inputLines) {
|
||||||
if (line == PacketLineIn.END) {
|
if (PacketLineIn.isEnd(line)) {
|
||||||
pckOut.end();
|
pckOut.end();
|
||||||
} else if (line == PacketLineIn.DELIM) {
|
} else if (PacketLineIn.isDelimiter(line)) {
|
||||||
pckOut.writeDelim();
|
pckOut.writeDelim();
|
||||||
} else {
|
} else {
|
||||||
pckOut.writeString(line);
|
pckOut.writeString(line);
|
||||||
|
@ -90,7 +90,7 @@ public void testRecvWantsWithCapabilities()
|
||||||
"4624442d68ee402a94364191085b77137618633e", "thin-pack",
|
"4624442d68ee402a94364191085b77137618633e", "thin-pack",
|
||||||
"no-progress", "include-tag", "ofs-delta", "\n"),
|
"no-progress", "include-tag", "ofs-delta", "\n"),
|
||||||
"want f900c8326a43303685c46b279b9f70411bff1a4b\n",
|
"want f900c8326a43303685c46b279b9f70411bff1a4b\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
ProtocolV0Parser parser = new ProtocolV0Parser(defaultConfig());
|
ProtocolV0Parser parser = new ProtocolV0Parser(defaultConfig());
|
||||||
FetchV0Request request = parser.recvWants(pckIn);
|
FetchV0Request request = parser.recvWants(pckIn);
|
||||||
assertTrue(request.getClientCapabilities()
|
assertTrue(request.getClientCapabilities()
|
||||||
|
@ -114,7 +114,7 @@ public void testRecvWantsWithAgent()
|
||||||
"4624442d68ee402a94364191085b77137618633e", "thin-pack",
|
"4624442d68ee402a94364191085b77137618633e", "thin-pack",
|
||||||
"agent=JGit.test/0.0.1", "\n"),
|
"agent=JGit.test/0.0.1", "\n"),
|
||||||
"want f900c8326a43303685c46b279b9f70411bff1a4b\n",
|
"want f900c8326a43303685c46b279b9f70411bff1a4b\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
ProtocolV0Parser parser = new ProtocolV0Parser(defaultConfig());
|
ProtocolV0Parser parser = new ProtocolV0Parser(defaultConfig());
|
||||||
FetchV0Request request = parser.recvWants(pckIn);
|
FetchV0Request request = parser.recvWants(pckIn);
|
||||||
assertTrue(request.getClientCapabilities()
|
assertTrue(request.getClientCapabilities()
|
||||||
|
@ -136,7 +136,7 @@ public void testRecvWantsWithoutCapabilities()
|
||||||
PacketLineIn pckIn = formatAsPacketLine(
|
PacketLineIn pckIn = formatAsPacketLine(
|
||||||
"want 4624442d68ee402a94364191085b77137618633e\n",
|
"want 4624442d68ee402a94364191085b77137618633e\n",
|
||||||
"want f900c8326a43303685c46b279b9f70411bff1a4b\n",
|
"want f900c8326a43303685c46b279b9f70411bff1a4b\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
ProtocolV0Parser parser = new ProtocolV0Parser(defaultConfig());
|
ProtocolV0Parser parser = new ProtocolV0Parser(defaultConfig());
|
||||||
FetchV0Request request = parser.recvWants(pckIn);
|
FetchV0Request request = parser.recvWants(pckIn);
|
||||||
assertTrue(request.getClientCapabilities().isEmpty());
|
assertTrue(request.getClientCapabilities().isEmpty());
|
||||||
|
@ -151,7 +151,7 @@ public void testRecvWantsDeepen()
|
||||||
PacketLineIn pckIn = formatAsPacketLine(
|
PacketLineIn pckIn = formatAsPacketLine(
|
||||||
"want 4624442d68ee402a94364191085b77137618633e\n",
|
"want 4624442d68ee402a94364191085b77137618633e\n",
|
||||||
"want f900c8326a43303685c46b279b9f70411bff1a4b\n", "deepen 3\n",
|
"want f900c8326a43303685c46b279b9f70411bff1a4b\n", "deepen 3\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
ProtocolV0Parser parser = new ProtocolV0Parser(defaultConfig());
|
ProtocolV0Parser parser = new ProtocolV0Parser(defaultConfig());
|
||||||
FetchV0Request request = parser.recvWants(pckIn);
|
FetchV0Request request = parser.recvWants(pckIn);
|
||||||
assertTrue(request.getClientCapabilities().isEmpty());
|
assertTrue(request.getClientCapabilities().isEmpty());
|
||||||
|
@ -168,7 +168,7 @@ public void testRecvWantsShallow()
|
||||||
"want 4624442d68ee402a94364191085b77137618633e\n",
|
"want 4624442d68ee402a94364191085b77137618633e\n",
|
||||||
"want f900c8326a43303685c46b279b9f70411bff1a4b\n",
|
"want f900c8326a43303685c46b279b9f70411bff1a4b\n",
|
||||||
"shallow 4b643d0ef739a1b494e7d6926d8d8ed80d35edf4\n",
|
"shallow 4b643d0ef739a1b494e7d6926d8d8ed80d35edf4\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
ProtocolV0Parser parser = new ProtocolV0Parser(defaultConfig());
|
ProtocolV0Parser parser = new ProtocolV0Parser(defaultConfig());
|
||||||
FetchV0Request request = parser.recvWants(pckIn);
|
FetchV0Request request = parser.recvWants(pckIn);
|
||||||
assertTrue(request.getClientCapabilities().isEmpty());
|
assertTrue(request.getClientCapabilities().isEmpty());
|
||||||
|
@ -186,7 +186,7 @@ public void testRecvWantsFilter()
|
||||||
"want 4624442d68ee402a94364191085b77137618633e\n",
|
"want 4624442d68ee402a94364191085b77137618633e\n",
|
||||||
"want f900c8326a43303685c46b279b9f70411bff1a4b\n",
|
"want f900c8326a43303685c46b279b9f70411bff1a4b\n",
|
||||||
"filter blob:limit=13000\n",
|
"filter blob:limit=13000\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
ProtocolV0Parser parser = new ProtocolV0Parser(defaultConfig());
|
ProtocolV0Parser parser = new ProtocolV0Parser(defaultConfig());
|
||||||
FetchV0Request request = parser.recvWants(pckIn);
|
FetchV0Request request = parser.recvWants(pckIn);
|
||||||
assertTrue(request.getClientCapabilities().isEmpty());
|
assertTrue(request.getClientCapabilities().isEmpty());
|
||||||
|
|
|
@ -123,9 +123,9 @@ private static PacketLineIn formatAsPacketLine(String... inputLines)
|
||||||
ByteArrayOutputStream send = new ByteArrayOutputStream();
|
ByteArrayOutputStream send = new ByteArrayOutputStream();
|
||||||
PacketLineOut pckOut = new PacketLineOut(send);
|
PacketLineOut pckOut = new PacketLineOut(send);
|
||||||
for (String line : inputLines) {
|
for (String line : inputLines) {
|
||||||
if (line == PacketLineIn.END) {
|
if (PacketLineIn.isEnd(line)) {
|
||||||
pckOut.end();
|
pckOut.end();
|
||||||
} else if (line == PacketLineIn.DELIM) {
|
} else if (PacketLineIn.isDelimiter(line)) {
|
||||||
pckOut.writeDelim();
|
pckOut.writeDelim();
|
||||||
} else {
|
} else {
|
||||||
pckOut.writeString(line);
|
pckOut.writeString(line);
|
||||||
|
@ -136,19 +136,19 @@ private static PacketLineIn formatAsPacketLine(String... inputLines)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Succesful fetch with the basic core commands of the protocol.
|
* Successful fetch with the basic core commands of the protocol.
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testFetchBasicArguments()
|
public void testFetchBasicArguments()
|
||||||
throws PackProtocolException, IOException {
|
throws PackProtocolException, IOException {
|
||||||
PacketLineIn pckIn = formatAsPacketLine(
|
PacketLineIn pckIn = formatAsPacketLine(
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"thin-pack", "no-progress", "include-tag", "ofs-delta",
|
"thin-pack", "no-progress", "include-tag", "ofs-delta",
|
||||||
"want 4624442d68ee402a94364191085b77137618633e",
|
"want 4624442d68ee402a94364191085b77137618633e",
|
||||||
"want f900c8326a43303685c46b279b9f70411bff1a4b",
|
"want f900c8326a43303685c46b279b9f70411bff1a4b",
|
||||||
"have 554f6e41067b9e3e565b6988a8294fac1cb78f4b",
|
"have 554f6e41067b9e3e565b6988a8294fac1cb78f4b",
|
||||||
"have abc760ab9ad72f08209943251b36cb886a578f87", "done",
|
"have abc760ab9ad72f08209943251b36cb886a578f87", "done",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
ProtocolV2Parser parser = new ProtocolV2Parser(
|
ProtocolV2Parser parser = new ProtocolV2Parser(
|
||||||
ConfigBuilder.getDefault());
|
ConfigBuilder.getDefault());
|
||||||
FetchV2Request request = parser.parseFetchRequest(pckIn);
|
FetchV2Request request = parser.parseFetchRequest(pckIn);
|
||||||
|
@ -173,12 +173,12 @@ public void testFetchBasicArguments()
|
||||||
@Test
|
@Test
|
||||||
public void testFetchWithShallow_deepen() throws IOException {
|
public void testFetchWithShallow_deepen() throws IOException {
|
||||||
PacketLineIn pckIn = formatAsPacketLine(
|
PacketLineIn pckIn = formatAsPacketLine(
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"deepen 15",
|
"deepen 15",
|
||||||
"deepen-relative",
|
"deepen-relative",
|
||||||
"shallow 28274d02c489f4c7e68153056e9061a46f62d7a0",
|
"shallow 28274d02c489f4c7e68153056e9061a46f62d7a0",
|
||||||
"shallow 145e683b229dcab9d0e2ccb01b386f9ecc17d29d",
|
"shallow 145e683b229dcab9d0e2ccb01b386f9ecc17d29d",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
ProtocolV2Parser parser = new ProtocolV2Parser(
|
ProtocolV2Parser parser = new ProtocolV2Parser(
|
||||||
ConfigBuilder.getDefault());
|
ConfigBuilder.getDefault());
|
||||||
FetchV2Request request = parser.parseFetchRequest(pckIn);
|
FetchV2Request request = parser.parseFetchRequest(pckIn);
|
||||||
|
@ -193,11 +193,11 @@ public void testFetchWithShallow_deepen() throws IOException {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFetchWithShallow_deepenNot() throws IOException {
|
public void testFetchWithShallow_deepenNot() throws IOException {
|
||||||
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.DELIM,
|
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.delimiter(),
|
||||||
"shallow 28274d02c489f4c7e68153056e9061a46f62d7a0",
|
"shallow 28274d02c489f4c7e68153056e9061a46f62d7a0",
|
||||||
"shallow 145e683b229dcab9d0e2ccb01b386f9ecc17d29d",
|
"shallow 145e683b229dcab9d0e2ccb01b386f9ecc17d29d",
|
||||||
"deepen-not a08595f76159b09d57553e37a5123f1091bb13e7",
|
"deepen-not a08595f76159b09d57553e37a5123f1091bb13e7",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
ProtocolV2Parser parser = new ProtocolV2Parser(
|
ProtocolV2Parser parser = new ProtocolV2Parser(
|
||||||
ConfigBuilder.getDefault());
|
ConfigBuilder.getDefault());
|
||||||
FetchV2Request request = parser.parseFetchRequest(pckIn);
|
FetchV2Request request = parser.parseFetchRequest(pckIn);
|
||||||
|
@ -210,11 +210,11 @@ public void testFetchWithShallow_deepenNot() throws IOException {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFetchWithShallow_deepenSince() throws IOException {
|
public void testFetchWithShallow_deepenSince() throws IOException {
|
||||||
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.DELIM,
|
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.delimiter(),
|
||||||
"shallow 28274d02c489f4c7e68153056e9061a46f62d7a0",
|
"shallow 28274d02c489f4c7e68153056e9061a46f62d7a0",
|
||||||
"shallow 145e683b229dcab9d0e2ccb01b386f9ecc17d29d",
|
"shallow 145e683b229dcab9d0e2ccb01b386f9ecc17d29d",
|
||||||
"deepen-since 123123123",
|
"deepen-since 123123123",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
ProtocolV2Parser parser = new ProtocolV2Parser(
|
ProtocolV2Parser parser = new ProtocolV2Parser(
|
||||||
ConfigBuilder.getDefault());
|
ConfigBuilder.getDefault());
|
||||||
FetchV2Request request = parser.parseFetchRequest(pckIn);
|
FetchV2Request request = parser.parseFetchRequest(pckIn);
|
||||||
|
@ -226,9 +226,9 @@ public void testFetchWithShallow_deepenSince() throws IOException {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFetchWithNoneFilter() throws IOException {
|
public void testFetchWithNoneFilter() throws IOException {
|
||||||
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.DELIM,
|
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.delimiter(),
|
||||||
"filter blob:none",
|
"filter blob:none",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
ProtocolV2Parser parser = new ProtocolV2Parser(
|
ProtocolV2Parser parser = new ProtocolV2Parser(
|
||||||
ConfigBuilder.start().allowFilter().done());
|
ConfigBuilder.start().allowFilter().done());
|
||||||
FetchV2Request request = parser.parseFetchRequest(pckIn);
|
FetchV2Request request = parser.parseFetchRequest(pckIn);
|
||||||
|
@ -238,9 +238,9 @@ public void testFetchWithNoneFilter() throws IOException {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFetchWithBlobSizeFilter() throws IOException {
|
public void testFetchWithBlobSizeFilter() throws IOException {
|
||||||
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.DELIM,
|
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.delimiter(),
|
||||||
"filter blob:limit=15",
|
"filter blob:limit=15",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
ProtocolV2Parser parser = new ProtocolV2Parser(
|
ProtocolV2Parser parser = new ProtocolV2Parser(
|
||||||
ConfigBuilder.start().allowFilter().done());
|
ConfigBuilder.start().allowFilter().done());
|
||||||
FetchV2Request request = parser.parseFetchRequest(pckIn);
|
FetchV2Request request = parser.parseFetchRequest(pckIn);
|
||||||
|
@ -250,9 +250,9 @@ public void testFetchWithBlobSizeFilter() throws IOException {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFetchWithTreeDepthFilter() throws IOException {
|
public void testFetchWithTreeDepthFilter() throws IOException {
|
||||||
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.DELIM,
|
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.delimiter(),
|
||||||
"filter tree:3",
|
"filter tree:3",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
ProtocolV2Parser parser = new ProtocolV2Parser(
|
ProtocolV2Parser parser = new ProtocolV2Parser(
|
||||||
ConfigBuilder.start().allowFilter().done());
|
ConfigBuilder.start().allowFilter().done());
|
||||||
FetchV2Request request = parser.parseFetchRequest(pckIn);
|
FetchV2Request request = parser.parseFetchRequest(pckIn);
|
||||||
|
@ -262,10 +262,10 @@ public void testFetchWithTreeDepthFilter() throws IOException {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFetchMustNotHaveMultipleFilters() throws IOException {
|
public void testFetchMustNotHaveMultipleFilters() throws IOException {
|
||||||
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.DELIM,
|
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.delimiter(),
|
||||||
"filter blob:none",
|
"filter blob:none",
|
||||||
"filter blob:limit=12",
|
"filter blob:limit=12",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
ProtocolV2Parser parser = new ProtocolV2Parser(
|
ProtocolV2Parser parser = new ProtocolV2Parser(
|
||||||
ConfigBuilder.start().allowFilter().done());
|
ConfigBuilder.start().allowFilter().done());
|
||||||
|
|
||||||
|
@ -275,8 +275,8 @@ public void testFetchMustNotHaveMultipleFilters() throws IOException {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFetchFilterWithoutAllowFilter() throws IOException {
|
public void testFetchFilterWithoutAllowFilter() throws IOException {
|
||||||
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.DELIM,
|
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.delimiter(),
|
||||||
"filter blob:limit=12", PacketLineIn.END);
|
"filter blob:limit=12", PacketLineIn.end());
|
||||||
ProtocolV2Parser parser = new ProtocolV2Parser(
|
ProtocolV2Parser parser = new ProtocolV2Parser(
|
||||||
ConfigBuilder.getDefault());
|
ConfigBuilder.getDefault());
|
||||||
|
|
||||||
|
@ -291,10 +291,10 @@ public void testFetchWithRefInWant() throws Exception {
|
||||||
testRepo.update("branchA", one);
|
testRepo.update("branchA", one);
|
||||||
testRepo.update("branchB", two);
|
testRepo.update("branchB", two);
|
||||||
|
|
||||||
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.DELIM,
|
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.delimiter(),
|
||||||
"want e4980cdc48cfa1301493ca94eb70523f6788b819",
|
"want e4980cdc48cfa1301493ca94eb70523f6788b819",
|
||||||
"want-ref refs/heads/branchA",
|
"want-ref refs/heads/branchA",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
ProtocolV2Parser parser = new ProtocolV2Parser(
|
ProtocolV2Parser parser = new ProtocolV2Parser(
|
||||||
ConfigBuilder.start().allowRefInWant().done());
|
ConfigBuilder.start().allowRefInWant().done());
|
||||||
|
|
||||||
|
@ -309,10 +309,10 @@ public void testFetchWithRefInWant() throws Exception {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFetchWithRefInWantUnknownRef() throws Exception {
|
public void testFetchWithRefInWantUnknownRef() throws Exception {
|
||||||
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.DELIM,
|
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.delimiter(),
|
||||||
"want e4980cdc48cfa1301493ca94eb70523f6788b819",
|
"want e4980cdc48cfa1301493ca94eb70523f6788b819",
|
||||||
"want-ref refs/heads/branchC",
|
"want-ref refs/heads/branchC",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
ProtocolV2Parser parser = new ProtocolV2Parser(
|
ProtocolV2Parser parser = new ProtocolV2Parser(
|
||||||
ConfigBuilder.start().allowRefInWant().done());
|
ConfigBuilder.start().allowRefInWant().done());
|
||||||
|
|
||||||
|
@ -328,8 +328,8 @@ public void testFetchWithRefInWantUnknownRef() throws Exception {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testLsRefsMinimalReq() throws IOException {
|
public void testLsRefsMinimalReq() throws IOException {
|
||||||
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.DELIM,
|
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.delimiter(),
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
|
|
||||||
ProtocolV2Parser parser = new ProtocolV2Parser(
|
ProtocolV2Parser parser = new ProtocolV2Parser(
|
||||||
ConfigBuilder.getDefault());
|
ConfigBuilder.getDefault());
|
||||||
|
@ -341,8 +341,8 @@ public void testLsRefsMinimalReq() throws IOException {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testLsRefsSymrefs() throws IOException {
|
public void testLsRefsSymrefs() throws IOException {
|
||||||
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.DELIM, "symrefs",
|
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.delimiter(), "symrefs",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
|
|
||||||
ProtocolV2Parser parser = new ProtocolV2Parser(
|
ProtocolV2Parser parser = new ProtocolV2Parser(
|
||||||
ConfigBuilder.getDefault());
|
ConfigBuilder.getDefault());
|
||||||
|
@ -356,9 +356,9 @@ public void testLsRefsSymrefs() throws IOException {
|
||||||
@Test
|
@Test
|
||||||
public void testLsRefsPeel() throws IOException {
|
public void testLsRefsPeel() throws IOException {
|
||||||
PacketLineIn pckIn = formatAsPacketLine(
|
PacketLineIn pckIn = formatAsPacketLine(
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"peel",
|
"peel",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
|
|
||||||
ProtocolV2Parser parser = new ProtocolV2Parser(
|
ProtocolV2Parser parser = new ProtocolV2Parser(
|
||||||
ConfigBuilder.getDefault());
|
ConfigBuilder.getDefault());
|
||||||
|
@ -370,9 +370,9 @@ public void testLsRefsPeel() throws IOException {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testLsRefsRefPrefixes() throws IOException {
|
public void testLsRefsRefPrefixes() throws IOException {
|
||||||
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.DELIM,
|
PacketLineIn pckIn = formatAsPacketLine(PacketLineIn.delimiter(),
|
||||||
"ref-prefix refs/for", "ref-prefix refs/heads",
|
"ref-prefix refs/for", "ref-prefix refs/heads",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
|
|
||||||
ProtocolV2Parser parser = new ProtocolV2Parser(
|
ProtocolV2Parser parser = new ProtocolV2Parser(
|
||||||
ConfigBuilder.getDefault());
|
ConfigBuilder.getDefault());
|
||||||
|
|
|
@ -306,11 +306,11 @@ public void testCreateBranchAtHiddenCommitFails() throws Exception {
|
||||||
int nul = master.indexOf('\0');
|
int nul = master.indexOf('\0');
|
||||||
assertTrue("has capability list", nul > 0);
|
assertTrue("has capability list", nul > 0);
|
||||||
assertEquals(B.name() + ' ' + R_MASTER, master.substring(0, nul));
|
assertEquals(B.name() + ' ' + R_MASTER, master.substring(0, nul));
|
||||||
assertSame(PacketLineIn.END, r.readString());
|
assertTrue(PacketLineIn.isEnd(r.readString()));
|
||||||
|
|
||||||
assertEquals("unpack error Missing commit " + P.name(), r.readString());
|
assertEquals("unpack error Missing commit " + P.name(), r.readString());
|
||||||
assertEquals("ng refs/heads/s n/a (unpacker error)", r.readString());
|
assertEquals("ng refs/heads/s n/a (unpacker error)", r.readString());
|
||||||
assertSame(PacketLineIn.END, r.readString());
|
assertTrue(PacketLineIn.isEnd(r.readString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void receive(final ReceivePack rp,
|
private static void receive(final ReceivePack rp,
|
||||||
|
@ -366,13 +366,13 @@ public void testUsingHiddenDeltaBaseFails() throws Exception {
|
||||||
int nul = master.indexOf('\0');
|
int nul = master.indexOf('\0');
|
||||||
assertTrue("has capability list", nul > 0);
|
assertTrue("has capability list", nul > 0);
|
||||||
assertEquals(B.name() + ' ' + R_MASTER, master.substring(0, nul));
|
assertEquals(B.name() + ' ' + R_MASTER, master.substring(0, nul));
|
||||||
assertSame(PacketLineIn.END, r.readString());
|
assertTrue(PacketLineIn.isEnd(r.readString()));
|
||||||
|
|
||||||
assertEquals("unpack error Missing blob " + b.name(),
|
assertEquals("unpack error Missing blob " + b.name(),
|
||||||
r.readString());
|
r.readString());
|
||||||
assertEquals("ng refs/heads/s n/a (unpacker error)",
|
assertEquals("ng refs/heads/s n/a (unpacker error)",
|
||||||
r.readString());
|
r.readString());
|
||||||
assertSame(PacketLineIn.END, r.readString());
|
assertTrue(PacketLineIn.isEnd(r.readString()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -419,13 +419,13 @@ public void testUsingHiddenCommonBlobFails() throws Exception {
|
||||||
int nul = master.indexOf('\0');
|
int nul = master.indexOf('\0');
|
||||||
assertTrue("has capability list", nul > 0);
|
assertTrue("has capability list", nul > 0);
|
||||||
assertEquals(B.name() + ' ' + R_MASTER, master.substring(0, nul));
|
assertEquals(B.name() + ' ' + R_MASTER, master.substring(0, nul));
|
||||||
assertSame(PacketLineIn.END, r.readString());
|
assertTrue(PacketLineIn.isEnd(r.readString()));
|
||||||
|
|
||||||
assertEquals("unpack error Missing blob " + b.name(),
|
assertEquals("unpack error Missing blob " + b.name(),
|
||||||
r.readString());
|
r.readString());
|
||||||
assertEquals("ng refs/heads/s n/a (unpacker error)",
|
assertEquals("ng refs/heads/s n/a (unpacker error)",
|
||||||
r.readString());
|
r.readString());
|
||||||
assertSame(PacketLineIn.END, r.readString());
|
assertTrue(PacketLineIn.isEnd(r.readString()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -473,13 +473,13 @@ public void testUsingUnknownBlobFails() throws Exception {
|
||||||
int nul = master.indexOf('\0');
|
int nul = master.indexOf('\0');
|
||||||
assertTrue("has capability list", nul > 0);
|
assertTrue("has capability list", nul > 0);
|
||||||
assertEquals(B.name() + ' ' + R_MASTER, master.substring(0, nul));
|
assertEquals(B.name() + ' ' + R_MASTER, master.substring(0, nul));
|
||||||
assertSame(PacketLineIn.END, r.readString());
|
assertTrue(PacketLineIn.isEnd(r.readString()));
|
||||||
|
|
||||||
assertEquals("unpack error Missing blob " + n.name(),
|
assertEquals("unpack error Missing blob " + n.name(),
|
||||||
r.readString());
|
r.readString());
|
||||||
assertEquals("ng refs/heads/s n/a (unpacker error)",
|
assertEquals("ng refs/heads/s n/a (unpacker error)",
|
||||||
r.readString());
|
r.readString());
|
||||||
assertSame(PacketLineIn.END, r.readString());
|
assertTrue(PacketLineIn.isEnd(r.readString()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -504,13 +504,13 @@ public void testIncludesInvalidGitmodules() throws Exception {
|
||||||
int nul = master.indexOf('\0');
|
int nul = master.indexOf('\0');
|
||||||
assertTrue("has capability list", nul > 0);
|
assertTrue("has capability list", nul > 0);
|
||||||
assertEquals(B.name() + ' ' + R_MASTER, master.substring(0, nul));
|
assertEquals(B.name() + ' ' + R_MASTER, master.substring(0, nul));
|
||||||
assertSame(PacketLineIn.END, r.readString());
|
assertTrue(PacketLineIn.isEnd(r.readString()));
|
||||||
|
|
||||||
String errorLine = r.readString();
|
String errorLine = r.readString();
|
||||||
assertTrue(errorLine.startsWith("unpack error"));
|
assertTrue(errorLine.startsWith("unpack error"));
|
||||||
assertTrue(errorLine.contains("Invalid submodule URL '-"));
|
assertTrue(errorLine.contains("Invalid submodule URL '-"));
|
||||||
assertEquals("ng refs/heads/s n/a (unpacker error)", r.readString());
|
assertEquals("ng refs/heads/s n/a (unpacker error)", r.readString());
|
||||||
assertSame(PacketLineIn.END, r.readString());
|
assertTrue(PacketLineIn.isEnd(r.readString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private TemporaryBuffer.Heap setupSourceRepoInvalidGitmodules()
|
private TemporaryBuffer.Heap setupSourceRepoInvalidGitmodules()
|
||||||
|
@ -589,13 +589,13 @@ public void testUsingUnknownTreeFails() throws Exception {
|
||||||
int nul = master.indexOf('\0');
|
int nul = master.indexOf('\0');
|
||||||
assertTrue("has capability list", nul > 0);
|
assertTrue("has capability list", nul > 0);
|
||||||
assertEquals(B.name() + ' ' + R_MASTER, master.substring(0, nul));
|
assertEquals(B.name() + ' ' + R_MASTER, master.substring(0, nul));
|
||||||
assertSame(PacketLineIn.END, r.readString());
|
assertTrue(PacketLineIn.isEnd(r.readString()));
|
||||||
|
|
||||||
assertEquals("unpack error Missing tree " + t.name(),
|
assertEquals("unpack error Missing tree " + t.name(),
|
||||||
r.readString());
|
r.readString());
|
||||||
assertEquals("ng refs/heads/s n/a (unpacker error)",
|
assertEquals("ng refs/heads/s n/a (unpacker error)",
|
||||||
r.readString());
|
r.readString());
|
||||||
assertSame(PacketLineIn.END, r.readString());
|
assertTrue(PacketLineIn.isEnd(r.readString()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertSame;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
|
@ -95,7 +95,7 @@ public void advertiser() throws IOException {
|
||||||
assertEquals(id(3).name() + " refs/Iñtërnâtiônàlizætiøn☃💩\n", s);
|
assertEquals(id(3).name() + " refs/Iñtërnâtiônàlizætiøn☃💩\n", s);
|
||||||
|
|
||||||
s = pckIn.readStringRaw();
|
s = pckIn.readStringRaw();
|
||||||
assertSame(PacketLineIn.END, s);
|
assertTrue(PacketLineIn.isEnd(s));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ObjectId id(int i) {
|
private static ObjectId id(int i) {
|
||||||
|
|
|
@ -0,0 +1,189 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018, Konrad Windszus <konrad_w@gmx.de>
|
||||||
|
* and other copyright owners as documented in the project's IP log.
|
||||||
|
*
|
||||||
|
* This program and the accompanying materials are made available
|
||||||
|
* under the terms of the Eclipse Distribution License v1.0 which
|
||||||
|
* accompanies this distribution, is reproduced below, and is
|
||||||
|
* available at http://www.eclipse.org/org/documents/edl-v10.php
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or
|
||||||
|
* without modification, are permitted provided that the following
|
||||||
|
* conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following
|
||||||
|
* disclaimer in the documentation and/or other materials provided
|
||||||
|
* with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Eclipse Foundation, Inc. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote
|
||||||
|
* products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
package org.eclipse.jgit.transport;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.HttpCookie;
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.eclipse.jgit.internal.transport.http.NetscapeCookieFile;
|
||||||
|
import org.eclipse.jgit.lib.Config;
|
||||||
|
import org.eclipse.jgit.test.resources.SampleDataRepositoryTestCase;
|
||||||
|
import org.eclipse.jgit.transport.http.HttpConnection;
|
||||||
|
import org.eclipse.jgit.util.http.HttpCookiesMatcher;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.mockito.ArgumentMatchers;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
|
||||||
|
public class TransportHttpTest extends SampleDataRepositoryTestCase {
|
||||||
|
private URIish uri;
|
||||||
|
private File cookieFile;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
super.setUp();
|
||||||
|
uri = new URIish("https://everyones.loves.git/u/2");
|
||||||
|
|
||||||
|
final Config config = db.getConfig();
|
||||||
|
config.setBoolean("http", null, "saveCookies", true);
|
||||||
|
cookieFile = createTempFile();
|
||||||
|
config.setString("http", null, "cookieFile",
|
||||||
|
cookieFile.getAbsolutePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMatchesCookieDomain() {
|
||||||
|
Assert.assertTrue(TransportHttp.matchesCookieDomain("example.com",
|
||||||
|
"example.com"));
|
||||||
|
Assert.assertTrue(TransportHttp.matchesCookieDomain("Example.Com",
|
||||||
|
"example.cOM"));
|
||||||
|
Assert.assertTrue(TransportHttp.matchesCookieDomain(
|
||||||
|
"some.subdomain.example.com", "example.com"));
|
||||||
|
Assert.assertFalse(TransportHttp
|
||||||
|
.matchesCookieDomain("someotherexample.com", "example.com"));
|
||||||
|
Assert.assertFalse(TransportHttp.matchesCookieDomain("example.com",
|
||||||
|
"example1.com"));
|
||||||
|
Assert.assertFalse(TransportHttp
|
||||||
|
.matchesCookieDomain("sub.sub.example.com", ".example.com"));
|
||||||
|
Assert.assertTrue(TransportHttp.matchesCookieDomain("host.example.com",
|
||||||
|
"example.com"));
|
||||||
|
Assert.assertTrue(TransportHttp.matchesCookieDomain(
|
||||||
|
"something.example.com", "something.example.com"));
|
||||||
|
Assert.assertTrue(TransportHttp.matchesCookieDomain(
|
||||||
|
"host.something.example.com", "something.example.com"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMatchesCookiePath() {
|
||||||
|
Assert.assertTrue(
|
||||||
|
TransportHttp.matchesCookiePath("/some/path", "/some/path"));
|
||||||
|
Assert.assertTrue(TransportHttp.matchesCookiePath("/some/path/child",
|
||||||
|
"/some/path"));
|
||||||
|
Assert.assertTrue(TransportHttp.matchesCookiePath("/some/path/child",
|
||||||
|
"/some/path/"));
|
||||||
|
Assert.assertFalse(TransportHttp.matchesCookiePath("/some/pathother",
|
||||||
|
"/some/path"));
|
||||||
|
Assert.assertFalse(
|
||||||
|
TransportHttp.matchesCookiePath("otherpath", "/some/path"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testProcessResponseCookies() throws IOException {
|
||||||
|
HttpConnection connection = Mockito.mock(HttpConnection.class);
|
||||||
|
Mockito.when(
|
||||||
|
connection.getHeaderFields(ArgumentMatchers.eq("Set-Cookie")))
|
||||||
|
.thenReturn(Arrays.asList(
|
||||||
|
"id=a3fWa; Expires=Fri, 01 Jan 2100 11:00:00 GMT; Secure; HttpOnly",
|
||||||
|
"sessionid=38afes7a8; HttpOnly; Path=/"));
|
||||||
|
Mockito.when(
|
||||||
|
connection.getHeaderFields(ArgumentMatchers.eq("Set-Cookie2")))
|
||||||
|
.thenReturn(Collections
|
||||||
|
.singletonList("cookie2=some value; Max-Age=1234; Path=/"));
|
||||||
|
|
||||||
|
try (TransportHttp transportHttp = new TransportHttp(db, uri)) {
|
||||||
|
Date creationDate = new Date();
|
||||||
|
transportHttp.processResponseCookies(connection);
|
||||||
|
|
||||||
|
// evaluate written cookie file
|
||||||
|
Set<HttpCookie> expectedCookies = new LinkedHashSet<>();
|
||||||
|
|
||||||
|
HttpCookie cookie = new HttpCookie("id", "a3fWa");
|
||||||
|
cookie.setDomain("everyones.loves.git");
|
||||||
|
cookie.setPath("/u/2/");
|
||||||
|
|
||||||
|
cookie.setMaxAge(
|
||||||
|
(Instant.parse("2100-01-01T11:00:00.000Z").toEpochMilli()
|
||||||
|
- creationDate.getTime()) / 1000);
|
||||||
|
cookie.setSecure(true);
|
||||||
|
cookie.setHttpOnly(true);
|
||||||
|
expectedCookies.add(cookie);
|
||||||
|
|
||||||
|
cookie = new HttpCookie("cookie2", "some value");
|
||||||
|
cookie.setDomain("everyones.loves.git");
|
||||||
|
cookie.setPath("/");
|
||||||
|
cookie.setMaxAge(1234);
|
||||||
|
expectedCookies.add(cookie);
|
||||||
|
|
||||||
|
Assert.assertThat(
|
||||||
|
new NetscapeCookieFile(cookieFile.toPath())
|
||||||
|
.getCookies(true),
|
||||||
|
HttpCookiesMatcher.containsInOrder(expectedCookies, 5));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testProcessResponseCookiesNotPersistingWithSaveCookiesFalse()
|
||||||
|
throws IOException {
|
||||||
|
HttpConnection connection = Mockito.mock(HttpConnection.class);
|
||||||
|
Mockito.when(
|
||||||
|
connection.getHeaderFields(ArgumentMatchers.eq("Set-Cookie")))
|
||||||
|
.thenReturn(Arrays.asList(
|
||||||
|
"id=a3fWa; Expires=Thu, 21 Oct 2100 11:00:00 GMT; Secure; HttpOnly",
|
||||||
|
"sessionid=38afes7a8; HttpOnly; Path=/"));
|
||||||
|
Mockito.when(
|
||||||
|
connection.getHeaderFields(ArgumentMatchers.eq("Set-Cookie2")))
|
||||||
|
.thenReturn(Collections.singletonList(
|
||||||
|
"cookie2=some value; Max-Age=1234; Path=/"));
|
||||||
|
|
||||||
|
// tweak config
|
||||||
|
final Config config = db.getConfig();
|
||||||
|
config.setBoolean("http", null, "saveCookies", false);
|
||||||
|
|
||||||
|
try (TransportHttp transportHttp = new TransportHttp(db, uri)) {
|
||||||
|
transportHttp.processResponseCookies(connection);
|
||||||
|
|
||||||
|
// evaluate written cookie file
|
||||||
|
Assert.assertFalse("Cookie file was not supposed to be written!",
|
||||||
|
cookieFile.exists());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,7 +4,6 @@
|
||||||
import static org.hamcrest.Matchers.hasItems;
|
import static org.hamcrest.Matchers.hasItems;
|
||||||
import static org.hamcrest.Matchers.is;
|
import static org.hamcrest.Matchers.is;
|
||||||
import static org.hamcrest.Matchers.notNullValue;
|
import static org.hamcrest.Matchers.notNullValue;
|
||||||
import static org.hamcrest.Matchers.theInstance;
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
@ -428,9 +427,9 @@ private static ByteArrayInputStream linesAsInputStream(String... inputLines)
|
||||||
try (ByteArrayOutputStream send = new ByteArrayOutputStream()) {
|
try (ByteArrayOutputStream send = new ByteArrayOutputStream()) {
|
||||||
PacketLineOut pckOut = new PacketLineOut(send);
|
PacketLineOut pckOut = new PacketLineOut(send);
|
||||||
for (String line : inputLines) {
|
for (String line : inputLines) {
|
||||||
if (line == PacketLineIn.END) {
|
if (PacketLineIn.isEnd(line)) {
|
||||||
pckOut.end();
|
pckOut.end();
|
||||||
} else if (line == PacketLineIn.DELIM) {
|
} else if (PacketLineIn.isDelimiter(line)) {
|
||||||
pckOut.writeDelim();
|
pckOut.writeDelim();
|
||||||
} else {
|
} else {
|
||||||
pckOut.writeString(line);
|
pckOut.writeString(line);
|
||||||
|
@ -453,7 +452,7 @@ private ByteArrayInputStream uploadPackV2(RequestPolicy requestPolicy,
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
|
|
||||||
// drain capabilities
|
// drain capabilities
|
||||||
while (pckIn.readString() != PacketLineIn.END) {
|
while (!PacketLineIn.isEnd(pckIn.readString())) {
|
||||||
// do nothing
|
// do nothing
|
||||||
}
|
}
|
||||||
return recvStream;
|
return recvStream;
|
||||||
|
@ -490,7 +489,7 @@ public void onFetch(FetchV2Request req) {
|
||||||
public void testV2Capabilities() throws Exception {
|
public void testV2Capabilities() throws Exception {
|
||||||
TestV2Hook hook = new TestV2Hook();
|
TestV2Hook hook = new TestV2Hook();
|
||||||
ByteArrayInputStream recvStream =
|
ByteArrayInputStream recvStream =
|
||||||
uploadPackV2Setup(null, null, hook, PacketLineIn.END);
|
uploadPackV2Setup(null, null, hook, PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
assertThat(hook.capabilitiesRequest, notNullValue());
|
assertThat(hook.capabilitiesRequest, notNullValue());
|
||||||
assertThat(pckIn.readString(), is("version 2"));
|
assertThat(pckIn.readString(), is("version 2"));
|
||||||
|
@ -504,14 +503,14 @@ public void testV2Capabilities() throws Exception {
|
||||||
// and additional capabilities to be added to existing
|
// and additional capabilities to be added to existing
|
||||||
// commands without requiring test changes.
|
// commands without requiring test changes.
|
||||||
hasItems("ls-refs", "fetch=shallow", "server-option"));
|
hasItems("ls-refs", "fetch=shallow", "server-option"));
|
||||||
assertTrue(pckIn.readString() == PacketLineIn.END);
|
assertTrue(PacketLineIn.isEnd(pckIn.readString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testV2CapabilitiesAllowFilter() throws Exception {
|
public void testV2CapabilitiesAllowFilter() throws Exception {
|
||||||
server.getConfig().setBoolean("uploadpack", null, "allowfilter", true);
|
server.getConfig().setBoolean("uploadpack", null, "allowfilter", true);
|
||||||
ByteArrayInputStream recvStream =
|
ByteArrayInputStream recvStream =
|
||||||
uploadPackV2Setup(null, null, null, PacketLineIn.END);
|
uploadPackV2Setup(null, null, null, PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
|
|
||||||
assertThat(pckIn.readString(), is("version 2"));
|
assertThat(pckIn.readString(), is("version 2"));
|
||||||
|
@ -521,14 +520,14 @@ public void testV2CapabilitiesAllowFilter() throws Exception {
|
||||||
// TODO(jonathantanmy) This check overspecifies the
|
// TODO(jonathantanmy) This check overspecifies the
|
||||||
// order of the capabilities of "fetch".
|
// order of the capabilities of "fetch".
|
||||||
hasItems("ls-refs", "fetch=filter shallow", "server-option"));
|
hasItems("ls-refs", "fetch=filter shallow", "server-option"));
|
||||||
assertTrue(pckIn.readString() == PacketLineIn.END);
|
assertTrue(PacketLineIn.isEnd(pckIn.readString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testV2CapabilitiesRefInWant() throws Exception {
|
public void testV2CapabilitiesRefInWant() throws Exception {
|
||||||
server.getConfig().setBoolean("uploadpack", null, "allowrefinwant", true);
|
server.getConfig().setBoolean("uploadpack", null, "allowrefinwant", true);
|
||||||
ByteArrayInputStream recvStream =
|
ByteArrayInputStream recvStream =
|
||||||
uploadPackV2Setup(null, null, null, PacketLineIn.END);
|
uploadPackV2Setup(null, null, null, PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
|
|
||||||
assertThat(pckIn.readString(), is("version 2"));
|
assertThat(pckIn.readString(), is("version 2"));
|
||||||
|
@ -539,14 +538,14 @@ public void testV2CapabilitiesRefInWant() throws Exception {
|
||||||
// order of the capabilities of "fetch".
|
// order of the capabilities of "fetch".
|
||||||
hasItems("ls-refs", "fetch=ref-in-want shallow",
|
hasItems("ls-refs", "fetch=ref-in-want shallow",
|
||||||
"server-option"));
|
"server-option"));
|
||||||
assertTrue(pckIn.readString() == PacketLineIn.END);
|
assertTrue(PacketLineIn.isEnd(pckIn.readString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testV2CapabilitiesRefInWantNotAdvertisedIfUnallowed() throws Exception {
|
public void testV2CapabilitiesRefInWantNotAdvertisedIfUnallowed() throws Exception {
|
||||||
server.getConfig().setBoolean("uploadpack", null, "allowrefinwant", false);
|
server.getConfig().setBoolean("uploadpack", null, "allowrefinwant", false);
|
||||||
ByteArrayInputStream recvStream =
|
ByteArrayInputStream recvStream =
|
||||||
uploadPackV2Setup(null, null, null, PacketLineIn.END);
|
uploadPackV2Setup(null, null, null, PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
|
|
||||||
assertThat(pckIn.readString(), is("version 2"));
|
assertThat(pckIn.readString(), is("version 2"));
|
||||||
|
@ -554,7 +553,7 @@ public void testV2CapabilitiesRefInWantNotAdvertisedIfUnallowed() throws Excepti
|
||||||
Arrays.asList(pckIn.readString(), pckIn.readString(),
|
Arrays.asList(pckIn.readString(), pckIn.readString(),
|
||||||
pckIn.readString()),
|
pckIn.readString()),
|
||||||
hasItems("ls-refs", "fetch=shallow", "server-option"));
|
hasItems("ls-refs", "fetch=shallow", "server-option"));
|
||||||
assertTrue(pckIn.readString() == PacketLineIn.END);
|
assertTrue(PacketLineIn.isEnd(pckIn.readString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -562,7 +561,7 @@ public void testV2CapabilitiesRefInWantNotAdvertisedIfAdvertisingForbidden() thr
|
||||||
server.getConfig().setBoolean("uploadpack", null, "allowrefinwant", true);
|
server.getConfig().setBoolean("uploadpack", null, "allowrefinwant", true);
|
||||||
server.getConfig().setBoolean("uploadpack", null, "advertiserefinwant", false);
|
server.getConfig().setBoolean("uploadpack", null, "advertiserefinwant", false);
|
||||||
ByteArrayInputStream recvStream =
|
ByteArrayInputStream recvStream =
|
||||||
uploadPackV2Setup(null, null, null, PacketLineIn.END);
|
uploadPackV2Setup(null, null, null, PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
|
|
||||||
assertThat(pckIn.readString(), is("version 2"));
|
assertThat(pckIn.readString(), is("version 2"));
|
||||||
|
@ -570,12 +569,12 @@ public void testV2CapabilitiesRefInWantNotAdvertisedIfAdvertisingForbidden() thr
|
||||||
Arrays.asList(pckIn.readString(), pckIn.readString(),
|
Arrays.asList(pckIn.readString(), pckIn.readString(),
|
||||||
pckIn.readString()),
|
pckIn.readString()),
|
||||||
hasItems("ls-refs", "fetch=shallow", "server-option"));
|
hasItems("ls-refs", "fetch=shallow", "server-option"));
|
||||||
assertTrue(pckIn.readString() == PacketLineIn.END);
|
assertTrue(PacketLineIn.isEnd(pckIn.readString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testV2EmptyRequest() throws Exception {
|
public void testV2EmptyRequest() throws Exception {
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(PacketLineIn.END);
|
ByteArrayInputStream recvStream = uploadPackV2(PacketLineIn.end());
|
||||||
// Verify that there is nothing more after the capability
|
// Verify that there is nothing more after the capability
|
||||||
// advertisement.
|
// advertisement.
|
||||||
assertEquals(0, recvStream.available());
|
assertEquals(0, recvStream.available());
|
||||||
|
@ -591,14 +590,14 @@ public void testV2LsRefs() throws Exception {
|
||||||
|
|
||||||
TestV2Hook hook = new TestV2Hook();
|
TestV2Hook hook = new TestV2Hook();
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(null, null, hook,
|
ByteArrayInputStream recvStream = uploadPackV2(null, null, hook,
|
||||||
"command=ls-refs\n", PacketLineIn.END);
|
"command=ls-refs\n", PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
|
|
||||||
assertThat(hook.lsRefsRequest, notNullValue());
|
assertThat(hook.lsRefsRequest, notNullValue());
|
||||||
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " HEAD"));
|
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " HEAD"));
|
||||||
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " refs/heads/master"));
|
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " refs/heads/master"));
|
||||||
assertThat(pckIn.readString(), is(tag.toObjectId().getName() + " refs/tags/tag"));
|
assertThat(pckIn.readString(), is(tag.toObjectId().getName() + " refs/tags/tag"));
|
||||||
assertTrue(pckIn.readString() == PacketLineIn.END);
|
assertTrue(PacketLineIn.isEnd(pckIn.readString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -609,13 +608,14 @@ public void testV2LsRefsSymrefs() throws Exception {
|
||||||
RevTag tag = remote.tag("tag", tip);
|
RevTag tag = remote.tag("tag", tip);
|
||||||
remote.update("refs/tags/tag", tag);
|
remote.update("refs/tags/tag", tag);
|
||||||
|
|
||||||
ByteArrayInputStream recvStream = uploadPackV2("command=ls-refs\n", PacketLineIn.DELIM, "symrefs", PacketLineIn.END);
|
ByteArrayInputStream recvStream = uploadPackV2("command=ls-refs\n",
|
||||||
|
PacketLineIn.delimiter(), "symrefs", PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
|
|
||||||
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " HEAD symref-target:refs/heads/master"));
|
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " HEAD symref-target:refs/heads/master"));
|
||||||
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " refs/heads/master"));
|
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " refs/heads/master"));
|
||||||
assertThat(pckIn.readString(), is(tag.toObjectId().getName() + " refs/tags/tag"));
|
assertThat(pckIn.readString(), is(tag.toObjectId().getName() + " refs/tags/tag"));
|
||||||
assertTrue(pckIn.readString() == PacketLineIn.END);
|
assertTrue(PacketLineIn.isEnd(pckIn.readString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -626,7 +626,8 @@ public void testV2LsRefsPeel() throws Exception {
|
||||||
RevTag tag = remote.tag("tag", tip);
|
RevTag tag = remote.tag("tag", tip);
|
||||||
remote.update("refs/tags/tag", tag);
|
remote.update("refs/tags/tag", tag);
|
||||||
|
|
||||||
ByteArrayInputStream recvStream = uploadPackV2("command=ls-refs\n", PacketLineIn.DELIM, "peel", PacketLineIn.END);
|
ByteArrayInputStream recvStream = uploadPackV2("command=ls-refs\n",
|
||||||
|
PacketLineIn.delimiter(), "peel", PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
|
|
||||||
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " HEAD"));
|
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " HEAD"));
|
||||||
|
@ -635,7 +636,7 @@ public void testV2LsRefsPeel() throws Exception {
|
||||||
pckIn.readString(),
|
pckIn.readString(),
|
||||||
is(tag.toObjectId().getName() + " refs/tags/tag peeled:"
|
is(tag.toObjectId().getName() + " refs/tags/tag peeled:"
|
||||||
+ tip.toObjectId().getName()));
|
+ tip.toObjectId().getName()));
|
||||||
assertTrue(pckIn.readString() == PacketLineIn.END);
|
assertTrue(PacketLineIn.isEnd(pckIn.readString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -647,8 +648,9 @@ public void testV2LsRefsMultipleCommands() throws Exception {
|
||||||
remote.update("refs/tags/tag", tag);
|
remote.update("refs/tags/tag", tag);
|
||||||
|
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=ls-refs\n", PacketLineIn.DELIM, "symrefs", "peel", PacketLineIn.END,
|
"command=ls-refs\n", PacketLineIn.delimiter(), "symrefs",
|
||||||
"command=ls-refs\n", PacketLineIn.DELIM, PacketLineIn.END);
|
"peel", PacketLineIn.end(), "command=ls-refs\n",
|
||||||
|
PacketLineIn.delimiter(), PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
|
|
||||||
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " HEAD symref-target:refs/heads/master"));
|
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " HEAD symref-target:refs/heads/master"));
|
||||||
|
@ -657,11 +659,11 @@ public void testV2LsRefsMultipleCommands() throws Exception {
|
||||||
pckIn.readString(),
|
pckIn.readString(),
|
||||||
is(tag.toObjectId().getName() + " refs/tags/tag peeled:"
|
is(tag.toObjectId().getName() + " refs/tags/tag peeled:"
|
||||||
+ tip.toObjectId().getName()));
|
+ tip.toObjectId().getName()));
|
||||||
assertTrue(pckIn.readString() == PacketLineIn.END);
|
assertTrue(PacketLineIn.isEnd(pckIn.readString()));
|
||||||
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " HEAD"));
|
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " HEAD"));
|
||||||
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " refs/heads/master"));
|
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " refs/heads/master"));
|
||||||
assertThat(pckIn.readString(), is(tag.toObjectId().getName() + " refs/tags/tag"));
|
assertThat(pckIn.readString(), is(tag.toObjectId().getName() + " refs/tags/tag"));
|
||||||
assertTrue(pckIn.readString() == PacketLineIn.END);
|
assertTrue(PacketLineIn.isEnd(pckIn.readString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -673,15 +675,15 @@ public void testV2LsRefsRefPrefix() throws Exception {
|
||||||
|
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=ls-refs\n",
|
"command=ls-refs\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"ref-prefix refs/heads/maste",
|
"ref-prefix refs/heads/maste",
|
||||||
"ref-prefix refs/heads/other",
|
"ref-prefix refs/heads/other",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
|
|
||||||
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " refs/heads/master"));
|
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " refs/heads/master"));
|
||||||
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " refs/heads/other"));
|
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " refs/heads/other"));
|
||||||
assertTrue(pckIn.readString() == PacketLineIn.END);
|
assertTrue(PacketLineIn.isEnd(pckIn.readString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -692,15 +694,15 @@ public void testV2LsRefsRefPrefixNoSlash() throws Exception {
|
||||||
|
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=ls-refs\n",
|
"command=ls-refs\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"ref-prefix refs/heads/maste",
|
"ref-prefix refs/heads/maste",
|
||||||
"ref-prefix r",
|
"ref-prefix r",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
|
|
||||||
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " refs/heads/master"));
|
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " refs/heads/master"));
|
||||||
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " refs/heads/other"));
|
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " refs/heads/other"));
|
||||||
assertTrue(pckIn.readString() == PacketLineIn.END);
|
assertTrue(PacketLineIn.isEnd(pckIn.readString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -709,17 +711,17 @@ public void testV2LsRefsUnrecognizedArgument() throws Exception {
|
||||||
thrown.expectMessage("unexpected invalid-argument");
|
thrown.expectMessage("unexpected invalid-argument");
|
||||||
uploadPackV2(
|
uploadPackV2(
|
||||||
"command=ls-refs\n",
|
"command=ls-refs\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"invalid-argument\n",
|
"invalid-argument\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testV2LsRefsServerOptions() throws Exception {
|
public void testV2LsRefsServerOptions() throws Exception {
|
||||||
String[] lines = { "command=ls-refs\n",
|
String[] lines = { "command=ls-refs\n",
|
||||||
"server-option=one\n", "server-option=two\n",
|
"server-option=one\n", "server-option=two\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
PacketLineIn.END };
|
PacketLineIn.end() };
|
||||||
|
|
||||||
TestV2Hook testHook = new TestV2Hook();
|
TestV2Hook testHook = new TestV2Hook();
|
||||||
uploadPackV2Setup(null, null, testHook, lines);
|
uploadPackV2Setup(null, null, testHook, lines);
|
||||||
|
@ -763,9 +765,9 @@ public void testV2FetchRequestPolicyAdvertised() throws Exception {
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + advertized.name() + "\n",
|
"want " + advertized.name() + "\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
|
|
||||||
// This doesn't
|
// This doesn't
|
||||||
thrown.expect(TransportException.class);
|
thrown.expect(TransportException.class);
|
||||||
|
@ -776,9 +778,9 @@ public void testV2FetchRequestPolicyAdvertised() throws Exception {
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + unadvertized.name() + "\n",
|
"want " + unadvertized.name() + "\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -794,9 +796,9 @@ public void testV2FetchRequestPolicyReachableCommit() throws Exception {
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + reachable.name() + "\n",
|
"want " + reachable.name() + "\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
|
|
||||||
// This doesn't
|
// This doesn't
|
||||||
thrown.expect(TransportException.class);
|
thrown.expect(TransportException.class);
|
||||||
|
@ -807,9 +809,9 @@ public void testV2FetchRequestPolicyReachableCommit() throws Exception {
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + unreachable.name() + "\n",
|
"want " + unreachable.name() + "\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -824,9 +826,9 @@ public void testV2FetchRequestPolicyTip() throws Exception {
|
||||||
new RejectAllRefFilter(),
|
new RejectAllRefFilter(),
|
||||||
null,
|
null,
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + tip.name() + "\n",
|
"want " + tip.name() + "\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
|
|
||||||
// This doesn't
|
// This doesn't
|
||||||
thrown.expect(TransportException.class);
|
thrown.expect(TransportException.class);
|
||||||
|
@ -837,9 +839,9 @@ public void testV2FetchRequestPolicyTip() throws Exception {
|
||||||
new RejectAllRefFilter(),
|
new RejectAllRefFilter(),
|
||||||
null,
|
null,
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + parentOfTip.name() + "\n",
|
"want " + parentOfTip.name() + "\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -855,9 +857,9 @@ public void testV2FetchRequestPolicyReachableCommitTip() throws Exception {
|
||||||
new RejectAllRefFilter(),
|
new RejectAllRefFilter(),
|
||||||
null,
|
null,
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + parentOfTip.name() + "\n",
|
"want " + parentOfTip.name() + "\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
|
|
||||||
// This doesn't
|
// This doesn't
|
||||||
thrown.expect(TransportException.class);
|
thrown.expect(TransportException.class);
|
||||||
|
@ -868,9 +870,9 @@ public void testV2FetchRequestPolicyReachableCommitTip() throws Exception {
|
||||||
new RejectAllRefFilter(),
|
new RejectAllRefFilter(),
|
||||||
null,
|
null,
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + unreachable.name() + "\n",
|
"want " + unreachable.name() + "\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -883,9 +885,9 @@ public void testV2FetchRequestPolicyAny() throws Exception {
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + unreachable.name() + "\n",
|
"want " + unreachable.name() + "\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -899,16 +901,16 @@ public void testV2FetchServerDoesNotStopNegotiation() throws Exception {
|
||||||
|
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + fooChild.toObjectId().getName() + "\n",
|
"want " + fooChild.toObjectId().getName() + "\n",
|
||||||
"want " + barChild.toObjectId().getName() + "\n",
|
"want " + barChild.toObjectId().getName() + "\n",
|
||||||
"have " + fooParent.toObjectId().getName() + "\n",
|
"have " + fooParent.toObjectId().getName() + "\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
|
|
||||||
assertThat(pckIn.readString(), is("acknowledgments"));
|
assertThat(pckIn.readString(), is("acknowledgments"));
|
||||||
assertThat(pckIn.readString(), is("ACK " + fooParent.toObjectId().getName()));
|
assertThat(pckIn.readString(), is("ACK " + fooParent.toObjectId().getName()));
|
||||||
assertThat(pckIn.readString(), theInstance(PacketLineIn.END));
|
assertTrue(PacketLineIn.isEnd(pckIn.readString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -922,12 +924,12 @@ public void testV2FetchServerStopsNegotiation() throws Exception {
|
||||||
|
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + fooChild.toObjectId().getName() + "\n",
|
"want " + fooChild.toObjectId().getName() + "\n",
|
||||||
"want " + barChild.toObjectId().getName() + "\n",
|
"want " + barChild.toObjectId().getName() + "\n",
|
||||||
"have " + fooParent.toObjectId().getName() + "\n",
|
"have " + fooParent.toObjectId().getName() + "\n",
|
||||||
"have " + barParent.toObjectId().getName() + "\n",
|
"have " + barParent.toObjectId().getName() + "\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
|
|
||||||
assertThat(pckIn.readString(), is("acknowledgments"));
|
assertThat(pckIn.readString(), is("acknowledgments"));
|
||||||
|
@ -937,7 +939,7 @@ public void testV2FetchServerStopsNegotiation() throws Exception {
|
||||||
"ACK " + fooParent.toObjectId().getName(),
|
"ACK " + fooParent.toObjectId().getName(),
|
||||||
"ACK " + barParent.toObjectId().getName()));
|
"ACK " + barParent.toObjectId().getName()));
|
||||||
assertThat(pckIn.readString(), is("ready"));
|
assertThat(pckIn.readString(), is("ready"));
|
||||||
assertThat(pckIn.readString(), theInstance(PacketLineIn.DELIM));
|
assertTrue(PacketLineIn.isDelimiter(pckIn.readString()));
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
parsePack(recvStream);
|
parsePack(recvStream);
|
||||||
assertFalse(client.getObjectDatabase().has(fooParent.toObjectId()));
|
assertFalse(client.getObjectDatabase().has(fooParent.toObjectId()));
|
||||||
|
@ -957,12 +959,12 @@ public void testV2FetchClientStopsNegotiation() throws Exception {
|
||||||
|
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + fooChild.toObjectId().getName() + "\n",
|
"want " + fooChild.toObjectId().getName() + "\n",
|
||||||
"want " + barChild.toObjectId().getName() + "\n",
|
"want " + barChild.toObjectId().getName() + "\n",
|
||||||
"have " + fooParent.toObjectId().getName() + "\n",
|
"have " + fooParent.toObjectId().getName() + "\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
|
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
|
@ -986,12 +988,12 @@ public void testV2FetchThinPack() throws Exception {
|
||||||
// Pretend that we have parent to get a thin pack based on it.
|
// Pretend that we have parent to get a thin pack based on it.
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + child.toObjectId().getName() + "\n",
|
"want " + child.toObjectId().getName() + "\n",
|
||||||
"have " + parent.toObjectId().getName() + "\n",
|
"have " + parent.toObjectId().getName() + "\n",
|
||||||
"thin-pack\n",
|
"thin-pack\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
|
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
|
@ -1012,10 +1014,10 @@ public void testV2FetchNoProgress() throws Exception {
|
||||||
StringWriter sw = new StringWriter();
|
StringWriter sw = new StringWriter();
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + commit.toObjectId().getName() + "\n",
|
"want " + commit.toObjectId().getName() + "\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
parsePack(recvStream, new TextProgressMonitor(sw));
|
parsePack(recvStream, new TextProgressMonitor(sw));
|
||||||
|
@ -1025,11 +1027,11 @@ public void testV2FetchNoProgress() throws Exception {
|
||||||
sw = new StringWriter();
|
sw = new StringWriter();
|
||||||
recvStream = uploadPackV2(
|
recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + commit.toObjectId().getName() + "\n",
|
"want " + commit.toObjectId().getName() + "\n",
|
||||||
"no-progress\n",
|
"no-progress\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
pckIn = new PacketLineIn(recvStream);
|
pckIn = new PacketLineIn(recvStream);
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
parsePack(recvStream, new TextProgressMonitor(sw));
|
parsePack(recvStream, new TextProgressMonitor(sw));
|
||||||
|
@ -1046,10 +1048,10 @@ public void testV2FetchIncludeTag() throws Exception {
|
||||||
// Without include-tag.
|
// Without include-tag.
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + commit.toObjectId().getName() + "\n",
|
"want " + commit.toObjectId().getName() + "\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
parsePack(recvStream);
|
parsePack(recvStream);
|
||||||
|
@ -1058,11 +1060,11 @@ public void testV2FetchIncludeTag() throws Exception {
|
||||||
// With tag.
|
// With tag.
|
||||||
recvStream = uploadPackV2(
|
recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + commit.toObjectId().getName() + "\n",
|
"want " + commit.toObjectId().getName() + "\n",
|
||||||
"include-tag\n",
|
"include-tag\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
pckIn = new PacketLineIn(recvStream);
|
pckIn = new PacketLineIn(recvStream);
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
parsePack(recvStream);
|
parsePack(recvStream);
|
||||||
|
@ -1082,27 +1084,27 @@ public void testV2FetchOfsDelta() throws Exception {
|
||||||
// Without ofs-delta.
|
// Without ofs-delta.
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + child.toObjectId().getName() + "\n",
|
"want " + child.toObjectId().getName() + "\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
ReceivedPackStatistics stats = parsePack(recvStream);
|
ReceivedPackStatistics receivedStats = parsePack(recvStream);
|
||||||
assertTrue(stats.getNumOfsDelta() == 0);
|
assertTrue(receivedStats.getNumOfsDelta() == 0);
|
||||||
|
|
||||||
// With ofs-delta.
|
// With ofs-delta.
|
||||||
recvStream = uploadPackV2(
|
recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + child.toObjectId().getName() + "\n",
|
"want " + child.toObjectId().getName() + "\n",
|
||||||
"ofs-delta\n",
|
"ofs-delta\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
pckIn = new PacketLineIn(recvStream);
|
pckIn = new PacketLineIn(recvStream);
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
stats = parsePack(recvStream);
|
receivedStats = parsePack(recvStream);
|
||||||
assertTrue(stats.getNumOfsDelta() != 0);
|
assertTrue(receivedStats.getNumOfsDelta() != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -1116,11 +1118,11 @@ public void testV2FetchShallow() throws Exception {
|
||||||
// commonParent, so it doesn't send it.
|
// commonParent, so it doesn't send it.
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + barChild.toObjectId().getName() + "\n",
|
"want " + barChild.toObjectId().getName() + "\n",
|
||||||
"have " + fooChild.toObjectId().getName() + "\n",
|
"have " + fooChild.toObjectId().getName() + "\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
parsePack(recvStream);
|
parsePack(recvStream);
|
||||||
|
@ -1131,12 +1133,12 @@ public void testV2FetchShallow() throws Exception {
|
||||||
// commonParent, so it sends it.
|
// commonParent, so it sends it.
|
||||||
recvStream = uploadPackV2(
|
recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + barChild.toObjectId().getName() + "\n",
|
"want " + barChild.toObjectId().getName() + "\n",
|
||||||
"have " + fooChild.toObjectId().getName() + "\n",
|
"have " + fooChild.toObjectId().getName() + "\n",
|
||||||
"shallow " + fooChild.toObjectId().getName() + "\n",
|
"shallow " + fooChild.toObjectId().getName() + "\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
pckIn = new PacketLineIn(recvStream);
|
pckIn = new PacketLineIn(recvStream);
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
parsePack(recvStream);
|
parsePack(recvStream);
|
||||||
|
@ -1152,15 +1154,15 @@ public void testV2FetchDeepenAndDone() throws Exception {
|
||||||
// "deepen 1" sends only the child.
|
// "deepen 1" sends only the child.
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + child.toObjectId().getName() + "\n",
|
"want " + child.toObjectId().getName() + "\n",
|
||||||
"deepen 1\n",
|
"deepen 1\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
assertThat(pckIn.readString(), is("shallow-info"));
|
assertThat(pckIn.readString(), is("shallow-info"));
|
||||||
assertThat(pckIn.readString(), is("shallow " + child.toObjectId().getName()));
|
assertThat(pckIn.readString(), is("shallow " + child.toObjectId().getName()));
|
||||||
assertThat(pckIn.readString(), theInstance(PacketLineIn.DELIM));
|
assertTrue(PacketLineIn.isDelimiter(pckIn.readString()));
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
parsePack(recvStream);
|
parsePack(recvStream);
|
||||||
assertTrue(client.getObjectDatabase().has(child.toObjectId()));
|
assertTrue(client.getObjectDatabase().has(child.toObjectId()));
|
||||||
|
@ -1169,10 +1171,10 @@ public void testV2FetchDeepenAndDone() throws Exception {
|
||||||
// Without that, the parent is sent too.
|
// Without that, the parent is sent too.
|
||||||
recvStream = uploadPackV2(
|
recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + child.toObjectId().getName() + "\n",
|
"want " + child.toObjectId().getName() + "\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
pckIn = new PacketLineIn(recvStream);
|
pckIn = new PacketLineIn(recvStream);
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
parsePack(recvStream);
|
parsePack(recvStream);
|
||||||
|
@ -1187,10 +1189,10 @@ public void testV2FetchDeepenWithoutDone() throws Exception {
|
||||||
|
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + child.toObjectId().getName() + "\n",
|
"want " + child.toObjectId().getName() + "\n",
|
||||||
"deepen 1\n",
|
"deepen 1\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
|
|
||||||
// Verify that only the correct section is sent. "shallow-info"
|
// Verify that only the correct section is sent. "shallow-info"
|
||||||
|
@ -1198,7 +1200,7 @@ public void testV2FetchDeepenWithoutDone() throws Exception {
|
||||||
// sent only if a packfile is sent.
|
// sent only if a packfile is sent.
|
||||||
assertThat(pckIn.readString(), is("acknowledgments"));
|
assertThat(pckIn.readString(), is("acknowledgments"));
|
||||||
assertThat(pckIn.readString(), is("NAK"));
|
assertThat(pckIn.readString(), is("NAK"));
|
||||||
assertThat(pckIn.readString(), theInstance(PacketLineIn.END));
|
assertTrue(PacketLineIn.isEnd(pckIn.readString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -1219,13 +1221,13 @@ public void testV2FetchShallowSince() throws Exception {
|
||||||
// Report that we only have "boundary" as a shallow boundary.
|
// Report that we only have "boundary" as a shallow boundary.
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"shallow " + boundary.toObjectId().getName() + "\n",
|
"shallow " + boundary.toObjectId().getName() + "\n",
|
||||||
"deepen-since 1510000\n",
|
"deepen-since 1510000\n",
|
||||||
"want " + merge.toObjectId().getName() + "\n",
|
"want " + merge.toObjectId().getName() + "\n",
|
||||||
"have " + boundary.toObjectId().getName() + "\n",
|
"have " + boundary.toObjectId().getName() + "\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
assertThat(pckIn.readString(), is("shallow-info"));
|
assertThat(pckIn.readString(), is("shallow-info"));
|
||||||
|
|
||||||
|
@ -1237,7 +1239,7 @@ public void testV2FetchShallowSince() throws Exception {
|
||||||
// later than the given deepen-since time.
|
// later than the given deepen-since time.
|
||||||
assertThat(pckIn.readString(), is("unshallow " + boundary.toObjectId().getName()));
|
assertThat(pckIn.readString(), is("unshallow " + boundary.toObjectId().getName()));
|
||||||
|
|
||||||
assertThat(pckIn.readString(), theInstance(PacketLineIn.DELIM));
|
assertTrue(PacketLineIn.isDelimiter(pckIn.readString()));
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
parsePack(recvStream);
|
parsePack(recvStream);
|
||||||
|
|
||||||
|
@ -1270,12 +1272,12 @@ public void testV2FetchShallowSince_excludedParentWithMultipleChildren() throws
|
||||||
|
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"deepen-since 1510000\n",
|
"deepen-since 1510000\n",
|
||||||
"want " + child1.toObjectId().getName() + "\n",
|
"want " + child1.toObjectId().getName() + "\n",
|
||||||
"want " + child2.toObjectId().getName() + "\n",
|
"want " + child2.toObjectId().getName() + "\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
assertThat(pckIn.readString(), is("shallow-info"));
|
assertThat(pckIn.readString(), is("shallow-info"));
|
||||||
|
|
||||||
|
@ -1286,7 +1288,7 @@ public void testV2FetchShallowSince_excludedParentWithMultipleChildren() throws
|
||||||
"shallow " + child1.toObjectId().getName(),
|
"shallow " + child1.toObjectId().getName(),
|
||||||
"shallow " + child2.toObjectId().getName()));
|
"shallow " + child2.toObjectId().getName()));
|
||||||
|
|
||||||
assertThat(pckIn.readString(), theInstance(PacketLineIn.DELIM));
|
assertTrue(PacketLineIn.isDelimiter(pckIn.readString()));
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
parsePack(recvStream);
|
parsePack(recvStream);
|
||||||
|
|
||||||
|
@ -1309,11 +1311,11 @@ public void testV2FetchShallowSince_noCommitsSelected() throws Exception {
|
||||||
thrown.expectMessage("No commits selected for shallow request");
|
thrown.expectMessage("No commits selected for shallow request");
|
||||||
uploadPackV2(
|
uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"deepen-since 1510000\n",
|
"deepen-since 1510000\n",
|
||||||
"want " + tooOld.toObjectId().getName() + "\n",
|
"want " + tooOld.toObjectId().getName() + "\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -1332,13 +1334,13 @@ public void testV2FetchDeepenNot() throws Exception {
|
||||||
// wants "merge" while excluding "side".
|
// wants "merge" while excluding "side".
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"shallow " + three.toObjectId().getName() + "\n",
|
"shallow " + three.toObjectId().getName() + "\n",
|
||||||
"deepen-not side\n",
|
"deepen-not side\n",
|
||||||
"want " + merge.toObjectId().getName() + "\n",
|
"want " + merge.toObjectId().getName() + "\n",
|
||||||
"have " + three.toObjectId().getName() + "\n",
|
"have " + three.toObjectId().getName() + "\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
assertThat(pckIn.readString(), is("shallow-info"));
|
assertThat(pckIn.readString(), is("shallow-info"));
|
||||||
|
|
||||||
|
@ -1353,7 +1355,7 @@ public void testV2FetchDeepenNot() throws Exception {
|
||||||
// "three" is unshallow because its parent "two" is now available.
|
// "three" is unshallow because its parent "two" is now available.
|
||||||
assertThat(pckIn.readString(), is("unshallow " + three.toObjectId().getName()));
|
assertThat(pckIn.readString(), is("unshallow " + three.toObjectId().getName()));
|
||||||
|
|
||||||
assertThat(pckIn.readString(), theInstance(PacketLineIn.DELIM));
|
assertTrue(PacketLineIn.isDelimiter(pckIn.readString()));
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
parsePack(recvStream);
|
parsePack(recvStream);
|
||||||
|
|
||||||
|
@ -1385,11 +1387,11 @@ public void testV2FetchDeepenNot_excludeDescendantOfWant() throws Exception {
|
||||||
thrown.expectMessage("No commits selected for shallow request");
|
thrown.expectMessage("No commits selected for shallow request");
|
||||||
uploadPackV2(
|
uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"deepen-not four\n",
|
"deepen-not four\n",
|
||||||
"want " + two.toObjectId().getName() + "\n",
|
"want " + two.toObjectId().getName() + "\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -1405,15 +1407,15 @@ public void testV2FetchDeepenNot_supportAnnotatedTags() throws Exception {
|
||||||
|
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"deepen-not twotag\n",
|
"deepen-not twotag\n",
|
||||||
"want " + four.toObjectId().getName() + "\n",
|
"want " + four.toObjectId().getName() + "\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
assertThat(pckIn.readString(), is("shallow-info"));
|
assertThat(pckIn.readString(), is("shallow-info"));
|
||||||
assertThat(pckIn.readString(), is("shallow " + three.toObjectId().getName()));
|
assertThat(pckIn.readString(), is("shallow " + three.toObjectId().getName()));
|
||||||
assertThat(pckIn.readString(), theInstance(PacketLineIn.DELIM));
|
assertTrue(PacketLineIn.isDelimiter(pckIn.readString()));
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
parsePack(recvStream);
|
parsePack(recvStream);
|
||||||
assertFalse(client.getObjectDatabase().has(one.toObjectId()));
|
assertFalse(client.getObjectDatabase().has(one.toObjectId()));
|
||||||
|
@ -1439,12 +1441,12 @@ public void testV2FetchDeepenNot_excludedParentWithMultipleChildren() throws Exc
|
||||||
|
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"deepen-not base\n",
|
"deepen-not base\n",
|
||||||
"want " + child1.toObjectId().getName() + "\n",
|
"want " + child1.toObjectId().getName() + "\n",
|
||||||
"want " + child2.toObjectId().getName() + "\n",
|
"want " + child2.toObjectId().getName() + "\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
assertThat(pckIn.readString(), is("shallow-info"));
|
assertThat(pckIn.readString(), is("shallow-info"));
|
||||||
|
|
||||||
|
@ -1455,7 +1457,7 @@ public void testV2FetchDeepenNot_excludedParentWithMultipleChildren() throws Exc
|
||||||
"shallow " + child1.toObjectId().getName(),
|
"shallow " + child1.toObjectId().getName(),
|
||||||
"shallow " + child2.toObjectId().getName()));
|
"shallow " + child2.toObjectId().getName()));
|
||||||
|
|
||||||
assertThat(pckIn.readString(), theInstance(PacketLineIn.DELIM));
|
assertTrue(PacketLineIn.isDelimiter(pckIn.readString()));
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
parsePack(recvStream);
|
parsePack(recvStream);
|
||||||
|
|
||||||
|
@ -1471,16 +1473,16 @@ public void testV2FetchUnrecognizedArgument() throws Exception {
|
||||||
thrown.expectMessage("unexpected invalid-argument");
|
thrown.expectMessage("unexpected invalid-argument");
|
||||||
uploadPackV2(
|
uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"invalid-argument\n",
|
"invalid-argument\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testV2FetchServerOptions() throws Exception {
|
public void testV2FetchServerOptions() throws Exception {
|
||||||
String[] lines = { "command=fetch\n", "server-option=one\n",
|
String[] lines = { "command=fetch\n", "server-option=one\n",
|
||||||
"server-option=two\n", PacketLineIn.DELIM,
|
"server-option=two\n", PacketLineIn.delimiter(),
|
||||||
PacketLineIn.END };
|
PacketLineIn.end() };
|
||||||
|
|
||||||
TestV2Hook testHook = new TestV2Hook();
|
TestV2Hook testHook = new TestV2Hook();
|
||||||
uploadPackV2Setup(null, null, testHook, lines);
|
uploadPackV2Setup(null, null, testHook, lines);
|
||||||
|
@ -1504,11 +1506,11 @@ public void testV2FetchFilter() throws Exception {
|
||||||
|
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + commit.toObjectId().getName() + "\n",
|
"want " + commit.toObjectId().getName() + "\n",
|
||||||
"filter blob:limit=5\n",
|
"filter blob:limit=5\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
parsePack(recvStream);
|
parsePack(recvStream);
|
||||||
|
@ -1557,15 +1559,15 @@ private void uploadV2WithTreeDepthFilter(
|
||||||
long depth, ObjectId... wants) throws Exception {
|
long depth, ObjectId... wants) throws Exception {
|
||||||
server.getConfig().setBoolean("uploadpack", null, "allowfilter", true);
|
server.getConfig().setBoolean("uploadpack", null, "allowfilter", true);
|
||||||
|
|
||||||
List<String> input = new ArrayList();
|
List<String> input = new ArrayList<>();
|
||||||
input.add("command=fetch\n");
|
input.add("command=fetch\n");
|
||||||
input.add(PacketLineIn.DELIM);
|
input.add(PacketLineIn.delimiter());
|
||||||
for (ObjectId want : wants) {
|
for (ObjectId want : wants) {
|
||||||
input.add("want " + want.getName() + "\n");
|
input.add("want " + want.getName() + "\n");
|
||||||
}
|
}
|
||||||
input.add("filter tree:" + depth + "\n");
|
input.add("filter tree:" + depth + "\n");
|
||||||
input.add("done\n");
|
input.add("done\n");
|
||||||
input.add(PacketLineIn.END);
|
input.add(PacketLineIn.end());
|
||||||
ByteArrayInputStream recvStream =
|
ByteArrayInputStream recvStream =
|
||||||
uploadPackV2(RequestPolicy.ANY, /*refFilter=*/null,
|
uploadPackV2(RequestPolicy.ANY, /*refFilter=*/null,
|
||||||
/*hook=*/null, input.toArray(new String[0]));
|
/*hook=*/null, input.toArray(new String[0]));
|
||||||
|
@ -1846,11 +1848,11 @@ public void testV2FetchFilterWhenNotAllowed() throws Exception {
|
||||||
thrown.expectMessage("unexpected filter blob:limit=5");
|
thrown.expectMessage("unexpected filter blob:limit=5");
|
||||||
uploadPackV2(
|
uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want " + commit.toObjectId().getName() + "\n",
|
"want " + commit.toObjectId().getName() + "\n",
|
||||||
"filter blob:limit=5\n",
|
"filter blob:limit=5\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -1861,10 +1863,10 @@ public void testV2FetchWantRefIfNotAllowed() throws Exception {
|
||||||
try {
|
try {
|
||||||
uploadPackV2(
|
uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want-ref refs/heads/one\n",
|
"want-ref refs/heads/one\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
} catch (PackProtocolException e) {
|
} catch (PackProtocolException e) {
|
||||||
assertThat(
|
assertThat(
|
||||||
e.getMessage(),
|
e.getMessage(),
|
||||||
|
@ -1887,11 +1889,11 @@ public void testV2FetchWantRef() throws Exception {
|
||||||
|
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want-ref refs/heads/one\n",
|
"want-ref refs/heads/one\n",
|
||||||
"want-ref refs/heads/two\n",
|
"want-ref refs/heads/two\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
assertThat(pckIn.readString(), is("wanted-refs"));
|
assertThat(pckIn.readString(), is("wanted-refs"));
|
||||||
assertThat(
|
assertThat(
|
||||||
|
@ -1899,7 +1901,7 @@ public void testV2FetchWantRef() throws Exception {
|
||||||
hasItems(
|
hasItems(
|
||||||
one.toObjectId().getName() + " refs/heads/one",
|
one.toObjectId().getName() + " refs/heads/one",
|
||||||
two.toObjectId().getName() + " refs/heads/two"));
|
two.toObjectId().getName() + " refs/heads/two"));
|
||||||
assertThat(pckIn.readString(), theInstance(PacketLineIn.DELIM));
|
assertTrue(PacketLineIn.isDelimiter(pckIn.readString()));
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
parsePack(recvStream);
|
parsePack(recvStream);
|
||||||
|
|
||||||
|
@ -1918,11 +1920,11 @@ public void testV2FetchBadWantRef() throws Exception {
|
||||||
try {
|
try {
|
||||||
uploadPackV2(
|
uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want-ref refs/heads/one\n",
|
"want-ref refs/heads/one\n",
|
||||||
"want-ref refs/heads/nonExistentRef\n",
|
"want-ref refs/heads/nonExistentRef\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
} catch (PackProtocolException e) {
|
} catch (PackProtocolException e) {
|
||||||
assertThat(
|
assertThat(
|
||||||
e.getMessage(),
|
e.getMessage(),
|
||||||
|
@ -1945,17 +1947,17 @@ public void testV2FetchMixedWantRef() throws Exception {
|
||||||
|
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want-ref refs/heads/one\n",
|
"want-ref refs/heads/one\n",
|
||||||
"want " + two.toObjectId().getName() + "\n",
|
"want " + two.toObjectId().getName() + "\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
assertThat(pckIn.readString(), is("wanted-refs"));
|
assertThat(pckIn.readString(), is("wanted-refs"));
|
||||||
assertThat(
|
assertThat(
|
||||||
pckIn.readString(),
|
pckIn.readString(),
|
||||||
is(one.toObjectId().getName() + " refs/heads/one"));
|
is(one.toObjectId().getName() + " refs/heads/one"));
|
||||||
assertThat(pckIn.readString(), theInstance(PacketLineIn.DELIM));
|
assertTrue(PacketLineIn.isDelimiter(pckIn.readString()));
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
parsePack(recvStream);
|
parsePack(recvStream);
|
||||||
|
|
||||||
|
@ -1973,11 +1975,11 @@ public void testV2FetchWantRefWeAlreadyHave() throws Exception {
|
||||||
|
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want-ref refs/heads/one\n",
|
"want-ref refs/heads/one\n",
|
||||||
"have " + one.toObjectId().getName(),
|
"have " + one.toObjectId().getName(),
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
|
|
||||||
// The client still needs to know the hash of the object that
|
// The client still needs to know the hash of the object that
|
||||||
|
@ -1987,7 +1989,7 @@ public void testV2FetchWantRefWeAlreadyHave() throws Exception {
|
||||||
assertThat(
|
assertThat(
|
||||||
pckIn.readString(),
|
pckIn.readString(),
|
||||||
is(one.toObjectId().getName() + " refs/heads/one"));
|
is(one.toObjectId().getName() + " refs/heads/one"));
|
||||||
assertThat(pckIn.readString(), theInstance(PacketLineIn.DELIM));
|
assertTrue(PacketLineIn.isDelimiter(pckIn.readString()));
|
||||||
|
|
||||||
// ... but the client does not need the object itself.
|
// ... but the client does not need the object itself.
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
|
@ -2005,20 +2007,20 @@ public void testV2FetchWantRefAndDeepen() throws Exception {
|
||||||
|
|
||||||
ByteArrayInputStream recvStream = uploadPackV2(
|
ByteArrayInputStream recvStream = uploadPackV2(
|
||||||
"command=fetch\n",
|
"command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want-ref refs/heads/branch1\n",
|
"want-ref refs/heads/branch1\n",
|
||||||
"deepen 1\n",
|
"deepen 1\n",
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
|
|
||||||
// shallow-info appears first, then wanted-refs.
|
// shallow-info appears first, then wanted-refs.
|
||||||
assertThat(pckIn.readString(), is("shallow-info"));
|
assertThat(pckIn.readString(), is("shallow-info"));
|
||||||
assertThat(pckIn.readString(), is("shallow " + child.toObjectId().getName()));
|
assertThat(pckIn.readString(), is("shallow " + child.toObjectId().getName()));
|
||||||
assertThat(pckIn.readString(), theInstance(PacketLineIn.DELIM));
|
assertTrue(PacketLineIn.isDelimiter(pckIn.readString()));
|
||||||
assertThat(pckIn.readString(), is("wanted-refs"));
|
assertThat(pckIn.readString(), is("wanted-refs"));
|
||||||
assertThat(pckIn.readString(), is(child.toObjectId().getName() + " refs/heads/branch1"));
|
assertThat(pckIn.readString(), is(child.toObjectId().getName() + " refs/heads/branch1"));
|
||||||
assertThat(pckIn.readString(), theInstance(PacketLineIn.DELIM));
|
assertTrue(PacketLineIn.isDelimiter(pckIn.readString()));
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
parsePack(recvStream);
|
parsePack(recvStream);
|
||||||
assertTrue(client.getObjectDatabase().has(child.toObjectId()));
|
assertTrue(client.getObjectDatabase().has(child.toObjectId()));
|
||||||
|
@ -2036,13 +2038,13 @@ public void testV2FetchMissingShallow() throws Exception {
|
||||||
true);
|
true);
|
||||||
|
|
||||||
ByteArrayInputStream recvStream = uploadPackV2("command=fetch\n",
|
ByteArrayInputStream recvStream = uploadPackV2("command=fetch\n",
|
||||||
PacketLineIn.DELIM,
|
PacketLineIn.delimiter(),
|
||||||
"want-ref refs/heads/three\n",
|
"want-ref refs/heads/three\n",
|
||||||
"deepen 3",
|
"deepen 3",
|
||||||
"shallow 0123012301230123012301230123012301230123",
|
"shallow 0123012301230123012301230123012301230123",
|
||||||
"shallow " + two.getName() + '\n',
|
"shallow " + two.getName() + '\n',
|
||||||
"done\n",
|
"done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
PacketLineIn pckIn = new PacketLineIn(recvStream);
|
||||||
|
|
||||||
assertThat(pckIn.readString(), is("shallow-info"));
|
assertThat(pckIn.readString(), is("shallow-info"));
|
||||||
|
@ -2050,11 +2052,11 @@ public void testV2FetchMissingShallow() throws Exception {
|
||||||
is("shallow " + one.toObjectId().getName()));
|
is("shallow " + one.toObjectId().getName()));
|
||||||
assertThat(pckIn.readString(),
|
assertThat(pckIn.readString(),
|
||||||
is("unshallow " + two.toObjectId().getName()));
|
is("unshallow " + two.toObjectId().getName()));
|
||||||
assertThat(pckIn.readString(), theInstance(PacketLineIn.DELIM));
|
assertTrue(PacketLineIn.isDelimiter(pckIn.readString()));
|
||||||
assertThat(pckIn.readString(), is("wanted-refs"));
|
assertThat(pckIn.readString(), is("wanted-refs"));
|
||||||
assertThat(pckIn.readString(),
|
assertThat(pckIn.readString(),
|
||||||
is(three.toObjectId().getName() + " refs/heads/three"));
|
is(three.toObjectId().getName() + " refs/heads/three"));
|
||||||
assertThat(pckIn.readString(), theInstance(PacketLineIn.DELIM));
|
assertTrue(PacketLineIn.isDelimiter(pckIn.readString()));
|
||||||
assertThat(pckIn.readString(), is("packfile"));
|
assertThat(pckIn.readString(), is("packfile"));
|
||||||
parsePack(recvStream);
|
parsePack(recvStream);
|
||||||
|
|
||||||
|
@ -2071,7 +2073,7 @@ public void testGetPeerAgentProtocolV0() throws Exception {
|
||||||
UploadPack up = new UploadPack(server);
|
UploadPack up = new UploadPack(server);
|
||||||
ByteArrayInputStream send = linesAsInputStream(
|
ByteArrayInputStream send = linesAsInputStream(
|
||||||
"want " + one.getName() + " agent=JGit-test/1.2.3\n",
|
"want " + one.getName() + " agent=JGit-test/1.2.3\n",
|
||||||
PacketLineIn.END,
|
PacketLineIn.end(),
|
||||||
"have 11cedf1b796d44207da702f7d420684022fc0f09\n", "done\n");
|
"have 11cedf1b796d44207da702f7d420684022fc0f09\n", "done\n");
|
||||||
|
|
||||||
ByteArrayOutputStream recv = new ByteArrayOutputStream();
|
ByteArrayOutputStream recv = new ByteArrayOutputStream();
|
||||||
|
@ -2092,9 +2094,9 @@ public void testGetPeerAgentProtocolV2() throws Exception {
|
||||||
|
|
||||||
ByteArrayInputStream send = linesAsInputStream(
|
ByteArrayInputStream send = linesAsInputStream(
|
||||||
"command=fetch\n", "agent=JGit-test/1.2.4\n",
|
"command=fetch\n", "agent=JGit-test/1.2.4\n",
|
||||||
PacketLineIn.DELIM, "want " + one.getName() + "\n",
|
PacketLineIn.delimiter(), "want " + one.getName() + "\n",
|
||||||
"have 11cedf1b796d44207da702f7d420684022fc0f09\n", "done\n",
|
"have 11cedf1b796d44207da702f7d420684022fc0f09\n", "done\n",
|
||||||
PacketLineIn.END);
|
PacketLineIn.end());
|
||||||
|
|
||||||
ByteArrayOutputStream recv = new ByteArrayOutputStream();
|
ByteArrayOutputStream recv = new ByteArrayOutputStream();
|
||||||
up.upload(send, recv, null);
|
up.upload(send, recv, null);
|
||||||
|
|
|
@ -137,7 +137,6 @@ public void testDeleteRecursive() throws IOException {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
||||||
public void testDeleteRecursiveEmpty() throws IOException {
|
public void testDeleteRecursiveEmpty() throws IOException {
|
||||||
File f1 = new File(trash, "test/test/a");
|
File f1 = new File(trash, "test/test/a");
|
||||||
File f2 = new File(trash, "test/a");
|
File f2 = new File(trash, "test/a");
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018, Konrad Windszus <konrad_w@gmx.de>
|
||||||
|
* and other copyright owners as documented in the project's IP log.
|
||||||
|
*
|
||||||
|
* This program and the accompanying materials are made available
|
||||||
|
* under the terms of the Eclipse Distribution License v1.0 which
|
||||||
|
* accompanies this distribution, is reproduced below, and is
|
||||||
|
* available at http://www.eclipse.org/org/documents/edl-v10.php
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or
|
||||||
|
* without modification, are permitted provided that the following
|
||||||
|
* conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following
|
||||||
|
* disclaimer in the documentation and/or other materials provided
|
||||||
|
* with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Eclipse Foundation, Inc. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote
|
||||||
|
* products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
package org.eclipse.jgit.util;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.hamcrest.collection.IsIterableContainingInOrder;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class LRUMapTest {
|
||||||
|
|
||||||
|
@SuppressWarnings("boxing")
|
||||||
|
@Test
|
||||||
|
public void testLRUEntriesAreEvicted() {
|
||||||
|
Map<Integer, Integer> map = new LRUMap<>(3, 3);
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
map.put(i, i);
|
||||||
|
}
|
||||||
|
// access the last ones
|
||||||
|
map.get(2);
|
||||||
|
map.get(0);
|
||||||
|
|
||||||
|
// put another one which exceeds the limit (entry with key "1" is
|
||||||
|
// evicted)
|
||||||
|
map.put(3, 3);
|
||||||
|
|
||||||
|
Map<Integer, Integer> expectedMap = new LinkedHashMap<>();
|
||||||
|
expectedMap.put(2, 2);
|
||||||
|
expectedMap.put(0, 0);
|
||||||
|
expectedMap.put(3, 3);
|
||||||
|
|
||||||
|
Assert.assertThat(map.entrySet(),
|
||||||
|
IsIterableContainingInOrder
|
||||||
|
.contains(expectedMap.entrySet().toArray()));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,150 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018, Konrad Windszus <konrad_w@gmx.de>
|
||||||
|
* and other copyright owners as documented in the project's IP log.
|
||||||
|
*
|
||||||
|
* This program and the accompanying materials are made available
|
||||||
|
* under the terms of the Eclipse Distribution License v1.0 which
|
||||||
|
* accompanies this distribution, is reproduced below, and is
|
||||||
|
* available at http://www.eclipse.org/org/documents/edl-v10.php
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or
|
||||||
|
* without modification, are permitted provided that the following
|
||||||
|
* conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following
|
||||||
|
* disclaimer in the documentation and/or other materials provided
|
||||||
|
* with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Eclipse Foundation, Inc. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote
|
||||||
|
* products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
package org.eclipse.jgit.util.http;
|
||||||
|
|
||||||
|
import java.net.HttpCookie;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.hamcrest.Description;
|
||||||
|
import org.hamcrest.Matcher;
|
||||||
|
import org.hamcrest.TypeSafeMatcher;
|
||||||
|
import org.hamcrest.collection.IsIterableContainingInOrder;
|
||||||
|
|
||||||
|
public final class HttpCookiesMatcher {
|
||||||
|
public static Matcher<Iterable<? extends HttpCookie>> containsInOrder(
|
||||||
|
Iterable<HttpCookie> expectedCookies) {
|
||||||
|
return containsInOrder(expectedCookies, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Matcher<Iterable<? extends HttpCookie>> containsInOrder(
|
||||||
|
Iterable<HttpCookie> expectedCookies, int allowedMaxAgeDelta) {
|
||||||
|
final List<Matcher<? super HttpCookie>> cookieMatchers = new LinkedList<>();
|
||||||
|
for (HttpCookie cookie : expectedCookies) {
|
||||||
|
cookieMatchers
|
||||||
|
.add(new HttpCookieMatcher(cookie, allowedMaxAgeDelta));
|
||||||
|
}
|
||||||
|
return new IsIterableContainingInOrder<>(cookieMatchers);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The default {@link HttpCookie#equals(Object)} is not good enough for
|
||||||
|
* testing purposes. Also the {@link HttpCookie#toString()} only emits some
|
||||||
|
* of the cookie attributes. For testing a dedicated matcher is needed which
|
||||||
|
* takes into account all attributes.
|
||||||
|
*/
|
||||||
|
private static final class HttpCookieMatcher
|
||||||
|
extends TypeSafeMatcher<HttpCookie> {
|
||||||
|
|
||||||
|
private final HttpCookie cookie;
|
||||||
|
|
||||||
|
private final int allowedMaxAgeDelta;
|
||||||
|
|
||||||
|
public HttpCookieMatcher(HttpCookie cookie, int allowedMaxAgeDelta) {
|
||||||
|
this.cookie = cookie;
|
||||||
|
this.allowedMaxAgeDelta = allowedMaxAgeDelta;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void describeTo(Description description) {
|
||||||
|
describeCookie(description, cookie);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void describeMismatchSafely(HttpCookie item,
|
||||||
|
Description mismatchDescription) {
|
||||||
|
mismatchDescription.appendText("was ");
|
||||||
|
describeCookie(mismatchDescription, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean matchesSafely(HttpCookie otherCookie) {
|
||||||
|
// the equals method in HttpCookie is not specific enough, we want
|
||||||
|
// to consider all attributes!
|
||||||
|
return (equals(cookie.getName(), otherCookie.getName())
|
||||||
|
&& equals(cookie.getValue(), otherCookie.getValue())
|
||||||
|
&& equals(cookie.getDomain(), otherCookie.getDomain())
|
||||||
|
&& equals(cookie.getPath(), otherCookie.getPath())
|
||||||
|
&& (cookie.getMaxAge() >= otherCookie.getMaxAge()
|
||||||
|
- allowedMaxAgeDelta)
|
||||||
|
&& (cookie.getMaxAge() <= otherCookie.getMaxAge()
|
||||||
|
+ allowedMaxAgeDelta)
|
||||||
|
&& cookie.isHttpOnly() == otherCookie.isHttpOnly()
|
||||||
|
&& cookie.getSecure() == otherCookie.getSecure()
|
||||||
|
&& cookie.getVersion() == otherCookie.getVersion());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean equals(String value1, String value2) {
|
||||||
|
if (value1 == null && value2 == null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (value1 == null || value2 == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return value1.equals(value2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("boxing")
|
||||||
|
protected static void describeCookie(Description description,
|
||||||
|
HttpCookie cookie) {
|
||||||
|
description.appendText("HttpCookie[");
|
||||||
|
description.appendText("name: ").appendValue(cookie.getName())
|
||||||
|
.appendText(", ");
|
||||||
|
description.appendText("value: ").appendValue(cookie.getValue())
|
||||||
|
.appendText(", ");
|
||||||
|
description.appendText("domain: ").appendValue(cookie.getDomain())
|
||||||
|
.appendText(", ");
|
||||||
|
description.appendText("path: ").appendValue(cookie.getPath())
|
||||||
|
.appendText(", ");
|
||||||
|
description.appendText("maxAge: ").appendValue(cookie.getMaxAge())
|
||||||
|
.appendText(", ");
|
||||||
|
description.appendText("httpOnly: ")
|
||||||
|
.appendValue(cookie.isHttpOnly()).appendText(", ");
|
||||||
|
description.appendText("secure: ").appendValue(cookie.getSecure())
|
||||||
|
.appendText(", ");
|
||||||
|
description.appendText("version: ").appendValue(cookie.getVersion())
|
||||||
|
.appendText(", ");
|
||||||
|
description.appendText("]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -22,6 +22,14 @@
|
||||||
</message_arguments>
|
</message_arguments>
|
||||||
</filter>
|
</filter>
|
||||||
</resource>
|
</resource>
|
||||||
|
<resource path="src/org/eclipse/jgit/lib/Repository.java" type="org.eclipse.jgit.lib.Repository">
|
||||||
|
<filter id="336695337">
|
||||||
|
<message_arguments>
|
||||||
|
<message_argument value="org.eclipse.jgit.lib.Repository"/>
|
||||||
|
<message_argument value="getIdentifier()"/>
|
||||||
|
</message_arguments>
|
||||||
|
</filter>
|
||||||
|
</resource>
|
||||||
<resource path="src/org/eclipse/jgit/revwalk/ObjectWalk.java" type="org.eclipse.jgit.revwalk.ObjectWalk">
|
<resource path="src/org/eclipse/jgit/revwalk/ObjectWalk.java" type="org.eclipse.jgit.revwalk.ObjectWalk">
|
||||||
<filter comment="ignore the risk subclasses could define the same field and cause a name clash" id="336658481">
|
<filter comment="ignore the risk subclasses could define the same field and cause a name clash" id="336658481">
|
||||||
<message_arguments>
|
<message_arguments>
|
||||||
|
@ -94,6 +102,26 @@
|
||||||
</message_arguments>
|
</message_arguments>
|
||||||
</filter>
|
</filter>
|
||||||
</resource>
|
</resource>
|
||||||
|
<resource path="src/org/eclipse/jgit/transport/HttpConfig.java" type="org.eclipse.jgit.transport.HttpConfig">
|
||||||
|
<filter id="336658481">
|
||||||
|
<message_arguments>
|
||||||
|
<message_argument value="org.eclipse.jgit.transport.HttpConfig"/>
|
||||||
|
<message_argument value="COOKIE_FILE_CACHE_LIMIT_KEY"/>
|
||||||
|
</message_arguments>
|
||||||
|
</filter>
|
||||||
|
<filter id="336658481">
|
||||||
|
<message_arguments>
|
||||||
|
<message_argument value="org.eclipse.jgit.transport.HttpConfig"/>
|
||||||
|
<message_argument value="COOKIE_FILE_KEY"/>
|
||||||
|
</message_arguments>
|
||||||
|
</filter>
|
||||||
|
<filter id="336658481">
|
||||||
|
<message_arguments>
|
||||||
|
<message_argument value="org.eclipse.jgit.transport.HttpConfig"/>
|
||||||
|
<message_argument value="SAVE_COOKIES_KEY"/>
|
||||||
|
</message_arguments>
|
||||||
|
</filter>
|
||||||
|
</resource>
|
||||||
<resource path="src/org/eclipse/jgit/transport/Transport.java" type="org.eclipse.jgit.transport.Transport">
|
<resource path="src/org/eclipse/jgit/transport/Transport.java" type="org.eclipse.jgit.transport.Transport">
|
||||||
<filter comment="Marked as final since overriding a deprecated stub is likely a mistake" id="421654647">
|
<filter comment="Marked as final since overriding a deprecated stub is likely a mistake" id="421654647">
|
||||||
<message_arguments>
|
<message_arguments>
|
||||||
|
@ -132,4 +160,24 @@
|
||||||
</message_arguments>
|
</message_arguments>
|
||||||
</filter>
|
</filter>
|
||||||
</resource>
|
</resource>
|
||||||
|
<resource path="src/org/eclipse/jgit/util/HttpSupport.java" type="org.eclipse.jgit.util.HttpSupport">
|
||||||
|
<filter id="336658481">
|
||||||
|
<message_arguments>
|
||||||
|
<message_argument value="org.eclipse.jgit.util.HttpSupport"/>
|
||||||
|
<message_argument value="HDR_COOKIE"/>
|
||||||
|
</message_arguments>
|
||||||
|
</filter>
|
||||||
|
<filter id="336658481">
|
||||||
|
<message_arguments>
|
||||||
|
<message_argument value="org.eclipse.jgit.util.HttpSupport"/>
|
||||||
|
<message_argument value="HDR_SET_COOKIE"/>
|
||||||
|
</message_arguments>
|
||||||
|
</filter>
|
||||||
|
<filter id="336658481">
|
||||||
|
<message_arguments>
|
||||||
|
<message_argument value="org.eclipse.jgit.util.HttpSupport"/>
|
||||||
|
<message_argument value="HDR_SET_COOKIE2"/>
|
||||||
|
</message_arguments>
|
||||||
|
</filter>
|
||||||
|
</resource>
|
||||||
</component>
|
</component>
|
||||||
|
|
|
@ -86,6 +86,7 @@ Export-Package: org.eclipse.jgit.annotations;version="5.4.0",
|
||||||
org.eclipse.jgit.pgm",
|
org.eclipse.jgit.pgm",
|
||||||
org.eclipse.jgit.internal.storage.reftree;version="5.4.0";x-friends:="org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm",
|
org.eclipse.jgit.internal.storage.reftree;version="5.4.0";x-friends:="org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm",
|
||||||
org.eclipse.jgit.internal.submodule;version="5.4.0";x-internal:=true,
|
org.eclipse.jgit.internal.submodule;version="5.4.0";x-internal:=true,
|
||||||
|
org.eclipse.jgit.internal.transport.http;version="5.4.0";x-friends:="org.eclipse.jgit.test",
|
||||||
org.eclipse.jgit.internal.transport.parser;version="5.4.0";x-friends:="org.eclipse.jgit.http.server,org.eclipse.jgit.test",
|
org.eclipse.jgit.internal.transport.parser;version="5.4.0";x-friends:="org.eclipse.jgit.http.server,org.eclipse.jgit.test",
|
||||||
org.eclipse.jgit.internal.transport.ssh;version="5.4.0";x-friends:="org.eclipse.jgit.ssh.apache",
|
org.eclipse.jgit.internal.transport.ssh;version="5.4.0";x-friends:="org.eclipse.jgit.ssh.apache",
|
||||||
org.eclipse.jgit.lib;version="5.4.0";
|
org.eclipse.jgit.lib;version="5.4.0";
|
||||||
|
@ -160,16 +161,17 @@ Import-Package: com.googlecode.javaewah;version="[1.1.6,2.0.0)",
|
||||||
com.jcraft.jsch;version="[0.1.37,0.2.0)",
|
com.jcraft.jsch;version="[0.1.37,0.2.0)",
|
||||||
javax.crypto,
|
javax.crypto,
|
||||||
javax.net.ssl,
|
javax.net.ssl,
|
||||||
org.bouncycastle;version="[1.60.0,2.0.0)",
|
org.bouncycastle;version="[1.61.0,2.0.0)",
|
||||||
org.bouncycastle.bcpg;version="[1.60.0,2.0.0)",
|
org.bouncycastle.bcpg;version="[1.61.0,2.0.0)",
|
||||||
org.bouncycastle.gpg;version="[1.60.0,2.0.0)",
|
org.bouncycastle.gpg;version="[1.61.0,2.0.0)",
|
||||||
org.bouncycastle.gpg.keybox;version="[1.60.0,2.0.0)",
|
org.bouncycastle.gpg.keybox;version="[1.61.0,2.0.0)",
|
||||||
org.bouncycastle.jce.provider;version="[1.60.0,2.0.0)",
|
org.bouncycastle.gpg.keybox.jcajce;version="[1.61.0,2.0.0)",
|
||||||
org.bouncycastle.openpgp;version="[1.60.0,2.0.0)",
|
org.bouncycastle.jce.provider;version="[1.61.0,2.0.0)",
|
||||||
org.bouncycastle.openpgp.jcajce;version="[1.60.0,2.0.0)",
|
org.bouncycastle.openpgp;version="[1.61.0,2.0.0)",
|
||||||
org.bouncycastle.openpgp.operator;version="[1.60.0,2.0.0)",
|
org.bouncycastle.openpgp.jcajce;version="[1.61.0,2.0.0)",
|
||||||
org.bouncycastle.openpgp.operator.jcajce;version="[1.60.0,2.0.0)",
|
org.bouncycastle.openpgp.operator;version="[1.61.0,2.0.0)",
|
||||||
org.bouncycastle.util.encoders;version="[1.60.0,2.0.0)",
|
org.bouncycastle.openpgp.operator.jcajce;version="[1.61.0,2.0.0)",
|
||||||
|
org.bouncycastle.util.encoders;version="[1.61.0,2.0.0)",
|
||||||
org.slf4j;version="[1.7.0,2.0.0)",
|
org.slf4j;version="[1.7.0,2.0.0)",
|
||||||
org.xml.sax,
|
org.xml.sax,
|
||||||
org.xml.sax.helpers
|
org.xml.sax.helpers
|
||||||
|
|
|
@ -139,6 +139,7 @@ configSubsectionContainsNewline=config subsection name contains newline
|
||||||
configSubsectionContainsNullByte=config subsection name contains byte 0x00
|
configSubsectionContainsNullByte=config subsection name contains byte 0x00
|
||||||
configValueContainsNullByte=config value contains byte 0x00
|
configValueContainsNullByte=config value contains byte 0x00
|
||||||
configHandleIsStale=config file handle is stale, {0}. retry
|
configHandleIsStale=config file handle is stale, {0}. retry
|
||||||
|
configHandleMayBeLocked=config file handle may be locked by other process, {0}. retry
|
||||||
connectionFailed=connection failed
|
connectionFailed=connection failed
|
||||||
connectionTimeOut=Connection time out: {0}
|
connectionTimeOut=Connection time out: {0}
|
||||||
contextMustBeNonNegative=context must be >= 0
|
contextMustBeNonNegative=context must be >= 0
|
||||||
|
@ -208,6 +209,10 @@ couldNotDeleteTemporaryIndexFileShouldNotHappen=Could not delete temporary index
|
||||||
couldNotGetAdvertisedRef=Remote {0} did not advertise Ref for branch {1}. This Ref may not exist in the remote or may be hidden by permission settings.
|
couldNotGetAdvertisedRef=Remote {0} did not advertise Ref for branch {1}. This Ref may not exist in the remote or may be hidden by permission settings.
|
||||||
couldNotGetRepoStatistics=Could not get repository statistics
|
couldNotGetRepoStatistics=Could not get repository statistics
|
||||||
couldNotLockHEAD=Could not lock HEAD
|
couldNotLockHEAD=Could not lock HEAD
|
||||||
|
couldNotFindTabInLine=Could not find tab in line {0}. Tab is the mandatory separator for the Netscape Cookie File Format.
|
||||||
|
couldNotFindSixTabsInLine=Could not find 6 tabs but only {0} in line '{1}'. 7 tab separated columns per line are mandatory for the Netscape Cookie File Format.
|
||||||
|
couldNotPersistCookies=Could not persist received cookies in file ''{0}''
|
||||||
|
couldNotReadCookieFile=Could not read cookie file ''{0}''
|
||||||
couldNotReadIndexInOneGo=Could not read index in one go, only {0} out of {1} read
|
couldNotReadIndexInOneGo=Could not read index in one go, only {0} out of {1} read
|
||||||
couldNotReadObjectWhileParsingCommit=Could not read an object while parsing commit {0}
|
couldNotReadObjectWhileParsingCommit=Could not read an object while parsing commit {0}
|
||||||
couldNotRenameDeleteOldIndex=Could not rename delete old index
|
couldNotRenameDeleteOldIndex=Could not rename delete old index
|
||||||
|
@ -455,6 +460,7 @@ mismatchOffset=mismatch offset for object {0}
|
||||||
mismatchCRC=mismatch CRC for object {0}
|
mismatchCRC=mismatch CRC for object {0}
|
||||||
missingAccesskey=Missing accesskey.
|
missingAccesskey=Missing accesskey.
|
||||||
missingConfigurationForKey=No value for key {0} found in configuration
|
missingConfigurationForKey=No value for key {0} found in configuration
|
||||||
|
missingCookieFile=Configured http.cookieFile ''{0}'' is missing
|
||||||
missingCRC=missing CRC for object {0}
|
missingCRC=missing CRC for object {0}
|
||||||
missingDeltaBase=delta base
|
missingDeltaBase=delta base
|
||||||
missingForwardImageInGITBinaryPatch=Missing forward-image in GIT binary patch
|
missingForwardImageInGITBinaryPatch=Missing forward-image in GIT binary patch
|
||||||
|
@ -625,6 +631,7 @@ rewinding=Rewinding to commit {0}
|
||||||
s3ActionDeletion=Deletion
|
s3ActionDeletion=Deletion
|
||||||
s3ActionReading=Reading
|
s3ActionReading=Reading
|
||||||
s3ActionWriting=Writing
|
s3ActionWriting=Writing
|
||||||
|
searchForReachableBranches=Finding reachable branches
|
||||||
searchForReuse=Finding sources
|
searchForReuse=Finding sources
|
||||||
searchForSizes=Getting sizes
|
searchForSizes=Getting sizes
|
||||||
secondsAgo={0} seconds ago
|
secondsAgo={0} seconds ago
|
||||||
|
|
|
@ -63,8 +63,7 @@
|
||||||
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
|
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
|
||||||
import org.eclipse.jgit.errors.InvalidPatternException;
|
import org.eclipse.jgit.errors.InvalidPatternException;
|
||||||
import org.eclipse.jgit.errors.MissingObjectException;
|
import org.eclipse.jgit.errors.MissingObjectException;
|
||||||
import org.eclipse.jgit.ignore.internal.IMatcher;
|
import org.eclipse.jgit.fnmatch.FileNameMatcher;
|
||||||
import org.eclipse.jgit.ignore.internal.PathMatcher;
|
|
||||||
import org.eclipse.jgit.internal.JGitText;
|
import org.eclipse.jgit.internal.JGitText;
|
||||||
import org.eclipse.jgit.lib.Constants;
|
import org.eclipse.jgit.lib.Constants;
|
||||||
import org.eclipse.jgit.lib.ObjectId;
|
import org.eclipse.jgit.lib.ObjectId;
|
||||||
|
@ -104,12 +103,17 @@ public class DescribeCommand extends GitCommand<String> {
|
||||||
/**
|
/**
|
||||||
* Pattern matchers to be applied to tags under consideration.
|
* Pattern matchers to be applied to tags under consideration.
|
||||||
*/
|
*/
|
||||||
private List<IMatcher> matchers = new ArrayList<>();
|
private List<FileNameMatcher> matchers = new ArrayList<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether to use all tags (incl. lightweight) or not.
|
* Whether to use all tags (incl. lightweight) or not.
|
||||||
*/
|
*/
|
||||||
private boolean useTags = false;
|
private boolean useTags;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether to show a uniquely abbreviated commit hash as a fallback or not.
|
||||||
|
*/
|
||||||
|
private boolean always;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor for DescribeCommand.
|
* Constructor for DescribeCommand.
|
||||||
|
@ -197,6 +201,21 @@ public DescribeCommand setTags(boolean tags) {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Always describe the commit by eventually falling back to a uniquely
|
||||||
|
* abbreviated commit hash if no other name matches.
|
||||||
|
*
|
||||||
|
* @param always
|
||||||
|
* <code>true</code> enables falling back to a uniquely
|
||||||
|
* abbreviated commit hash
|
||||||
|
* @return {@code this}
|
||||||
|
* @since 5.4
|
||||||
|
*/
|
||||||
|
public DescribeCommand setAlways(boolean always) {
|
||||||
|
this.always = always;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
private String longDescription(Ref tag, int depth, ObjectId tip)
|
private String longDescription(Ref tag, int depth, ObjectId tip)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
return String.format(
|
return String.format(
|
||||||
|
@ -222,7 +241,7 @@ private String longDescription(Ref tag, int depth, ObjectId tip)
|
||||||
*/
|
*/
|
||||||
public DescribeCommand setMatch(String... patterns) throws InvalidPatternException {
|
public DescribeCommand setMatch(String... patterns) throws InvalidPatternException {
|
||||||
for (String p : patterns) {
|
for (String p : patterns) {
|
||||||
matchers.add(PathMatcher.createPathMatcher(p, null, false));
|
matchers.add(new FileNameMatcher(p, null));
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -255,9 +274,15 @@ private Optional<Ref> getBestMatch(List<Ref> tags) {
|
||||||
// Find the first tag that matches in the stream of all tags
|
// Find the first tag that matches in the stream of all tags
|
||||||
// filtered by matchers ordered by tie break order
|
// filtered by matchers ordered by tie break order
|
||||||
Stream<Ref> matchingTags = Stream.empty();
|
Stream<Ref> matchingTags = Stream.empty();
|
||||||
for (IMatcher matcher : matchers) {
|
for (FileNameMatcher matcher : matchers) {
|
||||||
Stream<Ref> m = tags.stream().filter(
|
Stream<Ref> m = tags.stream().filter(
|
||||||
tag -> matcher.matches(tag.getName(), false, false));
|
tag -> {
|
||||||
|
matcher.append(
|
||||||
|
tag.getName().substring(R_TAGS.length()));
|
||||||
|
boolean result = matcher.isMatch();
|
||||||
|
matcher.reset();
|
||||||
|
return result;
|
||||||
|
});
|
||||||
matchingTags = Stream.of(matchingTags, m).flatMap(i -> i);
|
matchingTags = Stream.of(matchingTags, m).flatMap(i -> i);
|
||||||
}
|
}
|
||||||
return matchingTags.sorted(TAG_TIE_BREAKER).findFirst();
|
return matchingTags.sorted(TAG_TIE_BREAKER).findFirst();
|
||||||
|
@ -399,8 +424,9 @@ String describe(ObjectId tip) throws IOException {
|
||||||
}
|
}
|
||||||
|
|
||||||
// if all the nodes are dominated by all the tags, the walk stops
|
// if all the nodes are dominated by all the tags, the walk stops
|
||||||
if (candidates.isEmpty())
|
if (candidates.isEmpty()) {
|
||||||
return null;
|
return always ? w.getObjectReader().abbreviate(target).name() : null;
|
||||||
|
}
|
||||||
|
|
||||||
Candidate best = Collections.min(candidates,
|
Candidate best = Collections.min(candidates,
|
||||||
(Candidate o1, Candidate o2) -> o1.depth - o2.depth);
|
(Candidate o1, Candidate o2) -> o1.depth - o2.depth);
|
||||||
|
|
|
@ -133,7 +133,7 @@ protected LogCommand(Repository repo) {
|
||||||
@Override
|
@Override
|
||||||
public Iterable<RevCommit> call() throws GitAPIException, NoHeadException {
|
public Iterable<RevCommit> call() throws GitAPIException, NoHeadException {
|
||||||
checkCallable();
|
checkCallable();
|
||||||
if (pathFilters.size() > 0)
|
if (!pathFilters.isEmpty())
|
||||||
walk.setTreeFilter(AndTreeFilter.create(
|
walk.setTreeFilter(AndTreeFilter.create(
|
||||||
PathFilterGroup.create(pathFilters), TreeFilter.ANY_DIFF));
|
PathFilterGroup.create(pathFilters), TreeFilter.ANY_DIFF));
|
||||||
if (skip > -1 && maxCount > -1)
|
if (skip > -1 && maxCount > -1)
|
||||||
|
|
|
@ -60,6 +60,7 @@
|
||||||
import org.eclipse.jgit.api.errors.RefNotAdvertisedException;
|
import org.eclipse.jgit.api.errors.RefNotAdvertisedException;
|
||||||
import org.eclipse.jgit.api.errors.RefNotFoundException;
|
import org.eclipse.jgit.api.errors.RefNotFoundException;
|
||||||
import org.eclipse.jgit.api.errors.WrongRepositoryStateException;
|
import org.eclipse.jgit.api.errors.WrongRepositoryStateException;
|
||||||
|
import org.eclipse.jgit.dircache.DirCacheCheckout;
|
||||||
import org.eclipse.jgit.internal.JGitText;
|
import org.eclipse.jgit.internal.JGitText;
|
||||||
import org.eclipse.jgit.lib.AnyObjectId;
|
import org.eclipse.jgit.lib.AnyObjectId;
|
||||||
import org.eclipse.jgit.lib.BranchConfig.BranchRebaseMode;
|
import org.eclipse.jgit.lib.BranchConfig.BranchRebaseMode;
|
||||||
|
@ -67,12 +68,17 @@
|
||||||
import org.eclipse.jgit.lib.ConfigConstants;
|
import org.eclipse.jgit.lib.ConfigConstants;
|
||||||
import org.eclipse.jgit.lib.Constants;
|
import org.eclipse.jgit.lib.Constants;
|
||||||
import org.eclipse.jgit.lib.NullProgressMonitor;
|
import org.eclipse.jgit.lib.NullProgressMonitor;
|
||||||
|
import org.eclipse.jgit.lib.ObjectId;
|
||||||
import org.eclipse.jgit.lib.ProgressMonitor;
|
import org.eclipse.jgit.lib.ProgressMonitor;
|
||||||
import org.eclipse.jgit.lib.Ref;
|
import org.eclipse.jgit.lib.Ref;
|
||||||
|
import org.eclipse.jgit.lib.RefUpdate;
|
||||||
|
import org.eclipse.jgit.lib.RefUpdate.Result;
|
||||||
import org.eclipse.jgit.lib.Repository;
|
import org.eclipse.jgit.lib.Repository;
|
||||||
import org.eclipse.jgit.lib.RepositoryState;
|
import org.eclipse.jgit.lib.RepositoryState;
|
||||||
import org.eclipse.jgit.lib.SubmoduleConfig.FetchRecurseSubmodulesMode;
|
import org.eclipse.jgit.lib.SubmoduleConfig.FetchRecurseSubmodulesMode;
|
||||||
import org.eclipse.jgit.merge.MergeStrategy;
|
import org.eclipse.jgit.merge.MergeStrategy;
|
||||||
|
import org.eclipse.jgit.revwalk.RevCommit;
|
||||||
|
import org.eclipse.jgit.revwalk.RevWalk;
|
||||||
import org.eclipse.jgit.transport.FetchResult;
|
import org.eclipse.jgit.transport.FetchResult;
|
||||||
import org.eclipse.jgit.transport.TagOpt;
|
import org.eclipse.jgit.transport.TagOpt;
|
||||||
|
|
||||||
|
@ -339,6 +345,45 @@ public PullResult call() throws GitAPIException,
|
||||||
|
|
||||||
PullResult result;
|
PullResult result;
|
||||||
if (pullRebaseMode != BranchRebaseMode.NONE) {
|
if (pullRebaseMode != BranchRebaseMode.NONE) {
|
||||||
|
try {
|
||||||
|
Ref head = repo.exactRef(Constants.HEAD);
|
||||||
|
if (head == null) {
|
||||||
|
throw new NoHeadException(JGitText
|
||||||
|
.get().commitOnRepoWithoutHEADCurrentlyNotSupported);
|
||||||
|
}
|
||||||
|
ObjectId headId = head.getObjectId();
|
||||||
|
if (headId == null) {
|
||||||
|
// Pull on an unborn branch: checkout
|
||||||
|
try (RevWalk revWalk = new RevWalk(repo)) {
|
||||||
|
RevCommit srcCommit = revWalk
|
||||||
|
.parseCommit(commitToMerge);
|
||||||
|
DirCacheCheckout dco = new DirCacheCheckout(repo,
|
||||||
|
repo.lockDirCache(), srcCommit.getTree());
|
||||||
|
dco.setFailOnConflict(true);
|
||||||
|
dco.setProgressMonitor(monitor);
|
||||||
|
dco.checkout();
|
||||||
|
RefUpdate refUpdate = repo
|
||||||
|
.updateRef(head.getTarget().getName());
|
||||||
|
refUpdate.setNewObjectId(commitToMerge);
|
||||||
|
refUpdate.setExpectedOldObjectId(null);
|
||||||
|
refUpdate.setRefLogMessage("initial pull", false); //$NON-NLS-1$
|
||||||
|
if (refUpdate.update() != Result.NEW) {
|
||||||
|
throw new NoHeadException(JGitText
|
||||||
|
.get().commitOnRepoWithoutHEADCurrentlyNotSupported);
|
||||||
|
}
|
||||||
|
monitor.endTask();
|
||||||
|
return new PullResult(fetchRes, remote,
|
||||||
|
RebaseResult.result(
|
||||||
|
RebaseResult.Status.FAST_FORWARD,
|
||||||
|
srcCommit));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (NoHeadException e) {
|
||||||
|
throw e;
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new JGitInternalException(JGitText
|
||||||
|
.get().exceptionCaughtDuringExecutionOfPullCommand, e);
|
||||||
|
}
|
||||||
RebaseCommand rebase = new RebaseCommand(repo);
|
RebaseCommand rebase = new RebaseCommand(repo);
|
||||||
RebaseResult rebaseRes = rebase.setUpstream(commitToMerge)
|
RebaseResult rebaseRes = rebase.setUpstream(commitToMerge)
|
||||||
.setUpstreamName(upstreamName).setProgressMonitor(monitor)
|
.setUpstreamName(upstreamName).setProgressMonitor(monitor)
|
||||||
|
|
|
@ -490,7 +490,7 @@ private RebaseResult processStep(RebaseTodoLine step, boolean shouldPick)
|
||||||
resetSoftToParent();
|
resetSoftToParent();
|
||||||
List<RebaseTodoLine> steps = repo.readRebaseTodo(
|
List<RebaseTodoLine> steps = repo.readRebaseTodo(
|
||||||
rebaseState.getPath(GIT_REBASE_TODO), false);
|
rebaseState.getPath(GIT_REBASE_TODO), false);
|
||||||
RebaseTodoLine nextStep = steps.size() > 0 ? steps.get(0) : null;
|
RebaseTodoLine nextStep = steps.isEmpty() ? null : steps.get(0);
|
||||||
File messageFixupFile = rebaseState.getFile(MESSAGE_FIXUP);
|
File messageFixupFile = rebaseState.getFile(MESSAGE_FIXUP);
|
||||||
File messageSquashFile = rebaseState.getFile(MESSAGE_SQUASH);
|
File messageSquashFile = rebaseState.getFile(MESSAGE_SQUASH);
|
||||||
if (isSquash && messageFixupFile.exists())
|
if (isSquash && messageFixupFile.exists())
|
||||||
|
@ -1083,7 +1083,7 @@ private void popSteps(int numSteps) throws IOException {
|
||||||
|
|
||||||
repo.writeRebaseTodoFile(rebaseState.getPath(GIT_REBASE_TODO),
|
repo.writeRebaseTodoFile(rebaseState.getPath(GIT_REBASE_TODO),
|
||||||
todoLines, false);
|
todoLines, false);
|
||||||
if (poppedLines.size() > 0) {
|
if (!poppedLines.isEmpty()) {
|
||||||
repo.writeRebaseTodoFile(rebaseState.getPath(DONE), poppedLines,
|
repo.writeRebaseTodoFile(rebaseState.getPath(DONE), poppedLines,
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -200,6 +200,7 @@ public static JGitText get() {
|
||||||
/***/ public String configSubsectionContainsNullByte;
|
/***/ public String configSubsectionContainsNullByte;
|
||||||
/***/ public String configValueContainsNullByte;
|
/***/ public String configValueContainsNullByte;
|
||||||
/***/ public String configHandleIsStale;
|
/***/ public String configHandleIsStale;
|
||||||
|
/***/ public String configHandleMayBeLocked;
|
||||||
/***/ public String connectionFailed;
|
/***/ public String connectionFailed;
|
||||||
/***/ public String connectionTimeOut;
|
/***/ public String connectionTimeOut;
|
||||||
/***/ public String contextMustBeNonNegative;
|
/***/ public String contextMustBeNonNegative;
|
||||||
|
@ -267,9 +268,13 @@ public static JGitText get() {
|
||||||
/***/ public String couldNotCheckOutBecauseOfConflicts;
|
/***/ public String couldNotCheckOutBecauseOfConflicts;
|
||||||
/***/ public String couldNotDeleteLockFileShouldNotHappen;
|
/***/ public String couldNotDeleteLockFileShouldNotHappen;
|
||||||
/***/ public String couldNotDeleteTemporaryIndexFileShouldNotHappen;
|
/***/ public String couldNotDeleteTemporaryIndexFileShouldNotHappen;
|
||||||
|
/***/ public String couldNotFindTabInLine;
|
||||||
|
/***/ public String couldNotFindSixTabsInLine;
|
||||||
/***/ public String couldNotGetAdvertisedRef;
|
/***/ public String couldNotGetAdvertisedRef;
|
||||||
/***/ public String couldNotGetRepoStatistics;
|
/***/ public String couldNotGetRepoStatistics;
|
||||||
/***/ public String couldNotLockHEAD;
|
/***/ public String couldNotLockHEAD;
|
||||||
|
/***/ public String couldNotPersistCookies;
|
||||||
|
/***/ public String couldNotReadCookieFile;
|
||||||
/***/ public String couldNotReadIndexInOneGo;
|
/***/ public String couldNotReadIndexInOneGo;
|
||||||
/***/ public String couldNotReadObjectWhileParsingCommit;
|
/***/ public String couldNotReadObjectWhileParsingCommit;
|
||||||
/***/ public String couldNotRenameDeleteOldIndex;
|
/***/ public String couldNotRenameDeleteOldIndex;
|
||||||
|
@ -516,6 +521,7 @@ public static JGitText get() {
|
||||||
/***/ public String mismatchCRC;
|
/***/ public String mismatchCRC;
|
||||||
/***/ public String missingAccesskey;
|
/***/ public String missingAccesskey;
|
||||||
/***/ public String missingConfigurationForKey;
|
/***/ public String missingConfigurationForKey;
|
||||||
|
/***/ public String missingCookieFile;
|
||||||
/***/ public String missingCRC;
|
/***/ public String missingCRC;
|
||||||
/***/ public String missingDeltaBase;
|
/***/ public String missingDeltaBase;
|
||||||
/***/ public String missingForwardImageInGITBinaryPatch;
|
/***/ public String missingForwardImageInGITBinaryPatch;
|
||||||
|
@ -686,6 +692,7 @@ public static JGitText get() {
|
||||||
/***/ public String s3ActionDeletion;
|
/***/ public String s3ActionDeletion;
|
||||||
/***/ public String s3ActionReading;
|
/***/ public String s3ActionReading;
|
||||||
/***/ public String s3ActionWriting;
|
/***/ public String s3ActionWriting;
|
||||||
|
/***/ public String searchForReachableBranches;
|
||||||
/***/ public String searchForReuse;
|
/***/ public String searchForReuse;
|
||||||
/***/ public String searchForSizes;
|
/***/ public String searchForSizes;
|
||||||
/***/ public String secondsAgo;
|
/***/ public String secondsAgo;
|
||||||
|
|
|
@ -124,6 +124,12 @@ public StoredConfig getConfig() {
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
|
@Override
|
||||||
|
public String getIdentifier() {
|
||||||
|
return getDescription().getRepositoryName();
|
||||||
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
@Override
|
@Override
|
||||||
public void scanForRepoChanges() throws IOException {
|
public void scanForRepoChanges() throws IOException {
|
||||||
|
|
|
@ -388,6 +388,17 @@ public RefDatabase getRefDatabase() {
|
||||||
return refs;
|
return refs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
|
@Override
|
||||||
|
public String getIdentifier() {
|
||||||
|
File directory = getDirectory();
|
||||||
|
if (directory != null) {
|
||||||
|
return directory.getPath();
|
||||||
|
} else {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
@Override
|
@Override
|
||||||
public FileBasedConfig getConfig() {
|
public FileBasedConfig getConfig() {
|
||||||
|
|
|
@ -244,7 +244,7 @@ public GC(FileRepository repo) {
|
||||||
* If the configuration parameter "gc.pruneexpire" couldn't be
|
* If the configuration parameter "gc.pruneexpire" couldn't be
|
||||||
* parsed
|
* parsed
|
||||||
*/
|
*/
|
||||||
// TODO(ms): in 5.0 change signature and return Future<Collection<PackFile>>
|
// TODO(ms): change signature and return Future<Collection<PackFile>>
|
||||||
@SuppressWarnings("FutureReturnValueIgnored")
|
@SuppressWarnings("FutureReturnValueIgnored")
|
||||||
public Collection<PackFile> gc() throws IOException, ParseException {
|
public Collection<PackFile> gc() throws IOException, ParseException {
|
||||||
if (!background) {
|
if (!background) {
|
||||||
|
@ -281,7 +281,7 @@ public Collection<PackFile> gc() throws IOException, ParseException {
|
||||||
}
|
}
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
};
|
};
|
||||||
// TODO(ms): in 5.0 change signature and return the Future
|
// TODO(ms): change signature and return the Future
|
||||||
executor().submit(gcTask);
|
executor().submit(gcTask);
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,476 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018, Konrad Windszus <konrad_w@gmx.de>
|
||||||
|
* and other copyright owners as documented in the project's IP log.
|
||||||
|
*
|
||||||
|
* This program and the accompanying materials are made available
|
||||||
|
* under the terms of the Eclipse Distribution License v1.0 which
|
||||||
|
* accompanies this distribution, is reproduced below, and is
|
||||||
|
* available at http://www.eclipse.org/org/documents/edl-v10.php
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or
|
||||||
|
* without modification, are permitted provided that the following
|
||||||
|
* conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following
|
||||||
|
* disclaimer in the documentation and/or other materials provided
|
||||||
|
* with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Eclipse Foundation, Inc. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote
|
||||||
|
* products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
package org.eclipse.jgit.internal.transport.http;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.io.StringReader;
|
||||||
|
import java.io.Writer;
|
||||||
|
import java.net.HttpCookie;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.text.MessageFormat;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.eclipse.jgit.annotations.NonNull;
|
||||||
|
import org.eclipse.jgit.annotations.Nullable;
|
||||||
|
import org.eclipse.jgit.internal.JGitText;
|
||||||
|
import org.eclipse.jgit.internal.storage.file.FileSnapshot;
|
||||||
|
import org.eclipse.jgit.internal.storage.file.LockFile;
|
||||||
|
import org.eclipse.jgit.lib.Constants;
|
||||||
|
import org.eclipse.jgit.storage.file.FileBasedConfig;
|
||||||
|
import org.eclipse.jgit.util.FileUtils;
|
||||||
|
import org.eclipse.jgit.util.IO;
|
||||||
|
import org.eclipse.jgit.util.RawParseUtils;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wraps all cookies persisted in a <strong>Netscape Cookie File Format</strong>
|
||||||
|
* being referenced via the git config <a href=
|
||||||
|
* "https://git-scm.com/docs/git-config#git-config-httpcookieFile">http.cookieFile</a>.
|
||||||
|
*
|
||||||
|
* It will only load the cookies lazily, i.e. before calling
|
||||||
|
* {@link #getCookies(boolean)} the file is not evaluated. This class also
|
||||||
|
* allows persisting cookies in that file format.
|
||||||
|
* <p>
|
||||||
|
* In general this class is not thread-safe. So any consumer needs to take care
|
||||||
|
* of synchronization!
|
||||||
|
*
|
||||||
|
* @see <a href="http://www.cookiecentral.com/faq/#3.5">Netscape Cookie File
|
||||||
|
* Format</a>
|
||||||
|
* @see <a href=
|
||||||
|
* "https://unix.stackexchange.com/questions/36531/format-of-cookies-when-using-wget">Cookie
|
||||||
|
* format for wget</a>
|
||||||
|
* @see <a href=
|
||||||
|
* "https://github.com/curl/curl/blob/07ebaf837843124ee670e5b8c218b80b92e06e47/lib/cookie.c#L745">libcurl
|
||||||
|
* Cookie file parsing</a>
|
||||||
|
* @see <a href=
|
||||||
|
* "https://github.com/curl/curl/blob/07ebaf837843124ee670e5b8c218b80b92e06e47/lib/cookie.c#L1417">libcurl
|
||||||
|
* Cookie file writing</a>
|
||||||
|
* @see NetscapeCookieFileCache
|
||||||
|
*/
|
||||||
|
public final class NetscapeCookieFile {
|
||||||
|
|
||||||
|
private static final String HTTP_ONLY_PREAMBLE = "#HttpOnly_"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private static final String COLUMN_SEPARATOR = "\t"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private static final String LINE_SEPARATOR = "\n"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maximum number of retries to acquire the lock for writing to the
|
||||||
|
* underlying file.
|
||||||
|
*/
|
||||||
|
private static final int LOCK_ACQUIRE_MAX_RETRY_COUNT = 4;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sleep time in milliseconds between retries to acquire the lock for
|
||||||
|
* writing to the underlying file.
|
||||||
|
*/
|
||||||
|
private static final int LOCK_ACQUIRE_RETRY_SLEEP = 500;
|
||||||
|
|
||||||
|
private final Path path;
|
||||||
|
|
||||||
|
private FileSnapshot snapshot;
|
||||||
|
|
||||||
|
private byte[] hash;
|
||||||
|
|
||||||
|
final Date creationDate;
|
||||||
|
|
||||||
|
private Set<HttpCookie> cookies = null;
|
||||||
|
|
||||||
|
private static final Logger LOG = LoggerFactory
|
||||||
|
.getLogger(NetscapeCookieFile.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param path
|
||||||
|
*/
|
||||||
|
public NetscapeCookieFile(Path path) {
|
||||||
|
this(path, new Date());
|
||||||
|
}
|
||||||
|
|
||||||
|
NetscapeCookieFile(Path path, Date creationDate) {
|
||||||
|
this.path = path;
|
||||||
|
this.snapshot = FileSnapshot.DIRTY;
|
||||||
|
this.creationDate = creationDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the path to the underlying cookie file
|
||||||
|
*/
|
||||||
|
public Path getPath() {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param refresh
|
||||||
|
* if {@code true} updates the list from the underlying cookie
|
||||||
|
* file if it has been modified since the last read otherwise
|
||||||
|
* returns the current transient state. In case the cookie file
|
||||||
|
* has never been read before will always read from the
|
||||||
|
* underlying file disregarding the value of this parameter.
|
||||||
|
* @return all cookies (may contain session cookies as well). This does not
|
||||||
|
* return a copy of the list but rather the original one. Every
|
||||||
|
* addition to the returned list can afterwards be persisted via
|
||||||
|
* {@link #write(URL)}. Errors in the underlying file will not lead
|
||||||
|
* to exceptions but rather to an empty set being returned and the
|
||||||
|
* underlying error being logged.
|
||||||
|
*/
|
||||||
|
public Set<HttpCookie> getCookies(boolean refresh) {
|
||||||
|
if (cookies == null || refresh) {
|
||||||
|
try {
|
||||||
|
byte[] in = getFileContentIfModified();
|
||||||
|
Set<HttpCookie> newCookies = parseCookieFile(in, creationDate);
|
||||||
|
if (cookies != null) {
|
||||||
|
cookies = mergeCookies(newCookies, cookies);
|
||||||
|
} else {
|
||||||
|
cookies = newCookies;
|
||||||
|
}
|
||||||
|
return cookies;
|
||||||
|
} catch (IOException | IllegalArgumentException e) {
|
||||||
|
LOG.warn(
|
||||||
|
MessageFormat.format(
|
||||||
|
JGitText.get().couldNotReadCookieFile, path),
|
||||||
|
e);
|
||||||
|
if (cookies == null) {
|
||||||
|
cookies = new LinkedHashSet<>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cookies;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses the given file and extracts all cookie information from it.
|
||||||
|
*
|
||||||
|
* @param input
|
||||||
|
* the file content to parse
|
||||||
|
* @param creationDate
|
||||||
|
* the date for the creation of the cookies (used to calculate
|
||||||
|
* the maxAge based on the expiration date given within the file)
|
||||||
|
* @return the set of parsed cookies from the given file (even expired
|
||||||
|
* ones). If there is more than one cookie with the same name in
|
||||||
|
* this file the last one overwrites the first one!
|
||||||
|
* @throws IOException
|
||||||
|
* if the given file could not be read for some reason
|
||||||
|
* @throws IllegalArgumentException
|
||||||
|
* if the given file does not have a proper format.
|
||||||
|
*/
|
||||||
|
private static Set<HttpCookie> parseCookieFile(@NonNull byte[] input,
|
||||||
|
@NonNull Date creationDate)
|
||||||
|
throws IOException, IllegalArgumentException {
|
||||||
|
|
||||||
|
String decoded = RawParseUtils.decode(StandardCharsets.US_ASCII, input);
|
||||||
|
|
||||||
|
Set<HttpCookie> cookies = new LinkedHashSet<>();
|
||||||
|
try (BufferedReader reader = new BufferedReader(
|
||||||
|
new StringReader(decoded))) {
|
||||||
|
String line;
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
HttpCookie cookie = parseLine(line, creationDate);
|
||||||
|
if (cookie != null) {
|
||||||
|
cookies.add(cookie);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cookies;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HttpCookie parseLine(@NonNull String line,
|
||||||
|
@NonNull Date creationDate) {
|
||||||
|
if (line.isEmpty() || (line.startsWith("#") //$NON-NLS-1$
|
||||||
|
&& !line.startsWith(HTTP_ONLY_PREAMBLE))) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String[] cookieLineParts = line.split(COLUMN_SEPARATOR, 7);
|
||||||
|
if (cookieLineParts == null) {
|
||||||
|
throw new IllegalArgumentException(MessageFormat
|
||||||
|
.format(JGitText.get().couldNotFindTabInLine, line));
|
||||||
|
}
|
||||||
|
if (cookieLineParts.length < 7) {
|
||||||
|
throw new IllegalArgumentException(MessageFormat.format(
|
||||||
|
JGitText.get().couldNotFindSixTabsInLine,
|
||||||
|
Integer.valueOf(cookieLineParts.length), line));
|
||||||
|
}
|
||||||
|
String name = cookieLineParts[5];
|
||||||
|
String value = cookieLineParts[6];
|
||||||
|
HttpCookie cookie = new HttpCookie(name, value);
|
||||||
|
|
||||||
|
String domain = cookieLineParts[0];
|
||||||
|
if (domain.startsWith(HTTP_ONLY_PREAMBLE)) {
|
||||||
|
cookie.setHttpOnly(true);
|
||||||
|
domain = domain.substring(HTTP_ONLY_PREAMBLE.length());
|
||||||
|
}
|
||||||
|
// strip off leading "."
|
||||||
|
// (https://tools.ietf.org/html/rfc6265#section-5.2.3)
|
||||||
|
if (domain.startsWith(".")) { //$NON-NLS-1$
|
||||||
|
domain = domain.substring(1);
|
||||||
|
}
|
||||||
|
cookie.setDomain(domain);
|
||||||
|
// domain evaluation as boolean flag not considered (i.e. always assumed
|
||||||
|
// to be true)
|
||||||
|
cookie.setPath(cookieLineParts[2]);
|
||||||
|
cookie.setSecure(Boolean.parseBoolean(cookieLineParts[3]));
|
||||||
|
|
||||||
|
long expires = Long.parseLong(cookieLineParts[4]);
|
||||||
|
long maxAge = (expires - creationDate.getTime()) / 1000;
|
||||||
|
if (maxAge <= 0) {
|
||||||
|
return null; // skip expired cookies
|
||||||
|
}
|
||||||
|
cookie.setMaxAge(maxAge);
|
||||||
|
return cookie;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes all the cookies being maintained in the set being returned by
|
||||||
|
* {@link #getCookies(boolean)} to the underlying file.
|
||||||
|
*
|
||||||
|
* Session-cookies will not be persisted.
|
||||||
|
*
|
||||||
|
* @param url
|
||||||
|
* url for which to write the cookies (important to derive
|
||||||
|
* default values for non-explicitly set attributes)
|
||||||
|
* @throws IOException
|
||||||
|
* @throws IllegalArgumentException
|
||||||
|
* @throws InterruptedException
|
||||||
|
*/
|
||||||
|
public void write(URL url)
|
||||||
|
throws IllegalArgumentException, IOException, InterruptedException {
|
||||||
|
try {
|
||||||
|
byte[] cookieFileContent = getFileContentIfModified();
|
||||||
|
if (cookieFileContent != null) {
|
||||||
|
LOG.debug(
|
||||||
|
"Reading the underlying cookie file '{}' as it has been modified since the last access", //$NON-NLS-1$
|
||||||
|
path);
|
||||||
|
// reread new changes if necessary
|
||||||
|
Set<HttpCookie> cookiesFromFile = NetscapeCookieFile
|
||||||
|
.parseCookieFile(cookieFileContent, creationDate);
|
||||||
|
this.cookies = mergeCookies(cookiesFromFile, cookies);
|
||||||
|
}
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
// ignore if file previously did not exist yet!
|
||||||
|
}
|
||||||
|
|
||||||
|
ByteArrayOutputStream output = new ByteArrayOutputStream();
|
||||||
|
try (Writer writer = new OutputStreamWriter(output,
|
||||||
|
StandardCharsets.US_ASCII)) {
|
||||||
|
write(writer, cookies, url, creationDate);
|
||||||
|
}
|
||||||
|
LockFile lockFile = new LockFile(path.toFile());
|
||||||
|
for (int retryCount = 0; retryCount < LOCK_ACQUIRE_MAX_RETRY_COUNT; retryCount++) {
|
||||||
|
if (lockFile.lock()) {
|
||||||
|
try {
|
||||||
|
lockFile.setNeedSnapshot(true);
|
||||||
|
lockFile.write(output.toByteArray());
|
||||||
|
if (!lockFile.commit()) {
|
||||||
|
throw new IOException(MessageFormat.format(
|
||||||
|
JGitText.get().cannotCommitWriteTo, path));
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
lockFile.unlock();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Thread.sleep(LOCK_ACQUIRE_RETRY_SLEEP);
|
||||||
|
}
|
||||||
|
throw new IOException(
|
||||||
|
MessageFormat.format(JGitText.get().cannotLock, lockFile));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read the underying file and return its content but only in case it has
|
||||||
|
* been modified since the last access. Internally calculates the hash and
|
||||||
|
* maintains {@link FileSnapshot}s to prevent issues described as <a href=
|
||||||
|
* "https://github.com/git/git/blob/master/Documentation/technical/racy-git.txt">"Racy
|
||||||
|
* Git problem"</a>. Inspired by {@link FileBasedConfig#load()}.
|
||||||
|
*
|
||||||
|
* @return the file contents in case the file has been modified since the
|
||||||
|
* last access, otherwise {@code null}
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
private byte[] getFileContentIfModified() throws IOException {
|
||||||
|
final int maxStaleRetries = 5;
|
||||||
|
int retries = 0;
|
||||||
|
File file = getPath().toFile();
|
||||||
|
if (!file.exists()) {
|
||||||
|
LOG.warn(MessageFormat.format(JGitText.get().missingCookieFile,
|
||||||
|
file.getAbsolutePath()));
|
||||||
|
return new byte[0];
|
||||||
|
}
|
||||||
|
while (true) {
|
||||||
|
final FileSnapshot oldSnapshot = snapshot;
|
||||||
|
final FileSnapshot newSnapshot = FileSnapshot.save(file);
|
||||||
|
try {
|
||||||
|
final byte[] in = IO.readFully(file);
|
||||||
|
byte[] newHash = hash(in);
|
||||||
|
if (Arrays.equals(hash, newHash)) {
|
||||||
|
if (oldSnapshot.equals(newSnapshot)) {
|
||||||
|
oldSnapshot.setClean(newSnapshot);
|
||||||
|
} else {
|
||||||
|
snapshot = newSnapshot;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
snapshot = newSnapshot;
|
||||||
|
hash = newHash;
|
||||||
|
}
|
||||||
|
return in;
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
throw e;
|
||||||
|
} catch (IOException e) {
|
||||||
|
if (FileUtils.isStaleFileHandle(e)
|
||||||
|
&& retries < maxStaleRetries) {
|
||||||
|
if (LOG.isDebugEnabled()) {
|
||||||
|
LOG.debug(MessageFormat.format(
|
||||||
|
JGitText.get().configHandleIsStale,
|
||||||
|
Integer.valueOf(retries)), e);
|
||||||
|
}
|
||||||
|
retries++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
throw new IOException(MessageFormat
|
||||||
|
.format(JGitText.get().cannotReadFile, getPath()), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private byte[] hash(final byte[] in) {
|
||||||
|
return Constants.newMessageDigest().digest(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the given cookies to the file in the Netscape Cookie File Format
|
||||||
|
* (also used by curl)
|
||||||
|
*
|
||||||
|
* @param writer
|
||||||
|
* the writer to use to persist the cookies.
|
||||||
|
* @param cookies
|
||||||
|
* the cookies to write into the file
|
||||||
|
* @param url
|
||||||
|
* the url for which to write the cookie (to derive the default
|
||||||
|
* values for certain cookie attributes)
|
||||||
|
* @param creationDate
|
||||||
|
* the date when the cookie has been created. Important for
|
||||||
|
* calculation the cookie expiration time (calculated from
|
||||||
|
* cookie's maxAge and this creation time).
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
static void write(@NonNull Writer writer,
|
||||||
|
@NonNull Collection<HttpCookie> cookies, @NonNull URL url,
|
||||||
|
@NonNull Date creationDate) throws IOException {
|
||||||
|
for (HttpCookie cookie : cookies) {
|
||||||
|
writeCookie(writer, cookie, url, creationDate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void writeCookie(@NonNull Writer writer,
|
||||||
|
@NonNull HttpCookie cookie, @NonNull URL url,
|
||||||
|
@NonNull Date creationDate) throws IOException {
|
||||||
|
if (cookie.getMaxAge() <= 0) {
|
||||||
|
return; // skip expired cookies
|
||||||
|
}
|
||||||
|
String domain = ""; //$NON-NLS-1$
|
||||||
|
if (cookie.isHttpOnly()) {
|
||||||
|
domain = HTTP_ONLY_PREAMBLE;
|
||||||
|
}
|
||||||
|
if (cookie.getDomain() != null) {
|
||||||
|
domain += cookie.getDomain();
|
||||||
|
} else {
|
||||||
|
domain += url.getHost();
|
||||||
|
}
|
||||||
|
writer.write(domain);
|
||||||
|
writer.write(COLUMN_SEPARATOR);
|
||||||
|
writer.write("TRUE"); //$NON-NLS-1$
|
||||||
|
writer.write(COLUMN_SEPARATOR);
|
||||||
|
String path = cookie.getPath();
|
||||||
|
if (path == null) {
|
||||||
|
path = url.getPath();
|
||||||
|
}
|
||||||
|
writer.write(path);
|
||||||
|
writer.write(COLUMN_SEPARATOR);
|
||||||
|
writer.write(Boolean.toString(cookie.getSecure()).toUpperCase());
|
||||||
|
writer.write(COLUMN_SEPARATOR);
|
||||||
|
final String expirationDate;
|
||||||
|
// whenCreated field is not accessible in HttpCookie
|
||||||
|
expirationDate = String
|
||||||
|
.valueOf(creationDate.getTime() + (cookie.getMaxAge() * 1000));
|
||||||
|
writer.write(expirationDate);
|
||||||
|
writer.write(COLUMN_SEPARATOR);
|
||||||
|
writer.write(cookie.getName());
|
||||||
|
writer.write(COLUMN_SEPARATOR);
|
||||||
|
writer.write(cookie.getValue());
|
||||||
|
writer.write(LINE_SEPARATOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merge the given sets in the following way. All cookies from
|
||||||
|
* {@code cookies1} and {@code cookies2} are contained in the resulting set
|
||||||
|
* which have unique names. If there is a duplicate entry for one name only
|
||||||
|
* the entry from set {@code cookies1} ends up in the resulting set.
|
||||||
|
*
|
||||||
|
* @param cookies1
|
||||||
|
* @param cookies2
|
||||||
|
*
|
||||||
|
* @return the merged cookies
|
||||||
|
*/
|
||||||
|
static Set<HttpCookie> mergeCookies(Set<HttpCookie> cookies1,
|
||||||
|
@Nullable Set<HttpCookie> cookies2) {
|
||||||
|
Set<HttpCookie> mergedCookies = new LinkedHashSet<>(cookies1);
|
||||||
|
if (cookies2 != null) {
|
||||||
|
mergedCookies.addAll(cookies2);
|
||||||
|
}
|
||||||
|
return mergedCookies;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,106 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018, Konrad Windszus <konrad_w@gmx.de>
|
||||||
|
* and other copyright owners as documented in the project's IP log.
|
||||||
|
*
|
||||||
|
* This program and the accompanying materials are made available
|
||||||
|
* under the terms of the Eclipse Distribution License v1.0 which
|
||||||
|
* accompanies this distribution, is reproduced below, and is
|
||||||
|
* available at http://www.eclipse.org/org/documents/edl-v10.php
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or
|
||||||
|
* without modification, are permitted provided that the following
|
||||||
|
* conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following
|
||||||
|
* disclaimer in the documentation and/or other materials provided
|
||||||
|
* with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Eclipse Foundation, Inc. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote
|
||||||
|
* products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
package org.eclipse.jgit.internal.transport.http;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
|
||||||
|
import org.eclipse.jgit.transport.HttpConfig;
|
||||||
|
import org.eclipse.jgit.util.LRUMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A cache of all known cookie files ({@link NetscapeCookieFile}). May contain
|
||||||
|
* at most {@code n} entries, where the least-recently used one is evicted as
|
||||||
|
* soon as more entries are added. The maximum number of entries (={@code n})
|
||||||
|
* can be set via the git config key {@code http.cookieFileCacheLimit}. By
|
||||||
|
* default it is set to 10.
|
||||||
|
* <p>
|
||||||
|
* The cache is global, i.e. it is shared among all consumers within the same
|
||||||
|
* Java process.
|
||||||
|
*
|
||||||
|
* @see NetscapeCookieFile
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class NetscapeCookieFileCache {
|
||||||
|
|
||||||
|
private final LRUMap<Path, NetscapeCookieFile> cookieFileMap;
|
||||||
|
|
||||||
|
private static NetscapeCookieFileCache instance;
|
||||||
|
|
||||||
|
private NetscapeCookieFileCache(HttpConfig config) {
|
||||||
|
cookieFileMap = new LRUMap<>(config.getCookieFileCacheLimit(),
|
||||||
|
config.getCookieFileCacheLimit());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param config
|
||||||
|
* the config which defines the limit for this cache
|
||||||
|
* @return the singleton instance of the cookie file cache. If the cache has
|
||||||
|
* already been created the given config is ignored (even if it
|
||||||
|
* differs from the config, with which the cache has originally been
|
||||||
|
* created)
|
||||||
|
*/
|
||||||
|
public static NetscapeCookieFileCache getInstance(HttpConfig config) {
|
||||||
|
if (instance == null) {
|
||||||
|
return new NetscapeCookieFileCache(config);
|
||||||
|
} else {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param path
|
||||||
|
* the path of the cookie file to retrieve
|
||||||
|
* @return the cache entry belonging to the requested file
|
||||||
|
*/
|
||||||
|
public NetscapeCookieFile getEntry(Path path) {
|
||||||
|
if (!cookieFileMap.containsKey(path)) {
|
||||||
|
synchronized (NetscapeCookieFileCache.class) {
|
||||||
|
if (!cookieFileMap.containsKey(path)) {
|
||||||
|
cookieFileMap.put(path, new NetscapeCookieFile(path));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cookieFileMap.get(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -162,7 +162,7 @@ private static final int hexUInt32(final byte[] bs, int p, final int end) {
|
||||||
r |= RawParseUtils.parseHexInt4(bs[p++]);
|
r |= RawParseUtils.parseHexInt4(bs[p++]);
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
return r << (8 - n) * 4;
|
return r << ((8 - n) * 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mask(int nibbles, int word, int v) {
|
static int mask(int nibbles, int word, int v) {
|
||||||
|
|
|
@ -107,7 +107,7 @@ public class Config {
|
||||||
* must ensure it is a special copy of the empty string. It also must
|
* must ensure it is a special copy of the empty string. It also must
|
||||||
* be treated like the empty string.
|
* be treated like the empty string.
|
||||||
*/
|
*/
|
||||||
static final String MAGIC_EMPTY_VALUE = new String();
|
private static final String MISSING_ENTRY = new String();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a configuration with no default fallback.
|
* Create a configuration with no default fallback.
|
||||||
|
@ -128,6 +128,17 @@ public Config(Config defaultConfig) {
|
||||||
state = new AtomicReference<>(newState());
|
state = new AtomicReference<>(newState());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a given string is the "missing" value.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* @return true if the given string is the "missing" value.
|
||||||
|
* @since 5.4
|
||||||
|
*/
|
||||||
|
public static boolean isMissing(String value) {
|
||||||
|
return value == MISSING_ENTRY;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Globally sets a {@link org.eclipse.jgit.lib.TypedConfigGetter} that is
|
* Globally sets a {@link org.eclipse.jgit.lib.TypedConfigGetter} that is
|
||||||
* subsequently used to read typed values from all git configs.
|
* subsequently used to read typed values from all git configs.
|
||||||
|
@ -1041,7 +1052,7 @@ public String toText() {
|
||||||
if (e.prefix == null || "".equals(e.prefix)) //$NON-NLS-1$
|
if (e.prefix == null || "".equals(e.prefix)) //$NON-NLS-1$
|
||||||
out.append('\t');
|
out.append('\t');
|
||||||
out.append(e.name);
|
out.append(e.name);
|
||||||
if (MAGIC_EMPTY_VALUE != e.value) {
|
if (MISSING_ENTRY != e.value) {
|
||||||
out.append(" ="); //$NON-NLS-1$
|
out.append(" ="); //$NON-NLS-1$
|
||||||
if (e.value != null) {
|
if (e.value != null) {
|
||||||
out.append(' ');
|
out.append(' ');
|
||||||
|
@ -1132,7 +1143,7 @@ private List<ConfigLine> fromTextRecurse(String text, int depth,
|
||||||
e.name = readKeyName(in);
|
e.name = readKeyName(in);
|
||||||
if (e.name.endsWith("\n")) { //$NON-NLS-1$
|
if (e.name.endsWith("\n")) { //$NON-NLS-1$
|
||||||
e.name = e.name.substring(0, e.name.length() - 1);
|
e.name = e.name.substring(0, e.name.length() - 1);
|
||||||
e.value = MAGIC_EMPTY_VALUE;
|
e.value = MISSING_ENTRY;
|
||||||
} else
|
} else
|
||||||
e.value = readValue(in);
|
e.value = readValue(in);
|
||||||
|
|
||||||
|
@ -1165,7 +1176,7 @@ protected byte[] readIncludedConfig(String relPath)
|
||||||
private void addIncludedConfig(final List<ConfigLine> newEntries,
|
private void addIncludedConfig(final List<ConfigLine> newEntries,
|
||||||
ConfigLine line, int depth) throws ConfigInvalidException {
|
ConfigLine line, int depth) throws ConfigInvalidException {
|
||||||
if (!line.name.equalsIgnoreCase("path") || //$NON-NLS-1$
|
if (!line.name.equalsIgnoreCase("path") || //$NON-NLS-1$
|
||||||
line.value == null || line.value.equals(MAGIC_EMPTY_VALUE)) {
|
line.value == null || line.value.equals(MISSING_ENTRY)) {
|
||||||
throw new ConfigInvalidException(MessageFormat.format(
|
throw new ConfigInvalidException(MessageFormat.format(
|
||||||
JGitText.get().invalidLineInConfigFileWithParam, line));
|
JGitText.get().invalidLineInConfigFileWithParam, line));
|
||||||
}
|
}
|
||||||
|
@ -1413,11 +1424,23 @@ private static String readValue(StringReader in)
|
||||||
case '"':
|
case '"':
|
||||||
value.append('"');
|
value.append('"');
|
||||||
continue;
|
continue;
|
||||||
default:
|
case '\r': {
|
||||||
throw new ConfigInvalidException(MessageFormat.format(
|
int next = in.read();
|
||||||
JGitText.get().badEscape,
|
if (next == '\n') {
|
||||||
Character.valueOf(((char) c))));
|
continue; // CR-LF
|
||||||
|
} else if (next >= 0) {
|
||||||
|
in.reset();
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
throw new ConfigInvalidException(
|
||||||
|
MessageFormat.format(JGitText.get().badEscape,
|
||||||
|
Character.isAlphabetic(c)
|
||||||
|
? Character.valueOf(((char) c))
|
||||||
|
: toUnicodeLiteral(c)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ('"' == c) {
|
if ('"' == c) {
|
||||||
|
@ -1430,6 +1453,11 @@ private static String readValue(StringReader in)
|
||||||
return value.length() > 0 ? value.toString() : null;
|
return value.length() > 0 ? value.toString() : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String toUnicodeLiteral(int c) {
|
||||||
|
return String.format("\\u%04x", //$NON-NLS-1$
|
||||||
|
Integer.valueOf(c));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses a section of the configuration into an application model object.
|
* Parses a section of the configuration into an application model object.
|
||||||
* <p>
|
* <p>
|
||||||
|
|
|
@ -72,7 +72,7 @@ public boolean getBoolean(Config config, String section, String subsection,
|
||||||
if (n == null) {
|
if (n == null) {
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
}
|
}
|
||||||
if (Config.MAGIC_EMPTY_VALUE == n) {
|
if (Config.isMissing(n)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -179,7 +179,7 @@ private static RebaseTodoLine parseLine(byte[] buf, int tokenBegin,
|
||||||
|
|
||||||
int nextSpace = RawParseUtils.next(buf, tokenBegin, ' ');
|
int nextSpace = RawParseUtils.next(buf, tokenBegin, ' ');
|
||||||
int tokenCount = 0;
|
int tokenCount = 0;
|
||||||
while (tokenCount < 3 && nextSpace < lineEnd) {
|
while (tokenCount < 3 && nextSpace <= lineEnd) {
|
||||||
switch (tokenCount) {
|
switch (tokenCount) {
|
||||||
case 0:
|
case 0:
|
||||||
String actionToken = new String(buf, tokenBegin,
|
String actionToken = new String(buf, tokenBegin,
|
||||||
|
@ -191,8 +191,14 @@ private static RebaseTodoLine parseLine(byte[] buf, int tokenBegin,
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
nextSpace = RawParseUtils.next(buf, tokenBegin, ' ');
|
nextSpace = RawParseUtils.next(buf, tokenBegin, ' ');
|
||||||
String commitToken = new String(buf, tokenBegin,
|
String commitToken;
|
||||||
|
if (nextSpace > lineEnd + 1) {
|
||||||
|
commitToken = new String(buf, tokenBegin,
|
||||||
|
lineEnd - tokenBegin + 1, UTF_8);
|
||||||
|
} else {
|
||||||
|
commitToken = new String(buf, tokenBegin,
|
||||||
nextSpace - tokenBegin - 1, UTF_8);
|
nextSpace - tokenBegin - 1, UTF_8);
|
||||||
|
}
|
||||||
tokenBegin = nextSpace;
|
tokenBegin = nextSpace;
|
||||||
commit = AbbreviatedObjectId.fromString(commitToken);
|
commit = AbbreviatedObjectId.fromString(commitToken);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -239,6 +239,15 @@ public File getDirectory() {
|
||||||
return gitDir;
|
return gitDir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get repository identifier.
|
||||||
|
*
|
||||||
|
* @return repository identifier. The returned identifier has to be unique
|
||||||
|
* within a given Git server.
|
||||||
|
* @since 5.4
|
||||||
|
*/
|
||||||
|
public abstract String getIdentifier();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the object database which stores this repository's data.
|
* Get the object database which stores this repository's data.
|
||||||
*
|
*
|
||||||
|
|
|
@ -54,6 +54,8 @@
|
||||||
import java.nio.file.InvalidPathException;
|
import java.nio.file.InvalidPathException;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.NoSuchProviderException;
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
@ -67,6 +69,7 @@
|
||||||
import org.bouncycastle.gpg.keybox.KeyInformation;
|
import org.bouncycastle.gpg.keybox.KeyInformation;
|
||||||
import org.bouncycastle.gpg.keybox.PublicKeyRingBlob;
|
import org.bouncycastle.gpg.keybox.PublicKeyRingBlob;
|
||||||
import org.bouncycastle.gpg.keybox.UserID;
|
import org.bouncycastle.gpg.keybox.UserID;
|
||||||
|
import org.bouncycastle.gpg.keybox.jcajce.JcaKeyBoxBuilder;
|
||||||
import org.bouncycastle.openpgp.PGPException;
|
import org.bouncycastle.openpgp.PGPException;
|
||||||
import org.bouncycastle.openpgp.PGPPublicKey;
|
import org.bouncycastle.openpgp.PGPPublicKey;
|
||||||
import org.bouncycastle.openpgp.PGPSecretKey;
|
import org.bouncycastle.openpgp.PGPSecretKey;
|
||||||
|
@ -210,9 +213,12 @@ private PGPPublicKey findPublicKeyByUserId(KeyBlob keyBlob)
|
||||||
* @return publicKey the public key (maybe <code>null</code>)
|
* @return publicKey the public key (maybe <code>null</code>)
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
* in case of problems reading the file
|
* in case of problems reading the file
|
||||||
|
* @throws NoSuchAlgorithmException
|
||||||
|
* @throws NoSuchProviderException
|
||||||
*/
|
*/
|
||||||
private PGPPublicKey findPublicKeyInKeyBox(Path keyboxFile)
|
private PGPPublicKey findPublicKeyInKeyBox(Path keyboxFile)
|
||||||
throws IOException {
|
throws IOException, NoSuchAlgorithmException,
|
||||||
|
NoSuchProviderException {
|
||||||
KeyBox keyBox = readKeyBoxFile(keyboxFile);
|
KeyBox keyBox = readKeyBoxFile(keyboxFile);
|
||||||
for (KeyBlob keyBlob : keyBox.getKeyBlobs()) {
|
for (KeyBlob keyBlob : keyBox.getKeyBlobs()) {
|
||||||
if (keyBlob.getType() == BlobType.OPEN_PGP_BLOB) {
|
if (keyBlob.getType() == BlobType.OPEN_PGP_BLOB) {
|
||||||
|
@ -236,15 +242,17 @@ private PGPPublicKey findPublicKeyInKeyBox(Path keyboxFile)
|
||||||
* @return the secret key
|
* @return the secret key
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
* in case of issues reading key files
|
* in case of issues reading key files
|
||||||
|
* @throws NoSuchAlgorithmException
|
||||||
|
* @throws NoSuchProviderException
|
||||||
* @throws PGPException
|
* @throws PGPException
|
||||||
* in case of issues finding a key
|
* in case of issues finding a key
|
||||||
* @throws CanceledException
|
* @throws CanceledException
|
||||||
* @throws URISyntaxException
|
* @throws URISyntaxException
|
||||||
* @throws UnsupportedCredentialItem
|
* @throws UnsupportedCredentialItem
|
||||||
*/
|
*/
|
||||||
public BouncyCastleGpgKey findSecretKey()
|
public BouncyCastleGpgKey findSecretKey() throws IOException,
|
||||||
throws IOException, PGPException, CanceledException,
|
NoSuchAlgorithmException, NoSuchProviderException, PGPException,
|
||||||
UnsupportedCredentialItem, URISyntaxException {
|
CanceledException, UnsupportedCredentialItem, URISyntaxException {
|
||||||
if (exists(USER_KEYBOX_PATH)) {
|
if (exists(USER_KEYBOX_PATH)) {
|
||||||
PGPPublicKey publicKey = //
|
PGPPublicKey publicKey = //
|
||||||
findPublicKeyInKeyBox(USER_KEYBOX_PATH);
|
findPublicKeyInKeyBox(USER_KEYBOX_PATH);
|
||||||
|
@ -376,14 +384,12 @@ private PGPPublicKey getFirstPublicKey(KeyBlob keyBlob) throws IOException {
|
||||||
.getPublicKey();
|
.getPublicKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
private KeyBox readKeyBoxFile(Path keyboxFile) throws IOException {
|
private KeyBox readKeyBoxFile(Path keyboxFile) throws IOException,
|
||||||
|
NoSuchAlgorithmException, NoSuchProviderException {
|
||||||
KeyBox keyBox;
|
KeyBox keyBox;
|
||||||
try (InputStream in = new BufferedInputStream(
|
try (InputStream in = new BufferedInputStream(
|
||||||
newInputStream(keyboxFile))) {
|
newInputStream(keyboxFile))) {
|
||||||
// note: KeyBox constructor reads in the whole InputStream at once
|
keyBox = new JcaKeyBoxBuilder().build(in);
|
||||||
// this code will change in 1.61 to
|
|
||||||
// either 'new BcKeyBox(in)' or 'new JcaKeyBoxBuilder().build(in)'
|
|
||||||
keyBox = new KeyBox(in, new JcaKeyFingerprintCalculator());
|
|
||||||
}
|
}
|
||||||
return keyBox;
|
return keyBox;
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,6 +45,8 @@
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.NoSuchProviderException;
|
||||||
import java.security.Security;
|
import java.security.Security;
|
||||||
|
|
||||||
import org.bouncycastle.bcpg.ArmoredOutputStream;
|
import org.bouncycastle.bcpg.ArmoredOutputStream;
|
||||||
|
@ -100,7 +102,8 @@ public boolean canLocateSigningKey(@Nullable String gpgSigningKey,
|
||||||
BouncyCastleGpgKey gpgKey = locateSigningKey(gpgSigningKey,
|
BouncyCastleGpgKey gpgKey = locateSigningKey(gpgSigningKey,
|
||||||
committer, passphrasePrompt);
|
committer, passphrasePrompt);
|
||||||
return gpgKey != null;
|
return gpgKey != null;
|
||||||
} catch (PGPException | IOException | URISyntaxException e) {
|
} catch (PGPException | IOException | NoSuchAlgorithmException
|
||||||
|
| NoSuchProviderException | URISyntaxException e) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -109,7 +112,8 @@ private BouncyCastleGpgKey locateSigningKey(@Nullable String gpgSigningKey,
|
||||||
PersonIdent committer,
|
PersonIdent committer,
|
||||||
BouncyCastleGpgKeyPassphrasePrompt passphrasePrompt)
|
BouncyCastleGpgKeyPassphrasePrompt passphrasePrompt)
|
||||||
throws CanceledException, UnsupportedCredentialItem, IOException,
|
throws CanceledException, UnsupportedCredentialItem, IOException,
|
||||||
PGPException, URISyntaxException {
|
NoSuchAlgorithmException, NoSuchProviderException, PGPException,
|
||||||
|
URISyntaxException {
|
||||||
if (gpgSigningKey == null || gpgSigningKey.isEmpty()) {
|
if (gpgSigningKey == null || gpgSigningKey.isEmpty()) {
|
||||||
gpgSigningKey = committer.getEmailAddress();
|
gpgSigningKey = committer.getEmailAddress();
|
||||||
}
|
}
|
||||||
|
@ -153,7 +157,8 @@ public void sign(@NonNull CommitBuilder commit,
|
||||||
signatureGenerator.generate().encode(out);
|
signatureGenerator.generate().encode(out);
|
||||||
}
|
}
|
||||||
commit.setGpgSignature(new GpgSignature(buffer.toByteArray()));
|
commit.setGpgSignature(new GpgSignature(buffer.toByteArray()));
|
||||||
} catch (PGPException | IOException | URISyntaxException e) {
|
} catch (PGPException | IOException | NoSuchAlgorithmException
|
||||||
|
| NoSuchProviderException | URISyntaxException e) {
|
||||||
throw new JGitInternalException(e.getMessage(), e);
|
throw new JGitInternalException(e.getMessage(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1190,7 +1190,7 @@ public Map<String, MergeFailureReason> getFailingPaths() {
|
||||||
* otherwise
|
* otherwise
|
||||||
*/
|
*/
|
||||||
public boolean failed() {
|
public boolean failed() {
|
||||||
return failingPaths.size() > 0;
|
return !failingPaths.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,3 +1,45 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2019, Google LLC.
|
||||||
|
* and other copyright owners as documented in the project's IP log.
|
||||||
|
*
|
||||||
|
* This program and the accompanying materials are made available
|
||||||
|
* under the terms of the Eclipse Distribution License v1.0 which
|
||||||
|
* accompanies this distribution, is reproduced below, and is
|
||||||
|
* available at http://www.eclipse.org/org/documents/edl-v10.php
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or
|
||||||
|
* without modification, are permitted provided that the following
|
||||||
|
* conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following
|
||||||
|
* disclaimer in the documentation and/or other materials provided
|
||||||
|
* with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Eclipse Foundation, Inc. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote
|
||||||
|
* products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
package org.eclipse.jgit.revwalk;
|
package org.eclipse.jgit.revwalk;
|
||||||
|
|
||||||
import static java.util.Objects.requireNonNull;
|
import static java.util.Objects.requireNonNull;
|
||||||
|
@ -52,8 +94,9 @@ class BitmapCalculator {
|
||||||
* @throws MissingObjectException
|
* @throws MissingObjectException
|
||||||
* the supplied id doesn't exist
|
* the supplied id doesn't exist
|
||||||
* @throws IncorrectObjectTypeException
|
* @throws IncorrectObjectTypeException
|
||||||
* the supplied id doens't refer to a commit or a tag
|
* the supplied id doesn't refer to a commit or a tag
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
|
* if the walk cannot open a packfile or loose object
|
||||||
*/
|
*/
|
||||||
BitmapBuilder getBitmap(RevCommit start, ProgressMonitor pm)
|
BitmapBuilder getBitmap(RevCommit start, ProgressMonitor pm)
|
||||||
throws MissingObjectException,
|
throws MissingObjectException,
|
||||||
|
|
|
@ -55,10 +55,8 @@
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks the reachability using bitmaps.
|
* Checks the reachability using bitmaps.
|
||||||
*
|
|
||||||
* @since 5.4
|
|
||||||
*/
|
*/
|
||||||
public class BitmappedReachabilityChecker implements ReachabilityChecker {
|
class BitmappedReachabilityChecker implements ReachabilityChecker {
|
||||||
|
|
||||||
private final RevWalk walk;
|
private final RevWalk walk;
|
||||||
|
|
||||||
|
|
|
@ -52,10 +52,8 @@
|
||||||
/**
|
/**
|
||||||
* Checks the reachability walking the graph from the starters towards the
|
* Checks the reachability walking the graph from the starters towards the
|
||||||
* target.
|
* target.
|
||||||
*
|
|
||||||
* @since 5.4
|
|
||||||
*/
|
*/
|
||||||
public class PedestrianReachabilityChecker implements ReachabilityChecker {
|
class PedestrianReachabilityChecker implements ReachabilityChecker {
|
||||||
|
|
||||||
private final boolean topoSort;
|
private final boolean topoSort;
|
||||||
|
|
||||||
|
|
|
@ -249,6 +249,23 @@ public ObjectReader getObjectReader() {
|
||||||
return reader;
|
return reader;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a reachability checker for commits over this revwalk.
|
||||||
|
*
|
||||||
|
* @return the most efficient reachability checker for this repository.
|
||||||
|
* @throws IOException
|
||||||
|
* if it cannot open any of the underlying indices.
|
||||||
|
*
|
||||||
|
* @since 5.4
|
||||||
|
*/
|
||||||
|
public ReachabilityChecker createReachabilityChecker() throws IOException {
|
||||||
|
if (reader.getBitmapIndex() != null) {
|
||||||
|
return new BitmappedReachabilityChecker(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new PedestrianReachabilityChecker(true, this);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
* <p>
|
* <p>
|
||||||
|
|
|
@ -50,6 +50,9 @@
|
||||||
|
|
||||||
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
|
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
|
||||||
import org.eclipse.jgit.errors.MissingObjectException;
|
import org.eclipse.jgit.errors.MissingObjectException;
|
||||||
|
import org.eclipse.jgit.internal.JGitText;
|
||||||
|
import org.eclipse.jgit.lib.NullProgressMonitor;
|
||||||
|
import org.eclipse.jgit.lib.ProgressMonitor;
|
||||||
import org.eclipse.jgit.lib.Ref;
|
import org.eclipse.jgit.lib.Ref;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -153,15 +156,51 @@ public static List<Ref> findBranchesReachableFrom(RevCommit commit,
|
||||||
RevWalk revWalk, Collection<Ref> refs)
|
RevWalk revWalk, Collection<Ref> refs)
|
||||||
throws MissingObjectException, IncorrectObjectTypeException,
|
throws MissingObjectException, IncorrectObjectTypeException,
|
||||||
IOException {
|
IOException {
|
||||||
|
return findBranchesReachableFrom(commit, revWalk, refs,
|
||||||
|
NullProgressMonitor.INSTANCE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find the list of branches a given commit is reachable from when following
|
||||||
|
* parents.
|
||||||
|
* <p>
|
||||||
|
* Note that this method calls
|
||||||
|
* {@link org.eclipse.jgit.revwalk.RevWalk#reset()} at the beginning.
|
||||||
|
* <p>
|
||||||
|
* In order to improve performance this method assumes clock skew among
|
||||||
|
* committers is never larger than 24 hours.
|
||||||
|
*
|
||||||
|
* @param commit
|
||||||
|
* the commit we are looking at
|
||||||
|
* @param revWalk
|
||||||
|
* The RevWalk to be used.
|
||||||
|
* @param refs
|
||||||
|
* the set of branches we want to see reachability from
|
||||||
|
* @param monitor
|
||||||
|
* the callback for progress and cancellation
|
||||||
|
* @return the list of branches a given commit is reachable from
|
||||||
|
* @throws org.eclipse.jgit.errors.MissingObjectException
|
||||||
|
* @throws org.eclipse.jgit.errors.IncorrectObjectTypeException
|
||||||
|
* @throws java.io.IOException
|
||||||
|
* @since 5.4
|
||||||
|
*/
|
||||||
|
public static List<Ref> findBranchesReachableFrom(RevCommit commit,
|
||||||
|
RevWalk revWalk, Collection<Ref> refs, ProgressMonitor monitor)
|
||||||
|
throws MissingObjectException, IncorrectObjectTypeException,
|
||||||
|
IOException {
|
||||||
|
|
||||||
// Make sure commit is from the same RevWalk
|
// Make sure commit is from the same RevWalk
|
||||||
commit = revWalk.parseCommit(commit.getId());
|
commit = revWalk.parseCommit(commit.getId());
|
||||||
revWalk.reset();
|
revWalk.reset();
|
||||||
List<Ref> result = new ArrayList<>();
|
List<Ref> result = new ArrayList<>();
|
||||||
|
monitor.beginTask(JGitText.get().searchForReachableBranches,
|
||||||
|
refs.size());
|
||||||
final int SKEW = 24*3600; // one day clock skew
|
final int SKEW = 24*3600; // one day clock skew
|
||||||
|
|
||||||
for (Ref ref : refs) {
|
for (Ref ref : refs) {
|
||||||
|
if (monitor.isCancelled())
|
||||||
|
return result;
|
||||||
|
monitor.update(1);
|
||||||
RevObject maybehead = revWalk.parseAny(ref.getObjectId());
|
RevObject maybehead = revWalk.parseAny(ref.getObjectId());
|
||||||
if (!(maybehead instanceof RevCommit))
|
if (!(maybehead instanceof RevCommit))
|
||||||
continue;
|
continue;
|
||||||
|
@ -176,6 +215,7 @@ public static List<Ref> findBranchesReachableFrom(RevCommit commit,
|
||||||
if (revWalk.isMergedInto(commit, headCommit))
|
if (revWalk.isMergedInto(commit, headCommit))
|
||||||
result.add(ref);
|
result.add(ref);
|
||||||
}
|
}
|
||||||
|
monitor.endTask();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -148,7 +148,8 @@ public final File getFile() {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void load() throws IOException, ConfigInvalidException {
|
public void load() throws IOException, ConfigInvalidException {
|
||||||
final int maxStaleRetries = 5;
|
final int maxRetries = 5;
|
||||||
|
int retryDelayMillis = 20;
|
||||||
int retries = 0;
|
int retries = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
final FileSnapshot oldSnapshot = snapshot;
|
final FileSnapshot oldSnapshot = snapshot;
|
||||||
|
@ -177,6 +178,22 @@ public void load() throws IOException, ConfigInvalidException {
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
} catch (FileNotFoundException noFile) {
|
} catch (FileNotFoundException noFile) {
|
||||||
|
// might be locked by another process (see exception Javadoc)
|
||||||
|
if (retries < maxRetries && configFile.exists()) {
|
||||||
|
if (LOG.isDebugEnabled()) {
|
||||||
|
LOG.debug(MessageFormat.format(
|
||||||
|
JGitText.get().configHandleMayBeLocked,
|
||||||
|
Integer.valueOf(retries)), noFile);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Thread.sleep(retryDelayMillis);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
}
|
||||||
|
retries++;
|
||||||
|
retryDelayMillis *= 2; // max wait 1260 ms
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (configFile.exists()) {
|
if (configFile.exists()) {
|
||||||
throw noFile;
|
throw noFile;
|
||||||
}
|
}
|
||||||
|
@ -185,7 +202,7 @@ public void load() throws IOException, ConfigInvalidException {
|
||||||
return;
|
return;
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
if (FileUtils.isStaleFileHandle(e)
|
if (FileUtils.isStaleFileHandle(e)
|
||||||
&& retries < maxStaleRetries) {
|
&& retries < maxRetries) {
|
||||||
if (LOG.isDebugEnabled()) {
|
if (LOG.isDebugEnabled()) {
|
||||||
LOG.debug(MessageFormat.format(
|
LOG.debug(MessageFormat.format(
|
||||||
JGitText.get().configHandleIsStale,
|
JGitText.get().configHandleIsStale,
|
||||||
|
|
|
@ -201,7 +201,7 @@ private void readAdvertisedRefsImpl() throws IOException {
|
||||||
throw noRepository();
|
throw noRepository();
|
||||||
throw eof;
|
throw eof;
|
||||||
}
|
}
|
||||||
if (line == PacketLineIn.END)
|
if (PacketLineIn.isEnd(line))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (line.startsWith("ERR ")) { //$NON-NLS-1$
|
if (line.startsWith("ERR ")) { //$NON-NLS-1$
|
||||||
|
|
|
@ -383,8 +383,7 @@ private void readStatusReport(Map<String, RemoteRefUpdate> refUpdates)
|
||||||
JGitText.get().errorOccurredDuringUnpackingOnTheRemoteEnd, unpackStatus));
|
JGitText.get().errorOccurredDuringUnpackingOnTheRemoteEnd, unpackStatus));
|
||||||
}
|
}
|
||||||
|
|
||||||
String refLine;
|
for (String refLine : pckIn.readStrings()) {
|
||||||
while ((refLine = pckIn.readString()) != PacketLineIn.END) {
|
|
||||||
boolean ok = false;
|
boolean ok = false;
|
||||||
int refNameEnd = -1;
|
int refNameEnd = -1;
|
||||||
if (refLine.startsWith("ok ")) { //$NON-NLS-1$
|
if (refLine.startsWith("ok ")) { //$NON-NLS-1$
|
||||||
|
|
|
@ -1282,7 +1282,7 @@ protected void recvCommands() throws IOException {
|
||||||
return;
|
return;
|
||||||
throw eof;
|
throw eof;
|
||||||
}
|
}
|
||||||
if (line == PacketLineIn.END) {
|
if (PacketLineIn.isEnd(line)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -227,7 +227,7 @@ public void writeBundle(ProgressMonitor monitor, OutputStream os)
|
||||||
exc.add(r.getId());
|
exc.add(r.getId());
|
||||||
packWriter.setIndexDisabled(true);
|
packWriter.setIndexDisabled(true);
|
||||||
packWriter.setDeltaBaseAsOffset(true);
|
packWriter.setDeltaBaseAsOffset(true);
|
||||||
packWriter.setThin(exc.size() > 0);
|
packWriter.setThin(!exc.isEmpty());
|
||||||
packWriter.setReuseValidatingObjects(false);
|
packWriter.setReuseValidatingObjects(false);
|
||||||
if (exc.isEmpty()) {
|
if (exc.isEmpty()) {
|
||||||
packWriter.setTagTargets(tagTargets);
|
packWriter.setTagTargets(tagTargets);
|
||||||
|
|
|
@ -45,14 +45,12 @@
|
||||||
import static java.nio.charset.StandardCharsets.ISO_8859_1;
|
import static java.nio.charset.StandardCharsets.ISO_8859_1;
|
||||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.security.InvalidKeyException;
|
import java.security.InvalidKeyException;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
|
||||||
import javax.crypto.Mac;
|
import javax.crypto.Mac;
|
||||||
import javax.crypto.spec.SecretKeySpec;
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
|
|
||||||
import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
|
|
||||||
import org.eclipse.jgit.lib.Repository;
|
import org.eclipse.jgit.lib.Repository;
|
||||||
import org.eclipse.jgit.transport.PushCertificate.NonceStatus;
|
import org.eclipse.jgit.transport.PushCertificate.NonceStatus;
|
||||||
|
|
||||||
|
@ -87,19 +85,7 @@ public HMACSHA1NonceGenerator(String seed) throws IllegalStateException {
|
||||||
@Override
|
@Override
|
||||||
public synchronized String createNonce(Repository repo, long timestamp)
|
public synchronized String createNonce(Repository repo, long timestamp)
|
||||||
throws IllegalStateException {
|
throws IllegalStateException {
|
||||||
String path;
|
String input = repo.getIdentifier() + ":" + String.valueOf(timestamp); //$NON-NLS-1$
|
||||||
if (repo instanceof DfsRepository) {
|
|
||||||
path = ((DfsRepository) repo).getDescription().getRepositoryName();
|
|
||||||
} else {
|
|
||||||
File directory = repo.getDirectory();
|
|
||||||
if (directory != null) {
|
|
||||||
path = directory.getPath();
|
|
||||||
} else {
|
|
||||||
throw new IllegalStateException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String input = path + ":" + String.valueOf(timestamp); //$NON-NLS-1$
|
|
||||||
byte[] rawHmac = mac.doFinal(input.getBytes(UTF_8));
|
byte[] rawHmac = mac.doFinal(input.getBytes(UTF_8));
|
||||||
return Long.toString(timestamp) + "-" + toHex(rawHmac); //$NON-NLS-1$
|
return Long.toString(timestamp) + "-" + toHex(rawHmac); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,6 +89,30 @@ public class HttpConfig {
|
||||||
/** git config key for the "sslVerify" setting. */
|
/** git config key for the "sslVerify" setting. */
|
||||||
public static final String SSL_VERIFY_KEY = "sslVerify"; //$NON-NLS-1$
|
public static final String SSL_VERIFY_KEY = "sslVerify"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* git config key for the "cookieFile" setting.
|
||||||
|
*
|
||||||
|
* @since 5.4
|
||||||
|
*/
|
||||||
|
public static final String COOKIE_FILE_KEY = "cookieFile"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* git config key for the "saveCookies" setting.
|
||||||
|
*
|
||||||
|
* @since 5.4
|
||||||
|
*/
|
||||||
|
public static final String SAVE_COOKIES_KEY = "saveCookies"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom JGit config key which holds the maximum number of cookie files to
|
||||||
|
* keep in the cache.
|
||||||
|
*
|
||||||
|
* @since 5.4
|
||||||
|
*/
|
||||||
|
public static final String COOKIE_FILE_CACHE_LIMIT_KEY = "cookieFileCacheLimit"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private static final int DEFAULT_COOKIE_FILE_CACHE_LIMIT = 10;
|
||||||
|
|
||||||
private static final String MAX_REDIRECT_SYSTEM_PROPERTY = "http.maxRedirects"; //$NON-NLS-1$
|
private static final String MAX_REDIRECT_SYSTEM_PROPERTY = "http.maxRedirects"; //$NON-NLS-1$
|
||||||
|
|
||||||
private static final int DEFAULT_MAX_REDIRECTS = 5;
|
private static final int DEFAULT_MAX_REDIRECTS = 5;
|
||||||
|
@ -153,6 +177,12 @@ public boolean matchConfigValue(String s) {
|
||||||
|
|
||||||
private int maxRedirects;
|
private int maxRedirects;
|
||||||
|
|
||||||
|
private String cookieFile;
|
||||||
|
|
||||||
|
private boolean saveCookies;
|
||||||
|
|
||||||
|
private int cookieFileCacheLimit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the "http.postBuffer" setting
|
* Get the "http.postBuffer" setting
|
||||||
*
|
*
|
||||||
|
@ -189,6 +219,40 @@ public int getMaxRedirects() {
|
||||||
return maxRedirects;
|
return maxRedirects;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the "http.cookieFile" setting
|
||||||
|
*
|
||||||
|
* @return the value of the "http.cookieFile" setting
|
||||||
|
*
|
||||||
|
* @since 5.4
|
||||||
|
*/
|
||||||
|
public String getCookieFile() {
|
||||||
|
return cookieFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the "http.saveCookies" setting
|
||||||
|
*
|
||||||
|
* @return the value of the "http.saveCookies" setting
|
||||||
|
*
|
||||||
|
* @since 5.4
|
||||||
|
*/
|
||||||
|
public boolean getSaveCookies() {
|
||||||
|
return saveCookies;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the "http.cookieFileCacheLimit" setting (gives the maximum number of
|
||||||
|
* cookie files to keep in the LRU cache)
|
||||||
|
*
|
||||||
|
* @return the value of the "http.cookieFileCacheLimit" setting
|
||||||
|
*
|
||||||
|
* @since 5.4
|
||||||
|
*/
|
||||||
|
public int getCookieFileCacheLimit() {
|
||||||
|
return cookieFileCacheLimit;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link org.eclipse.jgit.transport.HttpConfig} tailored to
|
* Creates a new {@link org.eclipse.jgit.transport.HttpConfig} tailored to
|
||||||
* the given {@link org.eclipse.jgit.transport.URIish}.
|
* the given {@link org.eclipse.jgit.transport.URIish}.
|
||||||
|
@ -237,6 +301,10 @@ private void init(Config config, URIish uri) {
|
||||||
if (redirectLimit < 0) {
|
if (redirectLimit < 0) {
|
||||||
redirectLimit = MAX_REDIRECTS;
|
redirectLimit = MAX_REDIRECTS;
|
||||||
}
|
}
|
||||||
|
cookieFile = config.getString(HTTP, null, COOKIE_FILE_KEY);
|
||||||
|
saveCookies = config.getBoolean(HTTP, SAVE_COOKIES_KEY, false);
|
||||||
|
cookieFileCacheLimit = config.getInt(HTTP, COOKIE_FILE_CACHE_LIMIT_KEY,
|
||||||
|
DEFAULT_COOKIE_FILE_CACHE_LIMIT);
|
||||||
String match = findMatch(config.getSubsections(HTTP), uri);
|
String match = findMatch(config.getSubsections(HTTP), uri);
|
||||||
if (match != null) {
|
if (match != null) {
|
||||||
// Override with more specific items
|
// Override with more specific items
|
||||||
|
@ -251,6 +319,13 @@ private void init(Config config, URIish uri) {
|
||||||
if (newMaxRedirects >= 0) {
|
if (newMaxRedirects >= 0) {
|
||||||
redirectLimit = newMaxRedirects;
|
redirectLimit = newMaxRedirects;
|
||||||
}
|
}
|
||||||
|
String urlSpecificCookieFile = config.getString(HTTP, match,
|
||||||
|
COOKIE_FILE_KEY);
|
||||||
|
if (urlSpecificCookieFile != null) {
|
||||||
|
cookieFile = urlSpecificCookieFile;
|
||||||
|
}
|
||||||
|
saveCookies = config.getBoolean(HTTP, match, SAVE_COOKIES_KEY,
|
||||||
|
saveCookies);
|
||||||
}
|
}
|
||||||
postBuffer = postBufferSize;
|
postBuffer = postBufferSize;
|
||||||
sslVerify = sslVerifyFlag;
|
sslVerify = sslVerifyFlag;
|
||||||
|
|
|
@ -49,7 +49,9 @@
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.io.UncheckedIOException;
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
import org.eclipse.jgit.errors.PackProtocolException;
|
import org.eclipse.jgit.errors.PackProtocolException;
|
||||||
import org.eclipse.jgit.internal.JGitText;
|
import org.eclipse.jgit.internal.JGitText;
|
||||||
|
@ -72,14 +74,25 @@
|
||||||
public class PacketLineIn {
|
public class PacketLineIn {
|
||||||
private static final Logger log = LoggerFactory.getLogger(PacketLineIn.class);
|
private static final Logger log = LoggerFactory.getLogger(PacketLineIn.class);
|
||||||
|
|
||||||
/** Magic return from {@link #readString()} when a flush packet is found. */
|
/**
|
||||||
|
* Magic return from {@link #readString()} when a flush packet is found.
|
||||||
|
*
|
||||||
|
* @deprecated Callers should use {@link #isEnd(String)} to check if a
|
||||||
|
* string is the end marker, or
|
||||||
|
* {@link PacketLineIn#readStrings()} to iterate over all
|
||||||
|
* strings in the input stream until the marker is reached.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public static final String END = new StringBuilder(0).toString(); /* must not string pool */
|
public static final String END = new StringBuilder(0).toString(); /* must not string pool */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magic return from {@link #readString()} when a delim packet is found.
|
* Magic return from {@link #readString()} when a delim packet is found.
|
||||||
*
|
*
|
||||||
* @since 5.0
|
* @since 5.0
|
||||||
|
* @deprecated Callers should use {@link #isDelimiter(String)} to check if a
|
||||||
|
* string is the delimiter.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public static final String DELIM = new StringBuilder(0).toString(); /* must not string pool */
|
public static final String DELIM = new StringBuilder(0).toString(); /* must not string pool */
|
||||||
|
|
||||||
static enum AckNackResult {
|
static enum AckNackResult {
|
||||||
|
@ -192,6 +205,20 @@ public String readString() throws IOException {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an iterator to read strings from the input stream.
|
||||||
|
*
|
||||||
|
* @return an iterator that calls {@link #readString()} until {@link #END}
|
||||||
|
* is encountered.
|
||||||
|
*
|
||||||
|
* @throws IOException
|
||||||
|
* on failure to read the initial packet line.
|
||||||
|
* @since 5.4
|
||||||
|
*/
|
||||||
|
public PacketLineInIterator readStrings() throws IOException {
|
||||||
|
return new PacketLineInIterator(this);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read a single UTF-8 encoded string packet from the input stream.
|
* Read a single UTF-8 encoded string packet from the input stream.
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -224,6 +251,52 @@ public String readStringRaw() throws IOException {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a string is the delimiter marker.
|
||||||
|
*
|
||||||
|
* @param s
|
||||||
|
* the string to check
|
||||||
|
* @return true if the given string is {@link #DELIM}, otherwise false.
|
||||||
|
* @since 5.4
|
||||||
|
*/
|
||||||
|
public static boolean isDelimiter(String s) {
|
||||||
|
return s == DELIM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the delimiter marker.
|
||||||
|
* <p>
|
||||||
|
* Intended for use only in tests.
|
||||||
|
*
|
||||||
|
* @return The delimiter marker.
|
||||||
|
*/
|
||||||
|
static String delimiter() {
|
||||||
|
return DELIM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the end marker.
|
||||||
|
* <p>
|
||||||
|
* Intended for use only in tests.
|
||||||
|
*
|
||||||
|
* @return The end marker.
|
||||||
|
*/
|
||||||
|
static String end() {
|
||||||
|
return END;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a string is the packet end marker.
|
||||||
|
*
|
||||||
|
* @param s
|
||||||
|
* the string to check
|
||||||
|
* @return true if the given string is {@link #END}, otherwise false.
|
||||||
|
* @since 5.4
|
||||||
|
*/
|
||||||
|
public static boolean isEnd(String s) {
|
||||||
|
return s == END;
|
||||||
|
}
|
||||||
|
|
||||||
void discardUntilEnd() throws IOException {
|
void discardUntilEnd() throws IOException {
|
||||||
for (;;) {
|
for (;;) {
|
||||||
int n = readLength();
|
int n = readLength();
|
||||||
|
@ -282,4 +355,46 @@ private IOException invalidHeader() {
|
||||||
public static class InputOverLimitIOException extends IOException {
|
public static class InputOverLimitIOException extends IOException {
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterator over packet lines.
|
||||||
|
* <p>
|
||||||
|
* Calls {@link #readString()} on the {@link PacketLineIn} until
|
||||||
|
* {@link #END} is encountered.
|
||||||
|
*
|
||||||
|
* @since 5.4
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static class PacketLineInIterator implements Iterable<String> {
|
||||||
|
private PacketLineIn in;
|
||||||
|
|
||||||
|
private String current;
|
||||||
|
|
||||||
|
PacketLineInIterator(PacketLineIn in) throws IOException {
|
||||||
|
this.in = in;
|
||||||
|
current = in.readString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator<String> iterator() {
|
||||||
|
return new Iterator<String>() {
|
||||||
|
@Override
|
||||||
|
public boolean hasNext() {
|
||||||
|
return !PacketLineIn.isEnd(current);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String next() {
|
||||||
|
String next = current;
|
||||||
|
try {
|
||||||
|
current = in.readString();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new UncheckedIOException(e);
|
||||||
|
}
|
||||||
|
return next;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,7 +99,7 @@ FetchV0Request recvWants(PacketLineIn pckIn)
|
||||||
throw eof;
|
throw eof;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (line == PacketLineIn.END) {
|
if (PacketLineIn.isEnd(line)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -92,7 +92,7 @@ private static String consumeCapabilities(PacketLineIn pckIn,
|
||||||
String agentPrefix = OPTION_AGENT + '=';
|
String agentPrefix = OPTION_AGENT + '=';
|
||||||
|
|
||||||
String line = pckIn.readString();
|
String line = pckIn.readString();
|
||||||
while (line != PacketLineIn.DELIM && line != PacketLineIn.END) {
|
while (!PacketLineIn.isDelimiter(line) && !PacketLineIn.isEnd(line)) {
|
||||||
if (line.startsWith(serverOptionPrefix)) {
|
if (line.startsWith(serverOptionPrefix)) {
|
||||||
serverOptionConsumer
|
serverOptionConsumer
|
||||||
.accept(line.substring(serverOptionPrefix.length()));
|
.accept(line.substring(serverOptionPrefix.length()));
|
||||||
|
@ -133,40 +133,41 @@ FetchV2Request parseFetchRequest(PacketLineIn pckIn)
|
||||||
serverOption -> reqBuilder.addServerOption(serverOption),
|
serverOption -> reqBuilder.addServerOption(serverOption),
|
||||||
agent -> reqBuilder.setAgent(agent));
|
agent -> reqBuilder.setAgent(agent));
|
||||||
|
|
||||||
if (line == PacketLineIn.END) {
|
if (PacketLineIn.isEnd(line)) {
|
||||||
return reqBuilder.build();
|
return reqBuilder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (line != PacketLineIn.DELIM) {
|
if (!PacketLineIn.isDelimiter(line)) {
|
||||||
throw new PackProtocolException(
|
throw new PackProtocolException(
|
||||||
MessageFormat.format(JGitText.get().unexpectedPacketLine,
|
MessageFormat.format(JGitText.get().unexpectedPacketLine,
|
||||||
line));
|
line));
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean filterReceived = false;
|
boolean filterReceived = false;
|
||||||
while ((line = pckIn.readString()) != PacketLineIn.END) {
|
for (String line2 : pckIn.readStrings()) {
|
||||||
if (line.startsWith("want ")) { //$NON-NLS-1$
|
if (line2.startsWith("want ")) { //$NON-NLS-1$
|
||||||
reqBuilder.addWantId(ObjectId.fromString(line.substring(5)));
|
reqBuilder.addWantId(ObjectId.fromString(line2.substring(5)));
|
||||||
} else if (transferConfig.isAllowRefInWant()
|
} else if (transferConfig.isAllowRefInWant()
|
||||||
&& line.startsWith(OPTION_WANT_REF + " ")) { //$NON-NLS-1$
|
&& line2.startsWith(OPTION_WANT_REF + " ")) { //$NON-NLS-1$
|
||||||
reqBuilder.addWantedRef(line.substring(OPTION_WANT_REF.length() + 1));
|
reqBuilder.addWantedRef(
|
||||||
} else if (line.startsWith("have ")) { //$NON-NLS-1$
|
line2.substring(OPTION_WANT_REF.length() + 1));
|
||||||
reqBuilder.addPeerHas(ObjectId.fromString(line.substring(5)));
|
} else if (line2.startsWith("have ")) { //$NON-NLS-1$
|
||||||
} else if (line.equals("done")) { //$NON-NLS-1$
|
reqBuilder.addPeerHas(ObjectId.fromString(line2.substring(5)));
|
||||||
|
} else if (line2.equals("done")) { //$NON-NLS-1$
|
||||||
reqBuilder.setDoneReceived();
|
reqBuilder.setDoneReceived();
|
||||||
} else if (line.equals(OPTION_THIN_PACK)) {
|
} else if (line2.equals(OPTION_THIN_PACK)) {
|
||||||
reqBuilder.addClientCapability(OPTION_THIN_PACK);
|
reqBuilder.addClientCapability(OPTION_THIN_PACK);
|
||||||
} else if (line.equals(OPTION_NO_PROGRESS)) {
|
} else if (line2.equals(OPTION_NO_PROGRESS)) {
|
||||||
reqBuilder.addClientCapability(OPTION_NO_PROGRESS);
|
reqBuilder.addClientCapability(OPTION_NO_PROGRESS);
|
||||||
} else if (line.equals(OPTION_INCLUDE_TAG)) {
|
} else if (line2.equals(OPTION_INCLUDE_TAG)) {
|
||||||
reqBuilder.addClientCapability(OPTION_INCLUDE_TAG);
|
reqBuilder.addClientCapability(OPTION_INCLUDE_TAG);
|
||||||
} else if (line.equals(OPTION_OFS_DELTA)) {
|
} else if (line2.equals(OPTION_OFS_DELTA)) {
|
||||||
reqBuilder.addClientCapability(OPTION_OFS_DELTA);
|
reqBuilder.addClientCapability(OPTION_OFS_DELTA);
|
||||||
} else if (line.startsWith("shallow ")) { //$NON-NLS-1$
|
} else if (line2.startsWith("shallow ")) { //$NON-NLS-1$
|
||||||
reqBuilder.addClientShallowCommit(
|
reqBuilder.addClientShallowCommit(
|
||||||
ObjectId.fromString(line.substring(8)));
|
ObjectId.fromString(line2.substring(8)));
|
||||||
} else if (line.startsWith("deepen ")) { //$NON-NLS-1$
|
} else if (line2.startsWith("deepen ")) { //$NON-NLS-1$
|
||||||
int parsedDepth = Integer.parseInt(line.substring(7));
|
int parsedDepth = Integer.parseInt(line2.substring(7));
|
||||||
if (parsedDepth <= 0) {
|
if (parsedDepth <= 0) {
|
||||||
throw new PackProtocolException(
|
throw new PackProtocolException(
|
||||||
MessageFormat.format(JGitText.get().invalidDepth,
|
MessageFormat.format(JGitText.get().invalidDepth,
|
||||||
|
@ -181,19 +182,19 @@ FetchV2Request parseFetchRequest(PacketLineIn pckIn)
|
||||||
JGitText.get().deepenNotWithDeepen);
|
JGitText.get().deepenNotWithDeepen);
|
||||||
}
|
}
|
||||||
reqBuilder.setDepth(parsedDepth);
|
reqBuilder.setDepth(parsedDepth);
|
||||||
} else if (line.startsWith("deepen-not ")) { //$NON-NLS-1$
|
} else if (line2.startsWith("deepen-not ")) { //$NON-NLS-1$
|
||||||
reqBuilder.addDeepenNotRef(line.substring(11));
|
reqBuilder.addDeepenNotRef(line2.substring(11));
|
||||||
if (reqBuilder.getDepth() != 0) {
|
if (reqBuilder.getDepth() != 0) {
|
||||||
throw new PackProtocolException(
|
throw new PackProtocolException(
|
||||||
JGitText.get().deepenNotWithDeepen);
|
JGitText.get().deepenNotWithDeepen);
|
||||||
}
|
}
|
||||||
} else if (line.equals(OPTION_DEEPEN_RELATIVE)) {
|
} else if (line2.equals(OPTION_DEEPEN_RELATIVE)) {
|
||||||
reqBuilder.addClientCapability(OPTION_DEEPEN_RELATIVE);
|
reqBuilder.addClientCapability(OPTION_DEEPEN_RELATIVE);
|
||||||
} else if (line.startsWith("deepen-since ")) { //$NON-NLS-1$
|
} else if (line2.startsWith("deepen-since ")) { //$NON-NLS-1$
|
||||||
int ts = Integer.parseInt(line.substring(13));
|
int ts = Integer.parseInt(line2.substring(13));
|
||||||
if (ts <= 0) {
|
if (ts <= 0) {
|
||||||
throw new PackProtocolException(MessageFormat
|
throw new PackProtocolException(MessageFormat
|
||||||
.format(JGitText.get().invalidTimestamp, line));
|
.format(JGitText.get().invalidTimestamp, line2));
|
||||||
}
|
}
|
||||||
if (reqBuilder.getDepth() != 0) {
|
if (reqBuilder.getDepth() != 0) {
|
||||||
throw new PackProtocolException(
|
throw new PackProtocolException(
|
||||||
|
@ -201,17 +202,17 @@ FetchV2Request parseFetchRequest(PacketLineIn pckIn)
|
||||||
}
|
}
|
||||||
reqBuilder.setDeepenSince(ts);
|
reqBuilder.setDeepenSince(ts);
|
||||||
} else if (transferConfig.isAllowFilter()
|
} else if (transferConfig.isAllowFilter()
|
||||||
&& line.startsWith(OPTION_FILTER + ' ')) {
|
&& line2.startsWith(OPTION_FILTER + ' ')) {
|
||||||
if (filterReceived) {
|
if (filterReceived) {
|
||||||
throw new PackProtocolException(
|
throw new PackProtocolException(
|
||||||
JGitText.get().tooManyFilters);
|
JGitText.get().tooManyFilters);
|
||||||
}
|
}
|
||||||
filterReceived = true;
|
filterReceived = true;
|
||||||
reqBuilder.setFilterSpec(FilterSpec.fromFilterLine(
|
reqBuilder.setFilterSpec(FilterSpec.fromFilterLine(
|
||||||
line.substring(OPTION_FILTER.length() + 1)));
|
line2.substring(OPTION_FILTER.length() + 1)));
|
||||||
} else {
|
} else {
|
||||||
throw new PackProtocolException(MessageFormat
|
throw new PackProtocolException(MessageFormat
|
||||||
.format(JGitText.get().unexpectedPacketLine, line));
|
.format(JGitText.get().unexpectedPacketLine, line2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -244,25 +245,25 @@ LsRefsV2Request parseLsRefsRequest(PacketLineIn pckIn)
|
||||||
serverOption -> builder.addServerOption(serverOption),
|
serverOption -> builder.addServerOption(serverOption),
|
||||||
agent -> builder.setAgent(agent));
|
agent -> builder.setAgent(agent));
|
||||||
|
|
||||||
if (line == PacketLineIn.END) {
|
if (PacketLineIn.isEnd(line)) {
|
||||||
return builder.build();
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (line != PacketLineIn.DELIM) {
|
if (!PacketLineIn.isDelimiter(line)) {
|
||||||
throw new PackProtocolException(MessageFormat
|
throw new PackProtocolException(MessageFormat
|
||||||
.format(JGitText.get().unexpectedPacketLine, line));
|
.format(JGitText.get().unexpectedPacketLine, line));
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((line = pckIn.readString()) != PacketLineIn.END) {
|
for (String line2 : pckIn.readStrings()) {
|
||||||
if (line.equals("peel")) { //$NON-NLS-1$
|
if (line2.equals("peel")) { //$NON-NLS-1$
|
||||||
builder.setPeel(true);
|
builder.setPeel(true);
|
||||||
} else if (line.equals("symrefs")) { //$NON-NLS-1$
|
} else if (line2.equals("symrefs")) { //$NON-NLS-1$
|
||||||
builder.setSymrefs(true);
|
builder.setSymrefs(true);
|
||||||
} else if (line.startsWith("ref-prefix ")) { //$NON-NLS-1$
|
} else if (line2.startsWith("ref-prefix ")) { //$NON-NLS-1$
|
||||||
prefixes.add(line.substring("ref-prefix ".length())); //$NON-NLS-1$
|
prefixes.add(line2.substring("ref-prefix ".length())); //$NON-NLS-1$
|
||||||
} else {
|
} else {
|
||||||
throw new PackProtocolException(MessageFormat
|
throw new PackProtocolException(MessageFormat
|
||||||
.format(JGitText.get().unexpectedPacketLine, line));
|
.format(JGitText.get().unexpectedPacketLine, line2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -348,7 +348,7 @@ void readPostCommands(PacketLineIn in) throws IOException {
|
||||||
pushOptions = new ArrayList<>(4);
|
pushOptions = new ArrayList<>(4);
|
||||||
for (;;) {
|
for (;;) {
|
||||||
String option = in.readString();
|
String option = in.readString();
|
||||||
if (option == PacketLineIn.END) {
|
if (PacketLineIn.isEnd(option)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
pushOptions.add(option);
|
pushOptions.add(option);
|
||||||
|
|
|
@ -54,8 +54,11 @@
|
||||||
import static org.eclipse.jgit.util.HttpSupport.HDR_ACCEPT_ENCODING;
|
import static org.eclipse.jgit.util.HttpSupport.HDR_ACCEPT_ENCODING;
|
||||||
import static org.eclipse.jgit.util.HttpSupport.HDR_CONTENT_ENCODING;
|
import static org.eclipse.jgit.util.HttpSupport.HDR_CONTENT_ENCODING;
|
||||||
import static org.eclipse.jgit.util.HttpSupport.HDR_CONTENT_TYPE;
|
import static org.eclipse.jgit.util.HttpSupport.HDR_CONTENT_TYPE;
|
||||||
|
import static org.eclipse.jgit.util.HttpSupport.HDR_COOKIE;
|
||||||
import static org.eclipse.jgit.util.HttpSupport.HDR_LOCATION;
|
import static org.eclipse.jgit.util.HttpSupport.HDR_LOCATION;
|
||||||
import static org.eclipse.jgit.util.HttpSupport.HDR_PRAGMA;
|
import static org.eclipse.jgit.util.HttpSupport.HDR_PRAGMA;
|
||||||
|
import static org.eclipse.jgit.util.HttpSupport.HDR_SET_COOKIE;
|
||||||
|
import static org.eclipse.jgit.util.HttpSupport.HDR_SET_COOKIE2;
|
||||||
import static org.eclipse.jgit.util.HttpSupport.HDR_USER_AGENT;
|
import static org.eclipse.jgit.util.HttpSupport.HDR_USER_AGENT;
|
||||||
import static org.eclipse.jgit.util.HttpSupport.HDR_WWW_AUTHENTICATE;
|
import static org.eclipse.jgit.util.HttpSupport.HDR_WWW_AUTHENTICATE;
|
||||||
import static org.eclipse.jgit.util.HttpSupport.METHOD_GET;
|
import static org.eclipse.jgit.util.HttpSupport.METHOD_GET;
|
||||||
|
@ -68,11 +71,15 @@
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
import java.net.HttpCookie;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.Proxy;
|
import java.net.Proxy;
|
||||||
import java.net.ProxySelector;
|
import java.net.ProxySelector;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.nio.file.InvalidPathException;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
import java.security.cert.CertPathBuilderException;
|
import java.security.cert.CertPathBuilderException;
|
||||||
import java.security.cert.CertPathValidatorException;
|
import java.security.cert.CertPathValidatorException;
|
||||||
import java.security.cert.CertificateException;
|
import java.security.cert.CertificateException;
|
||||||
|
@ -84,6 +91,8 @@
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
@ -100,6 +109,8 @@
|
||||||
import org.eclipse.jgit.errors.TransportException;
|
import org.eclipse.jgit.errors.TransportException;
|
||||||
import org.eclipse.jgit.internal.JGitText;
|
import org.eclipse.jgit.internal.JGitText;
|
||||||
import org.eclipse.jgit.internal.storage.file.RefDirectory;
|
import org.eclipse.jgit.internal.storage.file.RefDirectory;
|
||||||
|
import org.eclipse.jgit.internal.transport.http.NetscapeCookieFile;
|
||||||
|
import org.eclipse.jgit.internal.transport.http.NetscapeCookieFileCache;
|
||||||
import org.eclipse.jgit.lib.Constants;
|
import org.eclipse.jgit.lib.Constants;
|
||||||
import org.eclipse.jgit.lib.ObjectId;
|
import org.eclipse.jgit.lib.ObjectId;
|
||||||
import org.eclipse.jgit.lib.ObjectIdRef;
|
import org.eclipse.jgit.lib.ObjectIdRef;
|
||||||
|
@ -116,6 +127,7 @@
|
||||||
import org.eclipse.jgit.util.HttpSupport;
|
import org.eclipse.jgit.util.HttpSupport;
|
||||||
import org.eclipse.jgit.util.IO;
|
import org.eclipse.jgit.util.IO;
|
||||||
import org.eclipse.jgit.util.RawParseUtils;
|
import org.eclipse.jgit.util.RawParseUtils;
|
||||||
|
import org.eclipse.jgit.util.StringUtils;
|
||||||
import org.eclipse.jgit.util.SystemReader;
|
import org.eclipse.jgit.util.SystemReader;
|
||||||
import org.eclipse.jgit.util.TemporaryBuffer;
|
import org.eclipse.jgit.util.TemporaryBuffer;
|
||||||
import org.eclipse.jgit.util.io.DisabledOutputStream;
|
import org.eclipse.jgit.util.io.DisabledOutputStream;
|
||||||
|
@ -274,6 +286,19 @@ public Transport open(URIish uri, Repository local, String remoteName)
|
||||||
|
|
||||||
private boolean sslFailure = false;
|
private boolean sslFailure = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All stored cookies bound to this repo (independent of the baseUrl)
|
||||||
|
*/
|
||||||
|
private final NetscapeCookieFile cookieFile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The cookies to be sent with each request to the given {@link #baseUrl}.
|
||||||
|
* Filtered view on top of {@link #cookieFile} where only cookies which
|
||||||
|
* apply to the current url are left. This set needs to be filtered for
|
||||||
|
* expired entries each time prior to sending them.
|
||||||
|
*/
|
||||||
|
private final Set<HttpCookie> relevantCookies;
|
||||||
|
|
||||||
TransportHttp(Repository local, URIish uri)
|
TransportHttp(Repository local, URIish uri)
|
||||||
throws NotSupportedException {
|
throws NotSupportedException {
|
||||||
super(local, uri);
|
super(local, uri);
|
||||||
|
@ -281,6 +306,8 @@ public Transport open(URIish uri, Repository local, String remoteName)
|
||||||
http = new HttpConfig(local.getConfig(), uri);
|
http = new HttpConfig(local.getConfig(), uri);
|
||||||
proxySelector = ProxySelector.getDefault();
|
proxySelector = ProxySelector.getDefault();
|
||||||
sslVerify = http.isSslVerify();
|
sslVerify = http.isSslVerify();
|
||||||
|
cookieFile = getCookieFileFromConfig(http);
|
||||||
|
relevantCookies = filterCookies(cookieFile, baseUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
private URL toURL(URIish urish) throws MalformedURLException {
|
private URL toURL(URIish urish) throws MalformedURLException {
|
||||||
|
@ -321,6 +348,8 @@ protected void setURI(URIish uri) throws NotSupportedException {
|
||||||
http = new HttpConfig(uri);
|
http = new HttpConfig(uri);
|
||||||
proxySelector = ProxySelector.getDefault();
|
proxySelector = ProxySelector.getDefault();
|
||||||
sslVerify = http.isSslVerify();
|
sslVerify = http.isSslVerify();
|
||||||
|
cookieFile = getCookieFileFromConfig(http);
|
||||||
|
relevantCookies = filterCookies(cookieFile, baseUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -508,6 +537,7 @@ private HttpConnection connect(String service)
|
||||||
conn.setRequestProperty(HDR_ACCEPT, "*/*"); //$NON-NLS-1$
|
conn.setRequestProperty(HDR_ACCEPT, "*/*"); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
final int status = HttpSupport.response(conn);
|
final int status = HttpSupport.response(conn);
|
||||||
|
processResponseCookies(conn);
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case HttpConnection.HTTP_OK:
|
case HttpConnection.HTTP_OK:
|
||||||
// Check if HttpConnection did some authentication in the
|
// Check if HttpConnection did some authentication in the
|
||||||
|
@ -596,6 +626,57 @@ private HttpConnection connect(String service)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void processResponseCookies(HttpConnection conn) {
|
||||||
|
if (cookieFile != null && http.getSaveCookies()) {
|
||||||
|
List<HttpCookie> foundCookies = new LinkedList<>();
|
||||||
|
|
||||||
|
List<String> cookieHeaderValues = conn
|
||||||
|
.getHeaderFields(HDR_SET_COOKIE);
|
||||||
|
if (!cookieHeaderValues.isEmpty()) {
|
||||||
|
foundCookies.addAll(
|
||||||
|
extractCookies(HDR_SET_COOKIE, cookieHeaderValues));
|
||||||
|
}
|
||||||
|
cookieHeaderValues = conn.getHeaderFields(HDR_SET_COOKIE2);
|
||||||
|
if (!cookieHeaderValues.isEmpty()) {
|
||||||
|
foundCookies.addAll(
|
||||||
|
extractCookies(HDR_SET_COOKIE2, cookieHeaderValues));
|
||||||
|
}
|
||||||
|
if (!foundCookies.isEmpty()) {
|
||||||
|
try {
|
||||||
|
// update cookie lists with the newly received cookies!
|
||||||
|
Set<HttpCookie> cookies = cookieFile.getCookies(false);
|
||||||
|
cookies.addAll(foundCookies);
|
||||||
|
cookieFile.write(baseUrl);
|
||||||
|
relevantCookies.addAll(foundCookies);
|
||||||
|
} catch (IOException | IllegalArgumentException
|
||||||
|
| InterruptedException e) {
|
||||||
|
LOG.warn(MessageFormat.format(
|
||||||
|
JGitText.get().couldNotPersistCookies,
|
||||||
|
cookieFile.getPath()), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<HttpCookie> extractCookies(String headerKey,
|
||||||
|
List<String> headerValues) {
|
||||||
|
List<HttpCookie> foundCookies = new LinkedList<>();
|
||||||
|
for (String headerValue : headerValues) {
|
||||||
|
foundCookies
|
||||||
|
.addAll(HttpCookie.parse(headerKey + ':' + headerValue));
|
||||||
|
}
|
||||||
|
// HttpCookies.parse(...) is only compliant with RFC 2965. Make it RFC
|
||||||
|
// 6265 compliant by applying the logic from
|
||||||
|
// https://tools.ietf.org/html/rfc6265#section-5.2.3
|
||||||
|
for (HttpCookie foundCookie : foundCookies) {
|
||||||
|
String domain = foundCookie.getDomain();
|
||||||
|
if (domain != null && domain.startsWith(".")) { //$NON-NLS-1$
|
||||||
|
foundCookie.setDomain(domain.substring(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return foundCookies;
|
||||||
|
}
|
||||||
|
|
||||||
private static class CredentialItems {
|
private static class CredentialItems {
|
||||||
CredentialItem.InformationalMessage message;
|
CredentialItem.InformationalMessage message;
|
||||||
|
|
||||||
|
@ -847,14 +928,35 @@ protected HttpConnection httpOpen(String method, URL u,
|
||||||
conn.setConnectTimeout(effTimeOut);
|
conn.setConnectTimeout(effTimeOut);
|
||||||
conn.setReadTimeout(effTimeOut);
|
conn.setReadTimeout(effTimeOut);
|
||||||
}
|
}
|
||||||
|
// set cookie header if necessary
|
||||||
|
if (!relevantCookies.isEmpty()) {
|
||||||
|
setCookieHeader(conn);
|
||||||
|
}
|
||||||
|
|
||||||
if (this.headers != null && !this.headers.isEmpty()) {
|
if (this.headers != null && !this.headers.isEmpty()) {
|
||||||
for (Map.Entry<String, String> entry : this.headers.entrySet())
|
for (Map.Entry<String, String> entry : this.headers.entrySet()) {
|
||||||
conn.setRequestProperty(entry.getKey(), entry.getValue());
|
conn.setRequestProperty(entry.getKey(), entry.getValue());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
authMethod.configureRequest(conn);
|
authMethod.configureRequest(conn);
|
||||||
return conn;
|
return conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setCookieHeader(HttpConnection conn) {
|
||||||
|
StringBuilder cookieHeaderValue = new StringBuilder();
|
||||||
|
for (HttpCookie cookie : relevantCookies) {
|
||||||
|
if (!cookie.hasExpired()) {
|
||||||
|
if (cookieHeaderValue.length() > 0) {
|
||||||
|
cookieHeaderValue.append(';');
|
||||||
|
}
|
||||||
|
cookieHeaderValue.append(cookie.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (cookieHeaderValue.length() > 0) {
|
||||||
|
conn.setRequestProperty(HDR_COOKIE, cookieHeaderValue.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
final InputStream openInputStream(HttpConnection conn)
|
final InputStream openInputStream(HttpConnection conn)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
InputStream input = conn.getInputStream();
|
InputStream input = conn.getInputStream();
|
||||||
|
@ -868,6 +970,150 @@ IOException wrongContentType(String expType, String actType) {
|
||||||
return new TransportException(uri, why);
|
return new TransportException(uri, why);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static NetscapeCookieFile getCookieFileFromConfig(
|
||||||
|
HttpConfig config) {
|
||||||
|
if (!StringUtils.isEmptyOrNull(config.getCookieFile())) {
|
||||||
|
try {
|
||||||
|
Path cookieFilePath = Paths.get(config.getCookieFile());
|
||||||
|
return NetscapeCookieFileCache.getInstance(config)
|
||||||
|
.getEntry(cookieFilePath);
|
||||||
|
} catch (InvalidPathException e) {
|
||||||
|
LOG.warn(MessageFormat.format(
|
||||||
|
JGitText.get().couldNotReadCookieFile,
|
||||||
|
config.getCookieFile()), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Set<HttpCookie> filterCookies(NetscapeCookieFile cookieFile,
|
||||||
|
URL url) {
|
||||||
|
if (cookieFile != null) {
|
||||||
|
return filterCookies(cookieFile.getCookies(true), url);
|
||||||
|
}
|
||||||
|
return Collections.emptySet();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param allCookies
|
||||||
|
* a list of cookies.
|
||||||
|
* @param url
|
||||||
|
* the url for which to filter the list of cookies.
|
||||||
|
* @return only the cookies from {@code allCookies} which are relevant (i.e.
|
||||||
|
* are not expired, have a matching domain, have a matching path and
|
||||||
|
* have a matching secure attribute)
|
||||||
|
*/
|
||||||
|
private static Set<HttpCookie> filterCookies(Set<HttpCookie> allCookies,
|
||||||
|
URL url) {
|
||||||
|
Set<HttpCookie> filteredCookies = new HashSet<>();
|
||||||
|
for (HttpCookie cookie : allCookies) {
|
||||||
|
if (cookie.hasExpired()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!matchesCookieDomain(url.getHost(), cookie.getDomain())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!matchesCookiePath(url.getPath(), cookie.getPath())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (cookie.getSecure() && !"https".equals(url.getProtocol())) { //$NON-NLS-1$
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
filteredCookies.add(cookie);
|
||||||
|
}
|
||||||
|
return filteredCookies;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* The utility method to check whether a host name is in a cookie's domain
|
||||||
|
* or not. Similar to {@link HttpCookie#domainMatches(String, String)} but
|
||||||
|
* implements domain matching rules according to
|
||||||
|
* <a href="https://tools.ietf.org/html/rfc6265#section-5.1.3">RFC 6265,
|
||||||
|
* section 5.1.3</a> instead of the rules from
|
||||||
|
* <a href="https://tools.ietf.org/html/rfc2965#section-3.3">RFC 2965,
|
||||||
|
* section 3.3.1</a>.
|
||||||
|
* <p>
|
||||||
|
* The former rules are also used by libcurl internally.
|
||||||
|
* <p>
|
||||||
|
* The rules are as follows
|
||||||
|
*
|
||||||
|
* A string matches another domain string if at least one of the following
|
||||||
|
* conditions holds:
|
||||||
|
* <ul>
|
||||||
|
* <li>The domain string and the string are identical. (Note that both the
|
||||||
|
* domain string and the string will have been canonicalized to lower case
|
||||||
|
* at this point.)</li>
|
||||||
|
* <li>All of the following conditions hold
|
||||||
|
* <ul>
|
||||||
|
* <li>The domain string is a suffix of the string.</li>
|
||||||
|
* <li>The last character of the string that is not included in the domain
|
||||||
|
* string is a %x2E (".") character.</li>
|
||||||
|
* <li>The string is a host name (i.e., not an IP address).</li>
|
||||||
|
* </ul>
|
||||||
|
* </li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* @param host
|
||||||
|
* the host to compare against the cookieDomain
|
||||||
|
* @param cookieDomain
|
||||||
|
* the domain to compare against
|
||||||
|
* @return {@code true} if they domain-match; {@code false} if not
|
||||||
|
*
|
||||||
|
* @see <a href= "https://tools.ietf.org/html/rfc6265#section-5.1.3">RFC
|
||||||
|
* 6265, section 5.1.3 (Domain Matching)</a>
|
||||||
|
* @see <a href=
|
||||||
|
* "https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8206092">JDK-8206092
|
||||||
|
* : HttpCookie.domainMatches() does not match to sub-sub-domain</a>
|
||||||
|
*/
|
||||||
|
static boolean matchesCookieDomain(String host, String cookieDomain) {
|
||||||
|
cookieDomain = cookieDomain.toLowerCase(Locale.ROOT);
|
||||||
|
host = host.toLowerCase(Locale.ROOT);
|
||||||
|
if (host.equals(cookieDomain)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
if (!host.endsWith(cookieDomain)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return host
|
||||||
|
.charAt(host.length() - cookieDomain.length() - 1) == '.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The utility method to check whether a path is matching a cookie path
|
||||||
|
* domain or not. The rules are defined by
|
||||||
|
* <a href="https://tools.ietf.org/html/rfc6265#section-5.1.4">RFC 6265,
|
||||||
|
* section 5.1.4</a>:
|
||||||
|
*
|
||||||
|
* A request-path path-matches a given cookie-path if at least one of the
|
||||||
|
* following conditions holds:
|
||||||
|
* <ul>
|
||||||
|
* <li>The cookie-path and the request-path are identical.</li>
|
||||||
|
* <li>The cookie-path is a prefix of the request-path, and the last
|
||||||
|
* character of the cookie-path is %x2F ("/").</li>
|
||||||
|
* <li>The cookie-path is a prefix of the request-path, and the first
|
||||||
|
* character of the request-path that is not included in the cookie- path is
|
||||||
|
* a %x2F ("/") character.</li>
|
||||||
|
* </ul>
|
||||||
|
* @param path
|
||||||
|
* the path to check
|
||||||
|
* @param cookiePath
|
||||||
|
* the cookie's path
|
||||||
|
*
|
||||||
|
* @return {@code true} if they path-match; {@code false} if not
|
||||||
|
*/
|
||||||
|
static boolean matchesCookiePath(String path, String cookiePath) {
|
||||||
|
if (cookiePath.equals(path)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!cookiePath.endsWith("/")) { //$NON-NLS-1$
|
||||||
|
cookiePath += "/"; //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
return path.startsWith(cookiePath);
|
||||||
|
}
|
||||||
|
|
||||||
private boolean isSmartHttp(HttpConnection c, String service) {
|
private boolean isSmartHttp(HttpConnection c, String service) {
|
||||||
final String expType = "application/x-" + service + "-advertisement"; //$NON-NLS-1$ //$NON-NLS-2$
|
final String expType = "application/x-" + service + "-advertisement"; //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
final String actType = c.getContentType();
|
final String actType = c.getContentType();
|
||||||
|
@ -902,7 +1148,7 @@ private void readSmartHeaders(InputStream in, String service)
|
||||||
JGitText.get().expectedGot, exp, act));
|
JGitText.get().expectedGot, exp, act));
|
||||||
}
|
}
|
||||||
|
|
||||||
while (pckIn.readString() != PacketLineIn.END) {
|
while (!PacketLineIn.isEnd(pckIn.readString())) {
|
||||||
// for now, ignore the remaining header lines
|
// for now, ignore the remaining header lines
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -106,10 +106,8 @@
|
||||||
import org.eclipse.jgit.lib.Repository;
|
import org.eclipse.jgit.lib.Repository;
|
||||||
import org.eclipse.jgit.revwalk.AsyncRevObjectQueue;
|
import org.eclipse.jgit.revwalk.AsyncRevObjectQueue;
|
||||||
import org.eclipse.jgit.revwalk.BitmapWalker;
|
import org.eclipse.jgit.revwalk.BitmapWalker;
|
||||||
import org.eclipse.jgit.revwalk.BitmappedReachabilityChecker;
|
|
||||||
import org.eclipse.jgit.revwalk.DepthWalk;
|
import org.eclipse.jgit.revwalk.DepthWalk;
|
||||||
import org.eclipse.jgit.revwalk.ObjectWalk;
|
import org.eclipse.jgit.revwalk.ObjectWalk;
|
||||||
import org.eclipse.jgit.revwalk.PedestrianReachabilityChecker;
|
|
||||||
import org.eclipse.jgit.revwalk.ReachabilityChecker;
|
import org.eclipse.jgit.revwalk.ReachabilityChecker;
|
||||||
import org.eclipse.jgit.revwalk.RevCommit;
|
import org.eclipse.jgit.revwalk.RevCommit;
|
||||||
import org.eclipse.jgit.revwalk.RevFlag;
|
import org.eclipse.jgit.revwalk.RevFlag;
|
||||||
|
@ -1231,7 +1229,7 @@ private boolean serveOneCommandV2() throws IOException {
|
||||||
/* EOF when awaiting command is fine */
|
/* EOF when awaiting command is fine */
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (command == PacketLineIn.END) {
|
if (PacketLineIn.isEnd(command)) {
|
||||||
// A blank request is valid according
|
// A blank request is valid according
|
||||||
// to the protocol; do nothing in this
|
// to the protocol; do nothing in this
|
||||||
// case.
|
// case.
|
||||||
|
@ -1602,7 +1600,7 @@ private boolean negotiate(FetchRequest req,
|
||||||
throw eof;
|
throw eof;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (line == PacketLineIn.END) {
|
if (PacketLineIn.isEnd(line)) {
|
||||||
last = processHaveLines(peerHas, last, pckOut);
|
last = processHaveLines(peerHas, last, pckOut);
|
||||||
if (commonBase.isEmpty() || multiAck != MultiAck.OFF)
|
if (commonBase.isEmpty() || multiAck != MultiAck.OFF)
|
||||||
pckOut.writeString("NAK\n"); //$NON-NLS-1$
|
pckOut.writeString("NAK\n"); //$NON-NLS-1$
|
||||||
|
@ -1909,9 +1907,8 @@ private static void checkNotAdvertisedWants(UploadPack up,
|
||||||
}
|
}
|
||||||
|
|
||||||
// All wants are commits, we can use ReachabilityChecker
|
// All wants are commits, we can use ReachabilityChecker
|
||||||
ReachabilityChecker reachabilityChecker = repoHasBitmaps
|
ReachabilityChecker reachabilityChecker = walk
|
||||||
? new BitmappedReachabilityChecker(walk)
|
.createReachabilityChecker();
|
||||||
: new PedestrianReachabilityChecker(true, walk);
|
|
||||||
|
|
||||||
List<RevCommit> starters = objectIdsToRevCommits(walk,
|
List<RevCommit> starters = objectIdsToRevCommits(walk,
|
||||||
reachableFrom);
|
reachableFrom);
|
||||||
|
|
|
@ -1516,6 +1516,7 @@ private boolean hasCrLfInIndex(DirCacheIterator dirCache) {
|
||||||
ObjectId blobId = entry.getObjectId();
|
ObjectId blobId = entry.getObjectId();
|
||||||
if (entry.getStage() > 0
|
if (entry.getStage() > 0
|
||||||
&& entry.getStage() != DirCacheEntry.STAGE_2) {
|
&& entry.getStage() != DirCacheEntry.STAGE_2) {
|
||||||
|
blobId = null;
|
||||||
// Merge conflict: check ours (stage 2)
|
// Merge conflict: check ours (stage 2)
|
||||||
byte[] name = entry.getRawPath();
|
byte[] name = entry.getRawPath();
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
@ -1523,7 +1524,8 @@ private boolean hasCrLfInIndex(DirCacheIterator dirCache) {
|
||||||
dirCache.next(1);
|
dirCache.next(1);
|
||||||
i++;
|
i++;
|
||||||
entry = dirCache.getDirCacheEntry();
|
entry = dirCache.getDirCacheEntry();
|
||||||
if (!Arrays.equals(name, entry.getRawPath())) {
|
if (entry == null
|
||||||
|
|| !Arrays.equals(name, entry.getRawPath())) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (entry.getStage() == DirCacheEntry.STAGE_2) {
|
if (entry.getStage() == DirCacheEntry.STAGE_2) {
|
||||||
|
@ -1533,8 +1535,10 @@ private boolean hasCrLfInIndex(DirCacheIterator dirCache) {
|
||||||
}
|
}
|
||||||
dirCache.back(i);
|
dirCache.back(i);
|
||||||
}
|
}
|
||||||
|
if (blobId != null) {
|
||||||
try (ObjectReader reader = repository.newObjectReader()) {
|
try (ObjectReader reader = repository.newObjectReader()) {
|
||||||
ObjectLoader loader = reader.open(blobId, Constants.OBJ_BLOB);
|
ObjectLoader loader = reader.open(blobId,
|
||||||
|
Constants.OBJ_BLOB);
|
||||||
try {
|
try {
|
||||||
return RawText.isCrLfText(loader.getCachedBytes());
|
return RawText.isCrLfText(loader.getCachedBytes());
|
||||||
} catch (LargeObjectException e) {
|
} catch (LargeObjectException e) {
|
||||||
|
@ -1546,6 +1550,7 @@ private boolean hasCrLfInIndex(DirCacheIterator dirCache) {
|
||||||
// Ignore and return false below
|
// Ignore and return false below
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,8 @@
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.nio.file.AccessDeniedException;
|
import java.nio.file.FileStore;
|
||||||
|
import java.nio.file.FileSystemException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
|
@ -57,9 +58,11 @@
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
import org.eclipse.jgit.annotations.Nullable;
|
import org.eclipse.jgit.annotations.Nullable;
|
||||||
import org.eclipse.jgit.api.errors.JGitInternalException;
|
import org.eclipse.jgit.api.errors.JGitInternalException;
|
||||||
|
@ -84,7 +87,7 @@ public class FS_POSIX extends FS {
|
||||||
private static final int DEFAULT_UMASK = 0022;
|
private static final int DEFAULT_UMASK = 0022;
|
||||||
private volatile int umask = -1;
|
private volatile int umask = -1;
|
||||||
|
|
||||||
private volatile boolean supportsUnixNLink = true;
|
private static final Map<FileStore, Boolean> CAN_HARD_LINK = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
private volatile AtomicFileCreation supportsAtomicCreateNewFile = AtomicFileCreation.UNDEFINED;
|
private volatile AtomicFileCreation supportsAtomicCreateNewFile = AtomicFileCreation.UNDEFINED;
|
||||||
|
|
||||||
|
@ -388,12 +391,18 @@ public boolean createNewFile(File lock) throws IOException {
|
||||||
if (!lock.createNewFile()) {
|
if (!lock.createNewFile()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (supportsAtomicCreateNewFile() || !supportsUnixNLink) {
|
if (supportsAtomicCreateNewFile()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
Path lockPath = lock.toPath();
|
Path lockPath = lock.toPath();
|
||||||
Path link = null;
|
Path link = null;
|
||||||
|
FileStore store = Files.getFileStore(lockPath);
|
||||||
try {
|
try {
|
||||||
|
Boolean canLink = CAN_HARD_LINK.computeIfAbsent(store,
|
||||||
|
s -> Boolean.TRUE);
|
||||||
|
if (Boolean.FALSE.equals(canLink)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
link = Files.createLink(
|
link = Files.createLink(
|
||||||
Paths.get(lock.getAbsolutePath() + ".lnk"), //$NON-NLS-1$
|
Paths.get(lock.getAbsolutePath() + ".lnk"), //$NON-NLS-1$
|
||||||
lockPath);
|
lockPath);
|
||||||
|
@ -405,11 +414,11 @@ public boolean createNewFile(File lock) throws IOException {
|
||||||
nlink));
|
nlink));
|
||||||
return false;
|
return false;
|
||||||
} else if (nlink < 2) {
|
} else if (nlink < 2) {
|
||||||
supportsUnixNLink = false;
|
CAN_HARD_LINK.put(store, Boolean.FALSE);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} catch (UnsupportedOperationException | IllegalArgumentException e) {
|
} catch (UnsupportedOperationException | IllegalArgumentException e) {
|
||||||
supportsUnixNLink = false;
|
CAN_HARD_LINK.put(store, Boolean.FALSE);
|
||||||
return true;
|
return true;
|
||||||
} finally {
|
} finally {
|
||||||
if (link != null) {
|
if (link != null) {
|
||||||
|
@ -448,12 +457,18 @@ public LockToken createNewFileAtomic(File file) throws IOException {
|
||||||
if (!file.createNewFile()) {
|
if (!file.createNewFile()) {
|
||||||
return token(false, null);
|
return token(false, null);
|
||||||
}
|
}
|
||||||
if (supportsAtomicCreateNewFile() || !supportsUnixNLink) {
|
if (supportsAtomicCreateNewFile()) {
|
||||||
return token(true, null);
|
return token(true, null);
|
||||||
}
|
}
|
||||||
Path link = null;
|
Path link = null;
|
||||||
Path path = file.toPath();
|
Path path = file.toPath();
|
||||||
|
FileStore store = Files.getFileStore(path);
|
||||||
try {
|
try {
|
||||||
|
Boolean canLink = CAN_HARD_LINK.computeIfAbsent(store,
|
||||||
|
s -> Boolean.TRUE);
|
||||||
|
if (Boolean.FALSE.equals(canLink)) {
|
||||||
|
return token(true, null);
|
||||||
|
}
|
||||||
link = Files.createLink(Paths.get(uniqueLinkPath(file)), path);
|
link = Files.createLink(Paths.get(uniqueLinkPath(file)), path);
|
||||||
Integer nlink = (Integer) (Files.getAttribute(path,
|
Integer nlink = (Integer) (Files.getAttribute(path,
|
||||||
"unix:nlink")); //$NON-NLS-1$
|
"unix:nlink")); //$NON-NLS-1$
|
||||||
|
@ -462,12 +477,12 @@ public LockToken createNewFileAtomic(File file) throws IOException {
|
||||||
JGitText.get().failedAtomicFileCreation, path, nlink));
|
JGitText.get().failedAtomicFileCreation, path, nlink));
|
||||||
return token(false, link);
|
return token(false, link);
|
||||||
} else if (nlink.intValue() < 2) {
|
} else if (nlink.intValue() < 2) {
|
||||||
supportsUnixNLink = false;
|
CAN_HARD_LINK.put(store, Boolean.FALSE);
|
||||||
}
|
}
|
||||||
return token(true, link);
|
return token(true, link);
|
||||||
} catch (UnsupportedOperationException | IllegalArgumentException
|
} catch (UnsupportedOperationException | IllegalArgumentException
|
||||||
| AccessDeniedException | SecurityException e) {
|
| FileSystemException | SecurityException e) {
|
||||||
supportsUnixNLink = false;
|
CAN_HARD_LINK.put(store, Boolean.FALSE);
|
||||||
return token(true, link);
|
return token(true, link);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -205,18 +205,21 @@ protected File discoverGitExe() {
|
||||||
@Override
|
@Override
|
||||||
protected File userHomeImpl() {
|
protected File userHomeImpl() {
|
||||||
String home = SystemReader.getInstance().getenv("HOME"); //$NON-NLS-1$
|
String home = SystemReader.getInstance().getenv("HOME"); //$NON-NLS-1$
|
||||||
if (home != null)
|
if (home != null) {
|
||||||
return resolve(null, home);
|
return resolve(null, home);
|
||||||
|
}
|
||||||
String homeDrive = SystemReader.getInstance().getenv("HOMEDRIVE"); //$NON-NLS-1$
|
String homeDrive = SystemReader.getInstance().getenv("HOMEDRIVE"); //$NON-NLS-1$
|
||||||
if (homeDrive != null) {
|
if (homeDrive != null) {
|
||||||
String homePath = SystemReader.getInstance().getenv("HOMEPATH"); //$NON-NLS-1$
|
String homePath = SystemReader.getInstance().getenv("HOMEPATH"); //$NON-NLS-1$
|
||||||
if (homePath != null)
|
if (homePath != null) {
|
||||||
return new File(homeDrive, homePath);
|
return new File(homeDrive, homePath);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
String homeShare = SystemReader.getInstance().getenv("HOMESHARE"); //$NON-NLS-1$
|
String homeShare = SystemReader.getInstance().getenv("HOMESHARE"); //$NON-NLS-1$
|
||||||
if (homeShare != null)
|
if (homeShare != null) {
|
||||||
return new File(homeShare);
|
return new File(homeShare);
|
||||||
|
}
|
||||||
|
|
||||||
return super.userHomeImpl();
|
return super.userHomeImpl();
|
||||||
}
|
}
|
||||||
|
@ -237,8 +240,9 @@ public ProcessBuilder runInShell(String cmd, String[] args) {
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
@Override
|
@Override
|
||||||
public boolean supportsSymlinks() {
|
public boolean supportsSymlinks() {
|
||||||
if (supportSymlinks == null)
|
if (supportSymlinks == null) {
|
||||||
detectSymlinkSupport();
|
detectSymlinkSupport();
|
||||||
|
}
|
||||||
return Boolean.TRUE.equals(supportSymlinks);
|
return Boolean.TRUE.equals(supportSymlinks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,7 +258,7 @@ private void detectSymlinkSupport() {
|
||||||
| InternalError e) {
|
| InternalError e) {
|
||||||
supportSymlinks = Boolean.FALSE;
|
supportSymlinks = Boolean.FALSE;
|
||||||
} finally {
|
} finally {
|
||||||
if (tempFile != null)
|
if (tempFile != null) {
|
||||||
try {
|
try {
|
||||||
FileUtils.delete(tempFile);
|
FileUtils.delete(tempFile);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
@ -262,6 +266,7 @@ private void detectSymlinkSupport() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -169,6 +169,27 @@ public class HttpSupport {
|
||||||
/** The {@code WWW-Authenticate} header. */
|
/** The {@code WWW-Authenticate} header. */
|
||||||
public static final String HDR_WWW_AUTHENTICATE = "WWW-Authenticate"; //$NON-NLS-1$
|
public static final String HDR_WWW_AUTHENTICATE = "WWW-Authenticate"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The {@code Cookie} header.
|
||||||
|
*
|
||||||
|
* @since 5.4
|
||||||
|
*/
|
||||||
|
public static final String HDR_COOKIE = "Cookie"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The {@code Set-Cookie} header.
|
||||||
|
*
|
||||||
|
* @since 5.4
|
||||||
|
*/
|
||||||
|
public static final String HDR_SET_COOKIE = "Set-Cookie"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The {@code Set-Cookie2} header.
|
||||||
|
*
|
||||||
|
* @since 5.4
|
||||||
|
*/
|
||||||
|
public static final String HDR_SET_COOKIE2 = "Set-Cookie2"; //$NON-NLS-1$
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* URL encode a value string into an output buffer.
|
* URL encode a value string into an output buffer.
|
||||||
*
|
*
|
||||||
|
|
|
@ -0,0 +1,83 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018, Konrad Windszus <konrad_w@gmx.de>
|
||||||
|
* and other copyright owners as documented in the project's IP log.
|
||||||
|
*
|
||||||
|
* This program and the accompanying materials are made available
|
||||||
|
* under the terms of the Eclipse Distribution License v1.0 which
|
||||||
|
* accompanies this distribution, is reproduced below, and is
|
||||||
|
* available at http://www.eclipse.org/org/documents/edl-v10.php
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or
|
||||||
|
* without modification, are permitted provided that the following
|
||||||
|
* conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following
|
||||||
|
* disclaimer in the documentation and/or other materials provided
|
||||||
|
* with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Eclipse Foundation, Inc. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote
|
||||||
|
* products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
package org.eclipse.jgit.util;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map with only up to n entries. If a new entry is added so that the map
|
||||||
|
* contains more than those n entries the least-recently used entry is removed
|
||||||
|
* from the map.
|
||||||
|
*
|
||||||
|
* @param <K>
|
||||||
|
* the type of keys maintained by this map
|
||||||
|
* @param <V>
|
||||||
|
* the type of mapped values
|
||||||
|
*
|
||||||
|
* @since 5.4
|
||||||
|
*/
|
||||||
|
public class LRUMap<K, V> extends LinkedHashMap<K, V> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 4329609127403759486L;
|
||||||
|
|
||||||
|
private final int limit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs an empty map which may contain at most the given amount of
|
||||||
|
* entries.
|
||||||
|
*
|
||||||
|
* @param initialCapacity
|
||||||
|
* the initial capacity
|
||||||
|
* @param limit
|
||||||
|
* the number of entries the map should have at most
|
||||||
|
*/
|
||||||
|
public LRUMap(int initialCapacity, int limit) {
|
||||||
|
super(initialCapacity, 0.75f, true);
|
||||||
|
this.limit = limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
|
||||||
|
return size() > limit;
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue