diff --git a/gradle/changelog/svn_head_revision.yaml b/gradle/changelog/svn_head_revision.yaml
new file mode 100644
index 0000000000..1e622b1b35
--- /dev/null
+++ b/gradle/changelog/svn_head_revision.yaml
@@ -0,0 +1,4 @@
+- type: changed
+ description: The code view for Subversion repositories now uses the alias 'head' by default for the latest revision
+- type: added
+ description: A 'is modifiable' flag for the browse command result.
diff --git a/scm-core/src/main/java/sonia/scm/repository/BrowserResult.java b/scm-core/src/main/java/sonia/scm/repository/BrowserResult.java
index b2fa1f6f4a..bc38e1be30 100644
--- a/scm-core/src/main/java/sonia/scm/repository/BrowserResult.java
+++ b/scm-core/src/main/java/sonia/scm/repository/BrowserResult.java
@@ -28,6 +28,7 @@ public class BrowserResult implements Serializable {
private String revision;
private String requestedRevision;
private FileObject file;
+ private boolean modifiable;
public BrowserResult() {
}
@@ -36,10 +37,19 @@ public class BrowserResult implements Serializable {
this(revision, revision, file);
}
+ public BrowserResult(String revision, FileObject file, boolean modifiable) {
+ this(revision, revision, file, modifiable);
+ }
+
public BrowserResult(String revision, String requestedRevision, FileObject file) {
+ this(revision, requestedRevision, file, false);
+ }
+
+ public BrowserResult(String revision, String requestedRevision, FileObject file, boolean modifiable) {
this.revision = revision;
this.requestedRevision = requestedRevision;
this.file = file;
+ this.modifiable = modifiable;
}
public String getRevision() {
@@ -53,4 +63,13 @@ public class BrowserResult implements Serializable {
public FileObject getFile() {
return file;
}
+
+ /**
+ * If this is true, the requested revision represents a modifiable head of the repository or (if
+ * supported) a branch and therefore can be modified.
+ * @since 3.6.0
+ */
+ public boolean isModifiable() {
+ return modifiable;
+ }
}
diff --git a/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java b/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java
index 790f74f62f..3ed8e7cd79 100644
--- a/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java
+++ b/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java
@@ -77,12 +77,11 @@ public class RepositoryAccessITCase {
public void init() {
TestData.createDefault();
folder = tempFolder.getRoot();
- String namespace = ADMIN_USERNAME;
String repo = TestData.getDefaultRepoName(repositoryType);
repositoryResponse =
ScmRequests.start()
.requestIndexResource(ADMIN_USERNAME, ADMIN_PASSWORD)
- .requestRepository(namespace, repo)
+ .requestRepository(ADMIN_USERNAME, repo)
.assertStatusCode(HttpStatus.SC_OK);
}
@@ -256,6 +255,7 @@ public class RepositoryAccessITCase {
}
@Test
+ @SuppressWarnings("rawtypes")
public void shouldFindChangesets() throws IOException {
RepositoryClient repositoryClient = RepositoryUtil.createRepositoryClient(repositoryType, folder);
@@ -302,7 +302,6 @@ public class RepositoryAccessITCase {
}
@Test
- @SuppressWarnings("unchecked")
public void shouldFindAddedModifications() throws IOException {
RepositoryClient repositoryClient = RepositoryUtil.createRepositoryClient(repositoryType, folder);
String fileName = "a.txt";
@@ -324,7 +323,6 @@ public class RepositoryAccessITCase {
}
@Test
- @SuppressWarnings("unchecked")
public void shouldFindRemovedModifications() throws IOException {
RepositoryClient repositoryClient = RepositoryUtil.createRepositoryClient(repositoryType, folder);
String fileName = "a.txt";
@@ -348,7 +346,6 @@ public class RepositoryAccessITCase {
}
@Test
- @SuppressWarnings("unchecked")
public void shouldFindUpdateModifications() throws IOException {
RepositoryClient repositoryClient = RepositoryUtil.createRepositoryClient(repositoryType, folder);
String fileName = "a.txt";
@@ -372,16 +369,15 @@ public class RepositoryAccessITCase {
}
@Test
- @SuppressWarnings("unchecked")
public void shouldFindMultipleModifications() throws IOException {
RepositoryClient repositoryClient = RepositoryUtil.createRepositoryClient(repositoryType, folder);
RepositoryUtil.createAndCommitFile(repositoryClient, ADMIN_USERNAME, "b.txt", "b");
RepositoryUtil.createAndCommitFile(repositoryClient, ADMIN_USERNAME, "c.txt", "c");
RepositoryUtil.createAndCommitFile(repositoryClient, ADMIN_USERNAME, "d.txt", "d");
- Map addedFiles = new HashMap() {{
+ Map addedFiles = new HashMap<>() {{
put("a.txt", "bla bla");
}};
- Map modifiedFiles = new HashMap() {{
+ Map modifiedFiles = new HashMap<>() {{
put("b.txt", "new content");
}};
ArrayList removedFiles = Lists.newArrayList("c.txt", "d.txt");
@@ -406,19 +402,16 @@ public class RepositoryAccessITCase {
}
@Test
- @SuppressWarnings("unchecked")
public void svnShouldCreateOneModificationPerFolder() throws IOException {
Assume.assumeThat(repositoryType, equalTo("svn"));
RepositoryClient repositoryClient = RepositoryUtil.createRepositoryClient(repositoryType, folder);
RepositoryUtil.createAndCommitFile(repositoryClient, ADMIN_USERNAME, "bbb/bb/b.txt", "b");
RepositoryUtil.createAndCommitFile(repositoryClient, ADMIN_USERNAME, "ccc/cc/c.txt", "c");
RepositoryUtil.createAndCommitFile(repositoryClient, ADMIN_USERNAME, "ddd/dd/d.txt", "d");
- Map addedFiles = new HashMap()
- {{
+ Map addedFiles = new HashMap<>() {{
put("aaa/aa/a.txt", "bla bla");
}};
- Map modifiedFiles = new HashMap()
- {{
+ Map modifiedFiles = new HashMap<>() {{
put("bbb/bb/b.txt", "new content");
}};
ArrayList removedFiles = Lists.newArrayList("ccc/cc/c.txt", "ddd/dd/d.txt");
diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java
index 44639bf4ce..74acee5ff6 100644
--- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java
+++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java
@@ -23,6 +23,8 @@ import com.google.common.collect.Maps;
import com.google.inject.assistedinject.Assisted;
import jakarta.annotation.Nullable;
import jakarta.inject.Inject;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.attributes.Attributes;
import org.eclipse.jgit.lfs.LfsPointer;
import org.eclipse.jgit.lib.Constants;
@@ -72,10 +74,10 @@ import static sonia.scm.repository.spi.SyncAsyncExecutor.ExecutionType.ASYNCHRON
public class GitBrowseCommand extends AbstractGitCommand
implements BrowseCommand {
-
+
public static final String PATH_MODULES = ".gitmodules";
-
+
private static final Logger logger = LoggerFactory.getLogger(GitBrowseCommand.class);
private final Map> subrepositoryCache = Maps.newHashMap();
@@ -119,11 +121,26 @@ public class GitBrowseCommand extends AbstractGitCommand
revId = computeRevIdToBrowse();
if (revId != null) {
- browserResult = new BrowserResult(revId.getName(), request.getRevision(), getEntry());
- return browserResult;
+ try {
+ boolean isBranch = Strings.isNullOrEmpty(request.getRevision()) || new Git(repo)
+ .branchList()
+ .call()
+ .stream()
+ .map(GitUtil::getBranch)
+ .anyMatch(branch -> branch.equals(request.getRevision()));
+ browserResult =
+ new BrowserResult(
+ revId.getName(),
+ request.getRevision() == null ? Constants.HEAD : request.getRevision(),
+ getEntry(),
+ isBranch);
+ return browserResult;
+ } catch (GitAPIException e) {
+ throw new IOException(e);
+ }
} else {
logger.warn("could not find head of repository {}, empty?", repository);
- return new BrowserResult(Constants.HEAD, request.getRevision(), createEmptyRoot());
+ return new BrowserResult(Constants.HEAD, createEmptyRoot(), true);
}
}
@@ -406,7 +423,7 @@ public class GitBrowseCommand extends AbstractGitCommand
// The increment is required to not close the repository if the getLatestCommit runs before the RepositoryService
// is closed.
repo.incrementOpen();
- try (RevWalk walk = new RevWalk(repo)) {
+ try (repo; RevWalk walk = new RevWalk(repo)) {
walk.setTreeFilter(AndTreeFilter.create(TreeFilter.ANY_DIFF, PathFilter.create(path)));
RevCommit commit = walk.parseCommit(revId);
@@ -416,8 +433,6 @@ public class GitBrowseCommand extends AbstractGitCommand
} catch (IOException ex) {
logger.error("could not parse commit for file", ex);
return empty();
- } finally {
- repo.close();
}
}
diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBrowseCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBrowseCommandTest.java
index e1d0099936..159d76c428 100644
--- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBrowseCommandTest.java
+++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBrowseCommandTest.java
@@ -54,11 +54,27 @@ public class GitBrowseCommandTest extends AbstractGitCommandTestBase {
BrowseCommandRequest request = new BrowseCommandRequest();
request.setPath("a.txt");
BrowserResult result = createCommand().getBrowserResult(request);
+ assertTrue(result.isModifiable());
+ assertEquals("HEAD", result.getRequestedRevision());
FileObject fileObject = result.getFile();
assertEquals("a.txt", fileObject.getName());
assertFalse(fileObject.isTruncated());
}
+ @Test
+ public void testDifferentBranch() throws IOException {
+ BrowseCommandRequest request = new BrowseCommandRequest();
+ request.setRevision("test-branch");
+
+ BrowserResult result = createCommand().getBrowserResult(request);
+
+ assertTrue(result.isModifiable());
+ Collection foList = result.getFile().getChildren();
+ assertThat(foList)
+ .extracting("name")
+ .containsExactly("c", "a.txt");
+ }
+
@Test
public void testDefaultDefaultBranch() throws IOException {
// without default branch, the repository head should be used
diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgBrowseCommand.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgBrowseCommand.java
index 118cd96468..78eaad75ec 100644
--- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgBrowseCommand.java
+++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgBrowseCommand.java
@@ -19,7 +19,9 @@ package sonia.scm.repository.spi;
import com.google.inject.assistedinject.Assisted;
import jakarta.inject.Inject;
+import org.javahg.Branch;
import org.javahg.Changeset;
+import org.javahg.commands.BranchesCommand;
import org.javahg.commands.LogCommand;
import com.google.common.base.MoreObjects;
import com.google.common.base.Strings;
@@ -82,7 +84,13 @@ public class HgBrowseCommand extends AbstractCommand implements BrowseCommand
FileObject file = cmd.execute()
.orElseThrow(() -> notFound(entity("File", request.getPath()).in("Revision", revision).in(getRepository())));
- return new BrowserResult(c == null? "tip": c.getNode(), revision, file);
+ boolean requestedRevisionIsBranch = BranchesCommand
+ .on(getContext().open())
+ .execute()
+ .stream()
+ .map(Branch::getName)
+ .anyMatch(b -> b.equals(request.getRevision()));
+ return new BrowserResult(c == null ? "tip" : c.getNode(), revision, file, requestedRevisionIsBranch);
}
public interface Factory {
diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgBrowseCommandTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgBrowseCommandTest.java
index 0986f9765b..a18a4db3d4 100644
--- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgBrowseCommandTest.java
+++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgBrowseCommandTest.java
@@ -65,6 +65,16 @@ public class HgBrowseCommandTest extends AbstractHgCommandTestBase {
assertEquals("c", c.getPath());
}
+ @Test
+ public void testBrowseWithRevision() throws IOException {
+ BrowseCommandRequest request = new BrowseCommandRequest();
+ request.setRevision("2baab8e80280ef05a9aa76c49c76feca2872afb7");
+
+ BrowserResult result = new HgBrowseCommand(cmdContext).getBrowserResult(request);
+
+ assertFalse(result.isModifiable());
+ }
+
@Test
public void testBrowseShouldResolveBranchForRevision() throws IOException {
String defaultBranchRevision = new LogCommand(cmdContext.open()).rev("default").single().getNode();
@@ -74,6 +84,7 @@ public class HgBrowseCommandTest extends AbstractHgCommandTestBase {
BrowserResult result = new HgBrowseCommand(cmdContext).getBrowserResult(browseCommandRequest);
+ assertTrue(result.isModifiable());
assertThat(result.getRevision()).isEqualTo(defaultBranchRevision);
}
diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnUtil.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnUtil.java
index f151443644..8248c453b8 100644
--- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnUtil.java
+++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnUtil.java
@@ -77,13 +77,15 @@ public final class SvnUtil
public static long parseRevision(String v, Repository repository) {
- long result = -1l;
-
if (!Strings.isNullOrEmpty(v))
{
+ if ("head".equals(v))
+ {
+ return -1;
+ }
try
{
- result = Long.parseLong(v);
+ return Long.parseLong(v);
}
catch (NumberFormatException ex)
{
@@ -91,7 +93,7 @@ public final class SvnUtil
}
}
- return result;
+ return -1;
}
public static Modifications createModifications(String startRevision, String endRevision, Collection entries) {
@@ -261,22 +263,23 @@ public final class SvnUtil
}
public static long getRevisionNumber(String revision, Repository repository) {
- // REVIEW Bei SVN wird ohne Revision die -1 genommen, was zu einem Fehler führt
- long revisionNumber = -1;
-
if (Util.isNotEmpty(revision))
{
+ if ("head".equals(revision))
+ {
+ return -1;
+ }
try
{
- revisionNumber = Long.parseLong(revision);
+ return Long.parseLong(revision);
}
catch (NumberFormatException ex)
{
throw notFound(entity("Revision", revision).in(repository));
}
+ } else {
+ return -1;
}
-
- return revisionNumber;
}
diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBrowseCommand.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBrowseCommand.java
index 2b9c23d14f..bbca66c811 100644
--- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBrowseCommand.java
+++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBrowseCommand.java
@@ -45,7 +45,7 @@ import static sonia.scm.NotFoundException.notFound;
public class SvnBrowseCommand extends AbstractSvnCommand
implements BrowseCommand {
-
+
private static final Logger logger =
LoggerFactory.getLogger(SvnBrowseCommand.class);
@@ -56,10 +56,10 @@ public class SvnBrowseCommand extends AbstractSvnCommand
}
@Override
- @SuppressWarnings("unchecked")
public BrowserResult getBrowserResult(BrowseCommandRequest request) {
String path = Strings.nullToEmpty(request.getPath());
long revisionNumber = SvnUtil.getRevisionNumber(request.getRevision(), repository);
+ boolean headRequest = revisionNumber < 0;
if (logger.isDebugEnabled()) {
logger.debug("browser repository {} in path \"{}\" at revision {}", repository, path, revisionNumber);
@@ -84,20 +84,19 @@ public class SvnBrowseCommand extends AbstractSvnCommand
traverse(svnRepository, revisionNumber, request, root, createBasePath(path));
}
-
- result = new BrowserResult(String.valueOf(revisionNumber), root);
+ result = new BrowserResult(String.valueOf(revisionNumber), headRequest ? "head" : String.valueOf(revisionNumber), root, headRequest);
} catch (SVNException ex) {
if (FS_NO_SUCH_REVISION.equals(ex.getErrorMessage().getErrorCode())) {
throw notFound(entity("Revision", Long.toString(revisionNumber)).in(this.repository));
}
- logger.error("could not open repository: " + repository.getNamespaceAndName(), ex);
+ logger.error("could not open repository: " + repository, ex);
}
return result;
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings({"unchecked", "rawtypes"})
private void traverse(SVNRepository svnRepository, long revisionNumber, BrowseCommandRequest request,
FileObject parent, String basePath)
throws SVNException {
diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnLogCommand.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnLogCommand.java
index 1197ca9679..f96ed802fc 100644
--- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnLogCommand.java
+++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnLogCommand.java
@@ -53,11 +53,16 @@ public class SvnLogCommand extends AbstractSvnCommand implements LogCommand {
}
try {
- long revisioNumber = parseRevision(revision, repository);
- Preconditions.checkArgument(revisioNumber > 0, "revision must be greater than zero: %d", revisioNumber);
+ long revisionNumber;
+ if ("head".equals(revision)) {
+ revisionNumber = -1;
+ } else {
+ revisionNumber = parseRevision(revision, repository);
+ Preconditions.checkArgument(revisionNumber > 0, "revision must be greater than zero: %d", revisionNumber);
+ }
SVNRepository repo = open();
- Collection entries = repo.log(null, null, revisioNumber,
- revisioNumber, true, true);
+ Collection entries = repo.log(null, null, revisionNumber,
+ revisionNumber, true, true);
if (Util.isNotEmpty(entries)) {
changeset = SvnUtil.createChangeset(entries.iterator().next());
@@ -70,7 +75,6 @@ public class SvnLogCommand extends AbstractSvnCommand implements LogCommand {
}
@Override
- @SuppressWarnings("unchecked")
public ChangesetPagingResult getChangesets(LogCommandRequest request) {
if (LOG.isDebugEnabled()) {
LOG.debug("fetch changesets for {}", request);
diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnModifyCommand.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnModifyCommand.java
index f222b293c1..6c59f76e14 100644
--- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnModifyCommand.java
+++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnModifyCommand.java
@@ -108,7 +108,7 @@ public class SvnModifyCommand implements ModifyCommand {
if (svnCommitInfo.toString().equals("EMPTY COMMIT")) {
throw new NoChangesMadeException(repository);
}
- return String.valueOf(svnCommitInfo.getNewRevision());
+ return "head";
} catch (SVNException e) {
throw withPattern(SVN_ERROR_PATTERN).forMessage(repository, e.getErrorMessage().getRootErrorMessage().getFullMessage());
}
diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBrowseCommandTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBrowseCommandTest.java
index f6ea870b98..482cde4f14 100644
--- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBrowseCommandTest.java
+++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBrowseCommandTest.java
@@ -27,7 +27,6 @@ import org.tmatesoft.svn.core.wc.SVNClientManager;
import org.tmatesoft.svn.core.wc.SVNRevision;
import sonia.scm.repository.BrowserResult;
import sonia.scm.repository.FileObject;
-import sonia.scm.repository.SubRepository;
import java.io.File;
import java.io.IOException;
@@ -38,7 +37,6 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
@@ -82,11 +80,6 @@ public class SvnBrowseCommandTest extends AbstractSvnCommandTestBase {
assertEquals("c", c.getPath());
}
- /**
- * Method description
- *
- * @throws IOException
- */
@Test
public void testBrowseSubDirectory() {
BrowseCommandRequest request = new BrowseCommandRequest();
@@ -286,6 +279,16 @@ public class SvnBrowseCommandTest extends AbstractSvnCommandTestBase {
assertTrue(containsSubRepository);
}
+ @Test
+ public void shouldGetHeadRevision() {
+ BrowseCommandRequest request = new BrowseCommandRequest();
+ request.setRevision("head");
+ BrowserResult browserResult = createCommand().getBrowserResult(request);
+
+ assertThat(browserResult.getRequestedRevision()).isEqualTo("head");
+ assertThat(browserResult.getRevision()).isEqualTo("5");
+ }
+
private SvnContext setProp(String propName, String propValue) throws SVNException, IOException {
SvnContext context = createContext();
SVNClientManager client = SVNClientManager.newInstance();
@@ -300,18 +303,14 @@ public class SvnBrowseCommandTest extends AbstractSvnCommandTestBase {
return context;
}
-
private SvnBrowseCommand createCommand() {
return new SvnBrowseCommand(createContext());
}
-
-
private FileObject getFileObject(Collection foList, String name) {
return foList.stream()
.filter(f -> name.equals(f.getName()))
.findFirst()
.orElseThrow(() -> new AssertionError("file " + name + " not found"));
}
-
}
diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnLogCommandTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnLogCommandTest.java
index 613e6ce8d5..c8cbe6ecfa 100644
--- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnLogCommandTest.java
+++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnLogCommandTest.java
@@ -25,11 +25,14 @@ import sonia.scm.repository.Modifications;
import java.util.stream.StreamSupport;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
-public class SvnLogCommandTest extends AbstractSvnCommandTestBase
-{
+public class SvnLogCommandTest extends AbstractSvnCommandTestBase {
@Test
public void testGetAll() {
@@ -179,9 +182,13 @@ public class SvnLogCommandTest extends AbstractSvnCommandTestBase
assertEquals("1", c2.getId());
}
+ @Test
+ public void shouldGetCorrectHeadRevision() {
+ Changeset changeset = createCommand().getChangeset("head", new LogCommandRequest());
+ assertEquals("5", changeset.getId());
+ }
- private SvnLogCommand createCommand()
- {
+ private SvnLogCommand createCommand() {
return new SvnLogCommand(createContext());
}
}
diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToFileObjectDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToFileObjectDtoMapper.java
index cd566a3465..430e607ed2 100644
--- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToFileObjectDtoMapper.java
+++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToFileObjectDtoMapper.java
@@ -40,7 +40,7 @@ public abstract class BrowserResultToFileObjectDtoMapper extends BaseFileObjectD
FileObjectDto map(BrowserResult browserResult, NamespaceAndName namespaceAndName, int offset) {
FileObjectDto fileObjectDto = fileObjectToDto(browserResult.getFile(), namespaceAndName, browserResult, offset);
- fileObjectDto.setRevision(browserResult.getRevision());
+ fileObjectDto.setRevision(browserResult.getRequestedRevision());
return fileObjectDto;
}
@@ -59,7 +59,7 @@ public abstract class BrowserResultToFileObjectDtoMapper extends BaseFileObjectD
applyEnrichers(appender, browserResult, namespaceAndName);
}
// we call enrichers, which are responsible for all file object top level browse result and its children
- applyEnrichers(appender, fileObject, namespaceAndName, browserResult, browserResult.getRevision());
+ applyEnrichers(appender, fileObject, namespaceAndName, browserResult, browserResult.getRequestedRevision());
}
Optional mapOptionalInstant(OptionalLong optionalLong) {