From 673007d52909eb02e301b900f315f5dc91b16209 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robin=20M=C3=BCller?= Date: Tue, 17 May 2022 14:51:53 +0200 Subject: [PATCH] ObjectDirectory: improve reading of shallow file Use FileUtils.readWithRetries(). Change-Id: I5929184caca6b83a1ee87b462e541620bd68aa90 --- .../eclipse/jgit/internal/JGitText.properties | 3 +- .../org/eclipse/jgit/internal/JGitText.java | 1 + .../storage/file/ObjectDirectory.java | 42 ++++++++++++------- 3 files changed, 31 insertions(+), 15 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 84a7a80d6..f3ecadd6e 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 551a5a8a9..964debccc 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 static JGitText get() { /***/ 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 1a1d31a63..769943912 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 Set getShallowCommits() throws IOException { if (shallowFileSnapshot == null || shallowFileSnapshot.isModified(shallowFile)) { - shallowCommitsIds = new HashSet<>(); + try { + shallowCommitsIds = FileUtils.readWithRetries(shallowFile, + f -> { + FileSnapshot newSnapshot = FileSnapshot.save(f); + HashSet 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)); - 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); - } - } + } + 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;