git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[JGIT PATCH 2/6] Add diff.Edit to describe an edit region within a file

From
Shawn O. Pearce <spearce@spearce.org>
Date
May 2, 2009, 02:08 UTC
Message-ID
<1241230127-28279-3-git-send-email-spearce@spearce.org>
In-Reply-To
<1241230127-28279-2-git-send-email-spearce@spearce.org>
From: Johannes E. Schindelin <johannes.schindelin@gmx.de>
This type represents a difference region detected between two files.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 .../tst/org/spearce/jgit/diff/EditTest.java        |  139 ++++++++++++++
 .../src/org/spearce/jgit/diff/Edit.java            |  189 ++++++++++++++++++++
 2 files changed, 328 insertions(+), 0 deletions(-)
 create mode 100644 org.spearce.jgit.test/tst/org/spearce/jgit/diff/EditTest.java
 create mode 100644 org.spearce.jgit/src/org/spearce/jgit/diff/Edit.java
diff --git a/org.spearce.jgit.test/tst/org/spearce/jgit/diff/EditTest.java b/org.spearce.jgit.test/tst/org/spearce/jgit/diff/EditTest.java
new file mode 100644
index 0000000..8f9b0e3
--- /dev/null
+++ b/org.spearce.jgit.test/tst/org/spearce/jgit/diff/EditTest.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2009, Google Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Git Development Community nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.spearce.jgit.diff;
+
+import junit.framework.TestCase;
+
+public class EditTest extends TestCase {
+	public void testCreate() {
+		final Edit e = new Edit(1, 2, 3, 4);
+		assertEquals(1, e.getBeginA());
+		assertEquals(2, e.getEndA());
+		assertEquals(3, e.getBeginB());
+		assertEquals(4, e.getEndB());
+	}
+
+	public void testCreateEmpty() {
+		final Edit e = new Edit(1, 3);
+		assertEquals(1, e.getBeginA());
+		assertEquals(1, e.getEndA());
+		assertEquals(3, e.getBeginB());
+		assertEquals(3, e.getEndB());
+	}
+
+	public void testSwap() {
+		final Edit e = new Edit(1, 2, 3, 4);
+		e.swap();
+		assertEquals(3, e.getBeginA());
+		assertEquals(4, e.getEndA());
+		assertEquals(1, e.getBeginB());
+		assertEquals(2, e.getEndB());
+	}
+
+	public void testType_Insert() {
+		final Edit e = new Edit(1, 1, 1, 2);
+		assertSame(Edit.Type.INSERT, e.getType());
+	}
+
+	public void testType_Delete() {
+		final Edit e = new Edit(1, 2, 1, 1);
+		assertSame(Edit.Type.DELETE, e.getType());
+	}
+
+	public void testType_Replace() {
+		final Edit e = new Edit(1, 2, 1, 4);
+		assertSame(Edit.Type.REPLACE, e.getType());
+	}
+
+	public void testType_Empty() {
+		assertSame(Edit.Type.EMPTY, new Edit(1, 1, 2, 2).getType());
+		assertSame(Edit.Type.EMPTY, new Edit(1, 2).getType());
+	}
+
+	public void testToString() {
+		final Edit e = new Edit(1, 2, 1, 4);
+		assertEquals("REPLACE(1-2,1-4)", e.toString());
+	}
+
+	public void testEquals1() {
+		final Edit e1 = new Edit(1, 2, 3, 4);
+		final Edit e2 = new Edit(1, 2, 3, 4);
+
+		assertTrue(e1.equals(e1));
+		assertTrue(e1.equals(e2));
+		assertTrue(e2.equals(e1));
+		assertEquals(e1.hashCode(), e2.hashCode());
+		assertFalse(e1.equals(""));
+	}
+
+	public void testNotEquals1() {
+		assertFalse(new Edit(1, 2, 3, 4).equals(new Edit(0, 2, 3, 4)));
+	}
+
+	public void testNotEquals2() {
+		assertFalse(new Edit(1, 2, 3, 4).equals(new Edit(1, 0, 3, 4)));
+	}
+
+	public void testNotEquals3() {
+		assertFalse(new Edit(1, 2, 3, 4).equals(new Edit(1, 2, 0, 4)));
+	}
+
+	public void testNotEquals4() {
+		assertFalse(new Edit(1, 2, 3, 4).equals(new Edit(1, 2, 3, 0)));
+	}
+
+	public void testExtendA() {
+		final Edit e = new Edit(1, 2, 1, 1);
+
+		e.extendA();
+		assertEquals(new Edit(1, 3, 1, 1), e);
+
+		e.extendA();
+		assertEquals(new Edit(1, 4, 1, 1), e);
+	}
+
+	public void testExtendB() {
+		final Edit e = new Edit(1, 2, 1, 1);
+
+		e.extendB();
+		assertEquals(new Edit(1, 2, 1, 2), e);
+
+		e.extendB();
+		assertEquals(new Edit(1, 2, 1, 3), e);
+	}
+}
diff --git a/org.spearce.jgit/src/org/spearce/jgit/diff/Edit.java b/org.spearce.jgit/src/org/spearce/jgit/diff/Edit.java
new file mode 100644
index 0000000..460e2c4
--- /dev/null
+++ b/org.spearce.jgit/src/org/spearce/jgit/diff/Edit.java
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2008, Johannes E. Schindelin <johannes.schindelin@gmx.de>
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Git Development Community nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.spearce.jgit.diff;
+
+/**
+ * A modified region detected between two versions of roughly the same content.
+ * <p>
+ * An edit covers the modified region only. It does not cover a common region.
+ * <p>
+ * Regions should be specified using 0 based notation, so add 1 to the start and
+ * end marks for line numbers in a file.
+ * <p>
+ * An edit where <code>beginA == endA && beginB < endB</code> is an insert edit,
+ * that is sequence B inserted the elements in region
+ * <code>[beginB, endB)</code> at <code>beginA</code>.
+ * <p>
+ * An edit where <code>beginA < endA && beginB == endB</code> is a delete edit,
+ * that is sequence B has removed the elements between
+ * <code>[beginA, endA)</code>.
+ * <p>
+ * An edit where <code>beginA < endA && beginB < endB</code> is a replace edit,
+ * that is sequence B has replaced the range of elements between
+ * <code>[beginA, endA)</code> with those found in <code>[beginB, endB)</code>.
+ */
+public class Edit {
+	/** Type of edit */
+	public static enum Type {
+		/** Sequence B has inserted the region. */
+		INSERT,
+
+		/** Sequence B has removed the region. */
+		DELETE,
+
+		/** Sequence B has replaced the region with different content. */
+		REPLACE,
+
+		/** Sequence A and B have zero length, describing nothing. */
+		EMPTY;
+	}
+
+	int beginA;
+
+	int endA;
+
+	int beginB;
+
+	int endB;
+
+	/**
+	 * Create a new empty edit.
+	 * 
+	 * @param as
+	 *            beginA: start and end of region in sequence A; 0 based.
+	 * @param bs
+	 *            beginB: start and end of region in sequence B; 0 based.
+	 */
+	public Edit(final int as, final int bs) {
+		this(as, as, bs, bs);
+	}
+
+	/**
+	 * Create a new edit.
+	 * 
+	 * @param as
+	 *            beginA: start of region in sequence A; 0 based.
+	 * @param ae
+	 *            endA: end of region in sequence A; must be >= as.
+	 * @param bs
+	 *            beginB: start of region in sequence B; 0 based.
+	 * @param be
+	 *            endB: end of region in sequence B; must be >= bs.
+	 */
+	public Edit(final int as, final int ae, final int bs, final int be) {
+		beginA = as;
+		endA = ae;
+
+		beginB = bs;
+		endB = be;
+	}
+
+	/** @return the type of this region */
+	public final Type getType() {
+		if (beginA == endA && beginB < endB)
+			return Type.INSERT;
+		if (beginA < endA && beginB == endB)
+			return Type.DELETE;
+		if (beginA == endA && beginB == endB)
+			return Type.EMPTY;
+		return Type.REPLACE;
+	}
+
+	/** @return start point in sequence A. */
+	public final int getBeginA() {
+		return beginA;
+	}
+
+	/** @return end point in sequence A. */
+	public final int getEndA() {
+		return endA;
+	}
+
+	/** @return start point in sequence B. */
+	public final int getBeginB() {
+		return beginB;
+	}
+
+	/** @return end point in sequence B. */
+	public final int getEndB() {
+		return endB;
+	}
+
+	/** Increase {@link #getEndA()} by 1. */
+	public void extendA() {
+		endA++;
+	}
+
+	/** Increase {@link #getEndB()} by 1. */
+	public void extendB() {
+		endB++;
+	}
+
+	/** Swap A and B, so the edit goes the other direction. */
+	public void swap() {
+		final int sBegin = beginA;
+		final int sEnd = endA;
+
+		beginA = beginB;
+		endA = endB;
+
+		beginB = sBegin;
+		endB = sEnd;
+	}
+
+	@Override
+	public int hashCode() {
+		return beginA ^ endA;
+	}
+
+	@Override
+	public boolean equals(final Object o) {
+		if (o instanceof Edit) {
+			final Edit e = (Edit) o;
+			return this.beginA == e.beginA && this.endA == e.endA
+					&& this.beginB == e.beginB && this.endB == e.endB;
+		}
+		return false;
+	}
+
+	@Override
+	public String toString() {
+		final Type t = getType();
+		return t + "(" + beginA + "-" + endA + "," + beginB + "-" + endB + ")";
+	}
+}
-- 
1.6.3.rc3.212.g8c698
Previous: Shawn O. PearceNext: Shawn O. Pearce
Message 3 of 15 in “Diff processing utilities”
  1. 0/6 Diff processing utilitiesShawn O. Pearce, May 2, 2009
  2. 1/6 Add set to IntListShawn O. Pearce, May 2, 2009
  3. 2/6 Add diff.Edit to describe an edit region within a fileShawn O. Pearce, May 2, 2009
  4. 3/6 Add diff.EditList to provide for a list of Edit instancesShawn O. Pearce, May 2, 2009
  5. 4/6 Add diff.RawText to index a file content for later comparesShawn O. Pearce, May 2, 2009
  6. 5/6 Teach FileHeader, HunkHeader how to create an EditListShawn O. Pearce, May 2, 2009
  7. 6/6 Add diff.DiffFormatter to create Git style unified patch scriptsShawn O. Pearce, May 2, 2009
  8. 6/6 Add diff.DiffFormatter to create Git style unified patch scriptsShawn O. Pearce, May 3, 2009
  9. 6/6 Add diff.DiffFormatter to create Git style unified patch scriptsShawn O. Pearce, May 3, 2009
  10. Robin RosenbergMay 3, 2009
  11. Shawn O. PearceMay 4, 2009
  12. Johannes SchindelinMay 4, 2009
  13. Shawn O. PearceMay 4, 2009
  14. Johannes SchindelinMay 4, 2009
  15. Johannes SchindelinMay 3, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.