init svn repositories with README.md in trunk folder

This commit is contained in:
Eduard Heimbuch
2020-07-22 14:00:52 +02:00
parent 9a1ec7a5ef
commit b1660f5ec7
8 changed files with 47 additions and 9 deletions

View File

@@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed ### Changed
- Adding start delay to liveness and readiness probes in helm chart template - Adding start delay to liveness and readiness probes in helm chart template
- Init svn repositories with trunk folder ([#1259](https://github.com/scm-manager/scm-manager/pull/1259))
### Fixed ### Fixed
- Fixed file extension detection with new spotter version - Fixed file extension detection with new spotter version

View File

@@ -30,6 +30,7 @@ Icon | Beschreibung
Im SCM-Manager können neue Git, Mercurial & Subersion (SVN) Repositories über ein Formular angelegt werden. Dieses kann über den Button "Repository erstellen" aufgerufen werden. Dabei muss ein gültiger Name eingetragen und der Repository-Typ bestimmt werden. Im SCM-Manager können neue Git, Mercurial & Subersion (SVN) Repositories über ein Formular angelegt werden. Dieses kann über den Button "Repository erstellen" aufgerufen werden. Dabei muss ein gültiger Name eingetragen und der Repository-Typ bestimmt werden.
Optional kann man das Repository beim Erstellen direkt initialisieren. Damit werden für Git und Mercurial jeweils der Standard-Branch (master bzw. default) angelegt. Außerdem wird ein initialer Commit ausgeführt, der eine README.md erzeugt. Optional kann man das Repository beim Erstellen direkt initialisieren. Damit werden für Git und Mercurial jeweils der Standard-Branch (master bzw. default) angelegt. Außerdem wird ein initialer Commit ausgeführt, der eine README.md erzeugt.
Für Subversion Repositories wird die README.md in einen Ordner `trunk` abgelegt.
Ist die Namespace-Strategie auf "Benutzerdefiniert" eingestellt, muss noch ein Namespace eingetragen werden. Ist die Namespace-Strategie auf "Benutzerdefiniert" eingestellt, muss noch ein Namespace eingetragen werden.

View File

@@ -27,7 +27,8 @@ Icon | Description
### Create a Repository ### Create a Repository
In SCM-Manager new Git, Mercurial & Subversion (SVN) repositories can be created via a form that can be accessed via the "Create Repository" button. A valid name and the repository type are mandatory. In SCM-Manager new Git, Mercurial & Subversion (SVN) repositories can be created via a form that can be accessed via the "Create Repository" button. A valid name and the repository type are mandatory.
Optionally, repositories can be initialized during the creation. That creates a standard branch (master or default) for Git and Mercurial repositories. Additionally, it performs a commit that creates a README.md. Optionally, repositories can be initialized during the creation. That creates a standard branch (master or default) for Git and Mercurial repositories.
Additionally, it performs a commit that creates a README.md. For Subversion repositories the README.md will be created in a directory named `trunk`.
If the namespace strategy is set to custom, the namespace field is also mandatory. If the namespace strategy is set to custom, the namespace field is also mandatory.

View File

@@ -175,6 +175,11 @@ public class ModifyCommandBuilder {
return this; return this;
} }
public ModifyCommandBuilder useDefaultPath(boolean useDefaultPath) {
request.setDefaultPath(useDefaultPath);
return this;
}
public interface ContentLoader { public interface ContentLoader {
/** /**
* Specify the data of the file using a {@link ByteSource}. * Specify the data of the file using a {@link ByteSource}.

View File

@@ -48,6 +48,7 @@ public class ModifyCommandRequest implements Resetable, Validateable, CommandWit
private String commitMessage; private String commitMessage;
private String branch; private String branch;
private String expectedRevision; private String expectedRevision;
private boolean defaultPath;
@Override @Override
public void reset() { public void reset() {
@@ -55,6 +56,7 @@ public class ModifyCommandRequest implements Resetable, Validateable, CommandWit
author = null; author = null;
commitMessage = null; commitMessage = null;
branch = null; branch = null;
defaultPath = false;
} }
public void addRequest(PartialRequest request) { public void addRequest(PartialRequest request) {
@@ -93,6 +95,10 @@ public class ModifyCommandRequest implements Resetable, Validateable, CommandWit
return expectedRevision; return expectedRevision;
} }
public boolean isDefaultPath() {
return defaultPath;
}
@Override @Override
public boolean isValid() { public boolean isValid() {
return StringUtils.isNotEmpty(commitMessage) && !requests.isEmpty(); return StringUtils.isNotEmpty(commitMessage) && !requests.isEmpty();
@@ -102,6 +108,10 @@ public class ModifyCommandRequest implements Resetable, Validateable, CommandWit
this.expectedRevision = expectedRevision; this.expectedRevision = expectedRevision;
} }
public void setDefaultPath(boolean defaultPath) {
this.defaultPath = defaultPath;
}
public interface PartialRequest { public interface PartialRequest {
void execute(ModifyCommand.Worker worker) throws IOException; void execute(ModifyCommand.Worker worker) throws IOException;
} }

View File

@@ -39,12 +39,13 @@ import sonia.scm.repository.work.WorkingCopy;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths;
public class SvnModifyCommand implements ModifyCommand { public class SvnModifyCommand implements ModifyCommand {
private SvnContext context; private final SvnContext context;
private SvnWorkingCopyFactory workingCopyFactory; private final SvnWorkingCopyFactory workingCopyFactory;
private Repository repository; private final Repository repository;
SvnModifyCommand(SvnContext context, SvnWorkingCopyFactory workingCopyFactory) { SvnModifyCommand(SvnContext context, SvnWorkingCopyFactory workingCopyFactory) {
this.context = context; this.context = context;
@@ -57,6 +58,9 @@ public class SvnModifyCommand implements ModifyCommand {
SVNClientManager clientManager = SVNClientManager.newInstance(); SVNClientManager clientManager = SVNClientManager.newInstance();
try (WorkingCopy<File, File> workingCopy = workingCopyFactory.createWorkingCopy(context, null)) { try (WorkingCopy<File, File> workingCopy = workingCopyFactory.createWorkingCopy(context, null)) {
File workingDirectory = workingCopy.getDirectory(); File workingDirectory = workingCopy.getDirectory();
if (request.isDefaultPath()) {
workingDirectory = Paths.get(workingDirectory.toString() + "/trunk").toFile();
}
modifyWorkingDirectory(request, clientManager, workingDirectory); modifyWorkingDirectory(request, clientManager, workingDirectory);
return commitChanges(clientManager, workingDirectory, request.getCommitMessage()); return commitChanges(clientManager, workingDirectory, request.getCommitMessage());
} }

View File

@@ -101,6 +101,22 @@ public class SvnModifyCommandTest extends AbstractSvnCommandTestBase {
assertThat(new File(workingCopy.getWorkingRepository(), "Test123")).exists(); assertThat(new File(workingCopy.getWorkingRepository(), "Test123")).exists();
} }
@Test
public void shouldAddNewFileInDefaultPath() throws IOException {
File testfile = temporaryFolder.newFile("Test123");
ModifyCommandRequest request = new ModifyCommandRequest();
request.setDefaultPath(true);
request.addRequest(new ModifyCommandRequest.CreateFileRequest("Test123", testfile, false));
request.setCommitMessage("this is great");
request.setAuthor(new Person("Arthur Dent", "dent@hitchhiker.com"));
svnModifyCommand.execute(request);
WorkingCopy<File, File> workingCopy = workingCopyFactory.createWorkingCopy(context, null);
assertThat(new File(workingCopy.getWorkingRepository(), "trunk/Test123")).exists();
}
@Test @Test
public void shouldThrowFileAlreadyExistsException() throws IOException { public void shouldThrowFileAlreadyExistsException() throws IOException {
File testfile = temporaryFolder.newFile("a.txt"); File testfile = temporaryFolder.newFile("a.txt");

View File

@@ -73,7 +73,7 @@ public class RepositoryInitializer {
} }
} }
private class InitializerContextImpl implements RepositoryContentInitializer.InitializerContext { private static class InitializerContextImpl implements RepositoryContentInitializer.InitializerContext {
private final Repository repository; private final Repository repository;
private final ModifyCommandBuilder builder; private final ModifyCommandBuilder builder;
@@ -90,11 +90,11 @@ public class RepositoryInitializer {
@Override @Override
public RepositoryContentInitializer.CreateFile create(String path) { public RepositoryContentInitializer.CreateFile create(String path) {
return new CreateFileImpl(this, builder.createFile(path).setOverwrite(true)); return new CreateFileImpl(this, builder.useDefaultPath(true).createFile(path).setOverwrite(true));
} }
} }
private class CreateFileImpl implements RepositoryContentInitializer.CreateFile { private static class CreateFileImpl implements RepositoryContentInitializer.CreateFile {
private final RepositoryContentInitializer.InitializerContext initializerContext; private final RepositoryContentInitializer.InitializerContext initializerContext;
private final ModifyCommandBuilder.WithOverwriteFlagContentLoader contentLoader; private final ModifyCommandBuilder.WithOverwriteFlagContentLoader contentLoader;