mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-09 23:15:43 +01:00
Remove archive flag
This commit is contained in:
@@ -161,7 +161,6 @@ public class ScmConfiguration implements Configuration {
|
|||||||
* Authentication realm for basic authentication.
|
* Authentication realm for basic authentication.
|
||||||
*/
|
*/
|
||||||
private String realmDescription = HttpUtil.AUTHENTICATION_REALM;
|
private String realmDescription = HttpUtil.AUTHENTICATION_REALM;
|
||||||
private boolean enableRepositoryArchive = false;
|
|
||||||
private boolean disableGroupingGrid = false;
|
private boolean disableGroupingGrid = false;
|
||||||
/**
|
/**
|
||||||
* JavaScript date format from moment.js
|
* JavaScript date format from moment.js
|
||||||
@@ -218,7 +217,6 @@ public class ScmConfiguration implements Configuration {
|
|||||||
this.forceBaseUrl = other.forceBaseUrl;
|
this.forceBaseUrl = other.forceBaseUrl;
|
||||||
this.baseUrl = other.baseUrl;
|
this.baseUrl = other.baseUrl;
|
||||||
this.disableGroupingGrid = other.disableGroupingGrid;
|
this.disableGroupingGrid = other.disableGroupingGrid;
|
||||||
this.enableRepositoryArchive = other.enableRepositoryArchive;
|
|
||||||
this.skipFailedAuthenticators = other.skipFailedAuthenticators;
|
this.skipFailedAuthenticators = other.skipFailedAuthenticators;
|
||||||
this.loginAttemptLimit = other.loginAttemptLimit;
|
this.loginAttemptLimit = other.loginAttemptLimit;
|
||||||
this.loginAttemptLimitTimeout = other.loginAttemptLimitTimeout;
|
this.loginAttemptLimitTimeout = other.loginAttemptLimitTimeout;
|
||||||
@@ -343,10 +341,6 @@ public class ScmConfiguration implements Configuration {
|
|||||||
return enableProxy;
|
return enableProxy;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isEnableRepositoryArchive() {
|
|
||||||
return enableRepositoryArchive;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isForceBaseUrl() {
|
public boolean isForceBaseUrl() {
|
||||||
return forceBaseUrl;
|
return forceBaseUrl;
|
||||||
}
|
}
|
||||||
@@ -393,16 +387,6 @@ public class ScmConfiguration implements Configuration {
|
|||||||
this.enableProxy = enableProxy;
|
this.enableProxy = enableProxy;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Enable or disable the repository archive. Default is disabled.
|
|
||||||
*
|
|
||||||
* @param enableRepositoryArchive true to disable the repository archive
|
|
||||||
* @since 1.14
|
|
||||||
*/
|
|
||||||
public void setEnableRepositoryArchive(boolean enableRepositoryArchive) {
|
|
||||||
this.enableRepositoryArchive = enableRepositoryArchive;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setForceBaseUrl(boolean forceBaseUrl) {
|
public void setForceBaseUrl(boolean forceBaseUrl) {
|
||||||
this.forceBaseUrl = forceBaseUrl;
|
this.forceBaseUrl = forceBaseUrl;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,7 +85,6 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per
|
|||||||
private Set<RepositoryPermission> permissions = new HashSet<>();
|
private Set<RepositoryPermission> permissions = new HashSet<>();
|
||||||
@XmlElement(name = "public")
|
@XmlElement(name = "public")
|
||||||
private boolean publicReadable = false;
|
private boolean publicReadable = false;
|
||||||
private boolean archived = false;
|
|
||||||
private String type;
|
private String type;
|
||||||
|
|
||||||
|
|
||||||
@@ -216,16 +215,6 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per
|
|||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if the repository is archived.
|
|
||||||
*
|
|
||||||
* @return true if the repository is archived
|
|
||||||
* @since 1.14
|
|
||||||
*/
|
|
||||||
public boolean isArchived() {
|
|
||||||
return archived;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns {@code true} if the repository is healthy.
|
* Returns {@code true} if the repository is healthy.
|
||||||
*
|
*
|
||||||
@@ -264,16 +253,6 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per
|
|||||||
&& ((Util.isEmpty(contact)) || ValidationUtil.isMailAddressValid(contact));
|
&& ((Util.isEmpty(contact)) || ValidationUtil.isMailAddressValid(contact));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Archive or un archive this repository.
|
|
||||||
*
|
|
||||||
* @param archived true to enable archive
|
|
||||||
* @since 1.14
|
|
||||||
*/
|
|
||||||
public void setArchived(boolean archived) {
|
|
||||||
this.archived = archived;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setContact(String contact) {
|
public void setContact(String contact) {
|
||||||
this.contact = contact;
|
this.contact = contact;
|
||||||
}
|
}
|
||||||
@@ -354,7 +333,6 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per
|
|||||||
repository.setDescription(description);
|
repository.setDescription(description);
|
||||||
repository.setPermissions(permissions);
|
repository.setPermissions(permissions);
|
||||||
repository.setPublicReadable(publicReadable);
|
repository.setPublicReadable(publicReadable);
|
||||||
repository.setArchived(archived);
|
|
||||||
|
|
||||||
// do not copy health check results
|
// do not copy health check results
|
||||||
}
|
}
|
||||||
@@ -383,7 +361,6 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per
|
|||||||
&& Objects.equal(contact, other.contact)
|
&& Objects.equal(contact, other.contact)
|
||||||
&& Objects.equal(description, other.description)
|
&& Objects.equal(description, other.description)
|
||||||
&& Objects.equal(publicReadable, other.publicReadable)
|
&& Objects.equal(publicReadable, other.publicReadable)
|
||||||
&& Objects.equal(archived, other.archived)
|
|
||||||
&& Objects.equal(permissions, other.permissions)
|
&& Objects.equal(permissions, other.permissions)
|
||||||
&& Objects.equal(type, other.type)
|
&& Objects.equal(type, other.type)
|
||||||
&& Objects.equal(creationDate, other.creationDate)
|
&& Objects.equal(creationDate, other.creationDate)
|
||||||
@@ -395,7 +372,7 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per
|
|||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return Objects.hashCode(id, namespace, name, contact, description, publicReadable,
|
return Objects.hashCode(id, namespace, name, contact, description, publicReadable,
|
||||||
archived, permissions, type, creationDate, lastModified, properties,
|
permissions, type, creationDate, lastModified, properties,
|
||||||
healthCheckFailures);
|
healthCheckFailures);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -408,7 +385,6 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per
|
|||||||
.add("contact", contact)
|
.add("contact", contact)
|
||||||
.add("description", description)
|
.add("description", description)
|
||||||
.add("publicReadable", publicReadable)
|
.add("publicReadable", publicReadable)
|
||||||
.add("archived", archived)
|
|
||||||
.add("permissions", permissions)
|
.add("permissions", permissions)
|
||||||
.add("type", type)
|
.add("type", type)
|
||||||
.add("lastModified", lastModified)
|
.add("lastModified", lastModified)
|
||||||
|
|||||||
@@ -1,48 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010, Sebastian Sdorra
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer in the documentation
|
|
||||||
* and/or other materials provided with the distribution.
|
|
||||||
* 3. Neither the name of SCM-Manager; nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from this
|
|
||||||
* software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
||||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* http://bitbucket.org/sdorra/scm-manager
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
package sonia.scm.repository;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author Sebastian Sdorra
|
|
||||||
*
|
|
||||||
* @since 1.14
|
|
||||||
*/
|
|
||||||
public class RepositoryIsNotArchivedException extends RuntimeException {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 7728748133123987511L;
|
|
||||||
|
|
||||||
public RepositoryIsNotArchivedException() {
|
|
||||||
super("Repository could not be deleted, because it is not archived.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,6 +5,5 @@
|
|||||||
<namespace>space</namespace>
|
<namespace>space</namespace>
|
||||||
<name>existing</name>
|
<name>existing</name>
|
||||||
<public>false</public>
|
<public>false</public>
|
||||||
<archived>false</archived>
|
|
||||||
<type>xml</type>
|
<type>xml</type>
|
||||||
</repositories>
|
</repositories>
|
||||||
|
|||||||
@@ -228,7 +228,6 @@ public class TestData {
|
|||||||
.add("contact", "zaphod.beeblebrox@hitchhiker.com")
|
.add("contact", "zaphod.beeblebrox@hitchhiker.com")
|
||||||
.add("description", "Heart of Gold")
|
.add("description", "Heart of Gold")
|
||||||
.add("name", getDefaultRepoName(repositoryType))
|
.add("name", getDefaultRepoName(repositoryType))
|
||||||
.add("archived", false)
|
|
||||||
.add("type", repositoryType)
|
.add("type", repositoryType)
|
||||||
.build().toString();
|
.build().toString();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ export type Config = {
|
|||||||
proxyUser: string | null,
|
proxyUser: string | null,
|
||||||
enableProxy: boolean,
|
enableProxy: boolean,
|
||||||
realmDescription: string,
|
realmDescription: string,
|
||||||
enableRepositoryArchive: boolean,
|
|
||||||
disableGroupingGrid: boolean,
|
disableGroupingGrid: boolean,
|
||||||
dateFormat: string,
|
dateFormat: string,
|
||||||
anonymousAccessEnabled: boolean,
|
anonymousAccessEnabled: boolean,
|
||||||
|
|||||||
@@ -36,7 +36,6 @@
|
|||||||
},
|
},
|
||||||
"general-settings": {
|
"general-settings": {
|
||||||
"realm-description": "Realm Beschreibung",
|
"realm-description": "Realm Beschreibung",
|
||||||
"enable-repository-archive": "Repository Archiv aktivieren",
|
|
||||||
"disable-grouping-grid": "Gruppen deaktivieren",
|
"disable-grouping-grid": "Gruppen deaktivieren",
|
||||||
"date-format": "Datumsformat",
|
"date-format": "Datumsformat",
|
||||||
"anonymous-access-enabled": "Anonyme Zugriffe erlauben",
|
"anonymous-access-enabled": "Anonyme Zugriffe erlauben",
|
||||||
@@ -57,7 +56,6 @@
|
|||||||
"dateFormatHelpText": "Moments Datumsformat. Zulässige Formate sind in der MomentJS Dokumentation beschrieben.",
|
"dateFormatHelpText": "Moments Datumsformat. Zulässige Formate sind in der MomentJS Dokumentation beschrieben.",
|
||||||
"pluginUrlHelpText": "Die URL der Plugin Center API. Beschreibung der Platzhalter: version = SCM-Manager Version; os = Betriebssystem; arch = Architektur",
|
"pluginUrlHelpText": "Die URL der Plugin Center API. Beschreibung der Platzhalter: version = SCM-Manager Version; os = Betriebssystem; arch = Architektur",
|
||||||
"enableForwardingHelpText": "mod_proxy Port Weiterleitung aktivieren.",
|
"enableForwardingHelpText": "mod_proxy Port Weiterleitung aktivieren.",
|
||||||
"enableRepositoryArchiveHelpText": "Repository Archive aktivieren. Nach einer Änderung an dieser Einstellung muss die Seite komplett neu geladen werden.",
|
|
||||||
"disableGroupingGridHelpText": "Repository Gruppen deaktivieren. Nach einer Änderung an dieser Einstellung muss die Seite komplett neu geladen werden.",
|
"disableGroupingGridHelpText": "Repository Gruppen deaktivieren. Nach einer Änderung an dieser Einstellung muss die Seite komplett neu geladen werden.",
|
||||||
"allowAnonymousAccessHelpText": "Anonyme Benutzer haben Zugriff auf öffentliche Repositories.",
|
"allowAnonymousAccessHelpText": "Anonyme Benutzer haben Zugriff auf öffentliche Repositories.",
|
||||||
"skipFailedAuthenticatorsHelpText": "Die Kette der Authentifikatoren wird nicht beendet, wenn ein Authentifikator einen Benutzer findet, ihn aber nicht erfolgreich authentifizieren kann.",
|
"skipFailedAuthenticatorsHelpText": "Die Kette der Authentifikatoren wird nicht beendet, wenn ein Authentifikator einen Benutzer findet, ihn aber nicht erfolgreich authentifizieren kann.",
|
||||||
|
|||||||
@@ -36,7 +36,6 @@
|
|||||||
},
|
},
|
||||||
"general-settings": {
|
"general-settings": {
|
||||||
"realm-description": "Realm Description",
|
"realm-description": "Realm Description",
|
||||||
"enable-repository-archive": "Enable Repository Archive",
|
|
||||||
"disable-grouping-grid": "Disable Grouping Grid",
|
"disable-grouping-grid": "Disable Grouping Grid",
|
||||||
"date-format": "Date Format",
|
"date-format": "Date Format",
|
||||||
"anonymous-access-enabled": "Anonymous Access Enabled",
|
"anonymous-access-enabled": "Anonymous Access Enabled",
|
||||||
@@ -57,7 +56,6 @@
|
|||||||
"dateFormatHelpText": "Moments date format. Please have a look at the MomentJS documentation.",
|
"dateFormatHelpText": "Moments date format. Please have a look at the MomentJS documentation.",
|
||||||
"pluginUrlHelpText": "The url of the Plugin Center API. Explanation of the placeholders: version = SCM-Manager Version; os = Operation System; arch = Architecture",
|
"pluginUrlHelpText": "The url of the Plugin Center API. Explanation of the placeholders: version = SCM-Manager Version; os = Operation System; arch = Architecture",
|
||||||
"enableForwardingHelpText": "Enable mod_proxy port forwarding.",
|
"enableForwardingHelpText": "Enable mod_proxy port forwarding.",
|
||||||
"enableRepositoryArchiveHelpText": "Enable repository archives. A complete page reload is required after a change of this value.",
|
|
||||||
"disableGroupingGridHelpText": "Disable repository Groups. A complete page reload is required after a change of this value.",
|
"disableGroupingGridHelpText": "Disable repository Groups. A complete page reload is required after a change of this value.",
|
||||||
"allowAnonymousAccessHelpText": "Anonymous users have read access on public repositories.",
|
"allowAnonymousAccessHelpText": "Anonymous users have read access on public repositories.",
|
||||||
"skipFailedAuthenticatorsHelpText": "Do not stop the authentication chain, if an authenticator finds the user but fails to authenticate the user.",
|
"skipFailedAuthenticatorsHelpText": "Do not stop the authentication chain, if an authenticator finds the user but fails to authenticate the user.",
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ type Props = {
|
|||||||
configUpdatePermission: boolean,
|
configUpdatePermission: boolean,
|
||||||
namespaceStrategies?: NamespaceStrategies,
|
namespaceStrategies?: NamespaceStrategies,
|
||||||
// context props
|
// context props
|
||||||
t: string => string,
|
t: string => string
|
||||||
};
|
};
|
||||||
|
|
||||||
type State = {
|
type State = {
|
||||||
@@ -41,7 +41,6 @@ class ConfigForm extends React.Component<Props, State> {
|
|||||||
proxyUser: null,
|
proxyUser: null,
|
||||||
enableProxy: false,
|
enableProxy: false,
|
||||||
realmDescription: "",
|
realmDescription: "",
|
||||||
enableRepositoryArchive: false,
|
|
||||||
disableGroupingGrid: false,
|
disableGroupingGrid: false,
|
||||||
dateFormat: "",
|
dateFormat: "",
|
||||||
anonymousAccessEnabled: false,
|
anonymousAccessEnabled: false,
|
||||||
@@ -122,7 +121,6 @@ class ConfigForm extends React.Component<Props, State> {
|
|||||||
namespaceStrategies={namespaceStrategies}
|
namespaceStrategies={namespaceStrategies}
|
||||||
loginInfoUrl={config.loginInfoUrl}
|
loginInfoUrl={config.loginInfoUrl}
|
||||||
realmDescription={config.realmDescription}
|
realmDescription={config.realmDescription}
|
||||||
enableRepositoryArchive={config.enableRepositoryArchive}
|
|
||||||
disableGroupingGrid={config.disableGroupingGrid}
|
disableGroupingGrid={config.disableGroupingGrid}
|
||||||
dateFormat={config.dateFormat}
|
dateFormat={config.dateFormat}
|
||||||
anonymousAccessEnabled={config.anonymousAccessEnabled}
|
anonymousAccessEnabled={config.anonymousAccessEnabled}
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import NamespaceStrategySelect from "./NamespaceStrategySelect";
|
|||||||
type Props = {
|
type Props = {
|
||||||
realmDescription: string,
|
realmDescription: string,
|
||||||
loginInfoUrl: string,
|
loginInfoUrl: string,
|
||||||
enableRepositoryArchive: boolean,
|
|
||||||
disableGroupingGrid: boolean,
|
disableGroupingGrid: boolean,
|
||||||
dateFormat: string,
|
dateFormat: string,
|
||||||
anonymousAccessEnabled: boolean,
|
anonymousAccessEnabled: boolean,
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ const config = {
|
|||||||
proxyUser: null,
|
proxyUser: null,
|
||||||
enableProxy: false,
|
enableProxy: false,
|
||||||
realmDescription: "SONIA :: SCM Manager",
|
realmDescription: "SONIA :: SCM Manager",
|
||||||
enableRepositoryArchive: false,
|
|
||||||
disableGroupingGrid: false,
|
disableGroupingGrid: false,
|
||||||
dateFormat: "YYYY-MM-DD HH:mm:ss",
|
dateFormat: "YYYY-MM-DD HH:mm:ss",
|
||||||
anonymousAccessEnabled: false,
|
anonymousAccessEnabled: false,
|
||||||
@@ -64,7 +63,6 @@ const configWithNullValues = {
|
|||||||
proxyUser: null,
|
proxyUser: null,
|
||||||
enableProxy: false,
|
enableProxy: false,
|
||||||
realmDescription: "SONIA :: SCM Manager",
|
realmDescription: "SONIA :: SCM Manager",
|
||||||
enableRepositoryArchive: false,
|
|
||||||
disableGroupingGrid: false,
|
disableGroupingGrid: false,
|
||||||
dateFormat: "YYYY-MM-DD HH:mm:ss",
|
dateFormat: "YYYY-MM-DD HH:mm:ss",
|
||||||
anonymousAccessEnabled: false,
|
anonymousAccessEnabled: false,
|
||||||
|
|||||||
@@ -96,7 +96,6 @@ const hitchhikerRestatend: Repository = {
|
|||||||
description: "restaurant at the end of the universe",
|
description: "restaurant at the end of the universe",
|
||||||
namespace: "hitchhiker",
|
namespace: "hitchhiker",
|
||||||
name: "restatend",
|
name: "restatend",
|
||||||
archived: false,
|
|
||||||
type: "git",
|
type: "git",
|
||||||
_links: {
|
_links: {
|
||||||
self: {
|
self: {
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ public class ConfigDto extends HalRepresentation {
|
|||||||
private String proxyUser;
|
private String proxyUser;
|
||||||
private boolean enableProxy;
|
private boolean enableProxy;
|
||||||
private String realmDescription;
|
private String realmDescription;
|
||||||
private boolean enableRepositoryArchive;
|
|
||||||
private boolean disableGroupingGrid;
|
private boolean disableGroupingGrid;
|
||||||
private String dateFormat;
|
private String dateFormat;
|
||||||
private boolean anonymousAccessEnabled;
|
private boolean anonymousAccessEnabled;
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import com.webcohesion.enunciate.metadata.rs.StatusCodes;
|
|||||||
import com.webcohesion.enunciate.metadata.rs.TypeHint;
|
import com.webcohesion.enunciate.metadata.rs.TypeHint;
|
||||||
import sonia.scm.repository.NamespaceAndName;
|
import sonia.scm.repository.NamespaceAndName;
|
||||||
import sonia.scm.repository.Repository;
|
import sonia.scm.repository.Repository;
|
||||||
import sonia.scm.repository.RepositoryIsNotArchivedException;
|
|
||||||
import sonia.scm.repository.RepositoryManager;
|
import sonia.scm.repository.RepositoryManager;
|
||||||
import sonia.scm.web.VndMediaType;
|
import sonia.scm.web.VndMediaType;
|
||||||
|
|
||||||
@@ -63,7 +62,7 @@ public class RepositoryResource {
|
|||||||
this.dtoToRepositoryMapper = dtoToRepositoryMapper;
|
this.dtoToRepositoryMapper = dtoToRepositoryMapper;
|
||||||
this.manager = manager;
|
this.manager = manager;
|
||||||
this.repositoryToDtoMapper = repositoryToDtoMapper;
|
this.repositoryToDtoMapper = repositoryToDtoMapper;
|
||||||
this.adapter = new SingleResourceManagerAdapter<>(manager, Repository.class, this::handleNotArchived);
|
this.adapter = new SingleResourceManagerAdapter<>(manager, Repository.class);
|
||||||
this.tagRootResource = tagRootResource;
|
this.tagRootResource = tagRootResource;
|
||||||
this.branchRootResource = branchRootResource;
|
this.branchRootResource = branchRootResource;
|
||||||
this.changesetRootResource = changesetRootResource;
|
this.changesetRootResource = changesetRootResource;
|
||||||
@@ -212,14 +211,6 @@ public class RepositoryResource {
|
|||||||
@Path("merge/")
|
@Path("merge/")
|
||||||
public MergeResource merge() {return mergeResource.get(); }
|
public MergeResource merge() {return mergeResource.get(); }
|
||||||
|
|
||||||
private Optional<Response> handleNotArchived(Throwable throwable) {
|
|
||||||
if (throwable instanceof RepositoryIsNotArchivedException) {
|
|
||||||
return Optional.of(Response.status(Response.Status.PRECONDITION_FAILED).build());
|
|
||||||
} else {
|
|
||||||
return Optional.empty();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Supplier<Repository> loadBy(String namespace, String name) {
|
private Supplier<Repository> loadBy(String namespace, String name) {
|
||||||
NamespaceAndName namespaceAndName = new NamespaceAndName(namespace, name);
|
NamespaceAndName namespaceAndName = new NamespaceAndName(namespace, name);
|
||||||
return () -> Optional.ofNullable(manager.get(namespaceAndName)).orElseThrow(() -> notFound(entity(namespaceAndName)));
|
return () -> Optional.ofNullable(manager.get(namespaceAndName)).orElseThrow(() -> notFound(entity(namespaceAndName)));
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import sonia.scm.ModelObject;
|
|||||||
import sonia.scm.NotFoundException;
|
import sonia.scm.NotFoundException;
|
||||||
|
|
||||||
import javax.ws.rs.core.Response;
|
import javax.ws.rs.core.Response;
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
@@ -28,20 +27,11 @@ import static javax.ws.rs.core.Response.Status.BAD_REQUEST;
|
|||||||
class SingleResourceManagerAdapter<MODEL_OBJECT extends ModelObject,
|
class SingleResourceManagerAdapter<MODEL_OBJECT extends ModelObject,
|
||||||
DTO extends HalRepresentation> {
|
DTO extends HalRepresentation> {
|
||||||
|
|
||||||
private final Function<Throwable, Optional<Response>> errorHandler;
|
|
||||||
protected final Manager<MODEL_OBJECT> manager;
|
protected final Manager<MODEL_OBJECT> manager;
|
||||||
protected final Class<MODEL_OBJECT> type;
|
protected final Class<MODEL_OBJECT> type;
|
||||||
|
|
||||||
SingleResourceManagerAdapter(Manager<MODEL_OBJECT> manager, Class<MODEL_OBJECT> type) {
|
SingleResourceManagerAdapter(Manager<MODEL_OBJECT> manager, Class<MODEL_OBJECT> type) {
|
||||||
this(manager, type, e -> Optional.empty());
|
|
||||||
}
|
|
||||||
|
|
||||||
SingleResourceManagerAdapter(
|
|
||||||
Manager<MODEL_OBJECT> manager,
|
|
||||||
Class<MODEL_OBJECT> type,
|
|
||||||
Function<Throwable, Optional<Response>> errorHandler) {
|
|
||||||
this.manager = manager;
|
this.manager = manager;
|
||||||
this.errorHandler = errorHandler;
|
|
||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,12 +64,8 @@ class SingleResourceManagerAdapter<MODEL_OBJECT extends ModelObject,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Response update(MODEL_OBJECT item) {
|
private Response update(MODEL_OBJECT item) {
|
||||||
try {
|
manager.modify(item);
|
||||||
manager.modify(item);
|
return Response.noContent().build();
|
||||||
return Response.noContent().build();
|
|
||||||
} catch (RuntimeException ex) {
|
|
||||||
return createErrorResponse(ex);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean modelObjectWasModifiedConcurrently(MODEL_OBJECT existing, MODEL_OBJECT updated) {
|
private boolean modelObjectWasModifiedConcurrently(MODEL_OBJECT existing, MODEL_OBJECT updated) {
|
||||||
@@ -100,22 +86,13 @@ class SingleResourceManagerAdapter<MODEL_OBJECT extends ModelObject,
|
|||||||
MODEL_OBJECT item = manager.get(name);
|
MODEL_OBJECT item = manager.get(name);
|
||||||
|
|
||||||
if (item != null) {
|
if (item != null) {
|
||||||
try {
|
manager.delete(item);
|
||||||
manager.delete(item);
|
return Response.noContent().build();
|
||||||
return Response.noContent().build();
|
|
||||||
} catch (RuntimeException ex) {
|
|
||||||
return createErrorResponse(ex);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
return Response.noContent().build();
|
return Response.noContent().build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Response createErrorResponse(RuntimeException throwable) {
|
|
||||||
return errorHandler.apply(throwable)
|
|
||||||
.orElseThrow(() -> throwable);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getId(MODEL_OBJECT item) {
|
protected String getId(MODEL_OBJECT item) {
|
||||||
return item.getId();
|
return item.getId();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -172,9 +172,6 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void preDelete(Repository toDelete) {
|
private void preDelete(Repository toDelete) {
|
||||||
if (configuration.isEnableRepositoryArchive() && !toDelete.isArchived()) {
|
|
||||||
throw new RepositoryIsNotArchivedException();
|
|
||||||
}
|
|
||||||
fireEvent(HandlerEventType.BEFORE_DELETE, toDelete);
|
fireEvent(HandlerEventType.BEFORE_DELETE, toDelete);
|
||||||
getHandler(toDelete).delete(toDelete);
|
getHandler(toDelete).delete(toDelete);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -168,8 +168,7 @@ public class AuthorizationChangedEventProducer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean isAuthorizationDataModified(Repository repository, Repository beforeModification) {
|
private boolean isAuthorizationDataModified(Repository repository, Repository beforeModification) {
|
||||||
return repository.isArchived() != beforeModification.isArchived()
|
return repository.isPublicReadable() != beforeModification.isPublicReadable()
|
||||||
|| repository.isPublicReadable() != beforeModification.isPublicReadable()
|
|
||||||
|| !(repository.getPermissions().containsAll(beforeModification.getPermissions()) && beforeModification.getPermissions().containsAll(repository.getPermissions()));
|
|| !(repository.getPermissions().containsAll(beforeModification.getPermissions()) && beforeModification.getPermissions().containsAll(repository.getPermissions()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -91,7 +91,6 @@ public class MigrateVerbsToPermissionRoles implements UpdateStep {
|
|||||||
repository.setHealthCheckFailures(oldRepository.healthCheckFailures);
|
repository.setHealthCheckFailures(oldRepository.healthCheckFailures);
|
||||||
repository.setLastModified(oldRepository.lastModified);
|
repository.setLastModified(oldRepository.lastModified);
|
||||||
repository.setPublicReadable(oldRepository.publicReadable);
|
repository.setPublicReadable(oldRepository.publicReadable);
|
||||||
repository.setArchived(oldRepository.archived);
|
|
||||||
return repository;
|
return repository;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ public class ConfigDtoToScmConfigurationMapperTest {
|
|||||||
assertEquals("user" , config.getProxyUser());
|
assertEquals("user" , config.getProxyUser());
|
||||||
assertTrue(config.isEnableProxy());
|
assertTrue(config.isEnableProxy());
|
||||||
assertEquals("realm" , config.getRealmDescription());
|
assertEquals("realm" , config.getRealmDescription());
|
||||||
assertTrue(config.isEnableRepositoryArchive());
|
|
||||||
assertTrue(config.isDisableGroupingGrid());
|
assertTrue(config.isDisableGroupingGrid());
|
||||||
assertEquals("yyyy" , config.getDateFormat());
|
assertEquals("yyyy" , config.getDateFormat());
|
||||||
assertTrue(config.isAnonymousAccessEnabled());
|
assertTrue(config.isAnonymousAccessEnabled());
|
||||||
@@ -61,7 +60,6 @@ public class ConfigDtoToScmConfigurationMapperTest {
|
|||||||
configDto.setProxyUser("user");
|
configDto.setProxyUser("user");
|
||||||
configDto.setEnableProxy(true);
|
configDto.setEnableProxy(true);
|
||||||
configDto.setRealmDescription("realm");
|
configDto.setRealmDescription("realm");
|
||||||
configDto.setEnableRepositoryArchive(true);
|
|
||||||
configDto.setDisableGroupingGrid(true);
|
configDto.setDisableGroupingGrid(true);
|
||||||
configDto.setDateFormat("yyyy");
|
configDto.setDateFormat("yyyy");
|
||||||
configDto.setAnonymousAccessEnabled(true);
|
configDto.setAnonymousAccessEnabled(true);
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ import org.mockito.Mock;
|
|||||||
import sonia.scm.PageResult;
|
import sonia.scm.PageResult;
|
||||||
import sonia.scm.repository.NamespaceAndName;
|
import sonia.scm.repository.NamespaceAndName;
|
||||||
import sonia.scm.repository.Repository;
|
import sonia.scm.repository.Repository;
|
||||||
import sonia.scm.repository.RepositoryIsNotArchivedException;
|
|
||||||
import sonia.scm.repository.RepositoryManager;
|
import sonia.scm.repository.RepositoryManager;
|
||||||
import sonia.scm.repository.api.RepositoryService;
|
import sonia.scm.repository.api.RepositoryService;
|
||||||
import sonia.scm.repository.api.RepositoryServiceFactory;
|
import sonia.scm.repository.api.RepositoryServiceFactory;
|
||||||
@@ -41,7 +40,6 @@ import static javax.servlet.http.HttpServletResponse.SC_CONFLICT;
|
|||||||
import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
|
import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
|
||||||
import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT;
|
import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT;
|
||||||
import static javax.servlet.http.HttpServletResponse.SC_OK;
|
import static javax.servlet.http.HttpServletResponse.SC_OK;
|
||||||
import static javax.servlet.http.HttpServletResponse.SC_PRECONDITION_FAILED;
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
@@ -270,20 +268,6 @@ public class RepositoryRootResourceTest extends RepositoryTestBase {
|
|||||||
verify(repositoryManager).delete(anyObject());
|
verify(repositoryManager).delete(anyObject());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldHandleDeleteIsNotArchivedException() throws Exception {
|
|
||||||
mockRepository("space", "repo");
|
|
||||||
|
|
||||||
doThrow(RepositoryIsNotArchivedException.class).when(repositoryManager).delete(anyObject());
|
|
||||||
|
|
||||||
MockHttpRequest request = MockHttpRequest.delete("/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + "space/repo");
|
|
||||||
MockHttpResponse response = new MockHttpResponse();
|
|
||||||
|
|
||||||
dispatcher.invoke(request, response);
|
|
||||||
|
|
||||||
assertEquals(SC_PRECONDITION_FAILED, response.getStatus());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldCreateNewRepositoryInCorrectNamespace() throws Exception {
|
public void shouldCreateNewRepositoryInCorrectNamespace() throws Exception {
|
||||||
when(repositoryManager.create(any())).thenAnswer(invocation -> {
|
when(repositoryManager.create(any())).thenAnswer(invocation -> {
|
||||||
|
|||||||
@@ -67,7 +67,6 @@ public class ScmConfigurationToConfigDtoMapperTest {
|
|||||||
assertEquals("trillian" , dto.getProxyUser());
|
assertEquals("trillian" , dto.getProxyUser());
|
||||||
assertTrue(dto.isEnableProxy());
|
assertTrue(dto.isEnableProxy());
|
||||||
assertEquals("description" , dto.getRealmDescription());
|
assertEquals("description" , dto.getRealmDescription());
|
||||||
assertTrue(dto.isEnableRepositoryArchive());
|
|
||||||
assertTrue(dto.isDisableGroupingGrid());
|
assertTrue(dto.isDisableGroupingGrid());
|
||||||
assertEquals("dd" , dto.getDateFormat());
|
assertEquals("dd" , dto.getDateFormat());
|
||||||
assertTrue(dto.isAnonymousAccessEnabled());
|
assertTrue(dto.isAnonymousAccessEnabled());
|
||||||
@@ -106,7 +105,6 @@ public class ScmConfigurationToConfigDtoMapperTest {
|
|||||||
config.setProxyUser("trillian");
|
config.setProxyUser("trillian");
|
||||||
config.setEnableProxy(true);
|
config.setEnableProxy(true);
|
||||||
config.setRealmDescription("description");
|
config.setRealmDescription("description");
|
||||||
config.setEnableRepositoryArchive(true);
|
|
||||||
config.setDisableGroupingGrid(true);
|
config.setDisableGroupingGrid(true);
|
||||||
config.setDateFormat("dd");
|
config.setDateFormat("dd");
|
||||||
config.setAnonymousAccessEnabled(true);
|
config.setAnonymousAccessEnabled(true);
|
||||||
|
|||||||
@@ -1,181 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2010, Sebastian Sdorra
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer in the documentation
|
|
||||||
* and/or other materials provided with the distribution.
|
|
||||||
* 3. Neither the name of SCM-Manager; nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from this
|
|
||||||
* software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
||||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* http://bitbucket.org/sdorra/scm-manager
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
package sonia.scm.it;
|
|
||||||
|
|
||||||
|
|
||||||
import com.sun.jersey.api.client.ClientResponse;
|
|
||||||
import com.sun.jersey.api.client.WebResource;
|
|
||||||
import org.junit.After;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.junit.runners.Parameterized;
|
|
||||||
import sonia.scm.api.v2.resources.ConfigDto;
|
|
||||||
import sonia.scm.api.v2.resources.RepositoryDto;
|
|
||||||
import sonia.scm.web.VndMediaType;
|
|
||||||
|
|
||||||
import javax.ws.rs.core.MediaType;
|
|
||||||
import java.net.URI;
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
import static sonia.scm.it.IntegrationTestUtil.createAdminClient;
|
|
||||||
import static sonia.scm.it.IntegrationTestUtil.createResource;
|
|
||||||
import static sonia.scm.it.IntegrationTestUtil.getLink;
|
|
||||||
import static sonia.scm.it.IntegrationTestUtil.readJson;
|
|
||||||
import static sonia.scm.it.IntegrationTestUtil.serialize;
|
|
||||||
import static sonia.scm.it.RepositoryITUtil.createRepository;
|
|
||||||
import static sonia.scm.it.RepositoryITUtil.deleteRepository;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author Sebastian Sdorra
|
|
||||||
*/
|
|
||||||
@RunWith(Parameterized.class)
|
|
||||||
public class RepositoryArchiveITCase
|
|
||||||
{
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs ...
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param type
|
|
||||||
*/
|
|
||||||
public RepositoryArchiveITCase(String type)
|
|
||||||
{
|
|
||||||
this.type = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
//~--- methods --------------------------------------------------------------
|
|
||||||
|
|
||||||
@Parameterized.Parameters(name = "{0}")
|
|
||||||
public static Collection<String[]> createParameters() {
|
|
||||||
return IntegrationTestUtil.createRepositoryTypeParameters();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method description
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@Before
|
|
||||||
public void createTestRepository() {
|
|
||||||
client = createAdminClient();
|
|
||||||
repository = createRepository(client, readJson("repository-" + type + ".json"));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method description
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@After
|
|
||||||
public void deleteTestRepository()
|
|
||||||
{
|
|
||||||
setArchiveMode(false);
|
|
||||||
|
|
||||||
if (repository != null)
|
|
||||||
{
|
|
||||||
deleteRepository(client, repository);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method description
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testDeleteAllowed() {
|
|
||||||
setArchiveMode(true);
|
|
||||||
|
|
||||||
repository.setArchived(true);
|
|
||||||
|
|
||||||
ClientResponse response = createResource(client,
|
|
||||||
"repositories/" + repository.getNamespace() + "/" + repository.getName())
|
|
||||||
.type(VndMediaType.REPOSITORY).put(ClientResponse.class, serialize(repository));
|
|
||||||
|
|
||||||
assertNotNull(response);
|
|
||||||
assertEquals(204, response.getStatus());
|
|
||||||
response = createResource(client,
|
|
||||||
"repositories/" + repository.getNamespace() + "/" + repository.getName()).delete(ClientResponse.class);
|
|
||||||
assertNotNull(response);
|
|
||||||
assertEquals(204, response.getStatus());
|
|
||||||
repository = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method description
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testDeleteDenied()
|
|
||||||
{
|
|
||||||
setArchiveMode(true);
|
|
||||||
|
|
||||||
URI deleteUrl = getLink(repository, "delete");
|
|
||||||
ClientResponse response = createResource(client, deleteUrl).delete(ClientResponse.class);
|
|
||||||
|
|
||||||
assertNotNull(response);
|
|
||||||
assertEquals(412, response.getStatus());
|
|
||||||
response.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method description
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param archive
|
|
||||||
*/
|
|
||||||
private void setArchiveMode(boolean archive)
|
|
||||||
{
|
|
||||||
WebResource.Builder resource = createResource(client, "config").type(MediaType.APPLICATION_JSON);
|
|
||||||
ConfigDto config = resource.get(ConfigDto.class);
|
|
||||||
|
|
||||||
assertNotNull(config);
|
|
||||||
config.setEnableRepositoryArchive(archive);
|
|
||||||
|
|
||||||
ClientResponse resp = createResource(client, "config").type(VndMediaType.CONFIG).put(ClientResponse.class, config);
|
|
||||||
|
|
||||||
assertNotNull(resp);
|
|
||||||
assertEquals(204, resp.getStatus());
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Field description */
|
|
||||||
private ScmClient client;
|
|
||||||
|
|
||||||
/** Field description */
|
|
||||||
private RepositoryDto repository;
|
|
||||||
|
|
||||||
/** Field description */
|
|
||||||
private String type;
|
|
||||||
}
|
|
||||||
@@ -13,7 +13,6 @@
|
|||||||
<enableSSL>false</enableSSL>
|
<enableSSL>false</enableSSL>
|
||||||
<enablePortForward>false</enablePortForward>
|
<enablePortForward>false</enablePortForward>
|
||||||
<sslPort>8181</sslPort>
|
<sslPort>8181</sslPort>
|
||||||
<enableRepositoryArchive>false</enableRepositoryArchive>
|
|
||||||
<disableGroupingGrid>false</disableGroupingGrid>
|
<disableGroupingGrid>false</disableGroupingGrid>
|
||||||
<dateFormat>Y-m-d H:i:s</dateFormat>
|
<dateFormat>Y-m-d H:i:s</dateFormat>
|
||||||
<anonymousAccessEnabled>false</anonymousAccessEnabled>
|
<anonymousAccessEnabled>false</anonymousAccessEnabled>
|
||||||
|
|||||||
Reference in New Issue
Block a user