mirror of
https://github.com/scm-manager/scm-manager.git
synced 2026-01-31 11:49:10 +01:00
Enhance repository manager create api to perform actions after creation
This commit is contained in:
@@ -24,6 +24,7 @@
|
||||
|
||||
package sonia.scm.api.v2.resources;
|
||||
|
||||
import com.google.common.annotations.VisibleForTesting;
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.inject.Inject;
|
||||
import de.otto.edison.hal.Embedded;
|
||||
@@ -49,7 +50,6 @@ import sonia.scm.repository.RepositoryManager;
|
||||
import sonia.scm.repository.RepositoryPermissions;
|
||||
import sonia.scm.repository.RepositoryType;
|
||||
import sonia.scm.repository.api.Command;
|
||||
import sonia.scm.repository.api.ImportFailedException;
|
||||
import sonia.scm.repository.api.PullCommandBuilder;
|
||||
import sonia.scm.repository.api.RepositoryService;
|
||||
import sonia.scm.repository.api.RepositoryServiceFactory;
|
||||
@@ -63,8 +63,10 @@ import javax.ws.rs.WebApplicationException;
|
||||
import javax.ws.rs.core.Context;
|
||||
import javax.ws.rs.core.Response;
|
||||
import javax.ws.rs.core.UriInfo;
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.util.Set;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
@@ -213,29 +215,33 @@ public class RepositoryImportResource {
|
||||
|
||||
logger.info("start {} import for external url {}", type, request.getUrl());
|
||||
|
||||
Repository repository = create(request.getNamespace(), request.getName(), type);
|
||||
|
||||
try (RepositoryService service = serviceFactory.create(repository)) {
|
||||
PullCommandBuilder pullCommand = service.getPullCommand();
|
||||
if (!Strings.isNullOrEmpty(request.getUsername()) && !Strings.isNullOrEmpty(request.getPassword())) {
|
||||
pullCommand
|
||||
.withUsername(request.getUsername())
|
||||
.withPassword(request.getPassword());
|
||||
}
|
||||
|
||||
pullCommand.pull(request.getUrl());
|
||||
eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, repository, false));
|
||||
} catch (ImportFailedException ex) {
|
||||
handleImportFailure(ex, repository);
|
||||
throw ex;
|
||||
} catch (Exception ex) {
|
||||
handleImportFailure(ex, repository);
|
||||
throw new InternalRepositoryException(repository, "Repository Import failed.", ex);
|
||||
}
|
||||
Repository repository = manager.create(
|
||||
new Repository(null, type, request.getNamespace(), request.getName()),
|
||||
pullChangesFromRemoteUrl(request)
|
||||
);
|
||||
|
||||
return Response.created(URI.create(resourceLinks.repository().self(repository.getNamespace(), repository.getName()))).build();
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
Consumer<Repository> pullChangesFromRemoteUrl(RepositoryImportDto request) {
|
||||
return repository -> {
|
||||
try (RepositoryService service = serviceFactory.create(repository)) {
|
||||
PullCommandBuilder pullCommand = service.getPullCommand();
|
||||
if (!Strings.isNullOrEmpty(request.getUsername()) && !Strings.isNullOrEmpty(request.getPassword())) {
|
||||
pullCommand
|
||||
.withUsername(request.getUsername())
|
||||
.withPassword(request.getPassword());
|
||||
}
|
||||
|
||||
pullCommand.pull(request.getUrl());
|
||||
eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, repository, false));
|
||||
} catch (IOException e) {
|
||||
throw new InternalRepositoryException(repository, "Failed to import from remote url", e);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// /**
|
||||
// * Imports repositories of the given type from the configured repository
|
||||
// * directory. <strong>Note:</strong> This method requires admin privileges.
|
||||
@@ -390,27 +396,6 @@ public class RepositoryImportResource {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new repository with the given namespace, name and type.
|
||||
*
|
||||
* @param namespace repository namespace
|
||||
* @param name repository name
|
||||
* @param type repository type
|
||||
* @return newly created repository
|
||||
*/
|
||||
private Repository create(String namespace, String name, String type) {
|
||||
Repository repository = null;
|
||||
|
||||
try {
|
||||
repository = new Repository(null, type, namespace, name);
|
||||
manager.create(repository);
|
||||
} catch (InternalRepositoryException ex) {
|
||||
handleGenericCreationFailure(ex, type, name);
|
||||
}
|
||||
|
||||
return repository;
|
||||
}
|
||||
|
||||
// /**
|
||||
// * Start bundle import.
|
||||
// *
|
||||
@@ -513,7 +498,6 @@ public class RepositoryImportResource {
|
||||
|
||||
try {
|
||||
eventBus.post(new RepositoryImportEvent(HandlerEventType.BEFORE_DELETE, repository, true));
|
||||
manager.delete(repository);
|
||||
} catch (InternalRepositoryException | NotFoundException e) {
|
||||
logger.error("can not delete repository after import failure", e);
|
||||
}
|
||||
|
||||
@@ -59,6 +59,7 @@ import java.util.Set;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
import static java.util.stream.Collectors.toSet;
|
||||
@@ -123,10 +124,16 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager {
|
||||
|
||||
@Override
|
||||
public Repository create(Repository repository) {
|
||||
return create(repository, true);
|
||||
return create(repository, r -> {
|
||||
}, true);
|
||||
}
|
||||
|
||||
public Repository create(Repository repository, boolean initRepository) {
|
||||
@Override
|
||||
public Repository create(Repository repository, Consumer<Repository> afterCreation) {
|
||||
return create(repository, afterCreation, true);
|
||||
}
|
||||
|
||||
public Repository create(Repository repository, Consumer<Repository> afterCreation, boolean initRepository) {
|
||||
repository.setId(keyGenerator.createKey());
|
||||
repository.setNamespace(namespaceStrategyProvider.get().createNamespace(repository));
|
||||
|
||||
@@ -137,15 +144,19 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager {
|
||||
RepositoryPermissions::create,
|
||||
newRepository -> fireEvent(HandlerEventType.BEFORE_CREATE, newRepository),
|
||||
newRepository -> {
|
||||
fireEvent(HandlerEventType.CREATE, newRepository);
|
||||
if (initRepository) {
|
||||
try {
|
||||
getHandler(newRepository).create(newRepository);
|
||||
} catch (InternalRepositoryException e) {
|
||||
afterCreation.accept(newRepository);
|
||||
//TODO check if this is okay
|
||||
} catch (Exception e) {
|
||||
delete(repository);
|
||||
throw e;
|
||||
}
|
||||
} else {
|
||||
afterCreation.accept(newRepository);
|
||||
}
|
||||
fireEvent(HandlerEventType.CREATE, newRepository);
|
||||
},
|
||||
newRepository -> {
|
||||
if (repositoryDAO.contains(newRepository.getNamespaceAndName())) {
|
||||
@@ -173,7 +184,8 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager {
|
||||
|
||||
@Override
|
||||
public void importRepository(Repository repository) {
|
||||
create(repository, false);
|
||||
create(repository, r -> {
|
||||
}, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user