File, FileInputStream and friends may throw FileNotFoundException even if the file is existing e.g. when file permissions don't allow to access the file content. In most cases this is a severe error we should not suppress hence rethrow the FileNotFoundException in this case. This may also fix bug 451508. Bug: 451508 Change-Id: If4a94217fb5b7cfd4c04d881902f3e86193c7008 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>tags/v4.2.0.201601211800-r
@@ -451,6 +451,7 @@ packfileIsTruncated=Packfile {0} is truncated. | |||
packfileIsTruncatedNoParam=Packfile is truncated. | |||
packHandleIsStale=Pack file {0} handle is stale, removing it from pack list | |||
packHasUnresolvedDeltas=pack has unresolved deltas | |||
packInaccessible=Pack file {0} now inaccessible; removing it from pack list | |||
packingCancelledDuringObjectsWriting=Packing cancelled during objects writing | |||
packObjectCountMismatch=Pack object count mismatch: pack {0} index {1}: {2} | |||
packRefs=Pack refs |
@@ -980,6 +980,9 @@ public class RebaseCommand extends GitCommand<RebaseResult> { | |||
try { | |||
raw = IO.readFully(authorScriptFile); | |||
} catch (FileNotFoundException notFound) { | |||
if (authorScriptFile.exists()) { | |||
throw notFound; | |||
} | |||
return null; | |||
} | |||
return parseAuthor(raw); |
@@ -510,6 +510,7 @@ public class JGitText extends TranslationBundle { | |||
/***/ public String packfileIsTruncatedNoParam; | |||
/***/ public String packHandleIsStale; | |||
/***/ public String packHasUnresolvedDeltas; | |||
/***/ public String packInaccessible; | |||
/***/ public String packingCancelledDuringObjectsWriting; | |||
/***/ public String packObjectCountMismatch; | |||
/***/ public String packRefs; |
@@ -227,6 +227,10 @@ public class LockFile { | |||
fis.close(); | |||
} | |||
} catch (FileNotFoundException fnfe) { | |||
if (ref.exists()) { | |||
unlock(); | |||
throw fnfe; | |||
} | |||
// Don't worry about a file that doesn't exist yet, it | |||
// conceptually has no current content to copy. | |||
// |
@@ -433,16 +433,14 @@ public class ObjectDirectory extends FileObjectDatabase { | |||
ObjectLoader openLooseObject(WindowCursor curs, AnyObjectId id) | |||
throws IOException { | |||
try { | |||
File path = fileFor(id); | |||
FileInputStream in = new FileInputStream(path); | |||
try { | |||
unpackedObjectCache.add(id); | |||
return UnpackedObject.open(in, path, id, curs); | |||
} finally { | |||
in.close(); | |||
} | |||
File path = fileFor(id); | |||
try (FileInputStream in = new FileInputStream(path)) { | |||
unpackedObjectCache.add(id); | |||
return UnpackedObject.open(in, path, id, curs); | |||
} catch (FileNotFoundException noFile) { | |||
if (path.exists()) { | |||
throw noFile; | |||
} | |||
unpackedObjectCache.remove(id); | |||
return null; | |||
} | |||
@@ -513,15 +511,14 @@ public class ObjectDirectory extends FileObjectDatabase { | |||
private long getLooseObjectSize(WindowCursor curs, AnyObjectId id) | |||
throws IOException { | |||
try { | |||
FileInputStream in = new FileInputStream(fileFor(id)); | |||
try { | |||
unpackedObjectCache.add(id); | |||
return UnpackedObject.getSize(in, id, curs); | |||
} finally { | |||
in.close(); | |||
} | |||
File f = fileFor(id); | |||
try (FileInputStream in = new FileInputStream(f)) { | |||
unpackedObjectCache.add(id); | |||
return UnpackedObject.getSize(in, id, curs); | |||
} catch (FileNotFoundException noFile) { | |||
if (f.exists()) { | |||
throw noFile; | |||
} | |||
unpackedObjectCache.remove(id); | |||
return -1; | |||
} | |||
@@ -561,7 +558,11 @@ public class ObjectDirectory extends FileObjectDatabase { | |||
// Assume the pack is corrupted, and remove it from the list. | |||
removePack(p); | |||
} else if (e instanceof FileNotFoundException) { | |||
warnTmpl = JGitText.get().packWasDeleted; | |||
if (p.getPackFile().exists()) { | |||
warnTmpl = JGitText.get().packInaccessible; | |||
} else { | |||
warnTmpl = JGitText.get().packWasDeleted; | |||
} | |||
removePack(p); | |||
} else if (FileUtils.isStaleFileHandle(e)) { | |||
warnTmpl = JGitText.get().packHandleIsStale; |
@@ -788,6 +788,9 @@ public class RefDirectory extends RefDatabase { | |||
new DigestInputStream(new FileInputStream(packedRefsFile), | |||
digest), CHARSET)); | |||
} catch (FileNotFoundException noPackedRefs) { | |||
if (packedRefsFile.exists()) { | |||
throw noPackedRefs; | |||
} | |||
// Ignore it and leave the new list empty. | |||
return PackedRefList.NO_PACKED_REFS; | |||
} | |||
@@ -944,7 +947,10 @@ public class RefDirectory extends RefDatabase { | |||
try { | |||
buf = IO.readSome(path, limit); | |||
} catch (FileNotFoundException noFile) { | |||
return null; // doesn't exist; not a reference. | |||
if (path.exists() && path.isFile()) { | |||
throw noFile; | |||
} | |||
return null; // doesn't exist or no file; not a reference. | |||
} | |||
int n = buf.length; |
@@ -96,6 +96,9 @@ class ReflogReaderImpl implements ReflogReader { | |||
try { | |||
log = IO.readFully(logName); | |||
} catch (FileNotFoundException e) { | |||
if (logName.exists()) { | |||
throw e; | |||
} | |||
return null; | |||
} | |||
@@ -118,6 +121,9 @@ class ReflogReaderImpl implements ReflogReader { | |||
try { | |||
log = IO.readFully(logName); | |||
} catch (FileNotFoundException e) { | |||
if (logName.exists()) { | |||
throw e; | |||
} | |||
return Collections.emptyList(); | |||
} | |||
@@ -399,6 +399,9 @@ public class UnpackedObject { | |||
try { | |||
in = buffer(new FileInputStream(path)); | |||
} catch (FileNotFoundException gone) { | |||
if (path.exists()) { | |||
throw gone; | |||
} | |||
// If the loose file no longer exists, it may have been | |||
// moved into a pack file in the mean time. Try again | |||
// to locate the object. |
@@ -1590,6 +1590,9 @@ public abstract class Repository implements AutoCloseable { | |||
try { | |||
return RawParseUtils.decode(IO.readFully(mergeMsgFile)); | |||
} catch (FileNotFoundException e) { | |||
if (mergeMsgFile.exists()) { | |||
throw e; | |||
} | |||
// the file has disappeared in the meantime ignore it | |||
return null; | |||
} | |||
@@ -1621,6 +1624,9 @@ public abstract class Repository implements AutoCloseable { | |||
byte[] raw = IO.readFully(file); | |||
return raw.length > 0 ? raw : null; | |||
} catch (FileNotFoundException notFound) { | |||
if (file.exists()) { | |||
throw notFound; | |||
} | |||
return null; | |||
} | |||
} |
@@ -163,6 +163,9 @@ public class FileBasedConfig extends StoredConfig { | |||
hash = newHash; | |||
} | |||
} catch (FileNotFoundException noFile) { | |||
if (configFile.exists()) { | |||
throw noFile; | |||
} | |||
clear(); | |||
snapshot = newSnapshot; | |||
} catch (IOException e) { |