Raise error if FileNotFoundException is caught for an existing file

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>
This commit is contained in:
Matthias Sohn 2015-11-20 14:40:41 +01:00 committed by Jonathan Nieder
parent 15e60b646e
commit d2faec27a7
10 changed files with 53 additions and 19 deletions

View File

@ -451,6 +451,7 @@ packfileIsTruncated=Packfile {0} is truncated.
packfileIsTruncatedNoParam=Packfile is truncated. packfileIsTruncatedNoParam=Packfile is truncated.
packHandleIsStale=Pack file {0} handle is stale, removing it from pack list packHandleIsStale=Pack file {0} handle is stale, removing it from pack list
packHasUnresolvedDeltas=pack has unresolved deltas packHasUnresolvedDeltas=pack has unresolved deltas
packInaccessible=Pack file {0} now inaccessible; removing it from pack list
packingCancelledDuringObjectsWriting=Packing cancelled during objects writing packingCancelledDuringObjectsWriting=Packing cancelled during objects writing
packObjectCountMismatch=Pack object count mismatch: pack {0} index {1}: {2} packObjectCountMismatch=Pack object count mismatch: pack {0} index {1}: {2}
packRefs=Pack refs packRefs=Pack refs

View File

@ -980,6 +980,9 @@ private PersonIdent parseAuthor() throws IOException {
try { try {
raw = IO.readFully(authorScriptFile); raw = IO.readFully(authorScriptFile);
} catch (FileNotFoundException notFound) { } catch (FileNotFoundException notFound) {
if (authorScriptFile.exists()) {
throw notFound;
}
return null; return null;
} }
return parseAuthor(raw); return parseAuthor(raw);

View File

@ -510,6 +510,7 @@ public static JGitText get() {
/***/ public String packfileIsTruncatedNoParam; /***/ public String packfileIsTruncatedNoParam;
/***/ public String packHandleIsStale; /***/ public String packHandleIsStale;
/***/ public String packHasUnresolvedDeltas; /***/ public String packHasUnresolvedDeltas;
/***/ public String packInaccessible;
/***/ public String packingCancelledDuringObjectsWriting; /***/ public String packingCancelledDuringObjectsWriting;
/***/ public String packObjectCountMismatch; /***/ public String packObjectCountMismatch;
/***/ public String packRefs; /***/ public String packRefs;

View File

@ -227,6 +227,10 @@ public void copyCurrentContent() throws IOException {
fis.close(); fis.close();
} }
} catch (FileNotFoundException fnfe) { } catch (FileNotFoundException fnfe) {
if (ref.exists()) {
unlock();
throw fnfe;
}
// Don't worry about a file that doesn't exist yet, it // Don't worry about a file that doesn't exist yet, it
// conceptually has no current content to copy. // conceptually has no current content to copy.
// //

View File

@ -433,16 +433,14 @@ ObjectLoader openPackedObject(WindowCursor curs, AnyObjectId objectId) {
ObjectLoader openLooseObject(WindowCursor curs, AnyObjectId id) ObjectLoader openLooseObject(WindowCursor curs, AnyObjectId id)
throws IOException { throws IOException {
try {
File path = fileFor(id); File path = fileFor(id);
FileInputStream in = new FileInputStream(path); try (FileInputStream in = new FileInputStream(path)) {
try {
unpackedObjectCache.add(id); unpackedObjectCache.add(id);
return UnpackedObject.open(in, path, id, curs); return UnpackedObject.open(in, path, id, curs);
} finally {
in.close();
}
} catch (FileNotFoundException noFile) { } catch (FileNotFoundException noFile) {
if (path.exists()) {
throw noFile;
}
unpackedObjectCache.remove(id); unpackedObjectCache.remove(id);
return null; return null;
} }
@ -513,15 +511,14 @@ private long getPackedObjectSize(WindowCursor curs, AnyObjectId id) {
private long getLooseObjectSize(WindowCursor curs, AnyObjectId id) private long getLooseObjectSize(WindowCursor curs, AnyObjectId id)
throws IOException { throws IOException {
try { File f = fileFor(id);
FileInputStream in = new FileInputStream(fileFor(id)); try (FileInputStream in = new FileInputStream(f)) {
try {
unpackedObjectCache.add(id); unpackedObjectCache.add(id);
return UnpackedObject.getSize(in, id, curs); return UnpackedObject.getSize(in, id, curs);
} finally {
in.close();
}
} catch (FileNotFoundException noFile) { } catch (FileNotFoundException noFile) {
if (f.exists()) {
throw noFile;
}
unpackedObjectCache.remove(id); unpackedObjectCache.remove(id);
return -1; return -1;
} }
@ -561,7 +558,11 @@ private void handlePackError(IOException e, PackFile p) {
// Assume the pack is corrupted, and remove it from the list. // Assume the pack is corrupted, and remove it from the list.
removePack(p); removePack(p);
} else if (e instanceof FileNotFoundException) { } else if (e instanceof FileNotFoundException) {
if (p.getPackFile().exists()) {
warnTmpl = JGitText.get().packInaccessible;
} else {
warnTmpl = JGitText.get().packWasDeleted; warnTmpl = JGitText.get().packWasDeleted;
}
removePack(p); removePack(p);
} else if (FileUtils.isStaleFileHandle(e)) { } else if (FileUtils.isStaleFileHandle(e)) {
warnTmpl = JGitText.get().packHandleIsStale; warnTmpl = JGitText.get().packHandleIsStale;

View File

@ -788,6 +788,9 @@ private PackedRefList readPackedRefs() throws IOException {
new DigestInputStream(new FileInputStream(packedRefsFile), new DigestInputStream(new FileInputStream(packedRefsFile),
digest), CHARSET)); digest), CHARSET));
} catch (FileNotFoundException noPackedRefs) { } catch (FileNotFoundException noPackedRefs) {
if (packedRefsFile.exists()) {
throw noPackedRefs;
}
// Ignore it and leave the new list empty. // Ignore it and leave the new list empty.
return PackedRefList.NO_PACKED_REFS; return PackedRefList.NO_PACKED_REFS;
} }
@ -944,7 +947,10 @@ LooseRef scanRef(LooseRef ref, String name) throws IOException {
try { try {
buf = IO.readSome(path, limit); buf = IO.readSome(path, limit);
} catch (FileNotFoundException noFile) { } 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; int n = buf.length;

View File

@ -96,6 +96,9 @@ public ReflogEntry getReverseEntry(int number) throws IOException {
try { try {
log = IO.readFully(logName); log = IO.readFully(logName);
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
if (logName.exists()) {
throw e;
}
return null; return null;
} }
@ -118,6 +121,9 @@ public List<ReflogEntry> getReverseEntries(int max) throws IOException {
try { try {
log = IO.readFully(logName); log = IO.readFully(logName);
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
if (logName.exists()) {
throw e;
}
return Collections.emptyList(); return Collections.emptyList();
} }

View File

@ -399,6 +399,9 @@ public ObjectStream openStream() throws MissingObjectException,
try { try {
in = buffer(new FileInputStream(path)); in = buffer(new FileInputStream(path));
} catch (FileNotFoundException gone) { } catch (FileNotFoundException gone) {
if (path.exists()) {
throw gone;
}
// If the loose file no longer exists, it may have been // If the loose file no longer exists, it may have been
// moved into a pack file in the mean time. Try again // moved into a pack file in the mean time. Try again
// to locate the object. // to locate the object.

View File

@ -1590,6 +1590,9 @@ private String readCommitMsgFile(String msgFilename) throws IOException {
try { try {
return RawParseUtils.decode(IO.readFully(mergeMsgFile)); return RawParseUtils.decode(IO.readFully(mergeMsgFile));
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
if (mergeMsgFile.exists()) {
throw e;
}
// the file has disappeared in the meantime ignore it // the file has disappeared in the meantime ignore it
return null; return null;
} }
@ -1621,6 +1624,9 @@ private byte[] readGitDirectoryFile(String filename) throws IOException {
byte[] raw = IO.readFully(file); byte[] raw = IO.readFully(file);
return raw.length > 0 ? raw : null; return raw.length > 0 ? raw : null;
} catch (FileNotFoundException notFound) { } catch (FileNotFoundException notFound) {
if (file.exists()) {
throw notFound;
}
return null; return null;
} }
} }

View File

@ -163,6 +163,9 @@ public void load() throws IOException, ConfigInvalidException {
hash = newHash; hash = newHash;
} }
} catch (FileNotFoundException noFile) { } catch (FileNotFoundException noFile) {
if (configFile.exists()) {
throw noFile;
}
clear(); clear();
snapshot = newSnapshot; snapshot = newSnapshot;
} catch (IOException e) { } catch (IOException e) {