summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit/src
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.jgit/src')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java1
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/Pack.java45
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java154
3 files changed, 170 insertions, 30 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java
index 9d215ca455..95265feb4e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java
@@ -771,6 +771,7 @@ public class JGitText extends TranslationBundle {
/***/ public String unmergedPaths;
/***/ public String unpackException;
/***/ public String unreadablePackIndex;
+ /***/ public String unrecognizedPackExtension;
/***/ public String unrecognizedRef;
/***/ public String unsetMark;
/***/ public String unsupportedAlternates;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/Pack.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/Pack.java
index d928633a73..fa938b3111 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/Pack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/Pack.java
@@ -78,13 +78,11 @@ public class Pack implements Iterable<PackIndex.MutableEntry> {
public static final Comparator<Pack> SORT = (a, b) -> b.packLastModified
.compareTo(a.packLastModified);
- private final File packFile;
+ private final PackFile packFile;
private final int extensions;
- private File keepFile;
-
- private volatile String packName;
+ private PackFile keepFile;
final int hash;
@@ -137,7 +135,7 @@ public class Pack implements Iterable<PackIndex.MutableEntry> {
* additional pack file extensions with the same base as the pack
*/
public Pack(File packFile, int extensions) {
- this.packFile = packFile;
+ this.packFile = new PackFile(packFile);
this.fileSnapshot = PackFileSnapshot.save(packFile);
this.packLastModified = fileSnapshot.lastModifiedInstant();
this.extensions = extensions;
@@ -156,16 +154,18 @@ public class Pack implements Iterable<PackIndex.MutableEntry> {
idx = loadedIdx;
if (idx == null) {
if (invalid) {
- throw new PackInvalidException(packFile, invalidatingCause);
+ throw new PackInvalidException(packFile,
+ invalidatingCause);
}
try {
long start = System.currentTimeMillis();
- idx = PackIndex.open(extFile(INDEX));
+ PackFile idxFile = packFile.create(INDEX);
+ idx = PackIndex.open(idxFile);
if (LOG.isDebugEnabled()) {
LOG.debug(String.format(
"Opening pack index %s, size %.3f MB took %d ms", //$NON-NLS-1$
- extFile(INDEX).getAbsolutePath(),
- Float.valueOf(extFile(INDEX).length()
+ idxFile.getAbsolutePath(),
+ Float.valueOf(idxFile.length()
/ (1024f * 1024)),
Long.valueOf(System.currentTimeMillis()
- start)));
@@ -205,7 +205,7 @@ public class Pack implements Iterable<PackIndex.MutableEntry> {
*
* @return the File object which locates this pack on disk.
*/
- public File getPackFile() {
+ public PackFile getPackFile() {
return packFile;
}
@@ -225,16 +225,7 @@ public class Pack implements Iterable<PackIndex.MutableEntry> {
* @return name extracted from {@code pack-*.pack} pattern.
*/
public String getPackName() {
- String name = packName;
- if (name == null) {
- name = getPackFile().getName();
- if (name.startsWith("pack-")) //$NON-NLS-1$
- name = name.substring("pack-".length()); //$NON-NLS-1$
- if (name.endsWith(".pack")) //$NON-NLS-1$
- name = name.substring(0, name.length() - ".pack".length()); //$NON-NLS-1$
- packName = name;
- }
- return name;
+ return packFile.getId();
}
/**
@@ -261,8 +252,9 @@ public class Pack implements Iterable<PackIndex.MutableEntry> {
* @return true if a .keep file exist.
*/
public boolean shouldBeKept() {
- if (keepFile == null)
- keepFile = extFile(KEEP);
+ if (keepFile == null) {
+ keepFile = packFile.create(KEEP);
+ }
return keepFile.exists();
}
@@ -1137,7 +1129,7 @@ public class Pack implements Iterable<PackIndex.MutableEntry> {
if (bitmapIdx == null && hasExt(BITMAP_INDEX)) {
final PackBitmapIndex idx;
try {
- idx = PackBitmapIndex.open(extFile(BITMAP_INDEX), idx(),
+ idx = PackBitmapIndex.open(packFile.create(BITMAP_INDEX), idx(),
getReverseIdx());
} catch (FileNotFoundException e) {
// Once upon a time this bitmap file existed. Now it
@@ -1187,13 +1179,6 @@ public class Pack implements Iterable<PackIndex.MutableEntry> {
}
}
- private File extFile(PackExt ext) {
- String p = packFile.getName();
- int dot = p.lastIndexOf('.');
- String b = (dot < 0) ? p : p.substring(0, dot);
- return new File(packFile.getParentFile(), b + '.' + ext.getExtension());
- }
-
private boolean hasExt(PackExt ext) {
return (extensions & ext.getBit()) != 0;
}
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
new file mode 100644
index 0000000000..c2e6f324d1
--- /dev/null
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 2021 Qualcomm Innovation Center, Inc.
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License 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.internal.storage.file;
+
+import java.io.File;
+import java.text.MessageFormat;
+
+import org.eclipse.jgit.internal.JGitText;
+import org.eclipse.jgit.internal.storage.pack.PackExt;
+
+/**
+ * A pack file (or pack related) File.
+ *
+ * Example: "pack-0123456789012345678901234567890123456789.idx"
+ */
+public class PackFile extends File {
+ private static final long serialVersionUID = 1L;
+
+ private static final String PREFIX = "pack-"; //$NON-NLS-1$
+
+ private final String base; // PREFIX + id i.e.
+ // pack-0123456789012345678901234567890123456789
+
+ private final String id; // i.e. 0123456789012345678901234567890123456789
+
+ private final boolean hasOldPrefix;
+
+ private final PackExt packExt;
+
+ /**
+ * Create a PackFile for a pack or related file.
+ *
+ * @param file
+ * File pointing to the location of the file.
+ */
+ public PackFile(File file) {
+ this(file.getParentFile(), file.getName());
+ }
+
+ /**
+ * Create a PackFile for a pack or related file.
+ *
+ * @param directory
+ * Directory to create the PackFile in.
+ * @param name
+ * Filename (last path section) of the PackFile
+ */
+ public PackFile(File directory, String name) {
+ super(directory, name);
+ int dot = name.lastIndexOf('.');
+
+ if (dot < 0) {
+ base = name;
+ hasOldPrefix = false;
+ packExt = null;
+ } else {
+ base = name.substring(0, dot);
+ String tail = name.substring(dot + 1); // ["old-"] + extension
+ packExt = getPackExt(tail);
+ String old = tail.substring(0,
+ tail.length() - getExtension().length());
+ hasOldPrefix = old.equals(getExtPrefix(true));
+ }
+
+ id = base.startsWith(PREFIX) ? base.substring(PREFIX.length()) : base;
+ }
+
+ /**
+ * Getter for the field <code>id</code>.
+ *
+ * @return the <code>id</code> (40 Hex char) section of the name.
+ */
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * Getter for the field <code>packExt</code>.
+ *
+ * @return the <code>packExt</code> of the name.
+ */
+ public PackExt getPackExt() {
+ return packExt;
+ }
+
+ /**
+ * Create a new similar PackFile with the given extension instead.
+ *
+ * @param ext
+ * PackExt the extension to use.
+ * @return a PackFile instance with specified extension
+ */
+ public PackFile create(PackExt ext) {
+ return new PackFile(getParentFile(), getName(ext));
+ }
+
+ /**
+ * Create a new similar PackFile in the given directory.
+ *
+ * @param directory
+ * Directory to create the new PackFile in.
+ * @return a PackFile in the given directory
+ */
+ public PackFile createForDirectory(File directory) {
+ return new PackFile(directory, getName(false));
+ }
+
+ /**
+ * Create a new similar preserved PackFile in the given directory.
+ *
+ * @param directory
+ * Directory to create the new PackFile in.
+ * @return a PackFile in the given directory with "old-" prefixing the
+ * extension
+ */
+ public PackFile createPreservedForDirectory(File directory) {
+ return new PackFile(directory, getName(true));
+ }
+
+ private String getName(PackExt ext) {
+ return base + '.' + getExtPrefix(hasOldPrefix) + ext.getExtension();
+ }
+
+ private String getName(boolean isPreserved) {
+ return base + '.' + getExtPrefix(isPreserved) + getExtension();
+ }
+
+ private String getExtension() {
+ return packExt == null ? "" : packExt.getExtension(); //$NON-NLS-1$
+ }
+
+ private static String getExtPrefix(boolean isPreserved) {
+ return isPreserved ? "old-" : ""; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ private static PackExt getPackExt(String endsWithExtension) {
+ for (PackExt ext : PackExt.values()) {
+ if (endsWithExtension.endsWith(ext.getExtension())) {
+ return ext;
+ }
+ }
+ throw new IllegalArgumentException(MessageFormat.format(
+ JGitText.get().unrecognizedPackExtension, endsWithExtension));
+ }
+}