From 7e945afc43c91016a24817096137f25a8400de07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Thu, 14 May 2020 23:01:48 +0200 Subject: [PATCH] Keep ParentAndClone inside working copy factories --- .../work/CachingAllWorkingCopyPool.java | 10 +- .../work/NoneCachingWorkingCopyPool.java | 4 +- .../work/SimpleWorkingCopyFactory.java | 290 +++++++++++------- .../repository/work/WorkingCopyContext.java | 55 ---- .../scm/repository/work/WorkingCopyPool.java | 28 +- .../work/CachingAllWorkingCopyPoolTest.java | 16 +- .../work/SimpleWorkingCopyFactoryTest.java | 6 +- .../spi/GitWorkingCopyInitializer.java | 6 +- .../spi/GitWorkingCopyReclaimer.java | 6 +- .../spi/SimpleHgWorkingCopyFactory.java | 1 - .../spi/SvnWorkingCopyInitializer.java | 6 +- .../spi/SvnWorkingCopyReclaimer.java | 6 +- 12 files changed, 206 insertions(+), 228 deletions(-) delete mode 100644 scm-core/src/main/java/sonia/scm/repository/work/WorkingCopyContext.java 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 40cdf97d27..190a7bb58a 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 @@ -48,13 +48,13 @@ public class CachingAllWorkingCopyPool implements WorkingCopyPool { } @Override - public ParentAndClone getWorkingCopy(WorkingCopyContext workingCopyContext) { + public WorkingCopy getWorkingCopy(SimpleWorkingCopyFactory.WorkingCopyContext workingCopyContext) { String id = workingCopyContext.getScmRepository().getId(); File existingWorkdir = workdirs.remove(id); if (existingWorkdir != null) { Stopwatch stopwatch = Stopwatch.createStarted(); try { - ParentAndClone reclaimed = workingCopyContext.reclaim(existingWorkdir); + WorkingCopy reclaimed = workingCopyContext.reclaim(existingWorkdir); LOG.debug("reclaimed workdir for {} in path {} in {}", workingCopyContext.getScmRepository().getNamespaceAndName(), existingWorkdir, stopwatch.stop()); return reclaimed; } catch (SimpleWorkingCopyFactory.ReclaimFailedException e) { @@ -65,16 +65,16 @@ public class CachingAllWorkingCopyPool implements WorkingCopyPool { return createNewWorkingCopy(workingCopyContext); } - private ParentAndClone createNewWorkingCopy(WorkingCopyContext workingCopyContext) { + private WorkingCopy createNewWorkingCopy(SimpleWorkingCopyFactory.WorkingCopyContext workingCopyContext) { Stopwatch stopwatch = Stopwatch.createStarted(); File newWorkdir = workdirProvider.createNewWorkdir(); - ParentAndClone parentAndClone = workingCopyContext.initialize(newWorkdir); + WorkingCopy parentAndClone = workingCopyContext.initialize(newWorkdir); LOG.debug("initialized new workdir for {} in path {} in {}", workingCopyContext.getScmRepository().getNamespaceAndName(), newWorkdir, stopwatch.stop()); return parentAndClone; } @Override - public void contextClosed(WorkingCopyContext workingCopyContext, File workdir) { + public void contextClosed(SimpleWorkingCopyFactory.WorkingCopyContext workingCopyContext, File workdir) { String id = workingCopyContext.getScmRepository().getId(); File putResult = workdirs.putIfAbsent(id, workdir); if (putResult != null && putResult != workdir) { 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 f4b493d3ab..9e9859d27f 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 @@ -39,12 +39,12 @@ public class NoneCachingWorkingCopyPool implements WorkingCopyPool { } @Override - public ParentAndClone getWorkingCopy(WorkingCopyContext context) { + public WorkingCopy getWorkingCopy(SimpleWorkingCopyFactory.WorkingCopyContext context) { return context.initialize(workdirProvider.createNewWorkdir()); } @Override - public void contextClosed(WorkingCopyContext workingCopyContext, File workdir) { + public void contextClosed(SimpleWorkingCopyFactory.WorkingCopyContext workingCopyContext, File workdir) { IOUtil.deleteSilently(workdir); } 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 727e54dffc..7ed74c4e11 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 @@ -26,6 +26,7 @@ package sonia.scm.repository.work; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryProvider; import javax.servlet.ServletContextEvent; @@ -55,95 +56,102 @@ import java.io.File; *
Closes resources allocated for the central repository.
* *
- *                     ┌─────────────┐          ┌───────────────────────────┐                                        ┌───────────────┐          ┌───────────────┐
- *                     │ModifyCommand│          │SimpleGitWorkingCopyFactory│                                        │WorkingCopyPool│          │WorkdirProvider│
- *                     └──────┬──────┘          └─────────────┬─────────────┘                                        └───────┬───────┘          └───────┬───────┘
- *                            │      createWorkingCopy        │                                                              │                          │
- *                            │──────────────────────────────>│                                                              │                          │
- *                            │                               │                                                              │                          │
- *                            │                               │        create          ┌──────────────────┐                  │                          │
- *                            │                               │──────────────────────> │WorkingCopyContext│                  │                          │
- *                            │                               │                        └────────┬─────────┘                  │                          │
- *                            │                               │                       getWorkingCopy                         │                          │
- *                            │                               │─────────────────────────────────────────────────────────────>│                          │
- *                            │                               │                                 │                            │                          │
- *                            │                               │                                 │                            │                          │
- *                            │                               │                                 │                            │                          │
- *                            │                               │                                 │                            │                          │
- *                            │                               │                                 │          reclaim           │                          │
- *                            │                               │                                 │ <──────────────────────────│                          │
- *                            │                               │                                 │                            │                          │
- *                            │                               │                                 │                            │                          │
- *                            │                               │              ╔══════╤═══════════╪════════════════════════════╪══════════════════════════╪═════════════════╗
- *                            │                               │              ║ ALT  │  reclaim successful                    │                          │                 ║
- *                            │                               │              ╟──────┘           │                            │                          │                 ║
- *                            │                               │              ║                  │                            │                          │                 ║
- *                            │                               │              ║                  │ ──────────────────────────>│                          │                 ║
- *                            │                               │              ╠══════════════════╪════════════════════════════╪══════════════════════════╪═════════════════╣
- *                            │                               │              ║ [reclaim fails; create new]                   │                          │                 ║
- *                            │                               │              ║                  │   ReclaimFailedException   │                          │                 ║
- *                            │                               │              ║                  │ ──────────────────────────>│                          │                 ║
- *                            │                               │              ║                  │                            │                          │                 ║
- *                            │                               │              ║                  │                            │    createNewWorkdir      │                 ║
- *                            │                               │              ║                  │                            │─────────────────────────>│                 ║
- *                            │                               │              ║                  │                            │                          │                 ║
- *                            │                               │              ║                  │                            │                          │                 ║
- *                            │                               │              ║                  │                            │<─────────────────────────│                 ║
- *                            │                               │              ║                  │                            │                          │                 ║
- *                            │                               │              ║                  │         initialize         │                          │                 ║
- *                            │                               │              ║                  │ <──────────────────────────│                          │                 ║
- *                            │                               │              ║                  │                            │                          │                 ║
- *                            │                               │              ║                  │                            │                          │                 ║
- *                            │                               │              ║                  │ ──────────────────────────>│                          │                 ║
- *                            │                               │              ╚══════════════════╪════════════════════════════╪══════════════════════════╪═════════════════╝
- *                            │                               │                                 │                            │                          │
- *                            │                               │                       ParentAndClone                         │                          │
- *                            │                               │<─────────────────────────────────────────────────────────────│                          │
- *                            │                               │                                 │                            │                          │
- *                            │                               │                                 │                            │                          │                  ┌───────────┐
- *                            │                               │──────────────────────────────────────────────────────────────────────────────────────────────────────────> │WorkingCopy│
- *                            │                               │                                 │                            │                          │                  └─────┬─────┘
- *                            │         WorkingCopy           │                                 │                            │                          │                        │
- *                            │<──────────────────────────────│                                 │                            │                          │                        │
- *                            │                               │                                 │                            │                          │                        │
- *                            .                               .                                 .                            .                          .                        .
- *                            .                               .                                 .                            .                          .                        .
- *                            .                               .                                 .                            .                          .                        .
- *                            .                               .                                 .                            .                          .                        .
- *                            │                               │                                 │   doWork                   │                          │                        │
- *                            │─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────>│
- *                            │                               │                                 │                            │                          │                        │
- *                            .                               .                                 .                            .                          .                        .
- *                            .                               .                                 .                            .                          .                        .
- *                            .                               .                                 .                            .                          .                        .
- *                            .                               .                                 .                            .                          .                        .
- *                            │                               │                                 │    close                   │                          │                        │
- *                            │─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────>│
- *                            │                               │                                 │                            │                          │                        │
- *                            │                               │                                 │                    close   │                          │                        │
- *                            │                               │<─────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
- *                            │                               │                                 │                            │                          │                        │
- *                            │                               ────┐                             │                            │                          │                        │
- *                            │                                   │ closeWorkingCopy            │                            │                          │                        │
- *                            │                               <───┘                             │                            │                          │                        │
- *                            │                               │                                 │                            │                          │                        │
- *                            │                               ────┐                             │                            │                          │                        │
- *                            │                                   │ closeRepository             │                            │                          │                        │
- *                            │                               <───┘                             │                            │                          │                        │
- *                            │                               │                                 │                            │                          │                        │
- *                            │                               │                        contextClosed                         │                          │                        │
- *                            │                               │─────────────────────────────────────────────────────────────>│                          │                        │
- *                     ┌──────┴──────┐          ┌─────────────┴─────────────┐          ┌────────┴─────────┐          ┌───────┴───────┐          ┌───────┴───────┐          ┌─────┴─────┐
- *                     │ModifyCommand│          │SimpleGitWorkingCopyFactory│          │WorkingCopyContext│          │WorkingCopyPool│          │WorkdirProvider│          │WorkingCopy│
- *                     └─────────────┘          └───────────────────────────┘          └──────────────────┘          └───────────────┘          └───────────────┘          └───────────┘
+ *                     ┌─────────────┐          ┌───────────────────────────┐                                        ┌───────────────┐                                 ┌───────────────┐
+ *                     │ModifyCommand│          │SimpleGitWorkingCopyFactory│                                        │WorkingCopyPool│                                 │WorkdirProvider│
+ *                     └──────┬──────┘          └─────────────┬─────────────┘                                        └───────┬───────┘                                 └───────┬───────┘
+ *                            │      createWorkingCopy        │                                                              │                                                 │
+ *                            │──────────────────────────────>│                                                              │                                                 │
+ *                            │                               │                                                              │                                                 │
+ *                            │                               │        create          ┌──────────────────┐                  │                                                 │
+ *                            │                               │──────────────────────> │WorkingCopyContext│                  │                                                 │
+ *                            │                               │                        └────────┬─────────┘                  │                                                 │
+ *                            │                               │                       getWorkingCopy                         │                                                 │
+ *                            │                               │─────────────────────────────────────────────────────────────>│                                                 │
+ *                            │                               │                                 │                            │                                                 │
+ *                            │                               │                                 │                            │                                                 │
+ *                            │                               │                                 │                            │                                                 │
+ *                            │                               │                                 │                            │                                                 │
+ *                            │                               │                                 │          reclaim           │                                                 │
+ *                            │                               │                                 │ <──────────────────────────│                                                 │
+ *                            │                               │                                 │                            │                                                 │
+ *                            │                               │                                 │                            │                                                 │
+ *                            │                               │              ╔══════╤═══════════╪════════════════════════════╪═════════════════════════════════════════════════╪═════════════════╗
+ *                            │                               │              ║ ALT  │  reclaim successful                    │                                                 │                 ║
+ *                            │                               │              ╟──────┘           │                            │                                                 │                 ║
+ *                            │                               │              ║                  │                            │                  ┌───────────┐                  │                 ║
+ *                            │                               │              ║                  │ ─────────────────────────────────────────────>│WorkingCopy│                  │                 ║
+ *                            │                               │              ║                  │                            │                  └─────┬─────┘                  │                 ║
+ *                            │                               │              ║                  │        WorkingCopy         │                                                 │                 ║
+ *                            │                               │              ║                  │ ──────────────────────────>│                                                 │                 ║
+ *                            │                               │              ╠══════════════════╪════════════════════════════╪═════════════════════════════════════════════════╪═════════════════╣
+ *                            │                               │              ║ [reclaim fails; create new]                   │                                                 │                 ║
+ *                            │                               │              ║                  │   ReclaimFailedException   │                                                 │                 ║
+ *                            │                               │              ║                  │ ──────────────────────────>│                                                 │                 ║
+ *                            │                               │              ║                  │                            │                                                 │                 ║
+ *                            │                               │              ║                  │                            │                createNewWorkdir                 │                 ║
+ *                            │                               │              ║                  │                            │────────────────────────────────────────────────>│                 ║
+ *                            │                               │              ║                  │                            │                                                 │                 ║
+ *                            │                               │              ║                  │                            │                                                 │                 ║
+ *                            │                               │              ║                  │                            │<────────────────────────────────────────────────│                 ║
+ *                            │                               │              ║                  │                            │                                                 │                 ║
+ *                            │                               │              ║                  │         initialize         │                                                 │                 ║
+ *                            │                               │              ║                  │ <──────────────────────────│                                                 │                 ║
+ *                            │                               │              ║                  │                            │                                                 │                 ║
+ *                            │                               │              ║                  │                            │                  ┌───────────┐                  │                 ║
+ *                            │                               │              ║                  │ ─────────────────────────────────────────────>│WorkingCopy│                  │                 ║
+ *                            │                               │              ║                  │                            │                  └─────┬─────┘                  │                 ║
+ *                            │                               │              ║                  │        WorkingCopy         │                        │                        │                 ║
+ *                            │                               │              ║                  │ ──────────────────────────>│                        │                        │                 ║
+ *                            │                               │              ╚══════════════════╪════════════════════════════╪════════════════════════╪════════════════════════╪═════════════════╝
+ *                            │                               │                                 │                            │                        │                        │
+ *                            │                               │                         WorkingCopy                          │                        │                        │
+ *                            │                               │<─────────────────────────────────────────────────────────────│                        │                        │
+ *                            │                               │                                 │                            │                        │                        │
+ *                            │         WorkingCopy           │                                 │                            │                        │                        │
+ *                            │<──────────────────────────────│                                 │                            │                        │                        │
+ *                            │                               │                                 │                            │                        │                        │
+ *                            .                               .                                 .                            .                        .                        .
+ *                            .                               .                                 .                            .                        .                        .
+ *                            .                               .                                 .                            .                        .                        .
+ *                            .                               .                                 .                            .                        .                        .
+ *                            │                               │                        doWork   │                            │                        │                        │
+ *                            │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────>│                        │
+ *                            │                               │                                 │                            │                        │                        │
+ *                            .                               .                                 .                            .                        .                        .
+ *                            .                               .                                 .                            .                        .                        .
+ *                            .                               .                                 .                            .                        .                        .
+ *                            .                               .                                 .                            .                        .                        .
+ *                            │                               │                        close    │                            │                        │                        │
+ *                            │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────>│                        │
+ *                            │                               │                                 │                            │                        │                        │
+ *                            │                               │                                 │      close                 │                        │                        │
+ *                            │                               │<──────────────────────────────────────────────────────────────────────────────────────│                        │
+ *                            │                               │                                 │                            │                        │                        │
+ *                            │                               ────┐                             │                            │                        │                        │
+ *                            │                                   │ closeWorkingCopy            │                            │                        │                        │
+ *                            │                               <───┘                             │                            │                        │                        │
+ *                            │                               │                                 │                            │                        │                        │
+ *                            │                               ────┐                             │                            │                        │                        │
+ *                            │                                   │ closeRepository             │                            │                        │                        │
+ *                            │                               <───┘                             │                            │                        │                        │
+ *                            │                               │                                 │                            │                        │                        │
+ *                            │                               │                        contextClosed                         │                        │                        │
+ *                            │                               │─────────────────────────────────────────────────────────────>│                        │                        │
+ *                            │                               │                                 │                            │                        │                        │
+ *                            │                               │                                 │                            ────┐                    │                        │
+ *                            │                               │                                 │                                │ cacheDirectory     │                        │
+ *                            │                               │                                 │                            <───┘                    │                        │
+ *                     ┌──────┴──────┐          ┌─────────────┴─────────────┐          ┌────────┴─────────┐          ┌───────┴───────┐          ┌─────┴─────┐          ┌───────┴───────┐
+ *                     │ModifyCommand│          │SimpleGitWorkingCopyFactory│          │WorkingCopyContext│          │WorkingCopyPool│          │WorkingCopy│          │WorkdirProvider│
+ *                     └─────────────┘          └───────────────────────────┘          └──────────────────┘          └───────────────┘          └───────────┘          └───────────────┘
  * 
- * + * * @param Type of central repository location * @param Type of working copy for repository * @param Type of repository context */ /* -http://www.plantuml.com/plantuml/uml/fPFHQlCm38Nl_HI-3gGFu1zCVyAwgutI3NPjRBM8ALQmdRNPqu_ITBX9yJ9sQUax9-H8MiTaGkfR4a_iS3yqtBR6krg_ODiHF69wu_2E_j1mDsoCJHm6gQGDO19aBL7WQospOiC-mIbLbRgOb9LPRSjCwW0v9Ww1-qw-Xa4cbW4i6Mp5H5Fh-TVLbJMKhZePUsiXndrFOgwejPOJOm4KuLkzDqZntvYCz72yQtAQcgZTHRynIE0UJXQwXEpl_uJ3i0tyWGx2cDup7CU6c02rdeQtA1ZqcD0GViBI4BoR6vVMHsrD09_-UzSG--NphweogcysMCcC4QlLQhhWMLivFhz-eYnnl4cbU2KZNY0MoBFw7vrsq774y_jt1sSlas_E7awimRk-fIy0 +http://www.plantuml.com/plantuml/uml/jLF1JiCm3BtdAtAkr7r0aQf9XN42JGE9SvHumyA9goHbAr-FnZgKDbCPGXnZl_ViFDlB49MFdINnm0QtVSFMAcVA-WbjIt2FyONz6xfTmss_KZgoxsKbjGSL8Kc96NnPooJOi8jmY4LHdKJccKbipKpL3bAOs7dkMldiUnbPUj2aq8e9fwppwjKPgoYUUJ9qMaC8suv4pXYf5CL5H2sdxQQz0WNuhhLLIE5cy54ws5yKF6I2cnD_fP30t1qqj17PNVwoGR_s_8u6_E3r8-o7X9W0odfgzLKseiE8Yl03_iSoP_8svbQpabVlP3rQ-35niLXCxo59LuQFhvzGcZYCR9azgW4-WxY2diJ_gBI1bWCUtx-xJtqQR7FKo6UNmvL-XLlqy2Kdbk1CP-aJ @startuml ModifyCommand->SimpleGitWorkingCopyFactory : createWorkingCopy SimpleGitWorkingCopyFactory-> WorkingCopyContext**:create @@ -151,16 +159,17 @@ SimpleGitWorkingCopyFactory->WorkingCopyPool:getWorkingCopy group Try to reclaim WorkingCopyPool->WorkingCopyContext:reclaim alt reclaim successful -WorkingCopyContext->> WorkingCopyPool +WorkingCopyContext->WorkingCopy** +WorkingCopyContext->> WorkingCopyPool:WorkingCopy else reclaim fails; create new WorkingCopyContext->x WorkingCopyPool:ReclaimFailedException WorkingCopyPool->WorkdirProvider:createNewWorkdir WorkdirProvider->>WorkingCopyPool WorkingCopyPool->WorkingCopyContext:initialize -WorkingCopyContext->> WorkingCopyPool +WorkingCopyContext->WorkingCopy** +WorkingCopyContext->> WorkingCopyPool:WorkingCopy end -WorkingCopyPool->>SimpleGitWorkingCopyFactory:ParentAndClone -SimpleGitWorkingCopyFactory->WorkingCopy** +WorkingCopyPool->>SimpleGitWorkingCopyFactory: WorkingCopy SimpleGitWorkingCopyFactory->>ModifyCommand: WorkingCopy ... ModifyCommand->WorkingCopy:doWork @@ -170,7 +179,9 @@ WorkingCopy->SimpleGitWorkingCopyFactory:close SimpleGitWorkingCopyFactory->SimpleGitWorkingCopyFactory:closeWorkingCopy SimpleGitWorkingCopyFactory->SimpleGitWorkingCopyFactory:closeRepository SimpleGitWorkingCopyFactory->WorkingCopyPool:contextClosed -@enduml*/ +WorkingCopyPool->WorkingCopyPool:cacheDirectory +@enduml +*/ public abstract class SimpleWorkingCopyFactory implements WorkingCopyFactory, ServletContextListener { private static final Logger LOG = LoggerFactory.getLogger(SimpleWorkingCopyFactory.class); @@ -183,38 +194,17 @@ public abstract class SimpleWorkingCopyFactory createWorkingCopy(C repositoryContext, String initialBranch) { - WorkingCopyContext workingCopyContext = createWorkingCopyContext(repositoryContext, initialBranch); - WorkingCopyPool.ParentAndClone parentAndClone = workingCopyPool.getWorkingCopy(workingCopyContext); - return new WorkingCopy<>(parentAndClone.getClone(), parentAndClone.getParent(), () -> this.close(workingCopyContext, parentAndClone), parentAndClone.getDirectory()); + WorkingCopyContext workingCopyContext = createWorkingCopyContext(repositoryContext, initialBranch); + return workingCopyPool.getWorkingCopy(workingCopyContext); } - private WorkingCopyContext createWorkingCopyContext(C repositoryContext, String initialBranch) { - return new WorkingCopyContext<>( + private WorkingCopyContext createWorkingCopyContext(C repositoryContext, String initialBranch) { + return new WorkingCopyContext( initialBranch, - repositoryContext.get(), - getInitializer(repositoryContext), - getReclaimer(repositoryContext) + repositoryContext ); } - 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 { - workingCopyPool.contextClosed(workingCopyContext, parentAndClone.getDirectory()); - } catch (Exception e) { - LOG.warn("could not close context for {} with directory {}", workingCopyContext.getScmRepository(), parentAndClone.getDirectory(), e); - } - } - @Override public void contextDestroyed(ServletContextEvent sce) { workingCopyPool.shutdown(); @@ -227,12 +217,12 @@ public abstract class SimpleWorkingCopyFactory { - WorkingCopyPool.ParentAndClone initialize(File target, String initialBranch); + ParentAndClone initialize(File target, String initialBranch); } @FunctionalInterface public interface WorkingCopyReclaimer { - WorkingCopyPool.ParentAndClone reclaim(File target, String initialBranch) throws ReclaimFailedException; + ParentAndClone reclaim(File target, String initialBranch) throws ReclaimFailedException; } protected abstract WorkingCopyInitializer getInitializer(C context); @@ -260,4 +250,72 @@ public abstract class SimpleWorkingCopyFactory { + private final R parent; + private final W clone; + private final File directory; + + public ParentAndClone(R parent, W clone, File directory) { + this.parent = parent; + this.clone = clone; + this.directory = directory; + } + + R getParent() { + return parent; + } + + W getClone() { + return clone; + } + + File getDirectory() { + return directory; + } + } + + public class WorkingCopyContext { + private final String requestedBranch; + private final C repositoryContext; + + public WorkingCopyContext(String requestedBranch, C repositoryContext) { + this.requestedBranch = requestedBranch; + this.repositoryContext = repositoryContext; + } + + public Repository getScmRepository() { + return repositoryContext.get(); + } + + public WorkingCopy reclaim(File workdir) throws SimpleWorkingCopyFactory.ReclaimFailedException { + return createWorkingCopyFromParentAndClone(getReclaimer(repositoryContext).reclaim(workdir, requestedBranch)); + } + + public WorkingCopy initialize(File workdir) { + return createWorkingCopyFromParentAndClone(getInitializer(repositoryContext).initialize(workdir, requestedBranch)); + } + + public WorkingCopy createWorkingCopyFromParentAndClone(ParentAndClone parentAndClone) { + return new WorkingCopy<>(parentAndClone.getClone(), parentAndClone.getParent(), () -> close(parentAndClone), parentAndClone.getDirectory()); + } + + private void close(ParentAndClone parentAndClone) { + try { + closeWorkingCopy(parentAndClone.getClone()); + } catch (Exception e) { + LOG.warn("could not close clone for {} in directory {}", getScmRepository(), parentAndClone.getDirectory(), e); + } + try { + closeRepository(parentAndClone.getParent()); + } catch (Exception e) { + LOG.warn("could not close central repository for {}", getScmRepository(), e); + } + try { + workingCopyPool.contextClosed(this, parentAndClone.getDirectory()); + } catch (Exception e) { + LOG.warn("could not close context for {} with directory {}", getScmRepository(), parentAndClone.getDirectory(), e); + } + } + } } 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 deleted file mode 100644 index 0fa90729fa..0000000000 --- a/scm-core/src/main/java/sonia/scm/repository/work/WorkingCopyContext.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2020-present Cloudogu GmbH and Contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package sonia.scm.repository.work; - -import sonia.scm.repository.Repository; - -import java.io.File; - -public class WorkingCopyContext { - private final String requestedBranch; - private final Repository repository; - private final SimpleWorkingCopyFactory.WorkingCopyInitializer initializer; - private final SimpleWorkingCopyFactory.WorkingCopyReclaimer reclaimer; - - public WorkingCopyContext(String requestedBranch, Repository repository, SimpleWorkingCopyFactory.WorkingCopyInitializer initializer, SimpleWorkingCopyFactory.WorkingCopyReclaimer reclaimer) { - this.requestedBranch = requestedBranch; - this.repository = repository; - this.initializer = initializer; - this.reclaimer = reclaimer; - } - - public Repository getScmRepository() { - return repository; - } - - public WorkingCopyPool.ParentAndClone reclaim(File workdir) throws SimpleWorkingCopyFactory.ReclaimFailedException { - return reclaimer.reclaim(workdir, requestedBranch); - } - - public WorkingCopyPool.ParentAndClone initialize(File workdir) { - return initializer.initialize(workdir, requestedBranch); - } -} 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 e64d52bddb..472363ceb7 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 @@ -27,33 +27,9 @@ package sonia.scm.repository.work; import java.io.File; public interface WorkingCopyPool { - ParentAndClone getWorkingCopy(WorkingCopyContext context); + WorkingCopy getWorkingCopy(SimpleWorkingCopyFactory.WorkingCopyContext context); - void contextClosed(WorkingCopyContext workingCopyContext, File workdir); + void contextClosed(SimpleWorkingCopyFactory.WorkingCopyContext workingCopyContext, File workdir); void shutdown(); - - class ParentAndClone { - private final R parent; - private final W clone; - private final File directory; - - public ParentAndClone(R parent, W clone, File directory) { - this.parent = parent; - this.clone = clone; - this.directory = directory; - } - - R getParent() { - return parent; - } - - W getClone() { - return clone; - } - - File getDirectory() { - return directory; - } - } } 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 3c378acea3..65c9d02a83 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 @@ -54,15 +54,15 @@ class CachingAllWorkingCopyPoolTest { CachingAllWorkingCopyPool cachingAllWorkingCopyPool; @Mock - WorkingCopyContext workingCopyContext; + SimpleWorkingCopyFactory.WorkingCopyContext workingCopyContext; @BeforeEach void initContext() throws SimpleWorkingCopyFactory.ReclaimFailedException { lenient().when(workingCopyContext.initialize(any())) - .thenAnswer(invocationOnMock -> new WorkingCopyPool.ParentAndClone<>(null, null, invocationOnMock.getArgument(0, File.class))); + .thenAnswer(invocationOnMock -> new WorkingCopy<>(null, null, () -> {}, invocationOnMock.getArgument(0, File.class))); lenient().when(workingCopyContext.reclaim(any())) - .thenAnswer(invocationOnMock -> new WorkingCopyPool.ParentAndClone<>(null, null, invocationOnMock.getArgument(0, File.class))); + .thenAnswer(invocationOnMock -> new WorkingCopy<>(null, null, () -> {}, invocationOnMock.getArgument(0, File.class))); } @Test @@ -70,7 +70,7 @@ class CachingAllWorkingCopyPoolTest { when(workingCopyContext.getScmRepository()).thenReturn(REPOSITORY); when(workdirProvider.createNewWorkdir()).thenReturn(temp.toFile()); - WorkingCopyPool.ParentAndClone workdir = cachingAllWorkingCopyPool.getWorkingCopy(workingCopyContext); + WorkingCopy workdir = cachingAllWorkingCopyPool.getWorkingCopy(workingCopyContext); verify(workingCopyContext).initialize(temp.toFile()); } @@ -80,9 +80,9 @@ class CachingAllWorkingCopyPoolTest { when(workingCopyContext.getScmRepository()).thenReturn(REPOSITORY); when(workdirProvider.createNewWorkdir()).thenReturn(temp.toFile()); - WorkingCopyPool.ParentAndClone firstWorkdir = cachingAllWorkingCopyPool.getWorkingCopy(workingCopyContext); + WorkingCopy firstWorkdir = cachingAllWorkingCopyPool.getWorkingCopy(workingCopyContext); cachingAllWorkingCopyPool.contextClosed(workingCopyContext, firstWorkdir.getDirectory()); - WorkingCopyPool.ParentAndClone secondWorkdir = cachingAllWorkingCopyPool.getWorkingCopy(workingCopyContext); + WorkingCopy secondWorkdir = cachingAllWorkingCopyPool.getWorkingCopy(workingCopyContext); verify(workingCopyContext).initialize(temp.toFile()); verify(workingCopyContext).reclaim(temp.toFile()); @@ -100,8 +100,8 @@ class CachingAllWorkingCopyPoolTest { firstDirectory, secondDirectory); - WorkingCopyPool.ParentAndClone firstWorkdir = cachingAllWorkingCopyPool.getWorkingCopy(workingCopyContext); - WorkingCopyPool.ParentAndClone secondWorkdir = cachingAllWorkingCopyPool.getWorkingCopy(workingCopyContext); + WorkingCopy firstWorkdir = cachingAllWorkingCopyPool.getWorkingCopy(workingCopyContext); + WorkingCopy secondWorkdir = cachingAllWorkingCopyPool.getWorkingCopy(workingCopyContext); cachingAllWorkingCopyPool.contextClosed(workingCopyContext, firstWorkdir.getDirectory()); cachingAllWorkingCopyPool.contextClosed(workingCopyContext, secondWorkdir.getDirectory()); 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 b3e2cb5e07..69a4225b22 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 @@ -61,13 +61,13 @@ public class SimpleWorkingCopyFactoryTest { WorkdirProvider workdirProvider = new WorkdirProvider(temporaryFolder.newFolder()); WorkingCopyPool configurableTestWorkingCopyPool = new WorkingCopyPool() { @Override - public ParentAndClone getWorkingCopy(WorkingCopyContext context) { + public WorkingCopy getWorkingCopy(SimpleWorkingCopyFactory.WorkingCopyContext context) { workdir = workdirProvider.createNewWorkdir(); return context.initialize(workdir); } @Override - public void contextClosed(WorkingCopyContext createWorkdirContext, File workdir) { + public void contextClosed(SimpleWorkingCopyFactory.WorkingCopyContext createWorkdirContext, File workdir) { if (!workdirIsCached) { IOUtil.deleteSilently(workdir); } @@ -98,7 +98,7 @@ public class SimpleWorkingCopyFactoryTest { protected WorkingCopyInitializer getInitializer(Context context) { return (target, initialBranch) -> { initialBranchForLastCloneCall = initialBranch; - return new WorkingCopyPool.ParentAndClone<>(parent, clone, target); + return new ParentAndClone<>(parent, clone, target); }; } }; diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyInitializer.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyInitializer.java index 304a8893f9..e1cd889d07 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyInitializer.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyInitializer.java @@ -33,7 +33,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.work.SimpleWorkingCopyFactory; -import sonia.scm.repository.work.WorkingCopyPool; +import sonia.scm.repository.work.SimpleWorkingCopyFactory.ParentAndClone; import java.io.File; import java.io.IOException; @@ -54,7 +54,7 @@ class GitWorkingCopyInitializer implements SimpleWorkingCopyFactory.WorkingCopyI } @Override - public WorkingCopyPool.ParentAndClone initialize(File target, String initialBranch) { + public ParentAndClone initialize(File target, String initialBranch) { LOG.trace("clone repository {}", context.getRepository().getId()); long start = System.nanoTime(); try { @@ -71,7 +71,7 @@ class GitWorkingCopyInitializer implements SimpleWorkingCopyFactory.WorkingCopyI throw notFound(entity("Branch", initialBranch).in(context.getRepository())); } - return new WorkingCopyPool.ParentAndClone<>(null, clone, target); + return new ParentAndClone<>(null, clone, target); } catch (GitAPIException | IOException e) { throw new InternalRepositoryException(context.getRepository(), "could not clone working copy of repository", e); } finally { diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyReclaimer.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyReclaimer.java index 95d6b8a09b..2cd37432b6 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyReclaimer.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyReclaimer.java @@ -32,7 +32,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.repository.GitUtil; import sonia.scm.repository.work.SimpleWorkingCopyFactory; -import sonia.scm.repository.work.WorkingCopyPool; +import sonia.scm.repository.work.SimpleWorkingCopyFactory.ParentAndClone; import java.io.File; import java.io.IOException; @@ -48,7 +48,7 @@ class GitWorkingCopyReclaimer implements SimpleWorkingCopyFactory.WorkingCopyRec } @Override - public WorkingCopyPool.ParentAndClone reclaim(File target, String initialBranch) throws SimpleWorkingCopyFactory.ReclaimFailedException { + public ParentAndClone reclaim(File target, String initialBranch) throws SimpleWorkingCopyFactory.ReclaimFailedException { LOG.trace("reclaim repository {}", context.getRepository().getId()); long start = System.nanoTime(); Repository repo = openTarget(target); @@ -59,7 +59,7 @@ class GitWorkingCopyReclaimer implements SimpleWorkingCopyFactory.WorkingCopyRec git.checkout().setForced(true).setName("origin/" + initialBranch).call(); git.branchDelete().setBranchNames(initialBranch).setForce(true).call(); git.checkout().setName(initialBranch).setCreateBranch(true).call(); - return new WorkingCopyPool.ParentAndClone<>(null, repo, target); + return new ParentAndClone<>(null, repo, target); } catch (GitAPIException | IOException e) { throw new SimpleWorkingCopyFactory.ReclaimFailedException(e); } finally { 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 364c64ed69..7fdd107ae0 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 @@ -35,7 +35,6 @@ import com.aragost.javahg.commands.flags.CloneCommandFlags; import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.work.SimpleWorkingCopyFactory; import sonia.scm.repository.work.WorkingCopyPool; -import sonia.scm.repository.work.WorkingCopyPool.ParentAndClone; import sonia.scm.util.IOUtil; import sonia.scm.web.HgRepositoryEnvironmentBuilder; diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnWorkingCopyInitializer.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnWorkingCopyInitializer.java index 2bb5ed6fc7..ed778f503f 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnWorkingCopyInitializer.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnWorkingCopyInitializer.java @@ -31,7 +31,7 @@ import org.tmatesoft.svn.core.wc2.SvnOperationFactory; import org.tmatesoft.svn.core.wc2.SvnTarget; import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.work.SimpleWorkingCopyFactory; -import sonia.scm.repository.work.WorkingCopyPool; +import sonia.scm.repository.work.SimpleWorkingCopyFactory.ParentAndClone; import java.io.File; @@ -43,7 +43,7 @@ class SvnWorkingCopyInitializer implements SimpleWorkingCopyFactory.WorkingCopyI } @Override - public WorkingCopyPool.ParentAndClone initialize(File workingCopy, String initialBranch) { + public ParentAndClone initialize(File workingCopy, String initialBranch) { final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); SVNURL source; @@ -64,6 +64,6 @@ class SvnWorkingCopyInitializer implements SimpleWorkingCopyFactory.WorkingCopyI svnOperationFactory.dispose(); } - return new WorkingCopyPool.ParentAndClone<>(context.getDirectory(), workingCopy, workingCopy); + return new ParentAndClone<>(context.getDirectory(), workingCopy, workingCopy); } } diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnWorkingCopyReclaimer.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnWorkingCopyReclaimer.java index 9ed5c6006f..2e60ce4c52 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnWorkingCopyReclaimer.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnWorkingCopyReclaimer.java @@ -28,7 +28,7 @@ import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.wc.SVNClientManager; import org.tmatesoft.svn.core.wc.SVNRevision; import sonia.scm.repository.work.SimpleWorkingCopyFactory; -import sonia.scm.repository.work.WorkingCopyPool; +import sonia.scm.repository.work.SimpleWorkingCopyFactory.ParentAndClone; import java.io.File; @@ -42,7 +42,7 @@ class SvnWorkingCopyReclaimer implements SimpleWorkingCopyFactory.WorkingCopyRec } @Override - public WorkingCopyPool.ParentAndClone reclaim(File target, String initialBranch) throws SimpleWorkingCopyFactory.ReclaimFailedException { + public ParentAndClone reclaim(File target, String initialBranch) throws SimpleWorkingCopyFactory.ReclaimFailedException { SVNClientManager clientManager = SVNClientManager.newInstance(); try { clientManager.getWCClient().doRevert(new File[] {target}, INFINITY, null); @@ -51,6 +51,6 @@ class SvnWorkingCopyReclaimer implements SimpleWorkingCopyFactory.WorkingCopyRec } catch (SVNException e) { throw new SimpleWorkingCopyFactory.ReclaimFailedException(e); } - return new WorkingCopyPool.ParentAndClone<>(context.getDirectory(), target, target); + return new ParentAndClone<>(context.getDirectory(), target, target); } }