aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit
diff options
context:
space:
mode:
authorRobin Müller <eclipse@mail.coder-hugo.de>2022-05-17 14:51:53 +0200
committerThomas Wolf <twolf@apache.org>2022-07-31 14:08:48 +0200
commit673007d52909eb02e301b900f315f5dc91b16209 (patch)
tree649f75c2ebba09313bffb13b1bc6042feed031be /org.eclipse.jgit
parent207dd4c938830e84c9101d30edb7fe626e04bbe1 (diff)
downloadjgit-673007d52909eb02e301b900f315f5dc91b16209.tar.gz
jgit-673007d52909eb02e301b900f315f5dc91b16209.zip
ObjectDirectory: improve reading of shallow file
Use FileUtils.readWithRetries(). Change-Id: I5929184caca6b83a1ee87b462e541620bd68aa90
Diffstat (limited to 'org.eclipse.jgit')
-rw-r--r--org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties3
-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/ObjectDirectory.java44
3 files changed, 32 insertions, 16 deletions
diff --git a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties
index 84a7a80d62..f3ecadd6e5 100644
--- a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties
+++ b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties
@@ -38,7 +38,7 @@ badIgnorePatternFull=File {0} line {1}: cannot parse pattern ''{2}'': {3}
badObjectType=Bad object type: {0}
badRef=Bad ref: {0}: {1}
badSectionEntry=Bad section entry: {0}
-badShallowLine=Bad shallow line: {0}
+badShallowLine=Shallow file ''{0}'' has bad line: {1}
bareRepositoryNoWorkdirAndIndex=Bare Repository has neither a working tree, nor an index
base85invalidChar=Invalid base-85 character: 0x{0}
base85length=Base-85 encoded data must have a length that is a multiple of 5
@@ -590,6 +590,7 @@ pushNotPermitted=push not permitted
pushOptionsNotSupported=Push options not supported; received {0}
rawLogMessageDoesNotParseAsLogEntry=Raw log message does not parse as log entry
readConfigFailed=Reading config file ''{0}'' failed
+readShallowFailed=Reading shallow file ''{0}'' failed
readFileStoreAttributesFailed=Reading FileStore attributes from user config failed
readerIsRequired=Reader is required
readingObjectsFromLocalRepositoryFailed=reading objects from local repository failed: {0}
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 551a5a8a9d..964debcccb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java
@@ -618,6 +618,7 @@ public class JGitText extends TranslationBundle {
/***/ public String pushOptionsNotSupported;
/***/ public String rawLogMessageDoesNotParseAsLogEntry;
/***/ public String readConfigFailed;
+ /***/ public String readShallowFailed;
/***/ public String readFileStoreAttributesFailed;
/***/ public String readerIsRequired;
/***/ public String readingObjectsFromLocalRepositoryFailed;
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 1a1d31a632..7699439128 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
@@ -567,22 +567,36 @@ public class ObjectDirectory extends FileObjectDatabase {
if (shallowFileSnapshot == null
|| shallowFileSnapshot.isModified(shallowFile)) {
- shallowCommitsIds = new HashSet<>();
-
- try (BufferedReader reader = open(shallowFile)) {
- String line;
- while ((line = reader.readLine()) != null) {
- try {
- shallowCommitsIds.add(ObjectId.fromString(line));
- } catch (IllegalArgumentException ex) {
- throw new IOException(MessageFormat
- .format(JGitText.get().badShallowLine, line),
- ex);
- }
- }
+ try {
+ shallowCommitsIds = FileUtils.readWithRetries(shallowFile,
+ f -> {
+ FileSnapshot newSnapshot = FileSnapshot.save(f);
+ HashSet<ObjectId> result = new HashSet<>();
+ try (BufferedReader reader = open(f)) {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ if (!ObjectId.isId(line)) {
+ throw new IOException(
+ MessageFormat.format(JGitText
+ .get().badShallowLine,
+ f.getAbsolutePath(),
+ line));
+
+ }
+ result.add(ObjectId.fromString(line));
+ }
+ }
+ shallowFileSnapshot = newSnapshot;
+ return result;
+ });
+ } catch (IOException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new IOException(
+ MessageFormat.format(JGitText.get().readShallowFailed,
+ shallowFile.getAbsolutePath()),
+ e);
}
-
- shallowFileSnapshot = FileSnapshot.save(shallowFile);
}
return shallowCommitsIds;