diff --git a/gradle/changelog/fix_open_file_handles.yaml b/gradle/changelog/fix_open_file_handles.yaml new file mode 100644 index 0000000000..8e13b093db --- /dev/null +++ b/gradle/changelog/fix_open_file_handles.yaml @@ -0,0 +1,2 @@ +- type: fixed + description: Open file handle prevent deleting a repository on Windows ([#2008](https://github.com/scm-manager/scm-manager/pull/2008)) diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitHookChangesetCollector.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitHookChangesetCollector.java index 5d7de5ce27..4565e17754 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitHookChangesetCollector.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitHookChangesetCollector.java @@ -29,7 +29,6 @@ package sonia.scm.repository; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevSort; @@ -40,7 +39,6 @@ import org.eclipse.jgit.transport.ReceivePack; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import sonia.scm.util.IOUtil; import sonia.scm.web.CollectingPackParserListener; //~--- JDK imports ------------------------------------------------------------ @@ -92,16 +90,12 @@ public class GitHookChangesetCollector { Map changesets = Maps.newLinkedHashMap(); - org.eclipse.jgit.lib.Repository repository = rpack.getRepository(); - - RevWalk walk = null; - - GitChangesetConverter converter = null; - - try - { - walk = rpack.getRevWalk(); - converter = converterFactory.create(repository, walk); + try ( + org.eclipse.jgit.lib.Repository repository = rpack.getRepository(); + RevWalk walk = rpack.getRevWalk(); + GitChangesetConverter converter = converterFactory.create(repository, walk) + ) { + repository.incrementOpen(); for (ReceiveCommand rc : receiveCommands) { @@ -142,18 +136,13 @@ public class GitHookChangesetCollector { logger.error("could not collect changesets", ex); } - finally - { - IOUtil.close(converter); - GitUtil.release(walk); - } return Lists.newArrayList(changesets.values()); } private void collectChangesets(Map changesets, GitChangesetConverter converter, RevWalk walk, ReceiveCommand rc) - throws IncorrectObjectTypeException, IOException + throws IOException { ObjectId newId = rc.getNewId(); diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryResolver.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryResolver.java index 6ef843f38f..24bdbbd5e3 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryResolver.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryResolver.java @@ -30,16 +30,14 @@ import com.google.common.base.Preconditions; import com.google.inject.Inject; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.lib.RepositoryCache; -import org.eclipse.jgit.lib.RepositoryCache.FileKey; import org.eclipse.jgit.transport.resolver.RepositoryResolver; import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException; import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException; -import org.eclipse.jgit.util.FS; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.repository.GitConfig; import sonia.scm.repository.GitRepositoryHandler; +import sonia.scm.repository.GitUtil; import sonia.scm.repository.RepositoryProvider; import javax.servlet.http.HttpServletRequest; @@ -103,7 +101,7 @@ public class GitRepositoryResolver implements RepositoryResolver