From: "Shawn O. Pearce" <spearce@spearce.org>
To: Robin Rosenberg <robin.rosenberg@dewire.com>,
Johannes Schindelin <Johannes.Schindelin@gmx.de>
Cc: git@vger.kernel.org,
"Johannes E. Schindelin" <johannes.schindelin@gmx.de>
Subject: [JGIT PATCH 2/6] Add diff.Edit to describe an edit region within a file
Date: Fri, 1 May 2009 19:08:43 -0700 [thread overview]
Message-ID: <1241230127-28279-3-git-send-email-spearce@spearce.org> (raw)
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
next prev parent reply other threads:[~2009-05-02 2:09 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-02 2:08 [JGIT PATCH 0/6] Diff processing utilities Shawn O. Pearce
2009-05-02 2:08 ` [JGIT PATCH 1/6] Add set to IntList Shawn O. Pearce
2009-05-02 2:08 ` Shawn O. Pearce [this message]
2009-05-02 2:08 ` [JGIT PATCH 3/6] Add diff.EditList to provide for a list of Edit instances Shawn O. Pearce
2009-05-02 2:08 ` [JGIT PATCH 4/6] Add diff.RawText to index a file content for later compares Shawn O. Pearce
2009-05-02 2:08 ` [JGIT PATCH 5/6] Teach FileHeader, HunkHeader how to create an EditList Shawn O. Pearce
2009-05-02 2:08 ` [JGIT PATCH 6/6] Add diff.DiffFormatter to create Git style unified patch scripts Shawn O. Pearce
2009-05-03 0:03 ` [JGIT PATCH v2 " Shawn O. Pearce
2009-05-03 0:29 ` [JGIT PATCH v3 " Shawn O. Pearce
2009-05-03 7:07 ` [JGIT PATCH 1/6] Add set to IntList Robin Rosenberg
2009-05-04 14:22 ` Shawn O. Pearce
2009-05-04 14:50 ` Johannes Schindelin
2009-05-04 14:55 ` Shawn O. Pearce
2009-05-04 15:10 ` Johannes Schindelin
2009-05-03 14:24 ` [JGIT PATCH 0/6] Diff processing utilities Johannes Schindelin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1241230127-28279-3-git-send-email-spearce@spearce.org \
--to=spearce@spearce.org \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=robin.rosenberg@dewire.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).