diff --git a/scm-core/src/main/java/sonia/scm/repository/work/CachingAllWorkingCopyPool.java b/scm-core/src/main/java/sonia/scm/repository/work/CachingAllWorkingCopyPool.java index f93a374c00..195e9e19d5 100644 --- a/scm-core/src/main/java/sonia/scm/repository/work/CachingAllWorkingCopyPool.java +++ b/scm-core/src/main/java/sonia/scm/repository/work/CachingAllWorkingCopyPool.java @@ -28,12 +28,14 @@ import com.google.common.base.Stopwatch; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.repository.InternalRepositoryException; +import sonia.scm.repository.Repository; import sonia.scm.util.IOUtil; import javax.inject.Inject; import java.io.File; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Supplier; public class CachingAllWorkingCopyPool implements WorkingCopyPool { @@ -49,7 +51,7 @@ public class CachingAllWorkingCopyPool implements WorkingCopyPool { } @Override - public ParentAndClone getWorkingCopy(WorkingCopyContext workingCopyContext) { + public > ParentAndClone getWorkingCopy(WorkingCopyContext workingCopyContext) { String id = workingCopyContext.getScmRepository().getId(); File existingWorkdir = workdirs.remove(id); if (existingWorkdir != null) { diff --git a/scm-core/src/main/java/sonia/scm/repository/work/NoneCachingWorkingCopyPool.java b/scm-core/src/main/java/sonia/scm/repository/work/NoneCachingWorkingCopyPool.java index c5aef18b0e..4cc7acfce6 100644 --- a/scm-core/src/main/java/sonia/scm/repository/work/NoneCachingWorkingCopyPool.java +++ b/scm-core/src/main/java/sonia/scm/repository/work/NoneCachingWorkingCopyPool.java @@ -24,10 +24,12 @@ package sonia.scm.repository.work; +import sonia.scm.repository.Repository; import sonia.scm.util.IOUtil; import javax.inject.Inject; import java.io.File; +import java.util.function.Supplier; public class NoneCachingWorkingCopyPool implements WorkingCopyPool { @@ -39,7 +41,7 @@ public class NoneCachingWorkingCopyPool implements WorkingCopyPool { } @Override - public ParentAndClone getWorkingCopy(WorkingCopyContext context) throws WorkingCopyFailedException { + public > ParentAndClone getWorkingCopy(WorkingCopyContext context) throws WorkingCopyFailedException { return context.getInitializer().initialize(workdirProvider.createNewWorkdir()); } diff --git a/scm-core/src/main/java/sonia/scm/repository/work/SimpleWorkingCopyFactory.java b/scm-core/src/main/java/sonia/scm/repository/work/SimpleWorkingCopyFactory.java index 76bb0a7b5e..ed75036641 100644 --- a/scm-core/src/main/java/sonia/scm/repository/work/SimpleWorkingCopyFactory.java +++ b/scm-core/src/main/java/sonia/scm/repository/work/SimpleWorkingCopyFactory.java @@ -32,8 +32,166 @@ import sonia.scm.repository.Repository; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import java.io.File; +import java.util.function.Supplier; -public abstract class SimpleWorkingCopyFactory implements WorkingCopyFactory, ServletContextListener { +/** + * This class is responsible to govern the creation, the reuse and the destruction + * of working copies. For every repository type there has to be an implementation + * of this class to provide the repository specific logic to create, initialize, + * reclaim and clean up working copies. To do this, the following methods have to be + * implemented: + * + *
+ *
{@link #cloneRepository(C, File, String)}
+ *
Creates a new clone of the repository for the given context in the given + * directory with the given branch checked out (if branches are supported).
+ *
{@link #reclaimRepository(C, File, String)}
+ *
Reclaim the working directory with a already checked out clone of the + * repository given in the context, so that the directory is not modified in + * respect to the repository and the given branch is checked out (if branches + * are supported).
+ *
{@link #closeWorkingCopy(W)}
+ *
Closes resources allocated for the working copy, so that the directory can + * be put to the cache. Will be called at the end of the operation.
+ *
{@link #closeRepository(R)}
+ *
Closes resources allocated for the central repository.
+ *
+ *
+ *                     ┌─────────────┐          ┌───────────────────────────┐                                                      ┌───────────────┐          ┌───────────────┐
+ *                     │ModifyCommand│          │SimpleGitWorkingCopyFactory│                                                      │WorkingCopyPool│          │WorkdirProvider│
+ *                     └──────┬──────┘          └─────────────┬─────────────┘                                                      └───────┬───────┘          └───────┬───────┘
+ *                            │      createWorkingCopy        │                                                                            │                          │
+ *                            │──────────────────────────────>│                                                                            │                          │
+ *                            │                               │                                                                            │                          │
+ *                            │                               ────┐                                                                        │                          │
+ *                            │                                   │ createContext                                                          │                          │
+ *                            │                               <───┘                                                                        │                          │
+ *                            │                               │                                                                            │                          │
+ *                            │                               │        create          ┌─────────┐                                         │                          │
+ *                            │                               │──────────────────────> │Reclaimer│                                         │                          │
+ *                            │                               │                        └────┬────┘                                         │                          │
+ *                            │                               │                  create     │               ┌───────────┐                  │                          │
+ *                            │                               │───────────────────────────────────────────> │Initializer│                  │                          │
+ *                            │                               │                             │               └─────┬─────┘                  │                          │
+ *                            │                               │                             │getWorkingCopy       │                        │                          │
+ *                            │                               │───────────────────────────────────────────────────────────────────────────>│                          │
+ *                            │                               │                             │                     │                        │                          │
+ *                            │                               │                             │                     │                        │                          │
+ *                            │                               │                             │                     │                        │                          │
+ *                            │                               │                             │                     │                        │                          │
+ *                            │                               │                             │                   reclaim                    │                          │
+ *                            │                               │                             │<─────────────────────────────────────────────│                          │
+ *                            │                               │                             │                     │                        │                          │
+ *                            │                               │          reclaim            │                     │                        │                          │
+ *                            │                               │<────────────────────────────│                     │                        │                          │
+ *                            │                               │                             │                     │                        │                          │
+ *                            │                               │                             │                     │                        │                          │
+ *                            │       ╔══════╤════════════════╪═════════════════════════════╪═════════════════════╪════════════════════════╪══════════════════════════╪═════════════════╗
+ *                            │       ║ ALT  │  reclaim successful                          │                     │                        │                          │                 ║
+ *                            │       ╟──────┘                │                             │                     │                        │                          │                 ║
+ *                            │       ║                       │                             │                     │                        │                          │                 ║
+ *                            │       ║                       │───────────────────────────────────────────────────────────────────────────>│                          │                 ║
+ *                            │       ╠═══════════════════════╪═════════════════════════════╪═════════════════════╪════════════════════════╪══════════════════════════╪═════════════════╣
+ *                            │       ║ [reclaim fails; create new]                         │                     │                        │                          │                 ║
+ *                            │       ║                       │                      ReclaimFailedException       │                        │                          │                 ║
+ *                            │       ║                       │───────────────────────────────────────────────────────────────────────────X│                          │                 ║
+ *                            │       ║                       │                             │                     │                        │                          │                 ║
+ *                            │       ║                       │                             │                     │                        │    createNewWorkdir      │                 ║
+ *                            │       ║                       │                             │                     │                        │─────────────────────────>│                 ║
+ *                            │       ║                       │                             │                     │                        │                          │                 ║
+ *                            │       ║                       │                             │                     │                        │                          │                 ║
+ *                            │       ║                       │                             │                     │                        │<─────────────────────────│                 ║
+ *                            │       ║                       │                             │                     │                        │                          │                 ║
+ *                            │       ║                       │                             │                     │      initialize        │                          │                 ║
+ *                            │       ║                       │                             │                     │<───────────────────────│                          │                 ║
+ *                            │       ║                       │                             │                     │                        │                          │                 ║
+ *                            │       ║                       │                    initialize                     │                        │                          │                 ║
+ *                            │       ║                       │<──────────────────────────────────────────────────│                        │                          │                 ║
+ *                            │       ║                       │                             │                     │                        │                          │                 ║
+ *                            │       ║                       │                             │                     │                        │                          │                 ║
+ *                            │       ║                       │───────────────────────────────────────────────────────────────────────────>│                          │                 ║
+ *                            │       ╚═══════════════════════╪═════════════════════════════╪═════════════════════╪════════════════════════╪══════════════════════════╪═════════════════╝
+ *                            │                               │                             │                     │                        │                          │
+ *                            │                               │                             │                     │                        │                          │
+ *                            │                               │<───────────────────────────────────────────────────────────────────────────│                          │                        │
+ *                            │                               │                             │                     │                        │                          │                        │
+ *                            │                               │                             │                     │                        │                          │                  ┌───────────┐
+ *                            │                               │────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────> │WorkingCopy│
+ *                            │                               │                             │                     │                        │                          │                  └─────┬─────┘
+ *                            │         WorkingCopy           │                             │                     │                        │                          │                        │
+ *                            │<──────────────────────────────│                             │                     │                        │                          │                        │
+ *                            │                               │                             │                     │                        │                          │                        │
+ *                            .                               .                             .                     .                        .                          .                        .
+ *                            .                               .                             .                     .                        .                          .                        .
+ *                            .                               .                             .                     .                        .                          .                        .
+ *                            .                               .                             .                     .                        .                          .                        .
+ *                            │                               │                             │              doWork │                        │                          │                        │
+ *                            │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────>│
+ *                            │                               │                             │                     │                        │                          │                        │
+ *                            .                               .                             .                     .                        .                          .                        .
+ *                            .                               .                             .                     .                        .                          .                        .
+ *                            .                               .                             .                     .                        .                          .                        .
+ *                            .                               .                             .                     .                        .                          .                        .
+ *                            │                               │                             │               close │                        │                          │                        │
+ *                            │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────>│
+ *                            │                               │                             │                     │                        │                          │                        │
+ *                            │                               │                             │                     │         close          │                          │                        │
+ *                            │                               │<───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
+ *                            │                               │                             │                     │                        │                          │                        │
+ *                            │                               ────┐                         │                     │                        │                          │                        │
+ *                            │                                   │ closeWorkingCopy        │                     │                        │                          │                        │
+ *                            │                               <───┘                         │                     │                        │                          │                        │
+ *                            │                               │                             │                     │                        │                          │                        │
+ *                            │                               ────┐                         │                     │                        │                          │                        │
+ *                            │                                   │ closeRepository         │                     │                        │                          │                        │
+ *                            │                               <───┘                         │                     │                        │                          │                        │
+ *                            │                               │                             │                     │                        │                          │                        │
+ *                            │                               │                             │ contextClosed       │                        │                          │                        │
+ *                            │                               │───────────────────────────────────────────────────────────────────────────>│                          │                        │
+ *                     ┌──────┴──────┐          ┌─────────────┴─────────────┐          ┌────┴────┐          ┌─────┴─────┐          ┌───────┴───────┐          ┌───────┴───────┐          ┌─────┴─────┐
+ *                     │ModifyCommand│          │SimpleGitWorkingCopyFactory│          │Reclaimer│          │Initializer│          │WorkingCopyPool│          │WorkdirProvider│          │WorkingCopy│
+ *                     └─────────────┘          └───────────────────────────┘          └─────────┘          └───────────┘          └───────────────┘          └───────────────┘          └───────────┘
+ * 
+ * + * @param Type of central repository location + * @param Type of working copy for repository + * @param Type of repository context + */ +/* +http://www.plantuml.com/plantuml/uml/fLH1QiCm4Bph5JeRaWUeO0AcAJsqXBJGiv0sOQcaDPBSn7rzQw8OLG4beJThTsOyE_9w5QBqSR26lP36tTYHjTBfHVk6jZVmXF63_2UwVKVzk9OgaX-vuCg3Z92rM0LV5HCdgOvSX6Eio_0jA2FHWc-QnBj2U7OOKHhylfcIrJP4HkmXXx6zfw7dxtxaaRW_sM45Pz7EFiKPCbUgOSnmQU9PdOT1AGXXDvYwyvONFXYO0BFCJg893-dck8D3NUrOgeaqmlfN1_JZKK4VaTpby5D1ezzu-a8DFgN-2eVKO0LWqPQXNsfczoXmVcPPkPfhnhaxGwSlxTJUTVFdrJHNlFpPI94xOylbibpOh2qqJQThA6KeG3vSDSC4ho1ke6VrVofjeQU0q_c-VLQd7qqtQMYs0gS7Qtu0 +@startuml +ModifyCommand->SimpleGitWorkingCopyFactory : createWorkingCopy +SimpleGitWorkingCopyFactory->SimpleGitWorkingCopyFactory:createContext +SimpleGitWorkingCopyFactory-> Reclaimer**:create +SimpleGitWorkingCopyFactory-> Initializer**:create +SimpleGitWorkingCopyFactory->WorkingCopyPool:getWorkingCopy +group Try to reclaim +WorkingCopyPool->Reclaimer:reclaim +Reclaimer->SimpleGitWorkingCopyFactory:reclaim +alt reclaim successful +SimpleGitWorkingCopyFactory->> WorkingCopyPool +else reclaim fails; create new +SimpleGitWorkingCopyFactory->x WorkingCopyPool:ReclaimFailedException +WorkingCopyPool->WorkdirProvider:createNewWorkdir +WorkdirProvider->>WorkingCopyPool +WorkingCopyPool->Initializer:initialize +Initializer->SimpleGitWorkingCopyFactory:initialize +SimpleGitWorkingCopyFactory->> WorkingCopyPool +end +WorkingCopyPool->>SimpleGitWorkingCopyFactory +SimpleGitWorkingCopyFactory->WorkingCopy** +SimpleGitWorkingCopyFactory->>ModifyCommand: WorkingCopy +... +ModifyCommand->WorkingCopy:doWork +... +ModifyCommand->WorkingCopy:close +WorkingCopy->SimpleGitWorkingCopyFactory:close +SimpleGitWorkingCopyFactory->SimpleGitWorkingCopyFactory:closeWorkingCopy +SimpleGitWorkingCopyFactory->SimpleGitWorkingCopyFactory:closeRepository +SimpleGitWorkingCopyFactory->WorkingCopyPool:contextClosed +@enduml +*/ +public abstract class SimpleWorkingCopyFactory> implements WorkingCopyFactory, ServletContextListener { private static final Logger LOG = LoggerFactory.getLogger(SimpleWorkingCopyFactory.class); @@ -50,13 +208,12 @@ public abstract class SimpleWorkingCopyFactory implements WorkingCopyFa WorkingCopyPool.ParentAndClone parentAndClone = workingCopyPool.getWorkingCopy(workingCopyContext); return new WorkingCopy<>(parentAndClone.getClone(), parentAndClone.getParent(), () -> this.close(workingCopyContext, parentAndClone), parentAndClone.getDirectory()); } catch (WorkingCopyFailedException e) { - throw new InternalRepositoryException(getScmRepository(repositoryContext), "could not create working copy for repository in temporary directory", e); + throw new InternalRepositoryException(repositoryContext.get(), "could not create working copy for repository in temporary directory", e); } } private WorkingCopyContext createWorkingCopyContext(C repositoryContext, String initialBranch) { return new WorkingCopyContext<>( - getScmRepository(repositoryContext), initialBranch, repositoryContext, newFolder -> cloneRepository(repositoryContext, newFolder, initialBranch), @@ -65,16 +222,16 @@ public abstract class SimpleWorkingCopyFactory implements WorkingCopyFa } private void close(WorkingCopyContext workingCopyContext, WorkingCopyPool.ParentAndClone parentAndClone) { + try { + closeWorkingCopy(parentAndClone.getClone()); + } catch (Exception e) { + LOG.warn("could not close clone for {} in directory {}", workingCopyContext.getScmRepository(), parentAndClone.getDirectory(), e); + } try { closeRepository(parentAndClone.getParent()); } catch (Exception e) { LOG.warn("could not close central repository for {}", workingCopyContext.getScmRepository(), e); } - try { - closeWorkingCopyInternal(parentAndClone.getClone()); - } catch (Exception e) { - LOG.warn("could not close clone for {} in directory {}", workingCopyContext.getScmRepository(), parentAndClone.getDirectory(), e); - } try { workingCopyPool.contextClosed(workingCopyContext, parentAndClone.getDirectory()); } catch (Exception e) { @@ -102,18 +259,17 @@ public abstract class SimpleWorkingCopyFactory implements WorkingCopyFa WorkingCopyPool.ParentAndClone reclaim(File target) throws ReclaimFailedException; } - protected abstract Repository getScmRepository(C context); + protected abstract WorkingCopyPool.ParentAndClone cloneRepository(C context, File target, String initialBranch) throws WorkingCopyFailedException; + + protected abstract WorkingCopyPool.ParentAndClone reclaimRepository(C context, File target, String initialBranch) throws ReclaimFailedException; @SuppressWarnings("squid:S00112") // We do allow implementations to throw arbitrary exceptions here, so that we can handle them in closeCentral protected abstract void closeRepository(R repository) throws Exception; + @SuppressWarnings("squid:S00112") // We do allow implementations to throw arbitrary exceptions here, so that we can handle them in closeWorkingCopy - protected abstract void closeWorkingCopyInternal(W workingCopy) throws Exception; - - protected abstract WorkingCopyPool.ParentAndClone cloneRepository(C context, File target, String initialBranch) throws WorkingCopyFailedException; - - protected abstract WorkingCopyPool.ParentAndClone reclaimRepository(C context, File target, String initialBranch) throws ReclaimFailedException; + protected abstract void closeWorkingCopy(W workingCopy) throws Exception; public static class ReclaimFailedException extends Exception { public ReclaimFailedException(String message) { diff --git a/scm-core/src/main/java/sonia/scm/repository/work/WorkingCopyContext.java b/scm-core/src/main/java/sonia/scm/repository/work/WorkingCopyContext.java index 9033a1b461..86fda237a3 100644 --- a/scm-core/src/main/java/sonia/scm/repository/work/WorkingCopyContext.java +++ b/scm-core/src/main/java/sonia/scm/repository/work/WorkingCopyContext.java @@ -26,15 +26,15 @@ package sonia.scm.repository.work; import sonia.scm.repository.Repository; -public class WorkingCopyContext { - private final Repository scmRepository; +import java.util.function.Supplier; + +public class WorkingCopyContext> { private final String requestedBranch; private final C context; private final SimpleWorkingCopyFactory.WorkingCopyInitializer initializer; private final SimpleWorkingCopyFactory.WorkingCopyReclaimer reclaimer; - public WorkingCopyContext(Repository scmRepository, String requestedBranch, C context, SimpleWorkingCopyFactory.WorkingCopyInitializer initializer, SimpleWorkingCopyFactory.WorkingCopyReclaimer reclaimer) { - this.scmRepository = scmRepository; + public WorkingCopyContext(String requestedBranch, C context, SimpleWorkingCopyFactory.WorkingCopyInitializer initializer, SimpleWorkingCopyFactory.WorkingCopyReclaimer reclaimer) { this.requestedBranch = requestedBranch; this.context = context; this.initializer = initializer; @@ -42,7 +42,7 @@ public class WorkingCopyContext { } public Repository getScmRepository() { - return scmRepository; + return context.get(); } public String getRequestedBranch() { diff --git a/scm-core/src/main/java/sonia/scm/repository/work/WorkingCopyPool.java b/scm-core/src/main/java/sonia/scm/repository/work/WorkingCopyPool.java index dfbaac91b9..4f261a5601 100644 --- a/scm-core/src/main/java/sonia/scm/repository/work/WorkingCopyPool.java +++ b/scm-core/src/main/java/sonia/scm/repository/work/WorkingCopyPool.java @@ -24,10 +24,13 @@ package sonia.scm.repository.work; +import sonia.scm.repository.Repository; + import java.io.File; +import java.util.function.Supplier; public interface WorkingCopyPool { - ParentAndClone getWorkingCopy(WorkingCopyContext context) throws WorkingCopyFailedException; + > ParentAndClone getWorkingCopy(WorkingCopyContext context) throws WorkingCopyFailedException; void contextClosed(WorkingCopyContext workingCopyContext, File workdir); diff --git a/scm-core/src/test/java/sonia/scm/repository/work/CachingAllWorkingCopyPoolTest.java b/scm-core/src/test/java/sonia/scm/repository/work/CachingAllWorkingCopyPoolTest.java index 74ccbe029b..fbea30a3f3 100644 --- a/scm-core/src/test/java/sonia/scm/repository/work/CachingAllWorkingCopyPoolTest.java +++ b/scm-core/src/test/java/sonia/scm/repository/work/CachingAllWorkingCopyPoolTest.java @@ -35,6 +35,7 @@ import sonia.scm.repository.Repository; import java.io.File; import java.nio.file.Path; +import java.util.function.Supplier; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -54,7 +55,7 @@ class CachingAllWorkingCopyPoolTest { CachingAllWorkingCopyPool cachingAllWorkingCopyPool; @Mock - WorkingCopyContext workingCopyContext; + WorkingCopyContext> workingCopyContext; @Mock SimpleWorkingCopyFactory.WorkingCopyInitializer initializer; @Mock diff --git a/scm-core/src/test/java/sonia/scm/repository/work/SimpleWorkingCopyFactoryTest.java b/scm-core/src/test/java/sonia/scm/repository/work/SimpleWorkingCopyFactoryTest.java index fd12e578dd..798e08c88a 100644 --- a/scm-core/src/test/java/sonia/scm/repository/work/SimpleWorkingCopyFactoryTest.java +++ b/scm-core/src/test/java/sonia/scm/repository/work/SimpleWorkingCopyFactoryTest.java @@ -34,6 +34,7 @@ import sonia.scm.util.IOUtil; import java.io.Closeable; import java.io.File; import java.io.IOException; +import java.util.function.Supplier; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -60,7 +61,7 @@ public class SimpleWorkingCopyFactoryTest { WorkdirProvider workdirProvider = new WorkdirProvider(temporaryFolder.newFolder()); WorkingCopyPool configurableTestWorkingCopyPool = new WorkingCopyPool() { @Override - public ParentAndClone getWorkingCopy(WorkingCopyContext context) throws WorkingCopyFailedException { + public > ParentAndClone getWorkingCopy(WorkingCopyContext context) throws WorkingCopyFailedException { workdir = workdirProvider.createNewWorkdir(); return context.getInitializer().initialize(workdir); } @@ -77,11 +78,6 @@ public class SimpleWorkingCopyFactoryTest { } }; simpleWorkingCopyFactory = new SimpleWorkingCopyFactory(configurableTestWorkingCopyPool) { - @Override - protected Repository getScmRepository(Context context) { - return REPOSITORY; - } - @Override protected void closeRepository(Closeable repository) throws IOException { repository.close(); @@ -93,7 +89,7 @@ public class SimpleWorkingCopyFactoryTest { } @Override - protected void closeWorkingCopyInternal(Closeable workingCopy) throws Exception { + protected void closeWorkingCopy(Closeable workingCopy) throws Exception { workingCopy.close(); } @@ -155,5 +151,10 @@ public class SimpleWorkingCopyFactoryTest { } } - private static class Context {} + private static class Context implements Supplier { + @Override + public Repository get() { + return REPOSITORY; + } + } } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitContext.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitContext.java index c66f5cab55..3763e57939 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitContext.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitContext.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- @@ -39,12 +39,13 @@ import sonia.scm.repository.Repository; import java.io.Closeable; import java.io.File; import java.io.IOException; +import java.util.function.Supplier; /** * * @author Sebastian Sdorra */ -public class GitContext implements Closeable +public class GitContext implements Closeable, Supplier { /** @@ -108,6 +109,11 @@ public class GitContext implements Closeable return repository; } + @Override + public Repository get() { + return getRepository(); + } + File getDirectory() { return directory; } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/SimpleGitWorkingCopyFactory.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/SimpleGitWorkingCopyFactory.java index ecd874e20c..a8a84fdf92 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/SimpleGitWorkingCopyFactory.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/SimpleGitWorkingCopyFactory.java @@ -133,14 +133,9 @@ public class SimpleGitWorkingCopyFactory extends SimpleWorkingCopyFactory { /** Field description */ @@ -155,6 +156,11 @@ public class HgCommandContext implements Closeable return scmRepository; } + @Override + public sonia.scm.repository.Repository get() { + return getScmRepository(); + } + //~--- fields --------------------------------------------------------------- /** Field description */ diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/SimpleHgWorkingCopyFactory.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/SimpleHgWorkingCopyFactory.java index 9285cf3417..170d57b421 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/SimpleHgWorkingCopyFactory.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/SimpleHgWorkingCopyFactory.java @@ -104,15 +104,10 @@ public class SimpleHgWorkingCopyFactory extends SimpleWorkingCopyFactory cloneRepository(SvnContext context, File workingCopy, String initialBranch) { @@ -63,7 +58,7 @@ public class SimpleSvnWorkingCopyFactory extends SimpleWorkingCopyFactory { private static final Logger LOG = LoggerFactory.getLogger(SvnContext.class); @@ -64,6 +65,11 @@ public class SvnContext implements Closeable { return repository; } + @Override + public Repository get() { + return getRepository(); + } + public File getDirectory() { return directory; } diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SimpleSvnWorkingCopyFactoryTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SimpleSvnWorkingCopyFactoryTest.java index 66c51a94cb..9cac5f205d 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SimpleSvnWorkingCopyFactoryTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SimpleSvnWorkingCopyFactoryTest.java @@ -96,7 +96,7 @@ public class SimpleSvnWorkingCopyFactoryTest extends AbstractSvnCommandTestBase @Test public void shouldReturnRepository() { SimpleSvnWorkingCopyFactory factory = new SimpleSvnWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider)); - Repository scmRepository = factory.getScmRepository(createContext()); + Repository scmRepository = createContext().getRepository(); assertThat(scmRepository).isSameAs(repository); } }