Skip to content

Diff created with java-diff-utils cannot be applied with git apply if file is shorter than context #119

@lgrammel

Description

@lgrammel

Describe the bug
Diff cannot be applied with git apply

To Reproduce

  1. original content
const world: string = 'world',
      p: number | undefined = 42;

console.log(`Hello, ${world}!`);
  1. new content
const world: string = 'world';
const p: number | undefined = 42;

console.log(`Hello, ${world}!`);
  1. code to create diff (Kotlin)
/**
 * @param contextSize
 *        How many lines of context around each changed line should be included.
 */
class DiffFactory(private val contextSize: Int) {

    companion object {

        private const val LINE_SEPARATOR = "\n"
    }

    /**
     * Creates a git-apply compatible diff.
     */
    fun computeDiff(
        filename: String,
        originalContent: String,
        newContent: String
    ): String = UnifiedDiffUtils.generateUnifiedDiff(
        "a/$filename", // a/ and b/ required for git-apply compatibility
        "b/$filename",
        originalContent.split(LINE_SEPARATOR),
        DiffUtils.diff(
            originalContent, newContent,
            NullDiffAlgorithmListener
        ),
        contextSize
    ).joinToString(LINE_SEPARATOR)
}
  1. With contextSize = 3 the following diff gets created:
--- a/examples/unchain-variable-declaration.js
+++ b/examples/unchain-variable-declaration.js
@@ -1,5 +1,5 @@
-const world: string = 'world',
-      p: number | undefined = 42;
+const world: string = 'world';
+const p: number | undefined = 42;
 
 console.log(`Hello, ${world}!`);
 

(important: line with 1 space at the end - I've also added an empty newline to support git apply call from file instead of system in)
5. git apply fails

> git apply example.diff
error: patch failed: examples/unchain-variable-declaration.js:1
error: examples/unchain-variable-declaration.js: patch does not apply

Expected behavior
Git apply works with the following patch:

--- a/examples/unchain-variable-declaration.js
+++ b/examples/unchain-variable-declaration.js
@@ -1,4 +1,4 @@
-const world: string = 'world',
-      p: number | undefined = 42;
+const world: string = 'world';
+const p: number | undefined = 42;
 
 console.log(`Hello, ${world}!`);

The difference is that the index is limited to 1,4 (original input is 4 lines long).

System

  • Kotlin 1.4

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions