Close 'out' consistently in ArchiveCommand.call

Whether the output stream specified with setOutputStream() is closed by
ArchiveCommand.call() is murky and inconsistent:

- on success, it is closed
- if an exception is encountered when writing the archive, it is closed
- if an exception is encountered when calling createArchiveStream to
  open the archive, we forget to close it

Close the output stream consistently to avoid leaks.

Now that the inner try-with-resources doesn't have its own finally
block, this allows us to merge the two try blocks.

It would be even better to never close the output stream.  That will
involve more API changes to avoid silently breaking callers, so it is
deferred to a later change.

Change-Id: I0185bdaa60ecee4a541eab5d8ff6c9c4dbe40bf1
Signed-off-by: Jonathan Nieder <jrn@google.com>
This commit is contained in:
Jonathan Nieder 2015-05-27 16:25:32 -07:00
parent ebfd62433a
commit 1287cdaf33
1 changed files with 7 additions and 6 deletions

View File

@ -364,10 +364,11 @@ public ArchiveCommand(Repository repo) {
}
private <T extends Closeable> OutputStream writeArchive(Format<T> fmt) {
final String pfx = prefix == null ? "" : prefix; //$NON-NLS-1$
try (final TreeWalk walk = new TreeWalk(repo)) {
final T outa = fmt.createArchiveOutputStream(out, formatOptions);
try (final RevWalk rw = new RevWalk(walk.getObjectReader())) {
try {
try (TreeWalk walk = new TreeWalk(repo);
RevWalk rw = new RevWalk(walk.getObjectReader())) {
final String pfx = prefix == null ? "" : prefix; //$NON-NLS-1$
final T outa = fmt.createArchiveOutputStream(out, formatOptions);
final MutableObjectId idBuf = new MutableObjectId();
final ObjectReader reader = walk.getObjectReader();
@ -376,7 +377,7 @@ private <T extends Closeable> OutputStream writeArchive(Format<T> fmt) {
walk.setFilter(PathFilterGroup.createFromStrings(paths));
while (walk.next()) {
final String name = pfx + walk.getPathString();
String name = pfx + walk.getPathString();
FileMode mode = walk.getFileMode(0);
if (walk.isSubtree())
@ -395,10 +396,10 @@ private <T extends Closeable> OutputStream writeArchive(Format<T> fmt) {
fmt.putEntry(outa, name, mode, reader.open(idBuf));
}
outa.close();
return out;
} finally {
out.close();
}
return out;
} catch (IOException e) {
// TODO(jrn): Throw finer-grained errors.
throw new JGitInternalException(