Browse Source
* master: Fix warnings in ObjectFilter Fix typo in reflog message written by RebaseCommand.tryFastForward() Correct @since tags for ObjectFilter Fix typo in ObjectWalk#getObjectFilter javadoc Allow ObjectWalk to be filtered by an arbitrary predicate Remove SoftReference from dfs.DeltaBaseCache Fix memory leak in dfs.DeltaBaseCase Update to Jetty 9.2.10 Update javax.servlet to 3.1 Use ANY_DIFF filter in ResolveMerger only for bare repositories FS_POSIX: Rework umask detection to make it settable Expose disposeBody() on RevCommit and RevTag ObjectReader: remove the walkAdvice API RevWalk: Discard uninteresting commits unless RevSort.BOUNDARY ObjectWalk: make setRetainBody(false) the default Do not concatenate strings as arguments to StringBuilder.append() IndexDiffFilter: Simplify a boolean expression GroupHead: Remove a redundant call to String.format() FS_Win32: Avoid an IOException on Windows if bash is not in PATH Skip logging stack trace on corrupt objects Add repository name to failures in HTTP server log Fix possible AIOOB in DirCacheTree.contains() Delete deprecated PackWriter.preparePack() methods Delete deprecated class IgnoreRule Delete deprecated checkoutEntry() methods in DirCacheCheckout Fix IllegalArgumentException in AmazonS3 Change-Id: Ica3d4f0675c81684fbe48fcf0053f2a949bc5c9b Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>stable-4.0
Matthias Sohn
10 years ago
64 changed files with 856 additions and 1575 deletions
@ -1,20 +0,0 @@
|
||||
target "jetty-7.6.14" with source configurePhase |
||||
|
||||
location jetty-7.6.14 "http://download.eclipse.org/jetty/updates/jetty-bundles-7.x/7.6.14.v20131031/" { |
||||
org.eclipse.jetty.client [7.6.14.v20131031,7.6.14.v20131031] |
||||
org.eclipse.jetty.client.source [7.6.14.v20131031,7.6.14.v20131031] |
||||
org.eclipse.jetty.continuation [7.6.14.v20131031,7.6.14.v20131031] |
||||
org.eclipse.jetty.continuation.source [7.6.14.v20131031,7.6.14.v20131031] |
||||
org.eclipse.jetty.http [7.6.14.v20131031,7.6.14.v20131031] |
||||
org.eclipse.jetty.http.source [7.6.14.v20131031,7.6.14.v20131031] |
||||
org.eclipse.jetty.io [7.6.14.v20131031,7.6.14.v20131031] |
||||
org.eclipse.jetty.io.source [7.6.14.v20131031,7.6.14.v20131031] |
||||
org.eclipse.jetty.security [7.6.14.v20131031,7.6.14.v20131031] |
||||
org.eclipse.jetty.security.source [7.6.14.v20131031,7.6.14.v20131031] |
||||
org.eclipse.jetty.server [7.6.14.v20131031,7.6.14.v20131031] |
||||
org.eclipse.jetty.server.source [7.6.14.v20131031,7.6.14.v20131031] |
||||
org.eclipse.jetty.servlet [7.6.14.v20131031,7.6.14.v20131031] |
||||
org.eclipse.jetty.servlet.source [7.6.14.v20131031,7.6.14.v20131031] |
||||
org.eclipse.jetty.util [7.6.14.v20131031,7.6.14.v20131031] |
||||
org.eclipse.jetty.util.source [7.6.14.v20131031,7.6.14.v20131031] |
||||
} |
@ -0,0 +1,20 @@
|
||||
target "jetty-9.2.10" with source configurePhase |
||||
|
||||
location jetty-9.2.10 "http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.2.10.v20150310/" { |
||||
org.eclipse.jetty.client [9.2.10.v20150310,9.2.10.v20150310] |
||||
org.eclipse.jetty.client.source [9.2.10.v20150310,9.2.10.v20150310] |
||||
org.eclipse.jetty.continuation [9.2.10.v20150310,9.2.10.v20150310] |
||||
org.eclipse.jetty.continuation.source [9.2.10.v20150310,9.2.10.v20150310] |
||||
org.eclipse.jetty.http [9.2.10.v20150310,9.2.10.v20150310] |
||||
org.eclipse.jetty.http.source [9.2.10.v20150310,9.2.10.v20150310] |
||||
org.eclipse.jetty.io [9.2.10.v20150310,9.2.10.v20150310] |
||||
org.eclipse.jetty.io.source [9.2.10.v20150310,9.2.10.v20150310] |
||||
org.eclipse.jetty.security [9.2.10.v20150310,9.2.10.v20150310] |
||||
org.eclipse.jetty.security.source [9.2.10.v20150310,9.2.10.v20150310] |
||||
org.eclipse.jetty.server [9.2.10.v20150310,9.2.10.v20150310] |
||||
org.eclipse.jetty.server.source [9.2.10.v20150310,9.2.10.v20150310] |
||||
org.eclipse.jetty.servlet [9.2.10.v20150310,9.2.10.v20150310] |
||||
org.eclipse.jetty.servlet.source [9.2.10.v20150310,9.2.10.v20150310] |
||||
org.eclipse.jetty.util [9.2.10.v20150310,9.2.10.v20150310] |
||||
org.eclipse.jetty.util.source [9.2.10.v20150310,9.2.10.v20150310] |
||||
} |
@ -1,400 +0,0 @@
|
||||
/* |
||||
* Copyright (C) 2010, Red Hat Inc. |
||||
* 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.ignore; |
||||
|
||||
import static org.junit.Assert.assertEquals; |
||||
import static org.junit.Assert.assertFalse; |
||||
import static org.junit.Assert.assertTrue; |
||||
|
||||
import org.junit.Test; |
||||
|
||||
|
||||
/** |
||||
* Tests ignore pattern matches |
||||
*/ |
||||
@SuppressWarnings("deprecation") |
||||
public class IgnoreMatcherTest { |
||||
|
||||
@Test |
||||
public void testBasic() { |
||||
String pattern = "/test.stp"; |
||||
assertMatched(pattern, "/test.stp"); |
||||
|
||||
pattern = "#/test.stp"; |
||||
assertNotMatched(pattern, "/test.stp"); |
||||
} |
||||
|
||||
@Test |
||||
public void testFileNameWildcards() { |
||||
//Test basic * and ? for any pattern + any character
|
||||
String pattern = "*.st?"; |
||||
assertMatched(pattern, "/test.stp"); |
||||
assertMatched(pattern, "/anothertest.stg"); |
||||
assertMatched(pattern, "/anothertest.st0"); |
||||
assertNotMatched(pattern, "/anothertest.sta1"); |
||||
//Check that asterisk does not expand to "/"
|
||||
assertNotMatched(pattern, "/another/test.sta1"); |
||||
|
||||
//Same as above, with a leading slash to ensure that doesn't cause problems
|
||||
pattern = "/*.st?"; |
||||
assertMatched(pattern, "/test.stp"); |
||||
assertMatched(pattern, "/anothertest.stg"); |
||||
assertMatched(pattern, "/anothertest.st0"); |
||||
assertNotMatched(pattern, "/anothertest.sta1"); |
||||
//Check that asterisk does not expand to "/"
|
||||
assertNotMatched(pattern, "/another/test.sta1"); |
||||
|
||||
//Test for numbers
|
||||
pattern = "*.sta[0-5]"; |
||||
assertMatched(pattern, "/test.sta5"); |
||||
assertMatched(pattern, "/test.sta4"); |
||||
assertMatched(pattern, "/test.sta3"); |
||||
assertMatched(pattern, "/test.sta2"); |
||||
assertMatched(pattern, "/test.sta1"); |
||||
assertMatched(pattern, "/test.sta0"); |
||||
assertMatched(pattern, "/anothertest.sta2"); |
||||
assertNotMatched(pattern, "test.stag"); |
||||
assertNotMatched(pattern, "test.sta6"); |
||||
|
||||
//Test for letters
|
||||
pattern = "/[tv]est.sta[a-d]"; |
||||
assertMatched(pattern, "/test.staa"); |
||||
assertMatched(pattern, "/test.stab"); |
||||
assertMatched(pattern, "/test.stac"); |
||||
assertMatched(pattern, "/test.stad"); |
||||
assertMatched(pattern, "/vest.stac"); |
||||
assertNotMatched(pattern, "test.stae"); |
||||
assertNotMatched(pattern, "test.sta9"); |
||||
|
||||
//Test child directory/file is matched
|
||||
pattern = "/src/ne?"; |
||||
assertMatched(pattern, "/src/new/"); |
||||
assertMatched(pattern, "/src/new"); |
||||
assertMatched(pattern, "/src/new/a.c"); |
||||
assertMatched(pattern, "/src/new/a/a.c"); |
||||
assertNotMatched(pattern, "/src/new.c"); |
||||
|
||||
//Test name-only fnmatcher matches
|
||||
pattern = "ne?"; |
||||
assertMatched(pattern, "/src/new/"); |
||||
assertMatched(pattern, "/src/new"); |
||||
assertMatched(pattern, "/src/new/a.c"); |
||||
assertMatched(pattern, "/src/new/a/a.c"); |
||||
assertMatched(pattern, "/neb"); |
||||
assertNotMatched(pattern, "/src/new.c"); |
||||
} |
||||
|
||||
@Test |
||||
public void testTargetWithoutLeadingSlash() { |
||||
//Test basic * and ? for any pattern + any character
|
||||
String pattern = "/*.st?"; |
||||
assertMatched(pattern, "test.stp"); |
||||
assertMatched(pattern, "anothertest.stg"); |
||||
assertMatched(pattern, "anothertest.st0"); |
||||
assertNotMatched(pattern, "anothertest.sta1"); |
||||
//Check that asterisk does not expand to ""
|
||||
assertNotMatched(pattern, "another/test.sta1"); |
||||
|
||||
//Same as above, with a leading slash to ensure that doesn't cause problems
|
||||
pattern = "/*.st?"; |
||||
assertMatched(pattern, "test.stp"); |
||||
assertMatched(pattern, "anothertest.stg"); |
||||
assertMatched(pattern, "anothertest.st0"); |
||||
assertNotMatched(pattern, "anothertest.sta1"); |
||||
//Check that asterisk does not expand to ""
|
||||
assertNotMatched(pattern, "another/test.sta1"); |
||||
|
||||
//Test for numbers
|
||||
pattern = "/*.sta[0-5]"; |
||||
assertMatched(pattern, "test.sta5"); |
||||
assertMatched(pattern, "test.sta4"); |
||||
assertMatched(pattern, "test.sta3"); |
||||
assertMatched(pattern, "test.sta2"); |
||||
assertMatched(pattern, "test.sta1"); |
||||
assertMatched(pattern, "test.sta0"); |
||||
assertMatched(pattern, "anothertest.sta2"); |
||||
assertNotMatched(pattern, "test.stag"); |
||||
assertNotMatched(pattern, "test.sta6"); |
||||
|
||||
//Test for letters
|
||||
pattern = "/[tv]est.sta[a-d]"; |
||||
assertMatched(pattern, "test.staa"); |
||||
assertMatched(pattern, "test.stab"); |
||||
assertMatched(pattern, "test.stac"); |
||||
assertMatched(pattern, "test.stad"); |
||||
assertMatched(pattern, "vest.stac"); |
||||
assertNotMatched(pattern, "test.stae"); |
||||
assertNotMatched(pattern, "test.sta9"); |
||||
|
||||
//Test child directory/file is matched
|
||||
pattern = "/src/ne?"; |
||||
assertMatched(pattern, "src/new/"); |
||||
assertMatched(pattern, "src/new"); |
||||
assertMatched(pattern, "src/new/a.c"); |
||||
assertMatched(pattern, "src/new/a/a.c"); |
||||
assertNotMatched(pattern, "src/new.c"); |
||||
|
||||
//Test name-only fnmatcher matches
|
||||
pattern = "ne?"; |
||||
assertMatched(pattern, "src/new/"); |
||||
assertMatched(pattern, "src/new"); |
||||
assertMatched(pattern, "src/new/a.c"); |
||||
assertMatched(pattern, "src/new/a/a.c"); |
||||
assertMatched(pattern, "neb"); |
||||
assertNotMatched(pattern, "src/new.c"); |
||||
} |
||||
|
||||
@Test |
||||
public void testParentDirectoryGitIgnores() { |
||||
//Contains git ignore patterns such as might be seen in a parent directory
|
||||
|
||||
//Test for wildcards
|
||||
String pattern = "/*/*.c"; |
||||
assertMatched(pattern, "/file/a.c"); |
||||
assertMatched(pattern, "/src/a.c"); |
||||
assertNotMatched(pattern, "/src/new/a.c"); |
||||
|
||||
//Test child directory/file is matched
|
||||
pattern = "/src/new"; |
||||
assertMatched(pattern, "/src/new/"); |
||||
assertMatched(pattern, "/src/new"); |
||||
assertMatched(pattern, "/src/new/a.c"); |
||||
assertMatched(pattern, "/src/new/a/a.c"); |
||||
assertNotMatched(pattern, "/src/new.c"); |
||||
|
||||
//Test child directory is matched, slash after name
|
||||
pattern = "/src/new/"; |
||||
assertMatched(pattern, "/src/new/"); |
||||
assertMatched(pattern, "/src/new/a.c"); |
||||
assertMatched(pattern, "/src/new/a/a.c"); |
||||
assertNotMatched(pattern, "/src/new"); |
||||
assertNotMatched(pattern, "/src/new.c"); |
||||
|
||||
//Test directory is matched by name only
|
||||
pattern = "b1"; |
||||
assertMatched(pattern, "/src/new/a/b1/a.c"); |
||||
assertNotMatched(pattern, "/src/new/a/b2/file.c"); |
||||
assertNotMatched(pattern, "/src/new/a/bb1/file.c"); |
||||
assertNotMatched(pattern, "/src/new/a/file.c"); |
||||
} |
||||
|
||||
@Test |
||||
public void testTrailingSlash() { |
||||
String pattern = "/src/"; |
||||
assertMatched(pattern, "/src/"); |
||||
assertMatched(pattern, "/src/new"); |
||||
assertMatched(pattern, "/src/new/a.c"); |
||||
assertMatched(pattern, "/src/a.c"); |
||||
assertNotMatched(pattern, "/src"); |
||||
assertNotMatched(pattern, "/srcA/"); |
||||
} |
||||
|
||||
@Test |
||||
public void testNameOnlyMatches() { |
||||
/* |
||||
* Name-only matches do not contain any path separators |
||||
*/ |
||||
//Test matches for file extension
|
||||
String pattern = "*.stp"; |
||||
assertMatched(pattern, "/test.stp"); |
||||
assertMatched(pattern, "/src/test.stp"); |
||||
assertNotMatched(pattern, "/test.stp1"); |
||||
assertNotMatched(pattern, "/test.astp"); |
||||
|
||||
//Test matches for name-only, applies to file name or folder name
|
||||
pattern = "src"; |
||||
assertMatched(pattern, "/src"); |
||||
assertMatched(pattern, "/src/"); |
||||
assertMatched(pattern, "/src/a.c"); |
||||
assertMatched(pattern, "/src/new/a.c"); |
||||
assertMatched(pattern, "/new/src/a.c"); |
||||
assertMatched(pattern, "/file/src"); |
||||
|
||||
//Test matches for name-only, applies only to folder names
|
||||
pattern = "src/"; |
||||
assertMatched(pattern, "/src/"); |
||||
assertMatched(pattern, "/src/a.c"); |
||||
assertMatched(pattern, "/src/new/a.c"); |
||||
assertMatched(pattern, "/new/src/a.c"); |
||||
assertNotMatched(pattern, "/src"); |
||||
assertNotMatched(pattern, "/file/src"); |
||||
|
||||
//Test matches for name-only, applies to file name or folder name
|
||||
//With a small wildcard
|
||||
pattern = "?rc"; |
||||
assertMatched(pattern, "/src/a.c"); |
||||
assertMatched(pattern, "/src/new/a.c"); |
||||
assertMatched(pattern, "/new/src/a.c"); |
||||
assertMatched(pattern, "/file/src"); |
||||
assertMatched(pattern, "/src/"); |
||||
|
||||
//Test matches for name-only, applies to file name or folder name
|
||||
//With a small wildcard
|
||||
pattern = "?r[a-c]"; |
||||
assertMatched(pattern, "/src/a.c"); |
||||
assertMatched(pattern, "/src/new/a.c"); |
||||
assertMatched(pattern, "/new/src/a.c"); |
||||
assertMatched(pattern, "/file/src"); |
||||
assertMatched(pattern, "/src/"); |
||||
assertMatched(pattern, "/srb/a.c"); |
||||
assertMatched(pattern, "/grb/new/a.c"); |
||||
assertMatched(pattern, "/new/crb/a.c"); |
||||
assertMatched(pattern, "/file/3rb"); |
||||
assertMatched(pattern, "/xrb/"); |
||||
assertMatched(pattern, "/3ra/a.c"); |
||||
assertMatched(pattern, "/5ra/new/a.c"); |
||||
assertMatched(pattern, "/new/1ra/a.c"); |
||||
assertMatched(pattern, "/file/dra"); |
||||
assertMatched(pattern, "/era/"); |
||||
assertNotMatched(pattern, "/crg"); |
||||
assertNotMatched(pattern, "/cr3"); |
||||
} |
||||
|
||||
@Test |
||||
public void testNegation() { |
||||
String pattern = "!/test.stp"; |
||||
assertMatched(pattern, "/test.stp"); |
||||
} |
||||
|
||||
@Test |
||||
public void testGetters() { |
||||
IgnoreRule r = new IgnoreRule("/pattern/"); |
||||
assertFalse(r.getNameOnly()); |
||||
assertTrue(r.dirOnly()); |
||||
assertFalse(r.getNegation()); |
||||
assertEquals(r.getPattern(), "/pattern"); |
||||
|
||||
r = new IgnoreRule("/patter?/"); |
||||
assertFalse(r.getNameOnly()); |
||||
assertTrue(r.dirOnly()); |
||||
assertFalse(r.getNegation()); |
||||
assertEquals(r.getPattern(), "/patter?"); |
||||
|
||||
r = new IgnoreRule("patt*"); |
||||
assertTrue(r.getNameOnly()); |
||||
assertFalse(r.dirOnly()); |
||||
assertFalse(r.getNegation()); |
||||
assertEquals(r.getPattern(), "patt*"); |
||||
|
||||
r = new IgnoreRule("pattern"); |
||||
assertTrue(r.getNameOnly()); |
||||
assertFalse(r.dirOnly()); |
||||
assertFalse(r.getNegation()); |
||||
assertEquals(r.getPattern(), "pattern"); |
||||
|
||||
r = new IgnoreRule("!pattern"); |
||||
assertTrue(r.getNameOnly()); |
||||
assertFalse(r.dirOnly()); |
||||
assertTrue(r.getNegation()); |
||||
assertEquals(r.getPattern(), "pattern"); |
||||
|
||||
r = new IgnoreRule("!/pattern"); |
||||
assertFalse(r.getNameOnly()); |
||||
assertFalse(r.dirOnly()); |
||||
assertTrue(r.getNegation()); |
||||
assertEquals(r.getPattern(), "/pattern"); |
||||
|
||||
r = new IgnoreRule("!/patter?"); |
||||
assertFalse(r.getNameOnly()); |
||||
assertFalse(r.dirOnly()); |
||||
assertTrue(r.getNegation()); |
||||
assertEquals(r.getPattern(), "/patter?"); |
||||
} |
||||
|
||||
@Test |
||||
public void testResetState() { |
||||
String pattern = "/build/*"; |
||||
String target = "/build"; |
||||
// Don't use the assert methods of this class, as we want to test
|
||||
// whether the state in IgnoreRule is reset properly
|
||||
IgnoreRule r = new IgnoreRule(pattern); |
||||
// Result should be the same for the same inputs
|
||||
assertFalse(r.isMatch(target, true)); |
||||
assertFalse(r.isMatch(target, true)); |
||||
} |
||||
|
||||
/** |
||||
* Check for a match. If target ends with "/", match will assume that the |
||||
* target is meant to be a directory. |
||||
* @param pattern |
||||
* Pattern as it would appear in a .gitignore file |
||||
* @param target |
||||
* Target file path relative to repository's GIT_DIR |
||||
*/ |
||||
public void assertMatched(String pattern, String target) { |
||||
boolean value = match(pattern, target); |
||||
assertTrue("Expected a match for: " + pattern + " with: " + target, |
||||
value); |
||||
} |
||||
|
||||
/** |
||||
* Check for a match. If target ends with "/", match will assume that the |
||||
* target is meant to be a directory. |
||||
* @param pattern |
||||
* Pattern as it would appear in a .gitignore file |
||||
* @param target |
||||
* Target file path relative to repository's GIT_DIR |
||||
*/ |
||||
public void assertNotMatched(String pattern, String target) { |
||||
boolean value = match(pattern, target); |
||||
assertFalse("Expected no match for: " + pattern + " with: " + target, |
||||
value); |
||||
} |
||||
|
||||
/** |
||||
* Check for a match. If target ends with "/", match will assume that the |
||||
* target is meant to be a directory. |
||||
* |
||||
* @param pattern |
||||
* Pattern as it would appear in a .gitignore file |
||||
* @param target |
||||
* Target file path relative to repository's GIT_DIR |
||||
* @return Result of IgnoreRule.isMatch(String, boolean) |
||||
*/ |
||||
private static boolean match(String pattern, String target) { |
||||
IgnoreRule r = new IgnoreRule(pattern); |
||||
//If speed of this test is ever an issue, we can use a presetRule field
|
||||
//to avoid recompiling a pattern each time.
|
||||
return r.isMatch(target, target.endsWith("/")); |
||||
} |
||||
} |
@ -0,0 +1,152 @@
|
||||
/* |
||||
* Copyright (C) 2015, Google Inc. |
||||
* 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.storage.dfs; |
||||
|
||||
import static org.eclipse.jgit.lib.Constants.OBJ_BLOB; |
||||
import static org.junit.Assert.assertEquals; |
||||
import static org.junit.Assert.assertNotNull; |
||||
import static org.junit.Assert.assertNull; |
||||
import static org.junit.Assert.assertSame; |
||||
|
||||
import org.eclipse.jgit.internal.storage.dfs.DeltaBaseCache.Entry; |
||||
import org.eclipse.jgit.junit.TestRng; |
||||
import org.junit.Before; |
||||
import org.junit.Test; |
||||
|
||||
public class DeltaBaseCacheTest { |
||||
private static final int SZ = 512; |
||||
|
||||
private DfsPackKey key; |
||||
private DeltaBaseCache cache; |
||||
private TestRng rng; |
||||
|
||||
@Before |
||||
public void setUp() { |
||||
key = new DfsPackKey(); |
||||
cache = new DeltaBaseCache(SZ); |
||||
rng = new TestRng(getClass().getSimpleName()); |
||||
} |
||||
|
||||
@Test |
||||
public void testObjectLargerThanCacheDoesNotEvict() { |
||||
byte[] obj12 = put(12, 32); |
||||
put(24, SZ + 5); |
||||
assertNull("does not store large object", cache.get(key, 24)); |
||||
get(obj12, 12); |
||||
} |
||||
|
||||
@Test |
||||
public void testCacheLruExpires1() { |
||||
byte[] obj1 = put(1, SZ / 4); |
||||
put(2, SZ / 4); |
||||
byte[] obj3 = put(3, SZ / 4); |
||||
put(4, SZ / 4); |
||||
assertEquals(SZ, cache.getMemoryUsed()); |
||||
|
||||
get(obj3, 3); |
||||
get(obj1, 1); |
||||
put(5, SZ / 2); |
||||
assertEquals(SZ, cache.getMemoryUsed()); |
||||
assertEquals(SZ, cache.getMemoryUsedByTableForTest()); |
||||
assertEquals(SZ, cache.getMemoryUsedByLruChainForTest()); |
||||
assertNull(cache.get(key, 4)); |
||||
assertNull(cache.get(key, 2)); |
||||
|
||||
get(obj1, 1); |
||||
get(obj3, 3); |
||||
} |
||||
|
||||
@Test |
||||
public void testCacheLruExpires2() { |
||||
int pos0 = (0 << 10) | 2; |
||||
int pos1 = (1 << 10) | 2; |
||||
int pos2 = (2 << 10) | 2; |
||||
int pos5 = (5 << 10) | 2; |
||||
int pos6 = (6 << 10) | 2; |
||||
|
||||
put(pos0, SZ / 4); |
||||
put(pos5, SZ / 4); |
||||
byte[] obj1 = put(pos1, SZ / 4); |
||||
byte[] obj2 = put(pos2, SZ / 4); |
||||
assertEquals(SZ, cache.getMemoryUsed()); |
||||
|
||||
byte[] obj6 = put(pos6, SZ / 2); |
||||
assertEquals(SZ, cache.getMemoryUsed()); |
||||
assertEquals(SZ, cache.getMemoryUsedByTableForTest()); |
||||
assertEquals(SZ, cache.getMemoryUsedByLruChainForTest()); |
||||
assertNull(cache.get(key, pos0)); |
||||
assertNull(cache.get(key, pos5)); |
||||
|
||||
get(obj1, pos1); |
||||
get(obj2, pos2); |
||||
get(obj6, pos6); |
||||
} |
||||
|
||||
@Test |
||||
public void testCacheMemoryUsedConsistentWithExpectations() { |
||||
put(1, 32); |
||||
put(2, 32); |
||||
put(3, 32); |
||||
|
||||
assertNotNull(cache.get(key, 1)); |
||||
assertNotNull(cache.get(key, 1)); |
||||
|
||||
assertEquals(32 * 3, cache.getMemoryUsed()); |
||||
assertEquals(32 * 3, cache.getMemoryUsedByTableForTest()); |
||||
assertEquals(32 * 3, cache.getMemoryUsedByLruChainForTest()); |
||||
} |
||||
|
||||
private void get(byte[] data, int position) { |
||||
Entry e = cache.get(key, position); |
||||
assertNotNull("expected entry at " + position, e); |
||||
assertEquals("expected blob for " + position, OBJ_BLOB, e.type); |
||||
assertSame("expected data for " + position, data, e.data); |
||||
} |
||||
|
||||
private byte[] put(int position, int sz) { |
||||
byte[] data = rng.nextBytes(sz); |
||||
cache.put(key, position, OBJ_BLOB, data); |
||||
return data; |
||||
} |
||||
} |
@ -1,278 +0,0 @@
|
||||
/* |
||||
* Copyright (C) 2010, Red Hat Inc. |
||||
* 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.ignore; |
||||
|
||||
import org.eclipse.jgit.errors.InvalidPatternException; |
||||
import org.eclipse.jgit.fnmatch.FileNameMatcher; |
||||
|
||||
/** |
||||
* A single ignore rule corresponding to one line in a .gitignore or ignore |
||||
* file. Parses the ignore pattern |
||||
* |
||||
* Inspiration from: Ferry Huberts |
||||
* |
||||
* @deprecated this rule does not support double star pattern and is slow |
||||
* parsing glob expressions. Consider to use {@link FastIgnoreRule} |
||||
* instead. See https://bugs.eclipse.org/bugs/show_bug.cgi?id=440732
|
||||
*/ |
||||
@Deprecated |
||||
public class IgnoreRule { |
||||
private String pattern; |
||||
private boolean negation; |
||||
private boolean nameOnly; |
||||
private boolean dirOnly; |
||||
private FileNameMatcher matcher; |
||||
|
||||
/** |
||||
* Create a new ignore rule with the given pattern. Assumes that |
||||
* the pattern is already trimmed. |
||||
* |
||||
* @param pattern |
||||
* Base pattern for the ignore rule. This pattern will |
||||
* be parsed to generate rule parameters. |
||||
*/ |
||||
public IgnoreRule (String pattern) { |
||||
this.pattern = pattern; |
||||
negation = false; |
||||
nameOnly = false; |
||||
dirOnly = false; |
||||
matcher = null; |
||||
setup(); |
||||
} |
||||
|
||||
/** |
||||
* Remove leading/trailing characters as needed. Set up |
||||
* rule variables for later matching. |
||||
*/ |
||||
private void setup() { |
||||
int startIndex = 0; |
||||
int endIndex = pattern.length(); |
||||
if (pattern.startsWith("!")) { //$NON-NLS-1$
|
||||
startIndex++; |
||||
negation = true; |
||||
} |
||||
|
||||
if (pattern.endsWith("/")) { //$NON-NLS-1$
|
||||
endIndex --; |
||||
dirOnly = true; |
||||
} |
||||
|
||||
pattern = pattern.substring(startIndex, endIndex); |
||||
boolean hasSlash = pattern.contains("/"); //$NON-NLS-1$
|
||||
|
||||
if (!hasSlash) |
||||
nameOnly = true; |
||||
else if (!pattern.startsWith("/")) { //$NON-NLS-1$
|
||||
//Contains "/" but does not start with one
|
||||
//Adding / to the start should not interfere with matching
|
||||
pattern = "/" + pattern; //$NON-NLS-1$
|
||||
} |
||||
|
||||
if (pattern.contains("*") || pattern.contains("?") || pattern.contains("[")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
||||
try { |
||||
matcher = new FileNameMatcher(pattern, Character.valueOf('/')); |
||||
} catch (InvalidPatternException e) { |
||||
// Ignore pattern exceptions
|
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* @return |
||||
* True if the pattern is just a file name and not a path |
||||
*/ |
||||
public boolean getNameOnly() { |
||||
return nameOnly; |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @return |
||||
* True if the pattern should match directories only |
||||
*/ |
||||
public boolean dirOnly() { |
||||
return dirOnly; |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @return |
||||
* True if the pattern had a "!" in front of it |
||||
*/ |
||||
public boolean getNegation() { |
||||
return negation; |
||||
} |
||||
|
||||
/** |
||||
* @return |
||||
* The blob pattern to be used as a matcher |
||||
*/ |
||||
public String getPattern() { |
||||
return pattern; |
||||
} |
||||
|
||||
/** |
||||
* Returns true if a match was made. |
||||
* <br> |
||||
* This function does NOT return the actual ignore status of the |
||||
* target! Please consult {@link #getResult()} for the ignore status. The actual |
||||
* ignore status may be true or false depending on whether this rule is |
||||
* an ignore rule or a negation rule. |
||||
* |
||||
* @param target |
||||
* Name pattern of the file, relative to the base directory of this rule |
||||
* @param isDirectory |
||||
* Whether the target file is a directory or not |
||||
* @return |
||||
* True if a match was made. This does not necessarily mean that |
||||
* the target is ignored. Call {@link IgnoreRule#getResult() getResult()} for the result. |
||||
*/ |
||||
public boolean isMatch(String target, boolean isDirectory) { |
||||
if (!target.startsWith("/")) //$NON-NLS-1$
|
||||
target = "/" + target; //$NON-NLS-1$
|
||||
|
||||
if (matcher == null) { |
||||
if (target.equals(pattern)) { |
||||
//Exact match
|
||||
if (dirOnly && !isDirectory) |
||||
//Directory expectations not met
|
||||
return false; |
||||
else |
||||
//Directory expectations met
|
||||
return true; |
||||
} |
||||
|
||||
/* |
||||
* Add slashes for startsWith check. This avoids matching e.g. |
||||
* "/src/new" to /src/newfile" but allows "/src/new" to match |
||||
* "/src/new/newfile", as is the git standard |
||||
*/ |
||||
if ((target).startsWith(pattern + "/")) //$NON-NLS-1$
|
||||
return true; |
||||
|
||||
if (nameOnly) { |
||||
//Iterate through each sub-name
|
||||
final String[] segments = target.split("/"); //$NON-NLS-1$
|
||||
for (int idx = 0; idx < segments.length; idx++) { |
||||
final String segmentName = segments[idx]; |
||||
// String.split("/") creates empty segment for leading slash
|
||||
if (segmentName.length() == 0) |
||||
continue; |
||||
if (segmentName.equals(pattern) && |
||||
doesMatchDirectoryExpectations(isDirectory, idx, segments.length)) |
||||
return true; |
||||
} |
||||
} |
||||
|
||||
} else { |
||||
matcher.reset(); |
||||
matcher.append(target); |
||||
if (matcher.isMatch()) |
||||
return true; |
||||
|
||||
final String[] segments = target.split("/"); //$NON-NLS-1$
|
||||
if (nameOnly) { |
||||
for (int idx = 0; idx < segments.length; idx++) { |
||||
final String segmentName = segments[idx]; |
||||
// String.split("/") creates empty segment for leading slash
|
||||
if (segmentName.length() == 0) |
||||
continue; |
||||
//Iterate through each sub-directory
|
||||
matcher.reset(); |
||||
matcher.append(segmentName); |
||||
if (matcher.isMatch() && |
||||
doesMatchDirectoryExpectations(isDirectory, idx, segments.length)) |
||||
return true; |
||||
} |
||||
} else { |
||||
//TODO: This is the slowest operation
|
||||
//This matches e.g. "/src/ne?" to "/src/new/file.c"
|
||||
matcher.reset(); |
||||
|
||||
for (int idx = 0; idx < segments.length; idx++) { |
||||
final String segmentName = segments[idx]; |
||||
// String.split("/") creates empty segment for leading slash
|
||||
if (segmentName.length() == 0) |
||||
continue; |
||||
|
||||
matcher.append("/" + segmentName); //$NON-NLS-1$
|
||||
|
||||
if (matcher.isMatch() |
||||
&& doesMatchDirectoryExpectations(isDirectory, idx, |
||||
segments.length)) |
||||
return true; |
||||
} |
||||
} |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
|
||||
/** |
||||
* If a call to <code>isMatch(String, boolean)</code> was previously |
||||
* made, this will return whether or not the target was ignored. Otherwise |
||||
* this just indicates whether the rule is non-negation or negation. |
||||
* |
||||
* @return |
||||
* True if the target is to be ignored, false otherwise. |
||||
*/ |
||||
public boolean getResult() { |
||||
return !negation; |
||||
} |
||||
|
||||
private boolean doesMatchDirectoryExpectations(boolean isDirectory, int segmentIdx, int segmentLength) { |
||||
// The segment we are checking is a directory, expectations are met.
|
||||
if (segmentIdx < segmentLength - 1) { |
||||
return true; |
||||
} |
||||
|
||||
// We are checking the last part of the segment for which isDirectory has to be considered.
|
||||
return !dirOnly || isDirectory; |
||||
} |
||||
|
||||
@Override |
||||
public String toString() { |
||||
return pattern; |
||||
} |
||||
} |
@ -0,0 +1,93 @@
|
||||
/** |
||||
* Copyright (C) 2015, Google Inc. |
||||
* 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.filter; |
||||
|
||||
import java.io.IOException; |
||||
|
||||
import org.eclipse.jgit.errors.IncorrectObjectTypeException; |
||||
import org.eclipse.jgit.errors.MissingObjectException; |
||||
import org.eclipse.jgit.lib.AnyObjectId; |
||||
import org.eclipse.jgit.revwalk.ObjectWalk; |
||||
|
||||
/** |
||||
* Selects interesting objects when walking. |
||||
* <p> |
||||
* Applications should install the filter on an ObjectWalk by |
||||
* {@link ObjectWalk#setObjectFilter(ObjectFilter)} prior to starting traversal. |
||||
* |
||||
* @since 4.0 |
||||
*/ |
||||
public abstract class ObjectFilter { |
||||
/** Default filter that always returns true. */ |
||||
public static final ObjectFilter ALL = new AllFilter(); |
||||
|
||||
private static final class AllFilter extends ObjectFilter { |
||||
@Override |
||||
public boolean include(ObjectWalk walker, AnyObjectId o) { |
||||
return true; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Determine if the named object should be included in the walk. |
||||
* |
||||
* @param walker |
||||
* the active walker this filter is being invoked from within. |
||||
* @param objid |
||||
* the object currently being tested. |
||||
* @return {@code true} if the named object should be included in the walk. |
||||
* @throws MissingObjectException |
||||
* an object the filter needed to consult to determine its |
||||
* answer was missing |
||||
* @throws IncorrectObjectTypeException |
||||
* an object the filter needed to consult to determine its |
||||
* answer was of the wrong type |
||||
* @throws IOException |
||||
* an object the filter needed to consult to determine its |
||||
* answer could not be read. |
||||
*/ |
||||
public abstract boolean include(ObjectWalk walker, AnyObjectId objid) |
||||
throws MissingObjectException, IncorrectObjectTypeException, |
||||
IOException; |
||||
} |
Loading…
Reference in new issue