From dbc58784e4b1f0faf57a39272eb2925bd0c89692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Mon, 11 May 2020 14:21:25 +0200 Subject: [PATCH] Fix path handling --- .../java/sonia/scm/repository/spi/Differ.java | 13 +++++++++---- .../scm/repository/spi/GitDiffCommand.java | 2 +- .../repository/spi/GitDiffCommandTest.java | 17 +++++++++++++++++ .../scm/repository/spi/scm-git-spi-test.zip | Bin 37734 -> 40559 bytes 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java index aa67268ac2..c8ed2e6e51 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java @@ -50,11 +50,13 @@ final class Differ implements AutoCloseable { private final RevWalk walk; private final TreeWalk treeWalk; private final RevCommit commit; + private final PathFilter pathFilter; - private Differ(RevCommit commit, RevWalk walk, TreeWalk treeWalk) { + private Differ(RevCommit commit, RevWalk walk, TreeWalk treeWalk, PathFilter pathFilter) { this.commit = commit; this.walk = walk; this.treeWalk = treeWalk; + this.pathFilter = pathFilter; } static Diff diff(Repository repository, DiffCommandRequest request) throws IOException { @@ -83,11 +85,11 @@ final class Differ implements AutoCloseable { treeWalk.reset(); treeWalk.setRecursive(true); + PathFilter pathFilter = null; if (Util.isNotEmpty(request.getPath())) { - treeWalk.setFilter(PathFilter.create(request.getPath())); + pathFilter = PathFilter.create(request.getPath()); } - if (!Strings.isNullOrEmpty(request.getAncestorChangeset())) { ObjectId otherRevision = repository.resolve(request.getAncestorChangeset()); ObjectId ancestorId = GitUtil.computeCommonAncestor(repository, revision, otherRevision); @@ -107,13 +109,16 @@ final class Differ implements AutoCloseable { treeWalk.addTree(commit.getTree()); - return new Differ(commit, walk, treeWalk); + return new Differ(commit, walk, treeWalk, pathFilter); } private Diff diff(Repository repository) throws IOException { DiffFormatter diffFormatter = new DiffFormatter(null); diffFormatter.setRepository(repository); diffFormatter.setDetectRenames(true); + if (pathFilter != null) { + diffFormatter.setPathFilter(pathFilter); + } List entries = diffFormatter.scan( treeWalk.getTree(0, AbstractTreeIterator.class), treeWalk.getTree(1, AbstractTreeIterator.class)); diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffCommand.java index 29c9f81b14..0e851456a7 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffCommand.java @@ -57,7 +57,7 @@ public class GitDiffCommand extends AbstractGitCommand implements DiffCommand { formatter.setRepository(repository); for (DiffEntry e : diff.getEntries()) { - if (!e.getOldId().equals(e.getNewId())) { + if (!e.getOldId().equals(e.getNewId()) || !e.getNewPath().equals(e.getOldPath())) { formatter.format(e); } } diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitDiffCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitDiffCommandTest.java index 042c1f3186..7a9e9f660e 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitDiffCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitDiffCommandTest.java @@ -24,11 +24,13 @@ package sonia.scm.repository.spi; +import org.assertj.core.api.Assertions; import org.junit.Test; import java.io.ByteArrayOutputStream; import java.io.IOException; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; public class GitDiffCommandTest extends AbstractGitCommandTestBase { @@ -140,4 +142,19 @@ public class GitDiffCommandTest extends AbstractGitCommandTestBase { gitDiffCommand.getDiffResult(diffCommandRequest).accept(output); assertEquals(DIFF_FILE_PARTIAL_MERGE, output.toString()); } + + @Test + public void diffBetweenTwoBranchesWithMovedFiles() throws IOException { + GitDiffCommand gitDiffCommand = new GitDiffCommand(createContext()); + DiffCommandRequest diffCommandRequest = new DiffCommandRequest(); + diffCommandRequest.setRevision("rename"); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + gitDiffCommand.getDiffResult(diffCommandRequest).accept(output); + assertThat(output.toString()) + .contains("similarity index 100%") + .contains("rename from a.txt") + .contains("rename to a-copy.txt") + .contains("rename from b.txt") + .contains("rename to b-copy.txt"); + } } diff --git a/scm-plugins/scm-git-plugin/src/test/resources/sonia/scm/repository/spi/scm-git-spi-test.zip b/scm-plugins/scm-git-plugin/src/test/resources/sonia/scm/repository/spi/scm-git-spi-test.zip index da166155a780700c719e046b5070e591b4434371..80483d04d1d77a446b75a353ad72e2f0a644f2f3 100644 GIT binary patch delta 5155 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 pB!JEngR~y{{jswFN6R9 delta 3037 zcmZWqc~Dem5`TPe!L=2BWh5P5%6gQJP=e4 z74(M(C@E8$tW~Zi%aUx?=*F{>wRB6_l&-htS|#d6D;2Y=wQ=9UywS@1^Sb-%?(f&X z?yu*E6XajNCq0u??fO&YgNb%G`Wu@bzQIOlEh=1!^2TRwfr{-^q6!-ly+KHj$5NaA zP1#qE4}IN{L8hqMjHk-6nw*EfDpgX3W~s)x$($}Vu zzh^WJlAfwl-ZAku1sgeJiDJiEf?@?67XVEO44!)cS>wG9p)g z)Gt~>jT?SXWv@&6NHisC4W3j81 z!UCo$_O}CM`}u&=um*(Sp}|`@(+An;UZD`X#ejduXt6!$fO1w~l+VO`9~x5xFd-U- z`85WSP`8jGsS7XjJ@7cj7cu!p^n`34CB+DtbOUUm-meWpQ>YX-bS>1!H8rBMrAZC_ z_zW@WP~~_xHwl&95{{0rY6W3svkns{WGEFhPWX><)*UWYJ#;VJT@DuKk&dv@UkP-H zCDlZ@C^|Q4chXQBS&VjbG(NY4;O}NnkJ8&$IFaV3789PEi|EH9cRJIT;+vne443Rejubfkmyg zz~ejhRjGWDwlA%95`|#~J>FoxRWdC|mZ?3Od|$Cebn0++N`|D1vBne^<@G5p#5YqO zDls2*>F`skv!_8QNn5R)-Ai*$WCG0A5HzQIdPE-WD0i~3cdC5;VCrW|%-IYXm)rvP zq4>jxSrM-dYZVir1>)t=-g^kSd#?2M6!u=+7uQx^2FIn1*q^1cR-R?a7(S`^mVh+T_)b-yK7w0KfiNQ5n%UeA#ae9={3 z;%U@T)Uw*84t%v@yio2~cr_TwJRQsprDUcb)-*68Z$X}vfs%h(>T%Ayew6dCM=F6` zWg_4BVc{x{So9cN#gq5+u<#r`qNmUmz~BQu91GW&$P0h`Wi?0G0C=t8Nn9W{uHi_1 zAcohJiS!Vi0ot`3DKo&nmM8f^xVCl{*%pM@Mve>zp}CPKfx-Au&=v$EuZbr@KaMx? zn#fQEP=Ylv0ZBC`k+#Za6R8eGYqJ1ISkTQJ88M-F9Zw8lIJ1tU%fl!HL@+2^&ywq5 z=v>bc(*)dHUxu_6lV)7_D@jumaJwY}&&)c!==G*c!zp-0GPt%O9P5^8aiUF4!Y5+q zMvlBS5npfQNoWM-wQ%&J2nwcX26tOnve%3Wn>hNGnZmvp28TAWz zKDDBF8%JJRabQ~+E^akxHZU$CQyHZ@$G4lvIR-bk^Xfk&yF9E*(cKk|tvihLlVl24 zGX$1*u!Kp0v74jUrckKJVsNmV)jUseMNM|)_3JUw*{KxF*$k?BSaLfRhkG~@o`x4a zJpE1@g*H}TemO2^1fj{a{tg}XTn9J^T3JQahxIQsNd3WstTq<|&=$iP}~bYLch z|4n1?QZV&pBBz(5?+B)Ic?`bjW$6o96bADdWbJ0jKsGk+=E&FC7~ahjuN)Na;fO5< zeS3H^oCED%p}D!R@8!v%TwD{hN4bdJ$CJoB9Nfo|>O4FZwB~$N^>O5MK92SAB&Pt0 z{T$g+fR=vVvu`>@RXH5hxVIuqdbXDRM*8}63MXwwRP1NT--_|>{xZ6<NvZ3H<|+ z$Ub1Czn?|n^4wra9}x7G>Ww0A7( QR;rcCN}?#;B5@P^AEBfjDF6Tf