diff --git a/Documentation/technical/reftable.md b/Documentation/technical/reftable.md index 1236a7909..ebef68f29 100644 --- a/Documentation/technical/reftable.md +++ b/Documentation/technical/reftable.md @@ -773,9 +773,6 @@ A repository must set its `$GIT_DIR/config` to configure reftable: ### Layout -The `$GIT_DIR/refs` path is a file when reftable is configured, not a -directory. This prevents loose references from being stored. - A collection of reftable files are stored in the `$GIT_DIR/reftable/` directory: @@ -789,28 +786,38 @@ the function `${min_update_index}-${max_update_index}.ref`. Log-only files use the `.log` extension, while ref-only and mixed ref and log files use `.ref`. extension. -The stack ordering file is `$GIT_DIR/refs` and lists the current -files, one per line, in order, from oldest (base) to newest (most -recent): - $ cat .git/refs +The stack ordering file is `$GIT_DIR/reftable/tables.list` and lists the current +files, one per line, in order, from oldest (base) to newest (most recent): + + $ cat .git/reftable/tables.list 00000001-00000001.log 00000002-00000002.ref 00000003-00000003.ref -Readers must read `$GIT_DIR/refs` to determine which files are -relevant right now, and search through the stack in reverse order -(last reftable is examined first). +Readers must read `$GIT_DIR/reftable/tables.list` to determine which files are +relevant right now, and search through the stack in reverse order (last reftable +is examined first). -Reftable files not listed in `refs` may be new (and about to be added +Reftable files not listed in `tables.list` may be new (and about to be added to the stack by the active writer), or ancient and ready to be pruned. +### Backward compatibility + +Older clients should continue to recognize the directory as a git repository so +they don't look for an enclosing repository in parent directories. To this end, +a reftable-enabled repository must contain the following dummy files + +* `.git/HEAD`, a regular file containing `ref: refs/heads/.invalid`. +* `.git/refs/`, a directory +* `.git/refs/heads`, a regular file + ### Readers Readers can obtain a consistent snapshot of the reference space by following: -1. Open and read the `refs` file. +1. Open and read the `tables.list` file. 2. Open each of the reftable files that it mentions. 3. If any of the files is missing, goto 1. 4. Read from the now-open files as long as necessary. @@ -820,13 +827,13 @@ following: Although reftables are immutable, mutations are supported by writing a new reftable and atomically appending it to the stack: -1. Acquire `refs.lock`. -2. Read `refs` to determine current reftables. +1. Acquire `tables.list.lock`. +2. Read `tables.list` to determine current reftables. 3. Select `update_index` to be most recent file's `max_update_index + 1`. 4. Prepare temp reftable `tmp_XXXXXX`, including log entries. 5. Rename `tmp_XXXXXX` to `${update_index}-${update_index}.ref`. -6. Copy `refs` to `refs.lock`, appending file from (5). -7. Rename `refs.lock` to `refs`. +6. Copy `tables.list` to `tables.list.lock`, appending file from (5). +7. Rename `tables.list.lock` to `tables.list`. During step 4 the new file's `min_update_index` and `max_update_index` are both set to the `update_index` selected by step 3. All log @@ -834,9 +841,9 @@ records for the transaction use the same `update_index` in their keys. This enables later correlation of which references were updated by the same transaction. -Because a single `refs.lock` file is used to manage locking, the +Because a single `tables.list.lock` file is used to manage locking, the repository is single-threaded for writers. Writers may have to -busy-spin (with backoff) around creating `refs.lock`, for up to an +busy-spin (with backoff) around creating `tables.list.lock`, for up to an acceptable wait period, aborting if the repository is too busy to mutate. Application servers wrapped around repositories (e.g. Gerrit Code Review) can layer their own lock/wait queue to improve fairness @@ -864,21 +871,21 @@ For sake of illustration, assume the stack currently consists of reftable files (from oldest to newest): A, B, C, and D. The compactor is going to compact B and C, leaving A and D alone. -1. Obtain lock `refs.lock` and read the `refs` file. +1. Obtain lock `tables.list.lock` and read the `tables.list` file. 2. Obtain locks `B.lock` and `C.lock`. Ownership of these locks prevents other processes from trying to compact these files. -3. Release `refs.lock`. +3. Release `tables.list.lock`. 4. Compact `B` and `C` into a temp file `${min_update_index}-${max_update_index}_XXXXXX`. -5. Reacquire lock `refs.lock`. +5. Reacquire lock `tables.list.lock`. 6. Verify that `B` and `C` are still in the stack, in that order. This should always be the case, assuming that other processes are adhering to the locking protocol. 7. Rename `${min_update_index}-${max_update_index}_XXXXXX` to `${min_update_index}-${max_update_index}.ref`. -8. Write the new stack to `refs.lock`, replacing `B` and `C` with the +8. Write the new stack to `tables.list.lock`, replacing `B` and `C` with the file from (4). -9. Rename `refs.lock` to `refs`. +9. Rename `tables.list.lock` to `tables.list`. 10. Delete `B` and `C`, perhaps after a short sleep to avoid forcing readers to backtrack. diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ObjectFileServlet.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ObjectFileServlet.java index ed9b9ae0d..625ab3e66 100644 --- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ObjectFileServlet.java +++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ObjectFileServlet.java @@ -50,7 +50,7 @@ abstract class ObjectFileServlet extends HttpServlet { } } - private static abstract class PackData extends ObjectFileServlet { + private abstract static class PackData extends ObjectFileServlet { private static final long serialVersionUID = 1L; PackData(String contentType) { diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/CleanFilter.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/CleanFilter.java index 6576edeb9..f0526ff8a 100644 --- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/CleanFilter.java +++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/CleanFilter.java @@ -45,7 +45,7 @@ public class CleanFilter extends FilterCommand { * The factory is responsible for creating instances of * {@link org.eclipse.jgit.lfs.CleanFilter} */ - public final static FilterCommandFactory FACTORY = CleanFilter::new; + public static final FilterCommandFactory FACTORY = CleanFilter::new; /** * Registers this filter by calling diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/SmudgeFilter.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/SmudgeFilter.java index 64f742588..23ece3e48 100644 --- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/SmudgeFilter.java +++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/SmudgeFilter.java @@ -59,7 +59,7 @@ public class SmudgeFilter extends FilterCommand { * The factory is responsible for creating instances of * {@link org.eclipse.jgit.lfs.SmudgeFilter} */ - public final static FilterCommandFactory FACTORY = SmudgeFilter::new; + public static final FilterCommandFactory FACTORY = SmudgeFilter::new; /** * Register this filter in JGit diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.10.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.10.target index f49adf9a6..1c6c95ce0 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.10.target +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.10.target @@ -1,7 +1,7 @@ - + @@ -70,8 +70,8 @@ - - + + @@ -84,7 +84,7 @@ - + diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.11.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.11.target index e68ab631f..e97b2553f 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.11.target +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.11.target @@ -1,7 +1,7 @@ - + @@ -70,8 +70,8 @@ - - + + @@ -84,7 +84,7 @@ - + diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.12.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.12.target index e83924c3f..4dff43fee 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.12.target +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.12.target @@ -1,7 +1,7 @@ - + @@ -70,8 +70,8 @@ - - + + @@ -84,7 +84,7 @@ - + diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.13.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.13.target index c79f20669..a03d04cc5 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.13.target +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.13.target @@ -1,7 +1,7 @@ - + @@ -70,8 +70,8 @@ - - + + @@ -84,7 +84,7 @@ - + diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.14-staging.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.14-staging.target index 39f52ace3..ca47ea91e 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.14-staging.target +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.14-staging.target @@ -1,7 +1,7 @@ - + @@ -70,8 +70,8 @@ - - + + @@ -84,7 +84,7 @@ - + diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.6.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.6.target index 4d862e2c1..4747817f7 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.6.target +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.6.target @@ -1,7 +1,7 @@ - + @@ -70,8 +70,8 @@ - - + + @@ -84,7 +84,7 @@ - + diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.7.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.7.target index 780b668ad..46fead68a 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.7.target +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.7.target @@ -1,7 +1,7 @@ - + @@ -70,8 +70,8 @@ - - + + @@ -84,7 +84,7 @@ - + diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.8.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.8.target index 596cd6915..d400753c4 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.8.target +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.8.target @@ -1,7 +1,7 @@ - + @@ -70,8 +70,8 @@ - - + + @@ -84,7 +84,7 @@ - + diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.9.target b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.9.target index 7da901f04..8c5e9cebc 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.9.target +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/jgit-4.9.target @@ -1,7 +1,7 @@ - + @@ -70,8 +70,8 @@ - - + + @@ -84,7 +84,7 @@ - + diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/staging-2020-03.tpd b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/staging-2020-03.tpd index 9269a642c..d010e5fca 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/staging-2020-03.tpd +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/orbit/staging-2020-03.tpd @@ -1,7 +1,7 @@ target "staging-2020-03" with source configurePhase // see http://download.eclipse.org/tools/orbit/downloads/ -location "https://download.eclipse.org/tools/orbit/downloads/drops/S20200128200239/repository" { +location "https://download.eclipse.org/tools/orbit/downloads/drops/S20200219023850/repository" { com.google.gson [2.8.2.v20180104-1110,2.8.2.v20180104-1110] com.google.gson.source [2.8.2.v20180104-1110,2.8.2.v20180104-1110] com.jcraft.jsch [0.1.55.v20190404-1902,0.1.55.v20190404-1902] @@ -49,8 +49,8 @@ location "https://download.eclipse.org/tools/orbit/downloads/drops/S202001282002 org.hamcrest.core.source [1.3.0.v20180420-1519,1.3.0.v20180420-1519] org.hamcrest.library [1.3.0.v20180524-2246,1.3.0.v20180524-2246] org.hamcrest.library.source [1.3.0.v20180524-2246,1.3.0.v20180524-2246] - org.junit [4.13.0.v20200128-1312,4.13.0.v20200128-1312] - org.junit.source [4.13.0.v20200128-1312,4.13.0.v20200128-1312] + org.junit [4.13.0.v20200204-1500,4.13.0.v20200204-1500] + org.junit.source [4.13.0.v20200204-1500,4.13.0.v20200204-1500] 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.mockito [2.23.0.v20190527-1420,2.23.0.v20190527-1420] @@ -64,4 +64,3 @@ location "https://download.eclipse.org/tools/orbit/downloads/drops/S202001282002 org.tukaani.xz [1.8.0.v20180207-1613,1.8.0.v20180207-1613] org.tukaani.xz.source [1.8.0.v20180207-1613,1.8.0.v20180207-1613] } - diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/DiffAlgorithms.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/DiffAlgorithms.java index 430ed2e91..cd5d8f1bf 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/DiffAlgorithms.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/DiffAlgorithms.java @@ -317,7 +317,7 @@ class DiffAlgorithms extends TextBuiltin { return false; } - private static abstract class Algorithm { + private abstract static class Algorithm { String name; abstract DiffAlgorithm create(); diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/LfsStore.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/LfsStore.java index 6c87bc99c..9c0ced5c1 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/LfsStore.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/LfsStore.java @@ -128,11 +128,11 @@ class LfsStore extends TextBuiltin { } } - private static enum StoreType { + private enum StoreType { FS, S3; } - private static enum StorageClass { + private enum StorageClass { REDUCED_REDUNDANCY, STANDARD } diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowCommands.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowCommands.java index 36d1d2366..9e61357da 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowCommands.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/ShowCommands.java @@ -50,7 +50,7 @@ class ShowCommands extends TextBuiltin { errw.println(); } - static enum Format { + enum Format { /** */ USAGE { @Override diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/TextHashFunctions.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/TextHashFunctions.java index e42d51be1..f777f277f 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/TextHashFunctions.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/TextHashFunctions.java @@ -410,7 +410,7 @@ class TextHashFunctions extends TextBuiltin { } /** Base class for any hashCode function to be tested. */ - private static abstract class Hash extends RawTextComparator { + private abstract static class Hash extends RawTextComparator { String name; @Override @@ -420,7 +420,7 @@ class TextHashFunctions extends TextBuiltin { } /** Base class for any hashCode folding function to be tested. */ - private static abstract class Fold { + private abstract static class Fold { String name; /** diff --git a/org.eclipse.jgit.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.test/META-INF/MANIFEST.MF index 18f16d91f..cfd1a0414 100644 --- a/org.eclipse.jgit.test/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.test/META-INF/MANIFEST.MF @@ -18,7 +18,6 @@ Import-Package: com.googlecode.javaewah;version="[1.1.6,2.0.0)", org.apache.commons.compress.compressors.gzip;version="[1.15.0,2.0)", org.apache.commons.compress.compressors.xz;version="[1.15.0,2.0)", org.assertj.core.api;version="[3.14.0,4.0.0)", - org.bouncycastle.util.encoders;version="[1.61.0,2.0.0)", org.eclipse.jgit.annotations;version="[5.7.0,5.8.0)", org.eclipse.jgit.api;version="[5.7.0,5.8.0)", org.eclipse.jgit.api.errors;version="[5.7.0,5.8.0)", diff --git a/org.eclipse.jgit.test/exttst/org/eclipse/jgit/patch/EGitPatchHistoryTest.java b/org.eclipse.jgit.test/exttst/org/eclipse/jgit/patch/EGitPatchHistoryTest.java index c7fd253bc..b01d9b467 100644 --- a/org.eclipse.jgit.test/exttst/org/eclipse/jgit/patch/EGitPatchHistoryTest.java +++ b/org.eclipse.jgit.test/exttst/org/eclipse/jgit/patch/EGitPatchHistoryTest.java @@ -152,7 +152,7 @@ public class EGitPatchHistoryTest { } } - static abstract class CommitReader { + abstract static class CommitReader { private Process proc; CommitReader(String[] args) throws IOException { diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java index 86239023d..d1522e98e 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java @@ -563,10 +563,10 @@ public class RebaseCommandTest extends RepositoryTestCase { RevCommit newD = rw.next(); assertDerivedFrom(newD, d); assertEquals(2, newD.getParentCount()); - RevCommit newC = rw.next(); - assertDerivedFrom(newC, c); RevCommit newE = rw.next(); assertEquals(e, newE); + RevCommit newC = rw.next(); + assertDerivedFrom(newC, c); assertEquals(newC, newD.getParent(0)); assertEquals(e, newD.getParent(1)); assertEquals(g, rw.next()); diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollectorTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollectorTest.java index 6e0762fe3..f235b2eaa 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollectorTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollectorTest.java @@ -19,7 +19,6 @@ import java.util.Collections; import java.util.concurrent.TimeUnit; import org.eclipse.jgit.internal.storage.dfs.DfsObjDatabase.PackSource; -import org.eclipse.jgit.internal.storage.dfs.DfsRefDatabase; import org.eclipse.jgit.internal.storage.reftable.RefCursor; import org.eclipse.jgit.internal.storage.reftable.ReftableConfig; import org.eclipse.jgit.internal.storage.reftable.ReftableReader; diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcOrphanFilesTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcOrphanFilesTest.java index 24df8dd2d..84d364b98 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcOrphanFilesTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcOrphanFilesTest.java @@ -20,17 +20,17 @@ import org.junit.Before; import org.junit.Test; public class GcOrphanFilesTest extends GcTestCase { - private final static String PACK = "pack"; + private static final String PACK = "pack"; - private final static String BITMAP_File_1 = PACK + "-1.bitmap"; + private static final String BITMAP_File_1 = PACK + "-1.bitmap"; - private final static String IDX_File_2 = PACK + "-2.idx"; + private static final String IDX_File_2 = PACK + "-2.idx"; - private final static String IDX_File_malformed = PACK + "-1234idx"; + private static final String IDX_File_malformed = PACK + "-1234idx"; - private final static String PACK_File_2 = PACK + "-2.pack"; + private static final String PACK_File_2 = PACK + "-2.pack"; - private final static String PACK_File_3 = PACK + "-3.pack"; + private static final String PACK_File_3 = PACK + "-3.pack"; private File packDir; diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java index 9b5691775..327b554b4 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java @@ -305,7 +305,7 @@ public class ConfigTest { assertFalse(c.getBoolean("s", "b", true)); } - static enum TestEnum { + enum TestEnum { ONE_TWO; } diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revplot/PlotCommitListTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revplot/PlotCommitListTest.java index 4e0bba2f2..45225a2bd 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revplot/PlotCommitListTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revplot/PlotCommitListTest.java @@ -254,12 +254,12 @@ public class PlotCommitListTest extends RevWalkTestCase { int posI = test.commit(i).lanePos(childPositions).parents(h) .getLanePos(); test.commit(h).lanePos(posI).parents(f); - test.commit(g).lanePos(childPositions).parents(a); test.commit(f).lanePos(posI).parents(e, d); + test.commit(d).lanePos(1).parents(b); test.commit(e).lanePos(posI).parents(c); - test.commit(d).lanePos(2).parents(b); test.commit(c).lanePos(posI).parents(b); test.commit(b).lanePos(posI).parents(a); + test.commit(g).lanePos(childPositions).parents(a); test.commit(a).lanePos(0).parents(); } } @@ -325,42 +325,42 @@ public class PlotCommitListTest extends RevWalkTestCase { .lanePos(mainPos); test.commit(merge_update_eclipse) .parents(add_a_clear, update_eclipse).lanePos(mainPos); + test.commit(update_eclipse).parents(add_Maven).lanePos(2); test.commit(add_a_clear).parents(fix_broken).lanePos(mainPos); test.commit(fix_broken).parents(merge_disable_comment) .lanePos(mainPos); test.commit(merge_disable_comment) .parents(merge_resolve_handler, disable_comment) .lanePos(mainPos); - test.commit(disable_comment).parents(clone_operation).lanePos(2); + test.commit(disable_comment).parents(clone_operation).lanePos(3); test.commit(merge_resolve_handler) .parents(clone_operation, resolve_handler).lanePos(mainPos); - test.commit(update_eclipse).parents(add_Maven).lanePos(3); + test.commit(resolve_handler).parents(merge_fix).lanePos(4); test.commit(clone_operation).parents(merge_changeset_implementation) .lanePos(mainPos); test.commit(merge_changeset_implementation) .parents(merge_disable_source, changeset_implementation) .lanePos(mainPos); + test.commit(changeset_implementation).parents(clear_repositorycache) + .lanePos(1); test.commit(merge_disable_source) .parents(update_eclipse_iplog2, disable_source) .lanePos(mainPos); + test.commit(disable_source).parents(merge_use_remote).lanePos(3); test.commit(update_eclipse_iplog2).parents(merge_use_remote) .lanePos(mainPos); - test.commit(disable_source).parents(merge_use_remote).lanePos(1); test.commit(merge_use_remote) .parents(update_eclipse_iplog, use_remote).lanePos(mainPos); - test.commit(changeset_implementation).parents(clear_repositorycache) - .lanePos(2); + test.commit(use_remote).parents(clear_repositorycache).lanePos(3); test.commit(update_eclipse_iplog).parents(merge_add_Maven) .lanePos(mainPos); test.commit(merge_add_Maven).parents(findToolBar_layout, add_Maven) .lanePos(mainPos); + test.commit(add_Maven).parents(clear_repositorycache).lanePos(2); test.commit(findToolBar_layout).parents(clear_repositorycache) .lanePos(mainPos); - test.commit(use_remote).parents(clear_repositorycache).lanePos(1); - test.commit(add_Maven).parents(clear_repositorycache).lanePos(3); test.commit(clear_repositorycache).parents(merge_remove) .lanePos(mainPos); - test.commit(resolve_handler).parents(merge_fix).lanePos(4); test.commit(merge_remove).parents(add_simple, remove_unused) .lanePos(mainPos); test.commit(remove_unused).parents(merge_fix).lanePos(1); @@ -453,33 +453,36 @@ public class PlotCommitListTest extends RevWalkTestCase { pcl.source(pw); pcl.fillTo(Integer.MAX_VALUE); - // test that the commits b1, b2 and b3 are on the same position - int bPos = pcl.get(9).lane.position; // b1 - assertEquals("b2 is an a different position", bPos, - pcl.get(7).lane.position); - assertEquals("b3 is on a different position", bPos, - pcl.get(4).lane.position); - - // test that nothing blocks the connections between b1, b2 and b3 - assertNotEquals("b lane is blocked by c", bPos, - pcl.get(8).lane.position); - assertNotEquals("b lane is blocked by a2", bPos, - pcl.get(6).lane.position); - assertNotEquals("b lane is blocked by d", bPos, - pcl.get(5).lane.position); + Set positions = asSet(0, 1); + CommitListAssert test = new CommitListAssert(pcl); + int posA = test.commit(a5).lanePos(positions).getLanePos(); + test.commit(a4); + test.commit(a3).lanePos(posA); + test.commit(e); + test.commit(d); + test.commit(a2).lanePos(posA); + int posB = test.commit(b3).lanePos(positions).getLanePos(); + test.commit(b2).lanePos(posB); + test.commit(b1).lanePos(posB); + test.commit(c); + test.commit(a1).lanePos(posA); + test.noMoreCommits(); + assertNotEquals("a lane is the same as b lane", posA, posB); } } /** *
 	 *    b3
+	 * a5 |
+	 * |  |
 	 * a4 |
 	 * | \|
 	 * |  b2
 	 * a3 |
 	 * | \|
-	 * a2 |
 	 * |  b1
+	 * a2 |
 	 * | /
 	 * a1
 	 * 
@@ -494,10 +497,11 @@ public class PlotCommitListTest extends RevWalkTestCase { final RevCommit a3 = commit(a2, b1); final RevCommit b2 = commit(b1); final RevCommit a4 = commit(a3, b2); + final RevCommit a5 = commit(a4); final RevCommit b3 = commit(b2); try (PlotWalk pw = new PlotWalk(db)) { - pw.markStart(pw.lookupCommit(a4)); + pw.markStart(pw.lookupCommit(a5)); pw.markStart(pw.lookupCommit(b3)); PlotCommitList pcl = new PlotCommitList<>(); pcl.source(pw); @@ -506,11 +510,12 @@ public class PlotCommitListTest extends RevWalkTestCase { Set positions = asSet(0, 1); CommitListAssert test = new CommitListAssert(pcl); int posB = test.commit(b3).lanePos(positions).getLanePos(); - int posA = test.commit(a4).lanePos(positions).getLanePos(); + int posA = test.commit(a5).lanePos(positions).getLanePos(); + test.commit(a4).lanePos(posA); test.commit(b2).lanePos(posB); test.commit(a3).lanePos(posA); - test.commit(a2).lanePos(posA); test.commit(b1).lanePos(posB); + test.commit(a2).lanePos(posA); test.commit(a1).lanePos(posA); test.noMoreCommits(); } @@ -519,13 +524,17 @@ public class PlotCommitListTest extends RevWalkTestCase { /** *
 	 * a4
-	 * |   b3
-	 * a3  |
-	 * | \\|
-	 * |   |\\
-	 * |   b2||
-	 * a2  | //
-	 * |   b1
+	 * |
+	 * a3
+	 * | \\
+	 * a2  \\
+	 * |    \\
+	 * |  b3 ||
+	 * |  |  ||
+	 * |  b2 ||
+	 * |  | //
+	 * |  b1
+	 * |  |
 	 * | /
 	 * a1
 	 * 
@@ -552,10 +561,10 @@ public class PlotCommitListTest extends RevWalkTestCase { Set positions = asSet(0, 1); CommitListAssert test = new CommitListAssert(pcl); int posA = test.commit(a4).lanePos(positions).getLanePos(); - int posB = test.commit(b3).lanePos(positions).getLanePos(); test.commit(a3).lanePos(posA); - test.commit(b2).lanePos(posB); test.commit(a2).lanePos(posA); + int posB = test.commit(b3).lanePos(positions).getLanePos(); + test.commit(b2).lanePos(posB); // b1 is not repositioned, uses "detour lane" // (drawn as a double arc in the ascii graph above) test.commit(b1).lanePos(posB); @@ -569,13 +578,14 @@ public class PlotCommitListTest extends RevWalkTestCase { * b2 * a4 | * | \ | - * a3 \| + * | b1 + * a3 | * | \ | * | c | * | / | * a2 | - * | b1 - * / + * | | + * | / * | / * a1 * @@ -604,10 +614,10 @@ public class PlotCommitListTest extends RevWalkTestCase { CommitListAssert test = new CommitListAssert(pcl); int posB = test.commit(b2).lanePos(positions).getLanePos(); int posA = test.commit(a4).lanePos(positions).getLanePos(); + test.commit(b1).lanePos(posB); // repositioned to go around c test.commit(a3).lanePos(posA); test.commit(c).lanePos(positions); test.commit(a2).lanePos(posA); - test.commit(b1).lanePos(posB); // repositioned to go around c test.commit(a1).lanePos(posA); test.noMoreCommits(); } diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkSortTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkSortTest.java index 6f110fa31..3f29e09e3 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkSortTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkSortTest.java @@ -144,4 +144,110 @@ public class RevWalkSortTest extends RevWalkTestCase { assertCommit(d, rw.next()); assertNull(rw.next()); } + + @Test + public void testSort_TOPO_OutOfOrderCommitTimes() throws Exception { + // b is committed before c2 in a different line of history. + // + final RevCommit a = commit(); + final RevCommit c1 = commit(a); + final RevCommit b = commit(a); + final RevCommit c2 = commit(c1); + final RevCommit d = commit(b, c2); + + rw.sort(RevSort.TOPO); + markStart(d); + assertCommit(d, rw.next()); + assertCommit(c2, rw.next()); + assertCommit(c1, rw.next()); + assertCommit(b, rw.next()); + assertCommit(a, rw.next()); + assertNull(rw.next()); + } + + @Test + public void testSort_TOPO_MultipleLinesOfHistory() throws Exception { + final RevCommit a1 = commit(); + final RevCommit b1 = commit(a1); + final RevCommit a2 = commit(a1, b1); + final RevCommit b2 = commit(b1); + final RevCommit b3 = commit(b1); + final RevCommit a3 = commit(a2, b2); + final RevCommit a4 = commit(a3, b3); + + rw.sort(RevSort.TOPO); + markStart(a4); + assertCommit(a4, rw.next()); + assertCommit(b3, rw.next()); + assertCommit(a3, rw.next()); + assertCommit(b2, rw.next()); + assertCommit(a2, rw.next()); + assertCommit(b1, rw.next()); + assertCommit(a1, rw.next()); + assertNull(rw.next()); + } + + @Test + public void testSort_TOPO_REVERSE_MultipleLinesOfHistory() + throws Exception { + final RevCommit a1 = commit(); + final RevCommit b1 = commit(a1); + final RevCommit a2 = commit(a1, b1); + final RevCommit b2 = commit(b1); + final RevCommit b3 = commit(b1); + final RevCommit a3 = commit(a2, b2); + final RevCommit a4 = commit(a3, b3); + + rw.sort(RevSort.TOPO); + rw.sort(RevSort.REVERSE, true); + markStart(a4); + assertCommit(a1, rw.next()); + assertCommit(b1, rw.next()); + assertCommit(a2, rw.next()); + assertCommit(b2, rw.next()); + assertCommit(a3, rw.next()); + assertCommit(b3, rw.next()); + assertCommit(a4, rw.next()); + assertNull(rw.next()); + } + + @Test + public void testSort_TOPO_ParentOfMultipleStartChildren() throws Exception { + final RevCommit a = commit(); + final RevCommit b = commit(a); + final RevCommit c = commit(a); + final RevCommit d1 = commit(a); + final RevCommit d2 = commit(d1); + final RevCommit e = commit(a); + + rw.sort(RevSort.TOPO); + markStart(b); + markStart(c); + markStart(d2); + markStart(e); + assertCommit(e, rw.next()); + assertCommit(d2, rw.next()); + assertCommit(d1, rw.next()); + assertCommit(c, rw.next()); + assertCommit(b, rw.next()); + assertCommit(a, rw.next()); + assertNull(rw.next()); + } + + @Test + public void testSort_TOPO_Uninteresting() throws Exception { + final RevCommit a1 = commit(); + final RevCommit a2 = commit(a1); + final RevCommit a3 = commit(a2); + final RevCommit b = commit(a1); + final RevCommit a4 = commit(a3, b); + + rw.sort(RevSort.TOPO); + markStart(a4); + markUninteresting(a2); + assertCommit(a4, rw.next()); + assertCommit(b, rw.next()); + assertCommit(a3, rw.next()); + assertNull(rw.next()); + } } diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/GitDateParserBadlyFormattedTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/GitDateParserBadlyFormattedTest.java index cd2cdce15..547def182 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/GitDateParserBadlyFormattedTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/GitDateParserBadlyFormattedTest.java @@ -46,7 +46,7 @@ public class GitDateParserBadlyFormattedTest { } @DataPoints - static public String[] getDataPoints() { + public static String[] getDataPoints() { return new String[] { "", "1970", "3000.3000.3000", "3 yesterday ago", "now yesterday ago", "yesterdays", "3.day. 2.week.ago", "day ago", "Gra Feb 21 15:35:00 2007 +0100", diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/HexTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/HexTest.java new file mode 100644 index 000000000..32af07f25 --- /dev/null +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/HexTest.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2010, Google Inc. + * Copyright (C) 2020 Michael Dardis and others + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Distribution License v. 1.0 which is available at + * https://www.eclipse.org/org/documents/edl-v10.php. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +package org.eclipse.jgit.util; + +import static org.eclipse.jgit.util.Hex.decode; +import static org.eclipse.jgit.util.Hex.toHexString; +import static org.junit.Assert.assertEquals; + +import org.eclipse.jgit.junit.JGitTestUtil; +import org.eclipse.jgit.lib.Constants; +import org.junit.Test; + +public class HexTest { + @Test + public void testEncode() { + assertEquals("68690a", toHexString(b("hi\n"))); + assertEquals("0001020d0a0971", toHexString(b("\0\1\2\r\n\tq"))); + } + + @Test + public void testDecode() { + JGitTestUtil.assertEquals(b("hi\n"), decode("68690a")); + JGitTestUtil.assertEquals(b("\0\1\2\r\n\tq"), decode("0001020d0a0971")); + JGitTestUtil.assertEquals(b("\u000EB"), decode("0E42")); + } + + @Test + public void testEncodeMatchesDecode() { + String[] testStrings = { "", "cow", "a", "a secret string", + "\0\1\2\r\n\t" }; + for (String e : testStrings) { + JGitTestUtil.assertEquals(b(e), decode(toHexString(b(e)))); + } + } + + private static byte[] b(String str) { + return Constants.encode(str); + } + +} diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/StatsTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/StatsTest.java index e4927376d..6c4b4a4bb 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/StatsTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/StatsTest.java @@ -12,7 +12,6 @@ package org.eclipse.jgit.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import org.eclipse.jgit.util.Stats; import org.junit.Test; public class StatsTest { diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/io/TeeOutputStreamTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/io/TeeOutputStreamTest.java new file mode 100644 index 000000000..bb1c97445 --- /dev/null +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/io/TeeOutputStreamTest.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2020, Michael Dardis. and others + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Distribution License v. 1.0 which is available at + * https://www.eclipse.org/org/documents/edl-v10.php. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +package org.eclipse.jgit.util.io; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import org.eclipse.jgit.lib.Constants; +import org.junit.Test; + +public class TeeOutputStreamTest { + + @Test + public void test() throws IOException { + byte[] data = Constants.encode("Hello World"); + + TestOutput first = new TestOutput(); + TestOutput second = new TestOutput(); + try (TeeOutputStream tee = new TeeOutputStream(first, second)) { + tee.write(data); + assertArrayEquals("Stream output must match", first.toByteArray(), + second.toByteArray()); + + tee.write(1); + assertArrayEquals("Stream output must match", first.toByteArray(), + second.toByteArray()); + + tee.write(data, 1, 4); // Test partial write methods + assertArrayEquals("Stream output must match", first.toByteArray(), + second.toByteArray()); + } + assertTrue("First stream should be closed", first.closed); + assertTrue("Second stream should be closed", second.closed); + } + + @Test + public void testCloseException() { + TestOutput first = new TestOutput() { + @Override + public void close() throws IOException { + throw new IOException(); + } + + }; + TestOutput second = new TestOutput(); + + @SuppressWarnings("resource") + TeeOutputStream tee = new TeeOutputStream(first, second); + try { + tee.close(); + } catch (IOException ex) { + // Expected from first closed + } + assertFalse("First stream should not be closed", first.closed); + assertTrue("Second stream should still be closed if first close failed", + second.closed); + } + + private static class TestOutput extends ByteArrayOutputStream { + + private boolean closed; + + @Override + public void close() throws IOException { + closed = true; + super.close(); + } + } + +} diff --git a/org.eclipse.jgit/META-INF/MANIFEST.MF b/org.eclipse.jgit/META-INF/MANIFEST.MF index 1fd25780d..dbf122ef9 100644 --- a/org.eclipse.jgit/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit/META-INF/MANIFEST.MF @@ -172,7 +172,6 @@ Import-Package: com.googlecode.javaewah;version="[1.1.6,2.0.0)", org.bouncycastle.openpgp.operator;version="[1.61.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.bouncycastle.util.io;version="[1.61.0,2.0.0)", org.slf4j;version="[1.7.0,2.0.0)", org.xml.sax, org.xml.sax.helpers diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java index fbd59dd75..0dc5d5e7f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java @@ -104,7 +104,7 @@ public class CheckoutCommand extends GitCommand { /** * Stage to check out, see {@link CheckoutCommand#setStage(Stage)}. */ - public static enum Stage { + public enum Stage { /** * Base stage (#1) */ diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java index 5322d5c0e..4e18b5994 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java @@ -491,7 +491,7 @@ public class CommitCommand extends GitCommand { int position = Collections.binarySearch(only, p); if (position >= 0) return position; - int l = p.lastIndexOf("/"); //$NON-NLS-1$ + int l = p.lastIndexOf('/'); if (l < 1) break; p = p.substring(0, l); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java index 16207c92e..449250890 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java @@ -57,7 +57,7 @@ import org.eclipse.jgit.transport.TagOpt; */ public class PullCommand extends TransportCommand { - private final static String DOT = "."; //$NON-NLS-1$ + private static final String DOT = "."; //$NON-NLS-1$ private ProgressMonitor monitor = NullProgressMonitor.INSTANCE; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java index 705993e4e..b722fbe9d 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java @@ -800,7 +800,8 @@ public class RebaseCommand extends GitCommand { sb.append("# This is a combination of ").append(count) .append(" commits.\n"); // Add the previous message without header (i.e first line) - sb.append(currSquashMessage.substring(currSquashMessage.indexOf("\n") + 1)); + sb.append(currSquashMessage + .substring(currSquashMessage.indexOf('\n') + 1)); sb.append("\n"); if (isSquash) { sb.append("# This is the ").append(count).append(ordinal) @@ -838,7 +839,7 @@ public class RebaseCommand extends GitCommand { static int parseSquashFixupSequenceCount(String currSquashMessage) { String regex = "This is a combination of (.*) commits"; //$NON-NLS-1$ String firstLine = currSquashMessage.substring(0, - currSquashMessage.indexOf("\n")); //$NON-NLS-1$ + currSquashMessage.indexOf('\n')); Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(firstLine); if (!matcher.find()) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/Attribute.java b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/Attribute.java index e409082d6..470a92eaf 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/Attribute.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/Attribute.java @@ -34,7 +34,7 @@ public final class Attribute { * The attribute value state * see also https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html */ - public static enum State { + public enum State { /** the attribute is set */ SET, diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesRule.java b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesRule.java index 53812442b..73fd587a1 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesRule.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/AttributesRule.java @@ -9,7 +9,7 @@ */ package org.eclipse.jgit.attributes; -import static org.eclipse.jgit.ignore.internal.IMatcher.NO_MATCH; +import static org.eclipse.jgit.ignore.IMatcher.NO_MATCH; import java.util.ArrayList; import java.util.Collections; @@ -18,7 +18,7 @@ import java.util.List; import org.eclipse.jgit.attributes.Attribute.State; import org.eclipse.jgit.errors.InvalidPatternException; import org.eclipse.jgit.ignore.FastIgnoreRule; -import org.eclipse.jgit.ignore.internal.IMatcher; +import org.eclipse.jgit.ignore.IMatcher; import org.eclipse.jgit.ignore.internal.PathMatcher; /** @@ -58,7 +58,7 @@ public class AttributesRule { continue; } - final int equalsIndex = attribute.indexOf("="); //$NON-NLS-1$ + final int equalsIndex = attribute.indexOf('='); if (equalsIndex == -1) result.add(new Attribute(attribute, State.SET)); else { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffConfig.java index 4ccde4f88..b062ee7ee 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffConfig.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffConfig.java @@ -26,7 +26,7 @@ public class DiffConfig { public static final Config.SectionParser KEY = DiffConfig::new; /** Permissible values for {@code diff.renames}. */ - public static enum RenameDetectionType { + public enum RenameDetectionType { /** Rename detection is disabled. */ FALSE, diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffEntry.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffEntry.java index 1041682ee..f0ce121f7 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffEntry.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffEntry.java @@ -39,7 +39,7 @@ public class DiffEntry { public static final String DEV_NULL = "/dev/null"; //$NON-NLS-1$ /** General type of change a single file-level patch describes. */ - public static enum ChangeType { + public enum ChangeType { /** Add a new file to the project */ ADD, @@ -57,7 +57,7 @@ public class DiffEntry { } /** Specify the old or new side for more generalized access. */ - public static enum Side { + public enum Side { /** The old side of a DiffEntry. */ OLD, diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/Edit.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/Edit.java index f05c4571c..219a187e2 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/Edit.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/Edit.java @@ -31,7 +31,7 @@ package org.eclipse.jgit.diff; */ public class Edit { /** Type of edit */ - public static enum Type { + public enum Type { /** Sequence B has inserted the region. */ INSERT, diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/SimilarityRenameDetector.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/SimilarityRenameDetector.java index 6173f7dfe..74a11a024 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/SimilarityRenameDetector.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/SimilarityRenameDetector.java @@ -302,14 +302,14 @@ class SimilarityRenameDetector { } static int nameScore(String a, String b) { - int aDirLen = a.lastIndexOf("/") + 1; //$NON-NLS-1$ - int bDirLen = b.lastIndexOf("/") + 1; //$NON-NLS-1$ + int aDirLen = a.lastIndexOf('/') + 1; + int bDirLen = b.lastIndexOf('/') + 1; - int dirMin = Math.min(aDirLen, bDirLen); - int dirMax = Math.max(aDirLen, bDirLen); + int dirMin = Math.min(aDirLen, bDirLen); + int dirMax = Math.max(aDirLen, bDirLen); - final int dirScoreLtr; - final int dirScoreRtl; + final int dirScoreLtr; + final int dirScoreRtl; if (dirMax == 0) { dirScoreLtr = 100; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/NoMergeBaseException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/NoMergeBaseException.java index 9c832944b..889ee5b3b 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/NoMergeBaseException.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/NoMergeBaseException.java @@ -30,7 +30,7 @@ public class NoMergeBaseException extends IOException { * An enum listing the different reason why no merge base could be * determined. */ - public static enum MergeBaseFailureReason { + public enum MergeBaseFailureReason { /** * Multiple merge bases have been found (e.g. the commits to be merged * have multiple common predecessors) but the merge strategy doesn't diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/TranslationBundleException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/TranslationBundleException.java index 28b48caec..1c9243c2e 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/TranslationBundleException.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/TranslationBundleException.java @@ -45,7 +45,7 @@ public abstract class TranslationBundleException extends RuntimeException { * * @return bundle class for which the exception occurred */ - final public Class getBundleClass() { + public final Class getBundleClass() { return bundleClass; } @@ -54,7 +54,7 @@ public abstract class TranslationBundleException extends RuntimeException { * * @return locale for which the exception occurred */ - final public Locale getLocale() { + public final Locale getLocale() { return locale; } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/GitHook.java b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/GitHook.java index ed9c38a4d..4059b16b3 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/GitHook.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/GitHook.java @@ -17,11 +17,11 @@ import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.util.concurrent.Callable; -import org.bouncycastle.util.io.TeeOutputStream; import org.eclipse.jgit.api.errors.AbortedByHookException; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.util.FS; import org.eclipse.jgit.util.ProcessResult; +import org.eclipse.jgit.util.io.TeeOutputStream; /** * Git can fire off custom scripts when certain important actions occur. These diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/FastIgnoreRule.java b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/FastIgnoreRule.java index a1866c85a..d7e4f79d2 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/FastIgnoreRule.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/FastIgnoreRule.java @@ -9,13 +9,12 @@ */ package org.eclipse.jgit.ignore; -import static org.eclipse.jgit.ignore.internal.IMatcher.NO_MATCH; +import static org.eclipse.jgit.ignore.IMatcher.NO_MATCH; import static org.eclipse.jgit.ignore.internal.Strings.isDirectoryPattern; import static org.eclipse.jgit.ignore.internal.Strings.stripTrailing; import static org.eclipse.jgit.ignore.internal.Strings.stripTrailingWhitespace; import org.eclipse.jgit.errors.InvalidPatternException; -import org.eclipse.jgit.ignore.internal.IMatcher; import org.eclipse.jgit.ignore.internal.PathMatcher; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,7 +28,7 @@ import org.slf4j.LoggerFactory; * @since 3.6 */ public class FastIgnoreRule { - private final static Logger LOG = LoggerFactory + private static final Logger LOG = LoggerFactory .getLogger(FastIgnoreRule.class); /** diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/IMatcher.java b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/IMatcher.java similarity index 60% rename from org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/IMatcher.java rename to org.eclipse.jgit/src/org/eclipse/jgit/ignore/IMatcher.java index d93cc9a8a..3cbb069ff 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/IMatcher.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/IMatcher.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014, 2017 Andrey Loskutov and others + * Copyright (C) 2014, 2020 Andrey Loskutov and others * * This program and the accompanying materials are made available under the * terms of the Eclipse Distribution License v. 1.0 which is available at @@ -7,10 +7,16 @@ * * SPDX-License-Identifier: BSD-3-Clause */ -package org.eclipse.jgit.ignore.internal; +package org.eclipse.jgit.ignore; + +import org.eclipse.jgit.annotations.NonNull; +import org.eclipse.jgit.errors.InvalidPatternException; +import org.eclipse.jgit.ignore.internal.PathMatcher; /** - * Generic string matcher + * Generic path matcher. + * + * @since 5.7 */ public interface IMatcher { @@ -18,6 +24,7 @@ public interface IMatcher { * Matcher that does not match any pattern. */ public static final IMatcher NO_MATCH = new IMatcher() { + @Override public boolean matches(String path, boolean assumeDirectory, boolean pathMatch) { @@ -30,6 +37,25 @@ public interface IMatcher { } }; + /** + * Creates a path matcher for the given pattern. A pattern may contain the + * wildcards "?", "*", and "**". The directory separator is '/'. + * + * @param pattern + * to match + * @param dirOnly + * whether to match only directories + * @return a matcher for the given pattern + * @throws InvalidPatternException + * if the pattern is invalid + */ + @NonNull + public static IMatcher createPathMatcher(@NonNull String pattern, + boolean dirOnly) throws InvalidPatternException { + return PathMatcher.createPathMatcher(pattern, + Character.valueOf(FastIgnoreRule.PATH_SEPARATOR), dirOnly); + } + /** * Matches entire given string * @@ -40,10 +66,7 @@ public interface IMatcher { * with a slash) * @param pathMatch * {@code true} if the match is for the full path: prefix-only - * matches are not allowed, and - * {@link org.eclipse.jgit.ignore.internal.NameMatcher}s must - * match only the last component (if they can -- they may not, if - * they are anchored at the beginning) + * matches are not allowed * @return true if this matcher pattern matches given string */ boolean matches(String path, boolean assumeDirectory, boolean pathMatch); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/IgnoreNode.java b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/IgnoreNode.java index 4564e241c..0bc612491 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/IgnoreNode.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/IgnoreNode.java @@ -26,7 +26,7 @@ import java.util.List; */ public class IgnoreNode { /** Result from {@link IgnoreNode#isIgnored(String, boolean)}. */ - public static enum MatchResult { + public enum MatchResult { /** The file is not ignored, due to a rule saying its not ignored. */ NOT_IGNORED, diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/AbstractMatcher.java b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/AbstractMatcher.java index a77061f50..0737ed887 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/AbstractMatcher.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/AbstractMatcher.java @@ -9,6 +9,8 @@ */ package org.eclipse.jgit.ignore.internal; +import org.eclipse.jgit.ignore.IMatcher; + /** * Base class for default methods as {@link #toString()} and such. *

diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/PathMatcher.java b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/PathMatcher.java index 8226a5247..ba77b3dd8 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/PathMatcher.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/PathMatcher.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.List; import org.eclipse.jgit.errors.InvalidPatternException; +import org.eclipse.jgit.ignore.IMatcher; import org.eclipse.jgit.ignore.internal.Strings.PatternState; /** diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/Strings.java b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/Strings.java index 107a0dd61..fbce08adf 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/Strings.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/Strings.java @@ -196,11 +196,11 @@ public class Strings { return PatternState.COMPLEX; } - static enum PatternState { + enum PatternState { LEADING_ASTERISK_ONLY, TRAILING_ASTERISK_ONLY, COMPLEX, NONE } - final static List POSIX_CHAR_CLASSES = Arrays.asList( + static final List POSIX_CHAR_CLASSES = Arrays.asList( "alnum", "alpha", "blank", "cntrl", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ // [:alnum:] [:alpha:] [:blank:] [:cntrl:] "digit", "graph", "lower", "print", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ @@ -215,7 +215,7 @@ public class Strings { private static final String DL = "\\p{javaDigit}\\p{javaLetter}"; //$NON-NLS-1$ - final static List JAVA_CHAR_CLASSES = Arrays + static final List JAVA_CHAR_CLASSES = Arrays .asList("\\p{Alnum}", "\\p{javaLetter}", "\\p{Blank}", "\\p{Cntrl}", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ // [:alnum:] [:alpha:] [:blank:] [:cntrl:] "\\p{javaDigit}", "[\\p{Graph}" + DL + "]", "\\p{Ll}", "[\\p{Print}" + DL + "]", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ @@ -228,7 +228,7 @@ public class Strings { // Collating symbols [[.a.]] or equivalence class expressions [[=a=]] are // not supported by CLI git (at least not by 1.9.1) - final static Pattern UNSUPPORTED = Pattern + static final Pattern UNSUPPORTED = Pattern .compile("\\[\\[[.=]\\w+[.=]\\]\\]"); //$NON-NLS-1$ /** diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchLeader.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchLeader.java index a587bbca3..743d1939c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchLeader.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/ketch/KetchLeader.java @@ -93,7 +93,7 @@ public abstract class KetchLeader { private static final Logger log = LoggerFactory.getLogger(KetchLeader.class); /** Current state of the leader instance. */ - public static enum State { + public enum State { /** Newly created instance trying to elect itself leader. */ CANDIDATE, diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsObjDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsObjDatabase.java index b357da5b4..4dab3b20c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsObjDatabase.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsObjDatabase.java @@ -64,7 +64,7 @@ public abstract class DfsObjDatabase extends ObjectDatabase { * comparator based on {@link Enum#compareTo}. Prefer {@link * #DEFAULT_COMPARATOR} or your own {@link ComparatorBuilder}. */ - public static enum PackSource { + public enum PackSource { /** The pack is created by ObjectInserter due to local activity. */ INSERT, @@ -672,7 +672,7 @@ public abstract class DfsObjDatabase extends ObjectDatabase { } /** Snapshot of packs scanned in a single pass. */ - public static abstract class PackList { + public abstract static class PackList { /** All known packs, sorted. */ public final DfsPackFile[] packs; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileObjectDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileObjectDatabase.java index 448c8bb27..11ed10c90 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileObjectDatabase.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileObjectDatabase.java @@ -27,7 +27,7 @@ import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.util.FS; abstract class FileObjectDatabase extends ObjectDatabase { - static enum InsertLooseObjectResult { + enum InsertLooseObjectResult { INSERTED, EXISTS_PACKED, EXISTS_LOOSE, FAILURE; } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java index 915f31070..0899578e2 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java @@ -98,7 +98,7 @@ import org.slf4j.LoggerFactory; * adapted to FileRepositories. */ public class GC { - private final static Logger LOG = LoggerFactory + private static final Logger LOG = LoggerFactory .getLogger(GC.class); private static final String PRUNE_EXPIRE_DEFAULT = "2.weeks.ago"; //$NON-NLS-1$ diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LockFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LockFile.java index f2b65572e..2e0a6da3a 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LockFile.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LockFile.java @@ -50,7 +50,7 @@ import org.slf4j.LoggerFactory; * name. */ public class LockFile { - private final static Logger LOG = LoggerFactory.getLogger(LockFile.class); + private static final Logger LOG = LoggerFactory.getLogger(LockFile.class); /** * Unlock the given file. diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java index 169587081..6a822d570 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java @@ -76,7 +76,7 @@ import org.slf4j.LoggerFactory; * considered. */ public class ObjectDirectory extends FileObjectDatabase { - private final static Logger LOG = LoggerFactory + private static final Logger LOG = LoggerFactory .getLogger(ObjectDirectory.class); private static final PackList NO_PACKS = new PackList( diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java index b99733875..254c02023 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java @@ -70,7 +70,7 @@ import org.slf4j.LoggerFactory; * objects are similar. */ public class PackFile implements Iterable { - private final static Logger LOG = LoggerFactory.getLogger(PackFile.class); + private static final Logger LOG = LoggerFactory.getLogger(PackFile.class); /** * Sorts PackFiles to be most recently created to least recently created. diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java index fddd430bf..7d108feae 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java @@ -97,7 +97,7 @@ import org.slf4j.LoggerFactory; * overall size of a Git repository on disk. */ public class RefDirectory extends RefDatabase { - private final static Logger LOG = LoggerFactory + private static final Logger LOG = LoggerFactory .getLogger(RefDirectory.class); /** Magic string denoting the start of a symbolic reference file. */ @@ -1376,7 +1376,7 @@ public class RefDirectory extends RefDatabase { LooseRef peel(ObjectIdRef newLeaf); } - private final static class LoosePeeledTag extends ObjectIdRef.PeeledTag + private static final class LoosePeeledTag extends ObjectIdRef.PeeledTag implements LooseRef { private final FileSnapshot snapShot; @@ -1397,7 +1397,7 @@ public class RefDirectory extends RefDatabase { } } - private final static class LooseNonTag extends ObjectIdRef.PeeledNonTag + private static final class LooseNonTag extends ObjectIdRef.PeeledNonTag implements LooseRef { private final FileSnapshot snapShot; @@ -1418,7 +1418,7 @@ public class RefDirectory extends RefDatabase { } } - private final static class LooseUnpeeled extends ObjectIdRef.Unpeeled + private static final class LooseUnpeeled extends ObjectIdRef.Unpeeled implements LooseRef { private FileSnapshot snapShot; @@ -1453,7 +1453,7 @@ public class RefDirectory extends RefDatabase { } } - private final static class LooseSymbolicRef extends SymbolicRef implements + private static final class LooseSymbolicRef extends SymbolicRef implements LooseRef { private final FileSnapshot snapShot; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackExt.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackExt.java index eaca758e4..bedc6939c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackExt.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackExt.java @@ -48,7 +48,7 @@ public class PackExt { * the file extension. * @return the PackExt for the ext */ - public synchronized static PackExt newPackExt(String ext) { + public static synchronized PackExt newPackExt(String ext) { PackExt[] dst = new PackExt[VALUES.length + 1]; for (int i = 0; i < VALUES.length; i++) { PackExt packExt = VALUES[i]; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java index e8f0e1fd9..057970eca 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java @@ -2399,7 +2399,7 @@ public class PackWriter implements AutoCloseable { } /** Possible states that a PackWriter can be in. */ - public static enum PackingPhase { + public enum PackingPhase { /** Counting objects phase. */ COUNTING, diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/BlockWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/BlockWriter.java index 0f11e0546..e3c0fc94a 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/BlockWriter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/BlockWriter.java @@ -253,7 +253,7 @@ class BlockWriter { return aLen - bLen; } - static abstract class Entry { + abstract static class Entry { static int compare(Entry ea, Entry eb) { byte[] a = ea.key; byte[] b = eb.key; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableDatabase.java index e8a61d2d3..4de6c2870 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableDatabase.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableDatabase.java @@ -47,7 +47,7 @@ public abstract class ReftableDatabase { * @throws IOException * on I/O problems. */ - abstract protected MergedReftable openMergedReftable() throws IOException; + protected abstract MergedReftable openMergedReftable() throws IOException; /** * @return the next available logical timestamp for an additional reftable diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/CoreConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/CoreConfig.java index 8220a9182..f23c6e08d 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/CoreConfig.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/CoreConfig.java @@ -27,7 +27,7 @@ public class CoreConfig { public static final Config.SectionParser KEY = CoreConfig::new; /** Permissible values for {@code core.autocrlf}. */ - public static enum AutoCRLF { + public enum AutoCRLF { /** Automatic CRLF->LF conversion is disabled. */ FALSE, @@ -45,7 +45,7 @@ public class CoreConfig { * * @since 4.3 */ - public static enum EOL { + public enum EOL { /** Check in with LF, check out with CRLF. */ CRLF, @@ -61,7 +61,7 @@ public class CoreConfig { * * @since 4.3 */ - public static enum EolStreamType { + public enum EolStreamType { /** Convert to CRLF without binary detection. */ TEXT_CRLF, @@ -83,7 +83,7 @@ public class CoreConfig { * * @since 3.0 */ - public static enum CheckStat { + public enum CheckStat { /** * Only check the size and whole second part of time stamp when * comparing the stat info in the dircache with actual file stat info. @@ -102,7 +102,7 @@ public class CoreConfig { * * @since 5.6 */ - public static enum LogRefUpdates { + public enum LogRefUpdates { /** Don't create ref logs; default for bare repositories. */ FALSE, @@ -131,7 +131,7 @@ public class CoreConfig { * * @since 3.3 */ - public static enum SymLinks { + public enum SymLinks { /** Check out symbolic links as plain files . */ FALSE, @@ -144,7 +144,7 @@ public class CoreConfig { * * @since 3.5 */ - public static enum HideDotFiles { + public enum HideDotFiles { /** Do not hide .files. */ FALSE, diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/GitmoduleEntry.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/GitmoduleEntry.java index d93a09623..aa0a9dd66 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/GitmoduleEntry.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/GitmoduleEntry.java @@ -9,8 +9,6 @@ */ package org.eclipse.jgit.lib; -import org.eclipse.jgit.lib.AnyObjectId; - /** * A .gitmodules file found in the pack. Store the blob of the file itself (e.g. * to access its contents) and the tree where it was found (e.g. to check if it diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java index 293b7237d..28ea927b1 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java @@ -75,7 +75,7 @@ public class IndexDiff { * @see IndexDiff#getConflictingStageStates() * @since 3.0 */ - public static enum StageState { + public enum StageState { /** * Exists in base, but neither in ours nor in theirs. */ @@ -210,11 +210,11 @@ public class IndexDiff { } } - private final static int TREE = 0; + private static final int TREE = 0; - private final static int INDEX = 1; + private static final int INDEX = 1; - private final static int WORKDIR = 2; + private static final int WORKDIR = 2; private final Repository repository; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/InflaterCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/InflaterCache.java index f242d31c8..239b4f822 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/InflaterCache.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/InflaterCache.java @@ -40,7 +40,7 @@ public class InflaterCache { return r != null ? r : new Inflater(false); } - private synchronized static Inflater getImpl() { + private static synchronized Inflater getImpl() { if (openInflaterCount > 0) { final Inflater r = inflaterCache[--openInflaterCount]; inflaterCache[openInflaterCount] = null; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdOwnerMap.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdOwnerMap.java index 1e93235de..ad529559a 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdOwnerMap.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdOwnerMap.java @@ -322,7 +322,7 @@ public class ObjectIdOwnerMap } /** Type of entry stored in the {@link ObjectIdOwnerMap}. */ - public static abstract class Entry extends ObjectId { + public abstract static class Entry extends ObjectId { transient Entry next; /** diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java index 1c3c9180b..000899d76 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java @@ -65,7 +65,7 @@ public abstract class ObjectInserter implements AutoCloseable { } /** Wraps a delegate ObjectInserter. */ - public static abstract class Filter extends ObjectInserter { + public abstract static class Filter extends ObjectInserter { /** @return delegate ObjectInserter to handle all processing. */ protected abstract ObjectInserter delegate(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectLoader.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectLoader.java index ad5314fa3..67b8a2c24 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectLoader.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectLoader.java @@ -300,7 +300,7 @@ public abstract class ObjectLoader { * * @since 4.10 */ - public static abstract class Filter extends ObjectLoader { + public abstract static class Filter extends ObjectLoader { /** * @return delegate ObjectLoader to handle all processing. * @since 4.10 diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectReader.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectReader.java index c0ac9e789..6bb6ae590 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectReader.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectReader.java @@ -462,7 +462,7 @@ public abstract class ObjectReader implements AutoCloseable { * * @since 4.4 */ - public static abstract class Filter extends ObjectReader { + public abstract static class Filter extends ObjectReader { /** * @return delegate ObjectReader to handle all processing. * @since 4.4 diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RebaseTodoLine.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RebaseTodoLine.java index 02022e9b0..8b778497f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RebaseTodoLine.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RebaseTodoLine.java @@ -25,7 +25,7 @@ public class RebaseTodoLine { * Describes rebase actions */ @SuppressWarnings("nls") - public static enum Action { + public enum Action { /** Use commit */ PICK("pick", "p"), @@ -72,7 +72,7 @@ public class RebaseTodoLine { * @param token * @return the Action */ - static public Action parse(String token) { + public static Action parse(String token) { for (Action action : Action.values()) { if (action.token.equals(token) || action.shortToken.equals(token)) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefUpdate.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefUpdate.java index 40e0a32f8..d1be63b96 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefUpdate.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefUpdate.java @@ -33,7 +33,7 @@ public abstract class RefUpdate { * unknown values are failures, and may generally treat them the same as * {@link #REJECTED_OTHER_REASON}. */ - public static enum Result { + public enum Result { /** The ref update/delete has not been attempted by the caller. */ NOT_ATTEMPTED, @@ -794,7 +794,7 @@ public abstract class RefUpdate { * Handle the abstraction of storing a ref update. This is because both * updating and deleting of a ref have merge testing in common. */ - private static abstract class Store { + private abstract static class Store { abstract Result execute(Result status) throws IOException; } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCache.java index 4af25de17..d36ccd5be 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCache.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCache.java @@ -33,7 +33,7 @@ import org.slf4j.LoggerFactory; * Cache of active {@link org.eclipse.jgit.lib.Repository} instances. */ public class RepositoryCache { - private final static Logger LOG = LoggerFactory + private static final Logger LOG = LoggerFactory .getLogger(RepositoryCache.class); private static final RepositoryCache cache = new RepositoryCache(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeAlgorithm.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeAlgorithm.java index 39e784013..27141c12c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeAlgorithm.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeAlgorithm.java @@ -50,7 +50,7 @@ public final class MergeAlgorithm { // An special edit which acts as a sentinel value by marking the end the // list of edits - private final static Edit END_EDIT = new Edit(Integer.MAX_VALUE, + private static final Edit END_EDIT = new Edit(Integer.MAX_VALUE, Integer.MAX_VALUE); @SuppressWarnings("ReferenceEquality") diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/nls/NLS.java b/org.eclipse.jgit/src/org/eclipse/jgit/nls/NLS.java index 2cb1a5301..daa039d34 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/nls/NLS.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/nls/NLS.java @@ -100,8 +100,8 @@ public class NLS { return b.get(type); } - final private Locale locale; - final private ConcurrentHashMap map = new ConcurrentHashMap<>(); + private final Locale locale; + private final ConcurrentHashMap map = new ConcurrentHashMap<>(); private NLS(Locale locale) { this.locale = locale; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/patch/BinaryHunk.java b/org.eclipse.jgit/src/org/eclipse/jgit/patch/BinaryHunk.java index 2c7d69630..20fcf8cf0 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/patch/BinaryHunk.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/patch/BinaryHunk.java @@ -25,7 +25,7 @@ public class BinaryHunk { private static final byte[] DELTA = encodeASCII("delta "); //$NON-NLS-1$ /** Type of information stored in a binary hunk. */ - public static enum Type { + public enum Type { /** The full content is stored, deflated. */ LITERAL_DEFLATED, diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/patch/CombinedHunkHeader.java b/org.eclipse.jgit/src/org/eclipse/jgit/patch/CombinedHunkHeader.java index edf278c94..263b1b9dd 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/patch/CombinedHunkHeader.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/patch/CombinedHunkHeader.java @@ -25,7 +25,7 @@ import org.eclipse.jgit.util.MutableInteger; * Hunk header for a hunk appearing in a "diff --cc" style patch. */ public class CombinedHunkHeader extends HunkHeader { - private static abstract class CombinedOldImage extends OldImage { + private abstract static class CombinedOldImage extends OldImage { int nContext; } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/patch/FileHeader.java b/org.eclipse.jgit/src/org/eclipse/jgit/patch/FileHeader.java index 617b66750..1e6fb780b 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/patch/FileHeader.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/patch/FileHeader.java @@ -71,7 +71,7 @@ public class FileHeader extends DiffEntry { static final byte[] NEW_NAME = encodeASCII("+++ "); //$NON-NLS-1$ /** Type of patch used by this file. */ - public static enum PatchType { + public enum PatchType { /** A traditional unified diff style patch of a text file. */ UNIFIED, diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/patch/FormatError.java b/org.eclipse.jgit/src/org/eclipse/jgit/patch/FormatError.java index 69ed60ac0..5618a7178 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/patch/FormatError.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/patch/FormatError.java @@ -21,7 +21,7 @@ import org.eclipse.jgit.util.RawParseUtils; */ public class FormatError { /** Classification of an error. */ - public static enum Severity { + public enum Severity { /** The error is unexpected, but can be worked around. */ WARNING, diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevObject.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevObject.java index 5ce4bc33b..1abcf6962 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevObject.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevObject.java @@ -151,7 +151,7 @@ public abstract class RevObject extends ObjectIdOwnerMap.Entry { * buffer to append a debug description of core RevFlags onto. */ protected void appendCoreFlags(StringBuilder s) { - s.append((flags & RevWalk.TOPO_DELAY) != 0 ? 'o' : '-'); + s.append((flags & RevWalk.TOPO_QUEUED) != 0 ? 'o' : '-'); s.append((flags & RevWalk.TEMP_MARK) != 0 ? 't' : '-'); s.append((flags & RevWalk.REWRITE) != 0 ? 'r' : '-'); s.append((flags & RevWalk.UNINTERESTING) != 0 ? 'u' : '-'); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java index f425e8761..383428c85 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java @@ -125,11 +125,11 @@ public class RevWalk implements Iterable, AutoCloseable { /** * Temporary mark for use within {@link TopoSortGenerator}. *

- * This mark indicates the commit could not produce when it wanted to, as at - * least one child was behind it. Commits with this flag are delayed until - * all children have been output first. + * This mark indicates the commit has been queued for emission in + * {@link TopoSortGenerator} and can be produced. This mark is removed when + * the commit has been produced. */ - static final int TOPO_DELAY = 1 << 5; + static final int TOPO_QUEUED = 1 << 5; /** Number of flag bits we keep internal for our own use. See above flags. */ static final int RESERVED_FLAGS = 6; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/TopoSortGenerator.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/TopoSortGenerator.java index 7a5db43a7..3c553b06c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/TopoSortGenerator.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/TopoSortGenerator.java @@ -17,7 +17,7 @@ import org.eclipse.jgit.errors.MissingObjectException; /** Sorts commits in topological order. */ class TopoSortGenerator extends Generator { - private static final int TOPO_DELAY = RevWalk.TOPO_DELAY; + private static final int TOPO_QUEUED = RevWalk.TOPO_QUEUED; private final FIFORevQueue pending; @@ -47,12 +47,16 @@ class TopoSortGenerator extends Generator { if (c == null) { break; } - for (RevCommit p : c.parents) { - p.inDegree++; - if (firstParent) { - break; + if ((c.flags & TOPO_QUEUED) == 0) { + for (RevCommit p : c.parents) { + p.inDegree++; + + if (firstParent) { + break; + } } } + c.flags |= TOPO_QUEUED; pending.add(c); } } @@ -71,34 +75,42 @@ class TopoSortGenerator extends Generator { RevCommit next() throws MissingObjectException, IncorrectObjectTypeException, IOException { for (;;) { - final RevCommit c = pending.next(); - if (c == null) + RevCommit c = pending.next(); + if (c == null) { return null; + } if (c.inDegree > 0) { // At least one of our children is missing. We delay // production until all of our children are output. // - c.flags |= TOPO_DELAY; continue; } - // All of our children have already produced, - // so it is OK for us to produce now as well. - // + if ((c.flags & TOPO_QUEUED) == 0) { + // c is a parent that already produced or a parent that + // was never in the priority queue and should never produce. + // + continue; + } + for (RevCommit p : c.parents) { - if (--p.inDegree == 0 && (p.flags & TOPO_DELAY) != 0) { - // This parent tried to come before us, but we are - // his last child. unpop the parent so it goes right - // behind this child. + if (--p.inDegree == 0 && (p.flags & TOPO_QUEUED) != 0) { + // The parent has no unproduced interesting children. unpop + // the parent so it goes right behind this child. This means + // that this parent commit may appear in "pending" more than + // once, but this is safe since upon the second and + // subsequent iterations with this commit, it will no longer + // have TOPO_QUEUED set, and thus will be skipped. // - p.flags &= ~TOPO_DELAY; pending.unpop(p); } if (firstParent) { break; } } + + c.flags &= ~TOPO_QUEUED; return c; } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileBasedConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileBasedConfig.java index 92f08923e..0b9b98108 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileBasedConfig.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileBasedConfig.java @@ -44,7 +44,7 @@ import org.slf4j.LoggerFactory; * The configuration file that is stored in the file of the file system. */ public class FileBasedConfig extends StoredConfig { - private final static Logger LOG = LoggerFactory + private static final Logger LOG = LoggerFactory .getLogger(FileBasedConfig.class); private final File configFile; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java index 168dae5bc..eb1d2ac0a 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java @@ -358,7 +358,7 @@ public abstract class BasePackPushConnection extends BasePackConnection implemen refNameEnd = refLine.length(); } else if (refLine.startsWith("ng ")) { //$NON-NLS-1$ ok = false; - refNameEnd = refLine.indexOf(" ", 3); //$NON-NLS-1$ + refNameEnd = refLine.indexOf(' ', 3); } if (refNameEnd == -1) throw new PackProtocolException(MessageFormat.format(JGitText.get().unexpectedReportLine2 diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/GitProtocolConstants.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/GitProtocolConstants.java index 54bdc3d70..35e2978bc 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/GitProtocolConstants.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/GitProtocolConstants.java @@ -247,7 +247,7 @@ public final class GitProtocolConstants { */ public static final String COMMAND_FETCH = "fetch"; //$NON-NLS-1$ - static enum MultiAck { + enum MultiAck { OFF, CONTINUE, DETAILED; } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java index 89981802c..0801b8a86 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java @@ -70,7 +70,7 @@ public abstract class PackParser { private static final int BUFFER_SIZE = 8192; /** Location data is being obtained from. */ - public static enum Source { + public enum Source { /** Data is read from the incoming stream. */ INPUT, diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PacketLineIn.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PacketLineIn.java index c992bb1cb..52a5576e4 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PacketLineIn.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PacketLineIn.java @@ -62,7 +62,7 @@ public class PacketLineIn { @Deprecated public static final String DELIM = new StringBuilder(0).toString(); /* must not string pool */ - static enum AckNackResult { + enum AckNackResult { /** NAK */ NAK, /** ACK */ diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java index 6146eaac9..ab411600f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java @@ -39,7 +39,7 @@ import org.eclipse.jgit.revwalk.RevWalk; */ public class ReceiveCommand { /** Type of operation requested. */ - public static enum Type { + public enum Type { /** Create a new ref; the ref must not already exist. */ CREATE, @@ -65,7 +65,7 @@ public class ReceiveCommand { } /** Result of the update command. */ - public static enum Result { + public enum Result { /** The command has not yet been attempted by the server. */ NOT_ATTEMPTED, diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java index e505e1706..ec2b76938 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java @@ -1937,7 +1937,7 @@ public class ReceivePack { } /** Interface for reporting status messages. */ - static abstract class Reporter { + abstract static class Reporter { abstract void sendString(String s) throws IOException; } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteRefUpdate.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteRefUpdate.java index f7d318c01..43eaac792 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteRefUpdate.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RemoteRefUpdate.java @@ -39,7 +39,7 @@ public class RemoteRefUpdate { /** * Represent current status of a remote ref update. */ - public static enum Status { + public enum Status { /** * Push process hasn't yet attempted to update this ref. This is the * default status, prior to push process execution. diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportProtocol.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportProtocol.java index 4767e1b0a..912a90a1b 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportProtocol.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportProtocol.java @@ -57,7 +57,7 @@ import org.eclipse.jgit.lib.Repository; */ public abstract class TransportProtocol { /** Fields within a {@link URIish} that a transport uses. */ - public static enum URIishField { + public enum URIishField { /** the user field */ USER, /** the pass (aka password) field */ diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java index 8e8b781bb..09ca7ca60 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java @@ -104,7 +104,7 @@ import org.eclipse.jgit.util.io.TimeoutOutputStream; */ public class UploadPack { /** Policy the server uses to validate client requests */ - public static enum RequestPolicy { + public enum RequestPolicy { /** Client may only ask for objects the server advertised a reference for. */ ADVERTISED, diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkEncryption.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkEncryption.java index df9f11ecf..c8cdb5a54 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkEncryption.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkEncryption.java @@ -34,9 +34,9 @@ import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.PBEParameterSpec; import javax.crypto.spec.SecretKeySpec; -import org.bouncycastle.util.encoders.Hex; import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.util.Base64; +import org.eclipse.jgit.util.Hex; abstract class WalkEncryption { static final WalkEncryption NONE = new NoEncryption(); @@ -294,7 +294,7 @@ abstract class WalkEncryption { * Base implementation of JGit symmetric encryption. Supports V2 properties * format. */ - static abstract class SymmetricEncryption extends WalkEncryption + abstract static class SymmetricEncryption extends WalkEncryption implements Keys, Vals { /** Encryption profile, root name of group of related properties. */ diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/FileTreeIterator.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/FileTreeIterator.java index f4be9e6c3..60b92d727 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/FileTreeIterator.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/FileTreeIterator.java @@ -242,7 +242,7 @@ public class FileTreeIterator extends WorkingTreeIterator { /** * a singleton instance of the default FileModeStrategy */ - public final static DefaultFileModeStrategy INSTANCE = + public static final DefaultFileModeStrategy INSTANCE = new DefaultFileModeStrategy(); @Override @@ -275,7 +275,7 @@ public class FileTreeIterator extends WorkingTreeIterator { /** * a singleton instance of the default FileModeStrategy */ - public final static NoGitlinksStrategy INSTANCE = new NoGitlinksStrategy(); + public static final NoGitlinksStrategy INSTANCE = new NoGitlinksStrategy(); @Override public FileMode getMode(File f, FS.Attributes attributes) { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java index bc7c5024b..1f614e31f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java @@ -78,7 +78,7 @@ public class TreeWalk implements AutoCloseable, AttributesProvider { /** * @since 4.2 */ - public static enum OperationType { + public enum OperationType { /** * Represents a checkout operation (for example a checkout or reset * operation). diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java index 2c3f3e254..2d406bd5b 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java @@ -1147,7 +1147,7 @@ public abstract class WorkingTreeIterator extends AbstractTreeIterator { * * @since 5.0 */ - public static abstract class Entry { + public abstract static class Entry { byte[] encodedName; int encodedNameLen; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/Base64.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/Base64.java index 69f854745..119c96e02 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/Base64.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/Base64.java @@ -28,26 +28,26 @@ import org.eclipse.jgit.internal.JGitText; */ public class Base64 { /** The equals sign (=) as a byte. */ - private final static byte EQUALS_SIGN = (byte) '='; + private static final byte EQUALS_SIGN = (byte) '='; /** Indicates equals sign in encoding. */ - private final static byte EQUALS_SIGN_DEC = -1; + private static final byte EQUALS_SIGN_DEC = -1; /** Indicates white space in encoding. */ - private final static byte WHITE_SPACE_DEC = -2; + private static final byte WHITE_SPACE_DEC = -2; /** Indicates an invalid byte during decoding. */ - private final static byte INVALID_DEC = -3; + private static final byte INVALID_DEC = -3; /** The 64 valid Base64 values. */ - private final static byte[] ENC; + private static final byte[] ENC; /** * Translates a Base64 value to either its 6-bit reconstruction value or a * negative number indicating some other meaning. The table is only 7 bits * wide, as the 8th bit is discarded during decoding. */ - private final static byte[] DEC; + private static final byte[] DEC; static { ENC = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ" // //$NON-NLS-1$ diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/ChangeIdUtil.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/ChangeIdUtil.java index 59327f798..12af374b2 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/ChangeIdUtil.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/ChangeIdUtil.java @@ -148,7 +148,7 @@ public class ChangeIdUtil { ret.append(CHANGE_ID); ret.append(" I"); //$NON-NLS-1$ ret.append(ObjectId.toString(changeId)); - int indexOfNextLineBreak = message.indexOf("\n", //$NON-NLS-1$ + int indexOfNextLineBreak = message.indexOf('\n', indexOfChangeId); if (indexOfNextLineBreak > 0) ret.append(message.substring(indexOfNextLineBreak)); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java index 415631805..f747d1a15 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java @@ -184,7 +184,7 @@ public abstract class FS { * * @since 5.1.9 */ - public final static class FileStoreAttributes { + public static final class FileStoreAttributes { private static final Duration UNDEFINED_DURATION = Duration .ofNanos(Long.MAX_VALUE); @@ -204,9 +204,8 @@ public abstract class FS { public static final FileStoreAttributes FALLBACK_FILESTORE_ATTRIBUTES = new FileStoreAttributes( FALLBACK_TIMESTAMP_RESOLUTION); - private static final String JAVA_VERSION_PREFIX = SystemReader - .getInstance().getHostname() + '|' - + System.getProperty("java.vendor") + '|' //$NON-NLS-1$ + private static final String JAVA_VERSION_PREFIX = System + .getProperty("java.vendor") + '|' //$NON-NLS-1$ + System.getProperty("java.version") + '|'; //$NON-NLS-1$ private static final Duration FALLBACK_MIN_RACY_INTERVAL = Duration @@ -691,7 +690,7 @@ public abstract class FS { /** The auto-detected implementation selected for this operating system and JRE. */ public static final FS DETECTED = detect(); - private volatile static FSFactory factory; + private static volatile FSFactory factory; /** * Auto-detect the appropriate file system abstraction. diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java index df5784b47..a0822001c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java @@ -52,7 +52,7 @@ import org.slf4j.LoggerFactory; * @since 3.0 */ public class FS_POSIX extends FS { - private final static Logger LOG = LoggerFactory.getLogger(FS_POSIX.class); + private static final Logger LOG = LoggerFactory.getLogger(FS_POSIX.class); private static final int DEFAULT_UMASK = 0022; private volatile int umask = -1; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32.java index c201586dc..d44dc32d1 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32.java @@ -39,7 +39,7 @@ import org.slf4j.LoggerFactory; * @since 3.0 */ public class FS_Win32 extends FS { - private final static Logger LOG = LoggerFactory.getLogger(FS_Win32.class); + private static final Logger LOG = LoggerFactory.getLogger(FS_Win32.class); /** * Constructor diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32_Cygwin.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32_Cygwin.java index 30e2c0c19..dd39416bb 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32_Cygwin.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32_Cygwin.java @@ -32,7 +32,7 @@ import org.slf4j.LoggerFactory; * @since 3.0 */ public class FS_Win32_Cygwin extends FS_Win32 { - private final static Logger LOG = LoggerFactory + private static final Logger LOG = LoggerFactory .getLogger(FS_Win32_Cygwin.class); private static String cygpath; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/GitDateFormatter.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/GitDateFormatter.java index 1c00925fc..e6bf497ac 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/GitDateFormatter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/GitDateFormatter.java @@ -35,7 +35,7 @@ public class GitDateFormatter { /** * Git and JGit formats */ - static public enum Format { + public enum Format { /** * Git format: Time and original time zone diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/Hex.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/Hex.java new file mode 100644 index 000000000..935903652 --- /dev/null +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/Hex.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2020, Michael Dardis. and others + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Distribution License v. 1.0 which is available at + * https://www.eclipse.org/org/documents/edl-v10.php. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +package org.eclipse.jgit.util; + +/** + * Encodes and decodes to and from hexadecimal notation. + * + * @since 5.7 + */ +public final class Hex { + + private static final char[] HEX = "0123456789abcdef".toCharArray(); //$NON-NLS-1$ + + /** Defeats instantiation. */ + private Hex() { + // empty + } + + /** + * Decode a hexadecimal string to a byte array. + * + * Note this method performs no validation on input content. + * + * @param s hexadecimal string + * @return decoded array + */ + public static byte[] decode(String s) { + int len = s.length(); + byte[] b = new byte[len / 2]; + + for (int i = 0; i < len; i += 2) { + b[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) | Character.digit(s.charAt(i + 1), 16)); + } + return b; + } + + /** + * Encode a byte array to a hexadecimal string. + * + * @param b byte array + * @return hexadecimal string + */ + public static String toHexString(byte[] b) { + char[] c = new char[b.length * 2]; + + for (int i = 0; i < b.length; i++) { + int v = b[i] & 0xFF; + + c[i * 2] = HEX[v >>> 4]; + c[i * 2 + 1] = HEX[v & 0x0F]; + } + + return new String(c); + } +} diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/Monitoring.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/Monitoring.java index 83bf695f7..cd2a8e672 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/Monitoring.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/Monitoring.java @@ -33,7 +33,7 @@ import org.slf4j.LoggerFactory; * @since 5.1.13 */ public class Monitoring { - private final static Logger LOG = LoggerFactory.getLogger(Monitoring.class); + private static final Logger LOG = LoggerFactory.getLogger(Monitoring.class); /** * Register a MBean with the platform MBean server diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/ProcessResult.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/ProcessResult.java index 6594b3fda..d2b4a0d84 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/ProcessResult.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/ProcessResult.java @@ -18,7 +18,7 @@ public class ProcessResult { /** * Status of a process' execution. */ - public static enum Status { + public enum Status { /** * The script was found and launched properly. It may still have exited * with a non-zero {@link #exitCode}. diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/RelativeDateFormatter.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/RelativeDateFormatter.java index bf70a1429..5611b1e78 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/RelativeDateFormatter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/RelativeDateFormatter.java @@ -19,19 +19,19 @@ import org.eclipse.jgit.internal.JGitText; * in the format defined by {@code git log --relative-date}. */ public class RelativeDateFormatter { - final static long SECOND_IN_MILLIS = 1000; + static final long SECOND_IN_MILLIS = 1000; - final static long MINUTE_IN_MILLIS = 60 * SECOND_IN_MILLIS; + static final long MINUTE_IN_MILLIS = 60 * SECOND_IN_MILLIS; - final static long HOUR_IN_MILLIS = 60 * MINUTE_IN_MILLIS; + static final long HOUR_IN_MILLIS = 60 * MINUTE_IN_MILLIS; - final static long DAY_IN_MILLIS = 24 * HOUR_IN_MILLIS; + static final long DAY_IN_MILLIS = 24 * HOUR_IN_MILLIS; - final static long WEEK_IN_MILLIS = 7 * DAY_IN_MILLIS; + static final long WEEK_IN_MILLIS = 7 * DAY_IN_MILLIS; - final static long MONTH_IN_MILLIS = 30 * DAY_IN_MILLIS; + static final long MONTH_IN_MILLIS = 30 * DAY_IN_MILLIS; - final static long YEAR_IN_MILLIS = 365 * DAY_IN_MILLIS; + static final long YEAR_IN_MILLIS = 365 * DAY_IN_MILLIS; /** * Get age of given {@link java.util.Date} compared to now formatted in the diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java index ff7f54c11..bcb838062 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java @@ -52,7 +52,7 @@ import org.slf4j.LoggerFactory; */ public abstract class SystemReader { - private final static Logger LOG = LoggerFactory + private static final Logger LOG = LoggerFactory .getLogger(SystemReader.class); private static final SystemReader DEFAULT; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TeeOutputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TeeOutputStream.java new file mode 100644 index 000000000..e6fdd709b --- /dev/null +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TeeOutputStream.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2020, Michael Dardis. and others + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Distribution License v. 1.0 which is available at + * https://www.eclipse.org/org/documents/edl-v10.php. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +package org.eclipse.jgit.util.io; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * An output stream that writes all data to two streams. + * + * @since 5.7 + */ +public class TeeOutputStream extends OutputStream { + + private final OutputStream stream1; + private final OutputStream stream2; + + /** + * Initialize a tee output stream. + * + * @param stream1 first output stream + * @param stream2 second output stream + */ + public TeeOutputStream(OutputStream stream1, OutputStream stream2) { + this.stream1 = stream1; + this.stream2 = stream2; + } + + /** {@inheritDoc} */ + @Override + public void write(byte[] buf) throws IOException { + this.stream1.write(buf); + this.stream2.write(buf); + } + + /** {@inheritDoc} */ + @Override + public void write(byte[] buf, int off, int len) throws IOException { + this.stream1.write(buf, off, len); + this.stream2.write(buf, off, len); + } + + /** {@inheritDoc} */ + @Override + public void write(int b) throws IOException { + this.stream1.write(b); + this.stream2.write(b); + } + + /** {@inheritDoc} */ + @Override + public void flush() throws IOException { + this.stream1.flush(); + this.stream2.flush(); + } + + /** {@inheritDoc} */ + @Override + public void close() throws IOException { + try { + this.stream1.close(); + } finally { + this.stream2.close(); + } + } +} diff --git a/pom.xml b/pom.xml index d0a5c83a1..3d9acd43f 100644 --- a/pom.xml +++ b/pom.xml @@ -234,7 +234,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.2.1 + 3.2.2 @@ -846,12 +846,12 @@ org.codehaus.plexus plexus-compiler-javac - 2.8.5 + 2.8.6 org.codehaus.plexus plexus-compiler-javac-errorprone - 2.8.5 + 2.8.6 @@ -890,7 +890,7 @@ org.codehaus.plexus plexus-compiler-eclipse - 2.8.5 + 2.8.6 org.eclipse.jdt