From 352bfe7f5ae42fd58766f807001f4038392302fa Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Wed, 13 Feb 2019 12:30:40 +0100 Subject: [PATCH 1/4] fixed mercurial PreReceiveRepositoryHooks The problem seems to be that guice had multiple options for injecting HgContext. HgContextProvider bound via Module and HgContext bound void RequestScoped annotation. It looks like that Guice 4 injects randomly the one or the other, in SCMv1 (Guice 3) everything works as expected. To fix the problem we have created a new class annotated with RequestScoped, which holds an instance of HgContext. This way only the HgContextProvider is used for injection. --- .../java/sonia/scm/repository/HgContext.java | 3 --- .../sonia/scm/repository/HgContextProvider.java | 17 ++++++----------- .../scm/repository/HgContextRequestStore.java | 14 ++++++++++++++ .../src/main/java/sonia/scm/web/HgUtil.java | 2 ++ 4 files changed, 22 insertions(+), 14 deletions(-) create mode 100644 scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContextRequestStore.java diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContext.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContext.java index cbf7804444..21e27af328 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContext.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContext.java @@ -35,13 +35,10 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- -import com.google.inject.servlet.RequestScoped; - /** * * @author Sebastian Sdorra */ -@RequestScoped public class HgContext { diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContextProvider.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContextProvider.java index c86588fb27..e6f7436650 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContextProvider.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContextProvider.java @@ -63,22 +63,17 @@ public class HgContextProvider implements Provider * @return */ @Override - public HgContext get() - { - HgContext ctx = context; - - if (ctx == null) - { - ctx = new HgContext(); + public HgContext get() { + if (contextRequestStore == null) { logger.trace("context is null, we are probably out of request scope"); + return new HgContext(); } - - return ctx; + logger.trace("return HgContext from request store"); + return contextRequestStore.get(); } //~--- fields --------------------------------------------------------------- - /** Field description */ @Inject(optional = true) - private HgContext context; + private HgContextRequestStore contextRequestStore; } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContextRequestStore.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContextRequestStore.java new file mode 100644 index 0000000000..156e915416 --- /dev/null +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContextRequestStore.java @@ -0,0 +1,14 @@ +package sonia.scm.repository; + +import com.google.inject.servlet.RequestScoped; + +@RequestScoped +public class HgContextRequestStore { + + private HgContext context = new HgContext(); + + public HgContext get() { + return context; + } + +} diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgUtil.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgUtil.java index ec35762de7..b6b085f3ac 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgUtil.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgUtil.java @@ -134,6 +134,8 @@ public final class HgUtil repoConfiguration.setHgBin(handler.getConfig().getHgBinary()); + logger.debug("open hg repository {}: encoding: {}, pending: {}", directory, enc, pending); + return Repository.open(repoConfiguration, directory); } From 49e9671fa7df758e2c34eccbf60b2e1b6e1c94fd Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Wed, 13 Feb 2019 12:42:07 +0100 Subject: [PATCH 2/4] added some javadoc --- .../main/java/sonia/scm/repository/HgContextProvider.java | 3 +++ .../java/sonia/scm/repository/HgContextRequestStore.java | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContextProvider.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContextProvider.java index e6f7436650..89170713ac 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContextProvider.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContextProvider.java @@ -42,6 +42,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** + * Injection provider for {@link HgContext}. + * This provider returns an instance {@link HgContext} from request scope, if no {@link HgContext} could be found in + * request scope (mostly because the scope is not available) a new {@link HgContext} gets returned. * * @author Sebastian Sdorra */ diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContextRequestStore.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContextRequestStore.java index 156e915416..6043c347ff 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContextRequestStore.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContextRequestStore.java @@ -2,10 +2,13 @@ package sonia.scm.repository; import com.google.inject.servlet.RequestScoped; +/** + * Holds an instance of {@link HgContext} in the request scope. + */ @RequestScoped public class HgContextRequestStore { - private HgContext context = new HgContext(); + private final HgContext context = new HgContext(); public HgContext get() { return context; From 5a5cafaee0ff1e0f5534da54242724f3705235ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Thu, 14 Feb 2019 11:22:58 +0100 Subject: [PATCH 3/4] Add comment from previous commit --- .../java/sonia/scm/repository/HgContextRequestStore.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContextRequestStore.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContextRequestStore.java index 6043c347ff..ff08c2fcd2 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContextRequestStore.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgContextRequestStore.java @@ -4,6 +4,13 @@ import com.google.inject.servlet.RequestScoped; /** * Holds an instance of {@link HgContext} in the request scope. + * + *

The problem seems to be that guice had multiple options for injecting HgContext. {@link HgContextProvider} + * bound via Module and {@link HgContext} bound void {@link RequestScoped} annotation. It looks like that Guice 4 + * injects randomly the one or the other, in SCMv1 (Guice 3) everything works as expected.

+ * + *

To fix the problem we have created this class annotated with {@link RequestScoped}, which holds an instance + * of {@link HgContext}. This way only the {@link HgContextProvider} is used for injection.

*/ @RequestScoped public class HgContextRequestStore { From 080a0d55fd31fc3af434437f7f0e32a1477784cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Thu, 14 Feb 2019 10:23:51 +0000 Subject: [PATCH 4/4] Close branch bugflix/mercurial_pending_changesets