diff --git a/scm-ui-components/packages/ui-components/src/errors.js b/scm-ui-components/packages/ui-components/src/errors.js index 13e4996cf7..5b11eab0b8 100644 --- a/scm-ui-components/packages/ui-components/src/errors.js +++ b/scm-ui-components/packages/ui-components/src/errors.js @@ -52,6 +52,13 @@ export class NotFoundError extends BackendError { super(content, "NotFoundError", statusCode); } } + +export class ConflictError extends BackendError { + constructor(content: BackendErrorContent, statusCode: number) { + super(content, "ConflictError", statusCode); + } +} + export function createBackendError( content: BackendErrorContent, statusCode: number @@ -59,6 +66,8 @@ export function createBackendError( switch (statusCode) { case 404: return new NotFoundError(content, statusCode); + case 409: + return new ConflictError(content, statusCode); default: return new BackendError(content, "BackendError", statusCode); } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/MergeResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/MergeResource.java index 63fa2274ec..2214b258c6 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/MergeResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/MergeResource.java @@ -4,6 +4,7 @@ import com.webcohesion.enunciate.metadata.rs.ResponseCode; import com.webcohesion.enunciate.metadata.rs.StatusCodes; import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpStatus; +import sonia.scm.ConcurrentModificationException; import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.api.MergeCommandBuilder; import sonia.scm.repository.api.MergeCommandResult; @@ -73,7 +74,7 @@ public class MergeResource { if (mergeCommandResult.isMergeable()) { return Response.noContent().build(); } else { - return Response.status(HttpStatus.SC_CONFLICT).build(); + throw new ConcurrentModificationException("revision", mergeCommand.getTargetRevision()); } } }