From 785e5e114282b79c3404958d597d3f4091be0d04 Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Mon, 29 Jul 2019 11:52:53 +0200 Subject: [PATCH] refactor plugin backend + fix tests --- .../sonia/scm/plugin/PluginInformation.java | 134 +++--------------- .../scm/plugin/DefaultPluginManager.java | 1 - .../sonia/scm/plugin/PluginProcessor.java | 8 +- .../api/v2/resources/ResourceLinksMock.java | 2 + .../sonia/scm/plugin/ExplodedSmpTest.java | 32 ++--- .../sonia/scm/plugin/PluginProcessorTest.java | 14 +- .../java/sonia/scm/plugin/PluginTreeTest.java | 28 ++-- .../sonia/scm/plugin/scm-b-plugin.smp | Bin 5787 -> 6872 bytes .../sonia/scm/plugin/scm-c-plugin.smp | Bin 4899 -> 5727 bytes .../sonia/scm/plugin/scm-d-plugin.smp | Bin 4899 -> 5727 bytes .../sonia/scm/plugin/scm-e-plugin.smp | Bin 4899 -> 5727 bytes .../sonia/scm/plugin/scm-f-plugin-1.0.0.smp | Bin 4822 -> 5654 bytes .../sonia/scm/plugin/scm-f-plugin-1.0.1.smp | Bin 4826 -> 5658 bytes 13 files changed, 54 insertions(+), 165 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/plugin/PluginInformation.java b/scm-core/src/main/java/sonia/scm/plugin/PluginInformation.java index 50d5c0d81f..663fd81f9f 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/PluginInformation.java +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginInformation.java @@ -44,11 +44,8 @@ import sonia.scm.util.Util; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; import java.io.Serializable; -import java.util.ArrayList; import java.util.List; //~--- JDK imports ------------------------------------------------------------ @@ -87,29 +84,18 @@ public class PluginInformation public PluginInformation clone() { PluginInformation clone = new PluginInformation(); - + clone.setName(name); clone.setAuthor(author); clone.setCategory(category); - clone.setTags(tags); + clone.setDescription(description); + clone.setState(state); + clone.setVersion(version); if (condition != null) { clone.setCondition(condition.clone()); } - clone.setDescription(description); - clone.setName(name); - - if (Util.isNotEmpty(screenshots)) - { - clone.setScreenshots(new ArrayList(screenshots)); - } - - clone.setState(state); - clone.setUrl(url); - clone.setVersion(version); - clone.setWiki(wiki); - return clone; } @@ -140,15 +126,11 @@ public class PluginInformation return Objects.equal(author, other.author) && Objects.equal(category, other.category) - && Objects.equal(tags, other.tags) && Objects.equal(condition, other.condition) && Objects.equal(description, other.description) && Objects.equal(name, other.name) - && Objects.equal(screenshots, other.screenshots) - && Objects.equal(state, other.state) - && Objects.equal(url, other.url) - && Objects.equal(version, other.version) - && Objects.equal(wiki, other.wiki); + && Objects.equal(state, other.state) + && Objects.equal(version, other.version); //J+ } @@ -161,8 +143,8 @@ public class PluginInformation @Override public int hashCode() { - return Objects.hashCode(author, category, tags, condition, - description, name, screenshots, state, url, version, wiki); + return Objects.hashCode(author, category, condition, + description, name, state, version); } /** @@ -178,15 +160,11 @@ public class PluginInformation return MoreObjects.toStringHelper(this) .add("author", author) .add("category", category) - .add("tags", tags) .add("condition", condition) .add("description", description) .add("name", name) - .add("screenshots", screenshots) .add("state", state) - .add("url", url) .add("version", version) - .add("wiki", wiki) .toString(); //J+ } @@ -282,17 +260,6 @@ public class PluginInformation return name; } - /** - * Method description - * - * - * @return - */ - public List getScreenshots() - { - return screenshots; - } - /** * Method description * @@ -304,28 +271,6 @@ public class PluginInformation return state; } - /** - * Method description - * - * - * @return - */ - public List getTags() - { - return tags; - } - - /** - * Method description - * - * - * @return - */ - public String getUrl() - { - return url; - } - /** * Method description * @@ -343,9 +288,8 @@ public class PluginInformation * * @return */ - public String getWiki() - { - return wiki; + public List getLinks() { + return links; } /** @@ -362,7 +306,6 @@ public class PluginInformation //~--- set methods ---------------------------------------------------------- - /** * Method description * @@ -419,17 +362,6 @@ public class PluginInformation this.name = name; } - /** - * Method description - * - * - * @param screenshots - */ - public void setScreenshots(List screenshots) - { - this.screenshots = screenshots; - } - /** * Method description * @@ -441,28 +373,6 @@ public class PluginInformation this.state = state; } - /** - * Method description - * - * - * @param tags - */ - public void setTags(List tags) - { - this.tags = tags; - } - - /** - * Method description - * - * - * @param url - */ - public void setUrl(String url) - { - this.url = url; - } - /** * Method description * @@ -474,15 +384,15 @@ public class PluginInformation this.version = version; } + /** * Method description * * - * @param wiki + * @param links */ - public void setWiki(String wiki) - { - this.wiki = wiki; + public void setLinks(List links) { + this.links = links; } //~--- fields --------------------------------------------------------------- @@ -502,25 +412,13 @@ public class PluginInformation /** Field description */ private String name; - /** Field description */ - @XmlElement(name = "screenshot") - @XmlElementWrapper(name = "screenshots") - private List screenshots; - /** Field description */ private PluginState state; - /** Field description */ - @XmlElement(name = "tag") - @XmlElementWrapper(name = "tags") - private List tags; - - /** Field description */ - private String url; - /** Field description */ private String version; /** Field description */ - private String wiki; + private List links; + } diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java index 4bcfc3a06e..a62916ed41 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java @@ -648,7 +648,6 @@ public class DefaultPluginManager implements PluginManager pluginInformation.setCategory(plugin.getCategory()); pluginInformation.setVersion(plugin.getVersion()); pluginInformation.setDescription(plugin.getDescription()); - pluginInformation.setUrl(plugin.getLinks().getDownload()); if (plugin.getConditions() != null) { PluginCenterDto.Condition condition = plugin.getConditions(); diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/PluginProcessor.java b/scm-webapp/src/main/java/sonia/scm/plugin/PluginProcessor.java index e55254d1d1..b91ee9b1ee 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/PluginProcessor.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/PluginProcessor.java @@ -318,10 +318,7 @@ public final class PluginProcessor { for (Path parent : parentStream) { - try (DirectoryStream direcotries = stream(parent, filter)) - { - paths.addAll(direcotries); - } + paths.add(parent); } } @@ -333,7 +330,6 @@ public final class PluginProcessor * * * @param parentClassLoader - * @param directory * @param smp * * @return @@ -472,7 +468,6 @@ public final class PluginProcessor * * * @param classLoader - * @param directory * @param smp * * @return @@ -511,7 +506,6 @@ public final class PluginProcessor * * * @param classLoader - * @param smps * @param rootNodes * * @return diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksMock.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksMock.java index 6950d882f4..539b5c8d99 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksMock.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksMock.java @@ -36,6 +36,8 @@ public class ResourceLinksMock { when(resourceLinks.modifications()).thenReturn(new ResourceLinks.ModificationsLinks(uriInfo)); when(resourceLinks.repositoryType()).thenReturn(new ResourceLinks.RepositoryTypeLinks(uriInfo)); when(resourceLinks.repositoryTypeCollection()).thenReturn(new ResourceLinks.RepositoryTypeCollectionLinks(uriInfo)); + when(resourceLinks.pluginCollection()).thenReturn(new ResourceLinks.PluginCollectionLinks(uriInfo)); + when(resourceLinks.plugin()).thenReturn(new ResourceLinks.PluginLinks(uriInfo)); when(resourceLinks.uiPluginCollection()).thenReturn(new ResourceLinks.UIPluginCollectionLinks(uriInfo)); when(resourceLinks.uiPlugin()).thenReturn(new ResourceLinks.UIPluginLinks(uriInfo)); when(resourceLinks.authentication()).thenReturn(new ResourceLinks.AuthenticationLinks(uriInfo)); diff --git a/scm-webapp/src/test/java/sonia/scm/plugin/ExplodedSmpTest.java b/scm-webapp/src/test/java/sonia/scm/plugin/ExplodedSmpTest.java index b7bde65677..601725d938 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/ExplodedSmpTest.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/ExplodedSmpTest.java @@ -60,12 +60,12 @@ public class ExplodedSmpTest @Test public void testCompareTo() { - ExplodedSmp e1 = create("a", "c", "1", "a:a"); + ExplodedSmp e1 = create("a", "c", "1", "a"); ExplodedSmp e3 = create("a", "a", "1"); ExplodedSmp e2 = create("a", "b", "1"); List es = list(e1, e2, e3); - is(es, 2, "c"); + is(es, 2, "a"); } /** @@ -75,9 +75,9 @@ public class ExplodedSmpTest @Test(expected = PluginCircularDependencyException.class) public void testCompareToCyclicDependency() { - ExplodedSmp e1 = create("a", "a", "1", "a:c"); - ExplodedSmp e2 = create("a", "b", "1"); - ExplodedSmp e3 = create("a", "c", "1", "a:a"); + ExplodedSmp e1 = create("a", "1", "c"); + ExplodedSmp e2 = create("b", "1"); + ExplodedSmp e3 = create("c", "1", "a"); list(e1, e2, e3); } @@ -89,9 +89,9 @@ public class ExplodedSmpTest @Test public void testCompareToTransitiveDependencies() { - ExplodedSmp e1 = create("a", "a", "1", "a:b"); - ExplodedSmp e2 = create("a", "b", "1"); - ExplodedSmp e3 = create("a", "c", "1", "a:a"); + ExplodedSmp e1 = create("a", "1", "b"); + ExplodedSmp e2 = create("b", "1"); + ExplodedSmp e3 = create("c", "1", "a"); List es = list(e1, e2, e3); @@ -107,9 +107,9 @@ public class ExplodedSmpTest @Test public void testMultipleDependencies() { - ExplodedSmp e1 = create("a", "a", "1", "a:b", "a:c"); - ExplodedSmp e2 = create("a", "b", "1", "a:c"); - ExplodedSmp e3 = create("a", "c", "1"); + ExplodedSmp e1 = create("a", "1", "b", "c"); + ExplodedSmp e2 = create("b", "1", "c"); + ExplodedSmp e3 = create("c", "1"); List es = list(e1, e2, e3); is(es, 2, "a"); @@ -119,20 +119,18 @@ public class ExplodedSmpTest * Method description * * - * @param groupId - * @param artifactId + * @param name * @param version * @param dependencies * * @return */ - private ExplodedSmp create(String groupId, String artifactId, String version, + private ExplodedSmp create(String name, String version, String... dependencies) { PluginInformation info = new PluginInformation(); - info.setGroupId(groupId); - info.setArtifactId(artifactId); + info.setName(name); info.setVersion(version); Plugin plugin = new Plugin(2, info, null, null, false, @@ -170,6 +168,6 @@ public class ExplodedSmpTest */ private void is(List es, int p, String a) { - assertEquals(a, es.get(p).getPlugin().getInformation().getArtifactId()); + assertEquals(a, es.get(p).getPlugin().getInformation().getName()); } } diff --git a/scm-webapp/src/test/java/sonia/scm/plugin/PluginProcessorTest.java b/scm-webapp/src/test/java/sonia/scm/plugin/PluginProcessorTest.java index 8b352b8e68..87e9cbf7b7 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/PluginProcessorTest.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/PluginProcessorTest.java @@ -71,37 +71,37 @@ public class PluginProcessorTest /** Field description */ private static final PluginResource PLUGIN_A = new PluginResource("sonia/scm/plugin/scm-a-plugin.smp", "scm-a-plugin.smp", - "sonia.scm.plugins:scm-a-plugin:1.0.0-SNAPSHOT"); + "scm-a-plugin:1.0.0-SNAPSHOT"); /** Field description */ private static final PluginResource PLUGIN_B = new PluginResource("sonia/scm/plugin/scm-b-plugin.smp", "scm-b-plugin.smp", - "sonia.scm.plugins:scm-b-plugin:1.0.0-SNAPSHOT"); + "scm-b-plugin:1.0.0-SNAPSHOT"); /** Field description */ private static final PluginResource PLUGIN_C = new PluginResource("sonia/scm/plugin/scm-c-plugin.smp", "scm-c-plugin.smp", - "sonia.scm.plugins:scm-c-plugin:1.0.0-SNAPSHOT"); + "scm-c-plugin:1.0.0-SNAPSHOT"); /** Field description */ private static final PluginResource PLUGIN_D = new PluginResource("sonia/scm/plugin/scm-d-plugin.smp", "scm-d-plugin.smp", - "sonia.scm.plugins:scm-d-plugin:1.0.0-SNAPSHOT"); + "scm-d-plugin:1.0.0-SNAPSHOT"); /** Field description */ private static final PluginResource PLUGIN_E = new PluginResource("sonia/scm/plugin/scm-e-plugin.smp", "scm-e-plugin.smp", - "sonia.scm.plugins:scm-e-plugin:1.0.0-SNAPSHOT"); + "scm-e-plugin:1.0.0-SNAPSHOT"); /** Field description */ private static final PluginResource PLUGIN_F_1_0_0 = new PluginResource("sonia/scm/plugin/scm-f-plugin-1.0.0.smp", - "scm-f-plugin.smp", "sonia.scm.plugins:scm-f-plugin:1.0.0"); + "scm-f-plugin.smp", "scm-f-plugin:1.0.0"); /** Field description */ private static final PluginResource PLUGIN_F_1_0_1 = new PluginResource("sonia/scm/plugin/scm-f-plugin-1.0.1.smp", - "scm-f-plugin.smp", "sonia.scm.plugins:scm-f-plugin:1.0.1"); + "scm-f-plugin.smp", "scm-f-plugin:1.0.1"); //~--- methods -------------------------------------------------------------- diff --git a/scm-webapp/src/test/java/sonia/scm/plugin/PluginTreeTest.java b/scm-webapp/src/test/java/sonia/scm/plugin/PluginTreeTest.java index 06d6c1732c..0115f4510e 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/PluginTreeTest.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/PluginTreeTest.java @@ -71,7 +71,7 @@ public class PluginTreeTest { PluginCondition condition = new PluginCondition("999", new ArrayList(), "hit"); - Plugin plugin = new Plugin(2, createInfo("a", "b", "1"), null, condition, + Plugin plugin = new Plugin(2, createInfo("a", "1"), null, condition, false, null); ExplodedSmp smp = createSmp(plugin); @@ -102,7 +102,7 @@ public class PluginTreeTest List smps = createSmps("a", "b", "c"); List nodes = unwrapIds(new PluginTree(smps).getRootNodes()); - assertThat(nodes, containsInAnyOrder("a:a", "b:b", "c:c")); + assertThat(nodes, containsInAnyOrder("a", "b", "c")); } /** @@ -114,7 +114,7 @@ public class PluginTreeTest @Test(expected = PluginException.class) public void testScmVersion() throws IOException { - Plugin plugin = new Plugin(1, createInfo("a", "b", "1"), null, null, false, + Plugin plugin = new Plugin(1, createInfo("a", "1"), null, null, false, null); ExplodedSmp smp = createSmp(plugin); @@ -141,34 +141,32 @@ public class PluginTreeTest PluginTree tree = new PluginTree(smps); List rootNodes = tree.getRootNodes(); - assertThat(unwrapIds(rootNodes), containsInAnyOrder("a:a")); + assertThat(unwrapIds(rootNodes), containsInAnyOrder("a")); PluginNode a = rootNodes.get(0); - assertThat(unwrapIds(a.getChildren()), containsInAnyOrder("b:b", "c:c")); + assertThat(unwrapIds(a.getChildren()), containsInAnyOrder("b", "c")); - PluginNode b = a.getChild("b:b"); + PluginNode b = a.getChild("b"); - assertThat(unwrapIds(b.getChildren()), containsInAnyOrder("c:c")); + assertThat(unwrapIds(b.getChildren()), containsInAnyOrder("c")); } /** * Method description * * - * @param groupId - * @param artifactId + * @param name * @param version * * @return */ - private PluginInformation createInfo(String groupId, String artifactId, + private PluginInformation createInfo(String name, String version) { PluginInformation info = new PluginInformation(); - info.setGroupId(groupId); - info.setArtifactId(artifactId); + info.setName(name); info.setVersion(version); return info; @@ -201,7 +199,7 @@ public class PluginTreeTest */ private ExplodedSmp createSmp(String name) throws IOException { - return createSmp(new Plugin(2, createInfo(name, name, "1.0.0"), null, null, + return createSmp(new Plugin(2, createInfo(name, "1.0.0"), null, null, false, null)); } @@ -224,10 +222,10 @@ public class PluginTreeTest for (String d : dependencies) { - dependencySet.add(d.concat(":").concat(d)); + dependencySet.add(d); } - Plugin plugin = new Plugin(2, createInfo(name, name, "1"), null, null, + Plugin plugin = new Plugin(2, createInfo(name, "1"), null, null, false, dependencySet); return createSmp(plugin); diff --git a/scm-webapp/src/test/resources/sonia/scm/plugin/scm-b-plugin.smp b/scm-webapp/src/test/resources/sonia/scm/plugin/scm-b-plugin.smp index 4106b9794585e53f4ef50d9ab63eee75b9657e56..a70205e3eb05275a8846e3fbffdce57aa9b73b4c 100644 GIT binary patch delta 3361 zcmbQOd&879z?+#xWU{`HxV{2Ia!z7#acZ%CXb3L@yTsq7kgPp+u^?Pp!Og(P@`9Ox z0ZhR3h*}9UAawbV&~?$O!+L64TMC@`H<`^&dlP9_$#92_THcgsowL`Hw6F>dvp9@izEAg7JcB z)}PakFPv|1!9DKg$3qc`?EW_oX6+Wdd`t9E(r4Aw1D7iQ$)vFq>^*l$-AdVbMqd2| z4+XF5vwQTWS?XM_a5G{{G&+1&<@}2+CxY)twD2gi-_345W^j|?=e~0s$rI8X!e7r& zQb;>-NM(5oZ=+gZ%$bZ$5=>1Flb#7&7Cn1W*T3Ctqw{Z5kxQ0qJj8TA8qT>i^rckMg-s{)k8Mu%Rmu{7Vtp{_P>%7NLdl<- z9n?(@>BO{hACkE9I@o(nTcsC)r$lZ`S}d|W(KcK zNa>jQ>4IRrgT#~`+Z$iEBwXoqpFAfea^tzoS$7il&kvM*B9-*w%*r`xwUh7WEV+4% zDcUzix$VOql^ydVW9JqvoZ7swDX{Ksn`PjIKf!w^OmOuH{M8ZBe?`eQ*e!2E`IJcZ zmaQx2JD-W(@hNxrgxKv%<~BXgl-qTTX|A(H^`dPpb_~xOFV@wU&1t!~Dc|vb&>o56 zKd*jACvIE*irqYU<+puh<<09?r(G#|zvFr3;)^O4a(>kp{S1WmH*Wp@{qhsL59{T1 zD-@!t|Lttfcrv68iD?(Ay+7>22YkN|tz^9&F|NO_d9jXs!>0Y+^P=AT%&BU*q2XiYAddjN(50u^h z&hwZ2L7gt~D>30-GINFIvaZ|4^#9g7)_?2|*QiXlULd|n@U81F|D&4V zer3*_zwy`c`b)oaiVUV3oDVBGa#{MnykObmPe0xr(W$>ypZa0lyj>dqZT#z*14O*p zIX=C+9T~>LzyKDUMyu5OtUy6uxt}hQU#Z7M5q^K z)&rG>0{XT@=>V6fO!;lDu%h_~8v}zW*aTzcirgHqAy57^g@EL-ICFC)UoI1SHBiz9 ztjU&OO*C0cu$vLwsIXT6843n(9YGZFO$o@_k`BUW7?Y8edGVW>QiIhbBlH$O-~30X0Qn;H~32 zRz&a++c1Iq${W-)fq}PH&f>*&QcS&~Tx5%IX%Ejl7{d;p_uW1bEvy;E02_bdZY_U`q#PG{cfc1Fp$$I3yu~ho{*C zi#cH6d4NhH7Y5ZyiVaR!Wcm~#_}ii#hIMnw-T1hI%Bhnm91N<&B?dP#90wrMQ1k}b6n z(p%&wXk#I0BWk5TK(Ms&V`eY6x3O?S2$_8|Z|2Q=vd<@@1*a{N;Ac7;BV;|lwLH1D zu`-3p6w%?6tsduz5-CFXhi>uV_8XeuKT*rn;k9&7^t`es>O{83RI)8?#WS^drN^a}~|L^sL#!A@i00df8ctRoc<%;if3_G;1M zyaU~)_A+t-mpID{0;XFQLjPTFU1+PY%qKX`mIbK5ND|%17kc_aQ6YWLUo$p(vb*3! Pg-uOjl1C8nO4#NXYH!Zn diff --git a/scm-webapp/src/test/resources/sonia/scm/plugin/scm-c-plugin.smp b/scm-webapp/src/test/resources/sonia/scm/plugin/scm-c-plugin.smp index aee452fac4a5056e2439f140faa9f361407791c5..b80169b9b594a9560803fbdde39124e020dd4834 100644 GIT binary patch delta 2953 zcmZ3ic3+1zz?+#xWO5?Es38Y~0z-06VsUY5v3_U>F9W;G-=>fWd+cICxU_E}kAb_Ni567|;)%zzT2*o-Sq&V?BHcNfGp2p6fLI*EY; z2$9Vc;$&cuXHb~@l2M@^>?x2DFk{d>wKXg-|B;12-ShA>AGb_x*s^!}WwTV#CPr_? zhmV%T$~h;k*s9{TEpz+-f5-eHG-6-Adn&M~Fa6o<{CzWTeBJ+d&G!$driyKQ%Ua2)>!;Zuiq3+)zXjz1;6 zWB=aWvJ8)BJ4pwc9MD=B@=&JvuiTu)Y)4JQ*YAb5WH zvgaf>slZQ-&WHOe1*N`mWEARMHoGdSekST2cVMw;(ZTQYS0t1%F@N2`D^KREU6TfJhUdk6-dTGWlS+hIm1jLjI=M-`j&NGl%dF4_;M(82W zH4~KilyWXUV6kM(+G(0!CbNr^x%Ra*DRAYTpO#XXBHj6rZY43yrUPx z_0=Yoi-L_>PfFGIvK&g;>i4o{;z6a(Wh$uxM}qJ4Zl2=zN#|g1-2sD5_xG7)@H{e| z@P73a12#{tlAT=|Oi67f9mZZa7&2tseoi^|nNfk`h$ow1>?NMNn^F>lt+$+CIN?l! z=cR(i{(~)UCegd+7|%LtcArO>Z3EY(p0-MnB^yp%4n4$?P{~*1RUawATH?7(`AEN^ z=>&D5^aEm!B0DDq8y)98{?~b~aFa^2r^_v!kGq(CJZIdTbZ)hPs7syTJY8*}pxp}h zImLvRymo9qed4~Q)k48#2aRS3KYOt6Pq)d9`3C+cF9o^jM%X1vp8eEwz{Yb~pNaBI zVP4Maf`-6DbFwUzna@mN?PI7vv>@fp!FB4Ei~Ve*(p7vvhq_Jv!S?%a&nboL49?5_ zo~pc?^(IZ(^SaoLtVdFY4bNE*{=M?*)fDbEGCZO@o4w7?bT*}he|7SCCg}RoImuS2 z`-_j{&V%;?(_{s%Evw@*$bWZg`&*~7x0AMU&0ALaK#IGB?ckTrTSB`S=CHf%zFA)= z)YiR@^{)5Fq%#j!KhJHsDRWx>PS28CmACHl&eMCHcz569y>a;#GQZpZ7OKxObbEAt z`?q&>Qulw~d%BqQyKC}!`*MNaSfg_DovwvP%ENnW*GKP&J(F;_%u9}ci&XZ_j--|q zi_O-4+dFyXbMaFhxq(uz+bd5ezHV+vcRp`_vHsxc;u7nW!VO8?Dxdepo77gP#47Gs zJFh<7=%a-E%kSzVumpowq8VU*|O@@#uZ!neTtzV}H0t<+=3&;Z0&^BY&-a zq?c=UV|ULs>Gnl`8n^gI+|l!i&z-{)y3t7{RrGA1|^Q@Pe06RRAt`k)2}( z^qn}c+;tF?P=H%M5n6nsmAji)vlX&HtheAtwmvtpEH#g~$^=w{F)IQsT*$4Y3bv4t zlfgRlz&i9HPQ;^Q@&#@&_MdDF45knb>IM0^dKI}jV4Lp!!5Olfm3eZR*sFoTZUfOc z`M(e!!ZsZ7G5HE#4)saW66Xr;W@j<{Q0X!+eDqk$=Fu)sP2dolD&MLr49A*W>lExR4pED|{ zgWZg$LWi0MjA?O8gzmSF>sT2O`Gk;d{TX+_((r3}{A%J7`JcH-4z0f|F12ahbsr b6G#abM+JDZ0t*oa23{Zx2BxEL0w5j$i0jsj delta 1114 zcmcbwvsleJz?+$civa`_^4na&3@E_~qM@LP!>&@2*c!mLSmEM z*^V%BP5vt&UeCagoRe5woLUUlgxzdGpxH20D0X01E{aWgadIv;8;qgO=S6ltOf7aV z$WOKuQrf(ny_jWk1iJt`$N+H$hRONt5;h(7ZYx zC0X3Ttp`yt`9BXYSQW&nfAdfy#T226y&ykVuOc^R^L*Z1Ca|Mz5R#Ln#rP%{2=v5a zcRMI{yg?dZaSu@e zGF1|&0T#zlHDF2fbOuTb5CGC;kE9FDP1wBxN*gfkVQ(Gtu<3_HKiHXIrRYuor4F9W;W-=>gld+cICxU_v1S&!8~* zC8L4@+y@{zEI!!0nyrw9QDkx=zj(a@1Ke`3HU$D6$FNv{k%2)3=oh##zK(vLZmz*0 zdcJOi9Fp2UG5S!72-pj6qyG9q{Q{_?eGerZ#NZJN>d*s%R6Vx8lP`OJe1mlU8h1aod); z{r|sXei0h6FW)^CSk#yPYnK!=f|GVbY3K5+4Q?d#$af3~#V;KyOXjQ!K|BUGns zTG_&TNpHooXW6G;=asnnHs6_NvC!p3^%b_&hO9+f7aVol7j@ZllABcEr$*<){gr}J z-#9V~^)8!T6;(eI^^QBR*tF>2_xURmPI3GCg>1O+s^iN)b+ZeiQ71n|d_HEe(Z50B zMWVlomBtG0!&5cB{aUj(dscn-K8+=7-=7ye60^hM^#u{r?Q0@-$mn%1yHWVH;mdiq z>zs*SG)*t%3ogAhU&uZ zrEK+kSu^pVQs*+2RDmPGcX~HZ@%yB6u($4j!KVBB%rbZ$nNE1WdWr#?Cs)bNE)Axn zHj@rxuNw>*GHySo9Q(|uz;VQrO)&Nn&)rQa3BuM}&M%yBCc*PkL1X{H7B`dV-E)j* z9W}epBh0pe>rzi!rO1*Er!I#c;z+3EEApz3lwd9KT&8@a-_Ue|x={K7F-MV|lY)(o z^B(`}JXg3$rP*CwouS+h5MXh!b@H|wx2$6-_mNK z;Ie~8GlZW#*!QQ~mh|C5)3+;k)C5+%=m>N#NJxvbAb`K2%~XLUhC;GsELmdea$ zrm*%g)E`=q^5)<=b<4$mHd5&-zMn(gCjVgj{kP|o!gU7c<$h09-pzWGrtEoL>_*lj zDZ_^6tOx&IdG%@v_Zk@`+zwbR=%=+Cm z`MiC(KyR#3x%p1l!XxG3y|wG3cf_7aI9%o>$G=4?`({T{%ZkNjYrpNCyz;sDsgB%0 zsn_k5s}o;0H>5kCx4&3_@N{vBbxPreq;8eZd*e-Nt5aeXcdVUPAM*QSeaP{()|2kJ z8+2d#ti8@#mCvv98k2bRzVgiXKkubdV%mJv9poCRzK3qHM_C9XPb2UqCbsW z{3Gr@e*eX8rpy`3HR;+`4_@~E@8{TESXWb?^eO&pyo6ol)cxN-t=q8o@)hyF%mLo) z9Io@W`$n=bFn~%XNL`Z1FKWS$T-@a*mZj!FDgr{~F|ZI9WmW_ha0|JWREa9V!8-K7 zI`kn`1s*#lU*HyF|H;O{U<%QoUXY)wSCN|ow&~WNrVvnBjioT&tjv?k#9j@Qw1H@x z{9lNVV8t}~3SSSfUINz0j-VPD2HrY?Sj5-Qj7%cTAXCIW6ktX$ymfR#G6P;&f&GEE zvWFQa>JF;0Vc@OfRBXn<>nS`&PCh0e$BQs&N#l#j&l#1};VuDLfh9x(ydf?DR@#;b z-ESQ?u`(d)UP1|A@n5S*hPno95OQ@35&+fQF!0uqn;pr0pz!el zI}%m}y4%UR^&3WEa26P5Ax56E?r12X+)KJ06r}((c2q#fiU`YW=0K5#rz=ZWp H0K@|T@UPCW delta 1128 zcmcbwvsleJz?+$civa|b^4na&3@E_~qM@LP!Ua;2*c!mLSmD> z*^V%BP5vt&UeCagoRe5woLUUl1Th<3lOWJ+m?{)IuqzkEro1>g7n=>nQ0Ma^J0GSN zyBFjqTM8*{c4aJPk-+9daiB?)`5484DhgTLum=`DvTeDEWvO{cZbJ`QMWA_gJW8^- z!(I=fV)B0;Ua%^NyMO1Q#*isO6?;K`u3klM&gS{NxlHV!Ah1D5PL>wqn_M8!6N}yL zpooS50fx7ZAQn=TFfxfSBSP)|q3LHf02K%@GBAih^nl4Fjq2cJz#iZY(f~^c5EUR( zC4m}X5e`)Ymc*7Y5W4JF9W;6-=>f|d+cICxU_v1S&!8~* zC8L4@+y@{zEI!!0nyrw9QDkx=zj(a@1Ke`3HYEZc$FNv{k%2)3=oh##zK(vLZmz*0 zdcJOi9Fp2UG5S!72-pkXqW=0p{Q{F5_?eGerZ#NZJN>d*s%R6Vx8lP`OJe1mlU8h1aod); z{r|sXei0h6FW)^CSk#yPYnK!=f|GVbY3K5+4Q?d#$af3~#V;KyOXjQ!K|BUGns zTG_&TNpHooXW6G;=asnnHs6_NvC!p3^%b_&hO9+f7aVol7j@ZllABcEr$*<){gr}J z-#9V~^)8!T6;(eI^^QBR*tF>2_xURmPI3GCg>1O+s^iN)b+ZeiQ71n|d_HEe(Z50B zMWVlomBtG0!&5cB{aUj(dscn-K8+=7-=7ye60^hM^#u{r?Q0@-$mn%1yHWVH;mdiq z>zs*SG)*t%3ogAhU&uZ zrEK+kSu^pVQs*+2RDmPGcX~HZ@%yB6u($4j!KVBB%rbZ$nNE1WdWr#?Cs)bNE)Axn zHj@rxuNw>*GHySo9Q(|uz;VQrO)&Nn&)rQa3BuM}&M%yBCc*PkL1X{H7B`dV-E)j* z9W}epBh0pe>rzi!rO1*Er!I#c;z+3EEApz3lwd9KT&8@a-_Ue|x={K7F-MV|lY)(o z^B(`}JXg3$rP*CwouS+h5MXh!b@H|wx2$6-_mNK z;Ie~8GlZW#*!QQ~mh|C5)3+;k)C5+%=m>N#NJxvbAb`K2%~XLUhC;GsELmdea$ zrm*%g)E`=q^5)<=b<4$mHd5&-zMn(gCjVgj{kP|o!gU7c<$h09-pzWGrtEoL>_*lj zDZ_^6tOx&IdG%@v_Zk@`+zwbR=%=+Cm z`MiC(KyR#3x%p1l!XxG3y|wG3cf_7aI9%o>$G=4?`({T{%ZkNjYrpNCyz;sDsgB%0 zsn_k5KR0}JJg|A;^Z768A3U|(CA-NYVx#M%pZD}mhUz1n+w7weU`nz8QJ|z=Wl4?bTjEUv2M3}odf?l z+)`ij?qhk?d>_7NGS@bX%6|BA?7w@WEgns2x1XmKQl6kFoR4H_fUWt!SL464ap36Wd*4c z@YQ)R!$jRdH8u>qb)1ULI7B^#+sMhs1mt)TCM{`vG5I;8k~-WaASSlq#ykZbomnNtRI1~j+A9kitJ8$Z-g!O5rixXcJAQC46{0ZIV848g#J J^-Tc80|1vN+8qD@ delta 1128 zcmcbwvsleJz?+$civa|b^V?j(3@E_~qM@LPzg<$2*c!mLSmD> z*^V%BP5vt&UeCagoRe5woLUUl1Th<3lOWJ+m?{)IuqzkEro1>g7n=>nQ0Ma^J0GSN zyBFjqTM8*{c4aJPk-+9daiB?)`5484DhgTLum=`DvTeDEWvO{cZbJ`QMWA_gJW8^- z!(I=fV)B0;Ua%^NyMN@N#*isO6?;K`u3klM&gS{NxlHV!Ah1D5PL>wqn_M8!6N}yL zpooS50fx7ZAQn=TFfxfSBSOvV=;5FZKm`Jf3=AR=Jz#Q4qdGVlum^a9G{6!9LZ5GbX>x?HeeJ0(@hq#htbmlDB(Z=$TkUXB->!g z2;o$8&5AI+3?R*}+~8!Ti_bb>!h!;jjuwaxP%@irBPxe*3(#8^5OT1@HF-apnkqi9 cjbQ!2G$t0{%?k800|PG*Zf0g+hyt4k0Aq-+5C8xG diff --git a/scm-webapp/src/test/resources/sonia/scm/plugin/scm-f-plugin-1.0.0.smp b/scm-webapp/src/test/resources/sonia/scm/plugin/scm-f-plugin-1.0.0.smp index cfcaae8427b446944574f877a2904199c48a28ed..8f2758f9624cbd31cb9e00921945e304d637262b 100644 GIT binary patch delta 1698 zcmb7E&ui0g6n|+NQ;liTlC~%^i#mp&9Rmj{I?Z82?PddZg2G^9R2{6YHY)QN9SGja zSH0>XcvBBMDE|02cJ(%T$u6?9zHid+HyI>d_CiZb`FuX_ectoB$*-)_>h zzWA$%xGVq|DE>q%1;P)|uLR-Vy&r<_azl*@+so~AUd2vcK`Qc9uY_Zt{W-NTZ0w6# zRK30Qy!AMpJ|0L#z)_V`qugU^RE!uu4Y5YeQO3je5)kC0QkKUK0Zaw}(kRLSsG02O z=3nK0M((2DR{~V6v(~P4x@(N1gGkuOVrP*m8~Lg_URS;Fa*$rgY~-kp_j8 z>s*q-k4<(YjY(ni`CF|RB6DAnXqGNGIfd)fa|bj%fN1ux~TPeA@C z>TJq$^B1*_|75$)oOmGvFvuP!bsbP?S4e8?8$@!qI1-u2b-rl>Y~gzPI9hcHR|}xx Ma|e&_vrfPL2aCCNr~m)} delta 865 zcmZ8fze~eF6uvaI^;gq!#RA2T`NVH@FCPaQD4Cd%gDEaJhHi``&l&%j5j#^gyMghKFg~wAP0RA#S0XUnrKH z9Hvb&22F5KFG{WUP78$Tm+;n)TDO!@5To^-JC{iSy*4 zlkYr!iLue!vDDoEC2WB|Bi~9xt(26Isj~THaH>3zFRsWl7AW25fC!?N71}n&qY{m7 z^#BeKV9S6K`oIGjo}iD=&0WD}{NKRAza?w!jW8iEpfBC2ggx*-kUK-2@s!@p2mW@1 zyCXN9MSFN))30HvX~(S28*PC_s5QdOlgSLQPa>-_L~el(feXI?;lIACE`gR3v-Z85tNvkd5(m^z(Fc4Gz)sbpyMj3m9}b z+%Yk7HzO#xMeBKyO(;&zB`(;o27)-cQ3W}r>6v+Y6}dU^a53GD8kOwOxP%3a1wXPO zxrt?|dBnL0w$IXlMwZJNKv57#=u|-Ho*)M^$xg$eDgQ% zC?@tIV1(F!br?_X;^QKiU?xxDYX--ZxV-`>F2UffBZwkCn=mqoFoR>8ACysG;H{(E z{)=fgzL2{2hDD%L;TgMN;)Bw-ZM23n?04UeM zz>-F5V1__3gNQr?FAm`W#O5iuVFJKh1v3j6=@vYb_j4;Fq77#j zLl^+eWJm@~2N__1NclJnnEYK(jt`-4Nh32aP@g%$d^R~s2vy%MexN=RP;N7WCv}i> Wu%q_q@B(2lFnw$k0Pz6Uw}q4d delta 842 zcmbQGb4!&qz?+$cYw`zfQF~4X1_oc(5Jz24KR11lum}SO5Kf)g?h2HF0}&t#uFTib z&(qB{I7H9aZL%fXZbq<4f*e34$vKI|#i_+$gTSJUf|Dl-iXiM`6b14n5PTh8WP^*7 zbCKLI4b2VmAgz;mgt#_OU{7R`067y~i8#=-$^Qk#fhyuz!0r+kLvna-Vp(b)!g0)s zK-CJoN(kpL>w!h|Wf38fhvo`XunM!yWxP>L>_F=nY`_A>leq-ACYuN}LqbCu6s`~; z!0^@)#DWLkt4a4WOAvtcm@cZi@OOfA@}65QaJL^4cN5Ez$G z05UEdtU`bCcM&;$m^jFJi^1Y%ldD8g#jW^2CW50?EWn!;=voE_ULf4e%)lTBHUR)L C>7GOY