[ https://issues.apache.org/jira/browse/SCM-1027?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jakob Vad Nielsen updated SCM-1027: ----------------------------------- Summary: Wrong implementation of git diff --cached (when endRevision set) (was: Wrong implementation of git diff, with --cached argument when endRevision set) > Wrong implementation of git diff --cached (when endRevision set) > ---------------------------------------------------------------- > > Key: SCM-1027 > URL: https://issues.apache.org/jira/browse/SCM-1027 > Project: Maven SCM > Issue Type: Bug > Components: maven-scm-provider-gitexe, maven-scm-provider-jgit > Affects Versions: 1.13.0, 2.0.0, 2.0.1, 2.1.0 > Reporter: Jakob Vad Nielsen > Priority: Major > > Hi, > The {{createCommandLine}} function In {{{}GitDiffCommand.java{}}}, has a > buggy implementation. The bug appears to have been there for a very long > time. It is triggered when giving both {{startRevision}} and {{endRevision}} > to this method (via {{{}executeDiffCommand{}}}) > [link to the method > |https://github.com/apache/maven-scm/blob/master/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/diff/GitDiffCommand.java#L75] > {code:java} > public static Commandline createCommandLine(File workingDirectory, ScmVersion > startVersion, ScmVersion endVersion, boolean cached) { > > Commandline cl = > GitCommandLineUtils.getBaseGitCommandLine(workingDirectory, "diff"); > if (cached) { > cl.createArg().setValue("--cached"); > } > if (startVersion != null && StringUtils.isNotEmpty(startVersion.getName())) > { > cl.createArg().setValue(startVersion.getName()); > } > if (endVersion != null && StringUtils.isNotEmpty(endVersion.getName())) { > cl.createArg().setValue(endVersion.getName()); > } > return cl; > } {code} > The problem is that both startRevision and endRevision are added as arguments > to git diff when the --cached flag is set. Git diff only supports one > argument in that case. It has been like that since the flag was introduced in > Git, long time ago. Setting an endRevision throws an exception, as the git > runtime fails with two arguments. > Reproduce by running this command in any repo: > {code:java} > git diff --cached HEAD~2 HEAD~1 {code} > From git doc: > {code:java} > git diff [<options>] --cached [--merge-base] [<commit>] [--] [<path>...] > This form is to view the changes you staged for the next commit > relative to the named <commit>. Typically you would want comparison with the > latest commit, so if you do not give <commit>, it defaults to HEAD. If HEAD > does not exist (e.g. unborn branches) and <commit> is not > given, it shows all staged changes. --staged is a synonym of > --cached. {code} > The easy fix would be to make sure the endVersion argument is not added when > the boolean cached argument is set to true. > But I do not think this is actually the problem. When I want to do a diff > between two revisions, I do not want to get a diff that also includes staged > changes (which is what --cached actually does). Actually, I do not want it at > all. I suspect that this diff command was introduced to solve special case > for the Maven Release Plugin, where you want to diff against a specific > commit AND make sure there are no staged commits. And then solved both > scenarios in the same executeDiffCommand. > In order for me to be able to use this code in my plugin (where I want to > diff between for example HEAD~3 and HEAD~2), I think there are two possible > solutions: > # Introduce a boolean parameter to the exeucteDiffCommand. Like > `includeCached` or `includeStagedChanges`. This way I could at least chose to > not include staged. > # Have two diff commands. DiffCommand and DiffCachedCommand. > I guess both variants in some way would introduce a breaking change, unless > new commands are added in addition to the existing one. > Just wanted to let you know. I can help out with a PR if this is something > you want to fix. If so, we need to agree on what the right solution would be. > -- This message was sent by Atlassian Jira (v8.20.10#820010)