Browse Source
Bug: 361548 CQ: 6243 Change-Id: I08e1369e142bb19f42a8d7bbb5a7d062cc8533fc Signed-off-by: Chris Aniszczyk <zx@twitter.com>stable-2.0
Tomasz Zarna
13 years ago
committed by
Chris Aniszczyk
19 changed files with 807 additions and 0 deletions
@ -0,0 +1,9 @@ |
|||||||
|
diff --git a/A1 b/A1
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..de98044
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/A1
|
||||||
|
@@ -0,0 +1,3 @@
|
||||||
|
+a
|
||||||
|
+b
|
||||||
|
+c
|
@ -0,0 +1,3 @@ |
|||||||
|
a |
||||||
|
b |
||||||
|
c |
@ -0,0 +1,10 @@ |
|||||||
|
diff --git a/A2 b/A2
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..de98044
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/A2
|
||||||
|
@@ -0,0 +1,3 @@
|
||||||
|
+a
|
||||||
|
+b
|
||||||
|
+c
|
||||||
|
\ No newline at end of file
|
@ -0,0 +1,3 @@ |
|||||||
|
a |
||||||
|
b |
||||||
|
c |
@ -0,0 +1,9 @@ |
|||||||
|
diff --git a/D b/D
|
||||||
|
deleted file mode 100644
|
||||||
|
index a3648a1..0000000
|
||||||
|
--- a/D
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,3 +0,0 @@
|
||||||
|
-a
|
||||||
|
-b
|
||||||
|
-c
|
@ -0,0 +1,3 @@ |
|||||||
|
a |
||||||
|
b |
||||||
|
c |
@ -0,0 +1,4 @@ |
|||||||
|
@@ -2,2 +2,3 @@ a
|
||||||
|
b
|
||||||
|
+c
|
||||||
|
d
|
@ -0,0 +1,25 @@ |
|||||||
|
a |
||||||
|
b |
||||||
|
d |
||||||
|
e |
||||||
|
f |
||||||
|
g |
||||||
|
h |
||||||
|
i |
||||||
|
j |
||||||
|
k |
||||||
|
l |
||||||
|
m |
||||||
|
n |
||||||
|
o |
||||||
|
p |
||||||
|
q |
||||||
|
r |
||||||
|
s |
||||||
|
t |
||||||
|
u |
||||||
|
v |
||||||
|
w |
||||||
|
x |
||||||
|
y |
||||||
|
z |
@ -0,0 +1,8 @@ |
|||||||
|
diff --git a/F2 b/F2
|
||||||
|
index a3648a1..2d44096 100644
|
||||||
|
--- a/F2
|
||||||
|
+++ b/F2
|
||||||
|
@@ -2,2 +2,3 @@ a
|
||||||
|
B
|
||||||
|
+c
|
||||||
|
d
|
@ -0,0 +1,25 @@ |
|||||||
|
a |
||||||
|
b |
||||||
|
d |
||||||
|
e |
||||||
|
f |
||||||
|
g |
||||||
|
h |
||||||
|
i |
||||||
|
j |
||||||
|
k |
||||||
|
l |
||||||
|
m |
||||||
|
n |
||||||
|
o |
||||||
|
p |
||||||
|
q |
||||||
|
r |
||||||
|
s |
||||||
|
t |
||||||
|
u |
||||||
|
v |
||||||
|
w |
||||||
|
x |
||||||
|
y |
||||||
|
z |
@ -0,0 +1,191 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2011, 2012, Tomasz Zarna <Tomasz.Zarna@pl.ibm.com> |
||||||
|
* and other copyright owners as documented in the project's IP log. |
||||||
|
* |
||||||
|
* This program and the accompanying materials are made available |
||||||
|
* under the terms of the Eclipse Distribution License v1.0 which |
||||||
|
* accompanies this distribution, is reproduced below, and is |
||||||
|
* available at http://www.eclipse.org/org/documents/edl-v10.php
|
||||||
|
* |
||||||
|
* 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 Eclipse Foundation, Inc. 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.eclipse.jgit.api; |
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals; |
||||||
|
import static org.junit.Assert.assertFalse; |
||||||
|
import static org.junit.Assert.fail; |
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream; |
||||||
|
import java.io.File; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.InputStream; |
||||||
|
|
||||||
|
import org.eclipse.jgit.api.errors.PatchApplyException; |
||||||
|
import org.eclipse.jgit.api.errors.PatchFormatException; |
||||||
|
import org.eclipse.jgit.diff.DiffFormatterReflowTest; |
||||||
|
import org.eclipse.jgit.diff.RawText; |
||||||
|
import org.eclipse.jgit.lib.RepositoryTestCase; |
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
public class ApplyCommandTest extends RepositoryTestCase { |
||||||
|
|
||||||
|
private RawText a; |
||||||
|
|
||||||
|
private RawText b; |
||||||
|
|
||||||
|
private ApplyResult init(final String name) throws Exception { |
||||||
|
return init(name, true, true); |
||||||
|
} |
||||||
|
|
||||||
|
private ApplyResult init(final String name, final boolean preExists, |
||||||
|
final boolean postExists) throws Exception { |
||||||
|
Git git = new Git(db); |
||||||
|
|
||||||
|
if (preExists) { |
||||||
|
a = new RawText(readFile(name + "_PreImage")); |
||||||
|
write(new File(db.getDirectory().getParent(), name), |
||||||
|
a.getString(0, a.size(), false)); |
||||||
|
|
||||||
|
git.add().addFilepattern(name).call(); |
||||||
|
git.commit().setMessage("PreImage").call(); |
||||||
|
} |
||||||
|
|
||||||
|
if (postExists) |
||||||
|
b = new RawText(readFile(name + "_PostImage")); |
||||||
|
|
||||||
|
return git |
||||||
|
.apply() |
||||||
|
.setPatch( |
||||||
|
DiffFormatterReflowTest.class.getResourceAsStream(name |
||||||
|
+ ".patch")).call(); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testAddA1() throws Exception { |
||||||
|
ApplyResult result = init("A1", false, true); |
||||||
|
assertEquals(1, result.getUpdatedFiles().size()); |
||||||
|
assertEquals(new File(db.getWorkTree(), "A1"), result.getUpdatedFiles() |
||||||
|
.get(0)); |
||||||
|
checkFile(new File(db.getWorkTree(), "A1"), |
||||||
|
b.getString(0, b.size(), false)); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testAddA2() throws Exception { |
||||||
|
ApplyResult result = init("A2", false, true); |
||||||
|
assertEquals(1, result.getUpdatedFiles().size()); |
||||||
|
assertEquals(new File(db.getWorkTree(), "A2"), result.getUpdatedFiles() |
||||||
|
.get(0)); |
||||||
|
checkFile(new File(db.getWorkTree(), "A2"), |
||||||
|
b.getString(0, b.size(), false)); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testDeleteD() throws Exception { |
||||||
|
ApplyResult result = init("D", true, false); |
||||||
|
assertEquals(1, result.getUpdatedFiles().size()); |
||||||
|
assertEquals(new File(db.getWorkTree(), "D"), result.getUpdatedFiles() |
||||||
|
.get(0)); |
||||||
|
assertFalse(new File(db.getWorkTree(), "D").exists()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test(expected = PatchFormatException.class) |
||||||
|
public void testFailureF1() throws Exception { |
||||||
|
init("F1", true, false); |
||||||
|
} |
||||||
|
|
||||||
|
@Test(expected = PatchApplyException.class) |
||||||
|
public void testFailureF2() throws Exception { |
||||||
|
init("F2", true, false); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testModifyE() throws Exception { |
||||||
|
ApplyResult result = init("E"); |
||||||
|
assertEquals(1, result.getUpdatedFiles().size()); |
||||||
|
assertEquals(new File(db.getWorkTree(), "E"), result.getUpdatedFiles() |
||||||
|
.get(0)); |
||||||
|
checkFile(new File(db.getWorkTree(), "E"), |
||||||
|
b.getString(0, b.size(), false)); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testModifyX() throws Exception { |
||||||
|
ApplyResult result = init("X"); |
||||||
|
assertEquals(1, result.getUpdatedFiles().size()); |
||||||
|
assertEquals(new File(db.getWorkTree(), "X"), result.getUpdatedFiles() |
||||||
|
.get(0)); |
||||||
|
checkFile(new File(db.getWorkTree(), "X"), |
||||||
|
b.getString(0, b.size(), false)); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testModifyY() throws Exception { |
||||||
|
ApplyResult result = init("Y"); |
||||||
|
assertEquals(1, result.getUpdatedFiles().size()); |
||||||
|
assertEquals(new File(db.getWorkTree(), "Y"), result.getUpdatedFiles() |
||||||
|
.get(0)); |
||||||
|
checkFile(new File(db.getWorkTree(), "Y"), |
||||||
|
b.getString(0, b.size(), false)); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testModifyZ() throws Exception { |
||||||
|
ApplyResult result = init("Z"); |
||||||
|
assertEquals(1, result.getUpdatedFiles().size()); |
||||||
|
assertEquals(new File(db.getWorkTree(), "Z"), result.getUpdatedFiles() |
||||||
|
.get(0)); |
||||||
|
checkFile(new File(db.getWorkTree(), "Z"), |
||||||
|
b.getString(0, b.size(), false)); |
||||||
|
} |
||||||
|
|
||||||
|
private byte[] readFile(final String patchFile) throws IOException { |
||||||
|
final InputStream in = DiffFormatterReflowTest.class |
||||||
|
.getResourceAsStream(patchFile); |
||||||
|
if (in == null) { |
||||||
|
fail("No " + patchFile + " test vector"); |
||||||
|
return null; // Never happens
|
||||||
|
} |
||||||
|
try { |
||||||
|
final byte[] buf = new byte[1024]; |
||||||
|
final ByteArrayOutputStream temp = new ByteArrayOutputStream(); |
||||||
|
int n; |
||||||
|
while ((n = in.read(buf)) > 0) |
||||||
|
temp.write(buf, 0, n); |
||||||
|
return temp.toByteArray(); |
||||||
|
} finally { |
||||||
|
in.close(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,258 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2011, 2012, IBM Corporation and others. |
||||||
|
* and other copyright owners as documented in the project's IP log. |
||||||
|
* |
||||||
|
* This program and the accompanying materials are made available |
||||||
|
* under the terms of the Eclipse Distribution License v1.0 which |
||||||
|
* accompanies this distribution, is reproduced below, and is |
||||||
|
* available at http://www.eclipse.org/org/documents/edl-v10.php
|
||||||
|
* |
||||||
|
* 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 Eclipse Foundation, Inc. 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.eclipse.jgit.api; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.io.FileWriter; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.InputStream; |
||||||
|
import java.text.MessageFormat; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import org.eclipse.jgit.JGitText; |
||||||
|
import org.eclipse.jgit.api.errors.GitAPIException; |
||||||
|
import org.eclipse.jgit.api.errors.PatchApplyException; |
||||||
|
import org.eclipse.jgit.api.errors.PatchFormatException; |
||||||
|
import org.eclipse.jgit.diff.DiffEntry.ChangeType; |
||||||
|
import org.eclipse.jgit.diff.RawText; |
||||||
|
import org.eclipse.jgit.lib.Repository; |
||||||
|
import org.eclipse.jgit.patch.FileHeader; |
||||||
|
import org.eclipse.jgit.patch.HunkHeader; |
||||||
|
import org.eclipse.jgit.patch.Patch; |
||||||
|
import org.eclipse.jgit.util.FileUtils; |
||||||
|
import org.eclipse.jgit.util.IO; |
||||||
|
|
||||||
|
/** |
||||||
|
* Apply a patch to files and/or to the index. |
||||||
|
* |
||||||
|
* @see <a href="http://www.kernel.org/pub/software/scm/git/docs/git-apply.html" |
||||||
|
* >Git documentation about apply</a> |
||||||
|
*/ |
||||||
|
public class ApplyCommand extends GitCommand<ApplyResult> { |
||||||
|
|
||||||
|
private InputStream in; |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructs the command if the patch is to be applied to the index. |
||||||
|
* |
||||||
|
* @param repo |
||||||
|
*/ |
||||||
|
ApplyCommand(Repository repo) { |
||||||
|
super(repo); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @param in |
||||||
|
* the patch to apply |
||||||
|
* @return this instance |
||||||
|
*/ |
||||||
|
public ApplyCommand setPatch(InputStream in) { |
||||||
|
checkCallable(); |
||||||
|
this.in = in; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Executes the {@code ApplyCommand} command with all the options and |
||||||
|
* parameters collected by the setter methods (e.g. |
||||||
|
* {@link #setPatch(InputStream)} of this class. Each instance of this class
|
||||||
|
* should only be used for one invocation of the command. Don't call this |
||||||
|
* method twice on an instance. |
||||||
|
* |
||||||
|
* @return an {@link ApplyResult} object representing the command result |
||||||
|
*/ |
||||||
|
public ApplyResult call() throws GitAPIException { |
||||||
|
checkCallable(); |
||||||
|
ApplyResult r = new ApplyResult(); |
||||||
|
try { |
||||||
|
final Patch p = new Patch(); |
||||||
|
try { |
||||||
|
p.parse(in); |
||||||
|
} finally { |
||||||
|
in.close(); |
||||||
|
} |
||||||
|
if (!p.getErrors().isEmpty()) |
||||||
|
throw new PatchFormatException(p.getErrors()); |
||||||
|
for (FileHeader fh : p.getFiles()) { |
||||||
|
ChangeType type = fh.getChangeType(); |
||||||
|
File f = null; |
||||||
|
switch (type) { |
||||||
|
case ADD: |
||||||
|
f = getFile(fh.getNewPath(), true); |
||||||
|
apply(f, fh); |
||||||
|
break; |
||||||
|
case MODIFY: |
||||||
|
f = getFile(fh.getOldPath(), false); |
||||||
|
apply(f, fh); |
||||||
|
break; |
||||||
|
case DELETE: |
||||||
|
f = getFile(fh.getOldPath(), false); |
||||||
|
if (!f.delete()) |
||||||
|
throw new PatchApplyException(MessageFormat.format( |
||||||
|
JGitText.get().cannotDeleteFile, f)); |
||||||
|
break; |
||||||
|
case RENAME: |
||||||
|
f = getFile(fh.getOldPath(), false); |
||||||
|
File dest = getFile(fh.getNewPath(), false); |
||||||
|
if (!f.renameTo(dest)) |
||||||
|
throw new PatchApplyException(MessageFormat.format( |
||||||
|
JGitText.get().renameFileFailed, f, dest)); |
||||||
|
break; |
||||||
|
case COPY: |
||||||
|
f = getFile(fh.getOldPath(), false); |
||||||
|
byte[] bs = IO.readFully(f); |
||||||
|
FileWriter fw = new FileWriter(getFile(fh.getNewPath(), |
||||||
|
true)); |
||||||
|
fw.write(new String(bs)); |
||||||
|
fw.close(); |
||||||
|
} |
||||||
|
r.addUpdatedFile(f); |
||||||
|
} |
||||||
|
} catch (IOException e) { |
||||||
|
throw new PatchApplyException(MessageFormat.format( |
||||||
|
JGitText.get().patchApplyException, e.getMessage()), e); |
||||||
|
} |
||||||
|
setCallable(false); |
||||||
|
return r; |
||||||
|
} |
||||||
|
|
||||||
|
private File getFile(String path, boolean create) |
||||||
|
throws PatchApplyException { |
||||||
|
File f = new File(getRepository().getWorkTree(), path); |
||||||
|
if (create) |
||||||
|
try { |
||||||
|
FileUtils.createNewFile(f); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new PatchApplyException(MessageFormat.format( |
||||||
|
JGitText.get().createNewFileFailed, f), e); |
||||||
|
} |
||||||
|
return f; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @param f |
||||||
|
* @param fh |
||||||
|
* @throws IOException |
||||||
|
* @throws PatchApplyException |
||||||
|
*/ |
||||||
|
private void apply(File f, FileHeader fh) |
||||||
|
throws IOException, PatchApplyException { |
||||||
|
RawText rt = new RawText(f); |
||||||
|
List<String> oldLines = new ArrayList<String>(rt.size()); |
||||||
|
for (int i = 0; i < rt.size(); i++) |
||||||
|
oldLines.add(rt.getString(i)); |
||||||
|
List<String> newLines = new ArrayList<String>(oldLines); |
||||||
|
for (HunkHeader hh : fh.getHunks()) { |
||||||
|
StringBuilder hunk = new StringBuilder(); |
||||||
|
for (int j = hh.getStartOffset(); j < hh.getEndOffset(); j++) |
||||||
|
hunk.append((char) hh.getBuffer()[j]); |
||||||
|
RawText hrt = new RawText(hunk.toString().getBytes()); |
||||||
|
List<String> hunkLines = new ArrayList<String>(hrt.size()); |
||||||
|
for (int i = 0; i < hrt.size(); i++) |
||||||
|
hunkLines.add(hrt.getString(i)); |
||||||
|
int pos = 0; |
||||||
|
for (int j = 1; j < hunkLines.size(); j++) { |
||||||
|
String hunkLine = hunkLines.get(j); |
||||||
|
switch (hunkLine.charAt(0)) { |
||||||
|
case ' ': |
||||||
|
if (!newLines.get(hh.getNewStartLine() - 1 + pos).equals( |
||||||
|
hunkLine.substring(1))) { |
||||||
|
throw new PatchApplyException(MessageFormat.format( |
||||||
|
JGitText.get().patchApplyException, hh)); |
||||||
|
} |
||||||
|
pos++; |
||||||
|
break; |
||||||
|
case '-': |
||||||
|
if (!newLines.get(hh.getNewStartLine() - 1 + pos).equals( |
||||||
|
hunkLine.substring(1))) { |
||||||
|
throw new PatchApplyException(MessageFormat.format( |
||||||
|
JGitText.get().patchApplyException, hh)); |
||||||
|
} |
||||||
|
newLines.remove(hh.getNewStartLine() - 1 + pos); |
||||||
|
break; |
||||||
|
case '+': |
||||||
|
newLines.add(hh.getNewStartLine() - 1 + pos, |
||||||
|
hunkLine.substring(1)); |
||||||
|
pos++; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
if (!isNoNewlineAtEndOfFile(fh)) |
||||||
|
newLines.add(""); |
||||||
|
if (!rt.isMissingNewlineAtEnd()) |
||||||
|
oldLines.add(""); |
||||||
|
if (!isChanged(oldLines, newLines)) |
||||||
|
return; // don't touch the file
|
||||||
|
StringBuilder sb = new StringBuilder(); |
||||||
|
final String eol = rt.size() == 0 |
||||||
|
|| (rt.size() == 1 && rt.isMissingNewlineAtEnd()) ? "\n" : rt |
||||||
|
.getEOL(); |
||||||
|
for (String l : newLines) { |
||||||
|
sb.append(l); |
||||||
|
if (eol != null) |
||||||
|
sb.append(eol); |
||||||
|
} |
||||||
|
sb.deleteCharAt(sb.length() - 1); |
||||||
|
FileWriter fw = new FileWriter(f); |
||||||
|
fw.write(sb.toString()); |
||||||
|
fw.close(); |
||||||
|
} |
||||||
|
|
||||||
|
private boolean isChanged(List<String> ol, List<String> nl) { |
||||||
|
if (ol.size() != nl.size()) |
||||||
|
return true; |
||||||
|
for (int i = 0; i < ol.size(); i++) |
||||||
|
if (!ol.get(i).equals(nl.get(i))) |
||||||
|
return true; |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
private boolean isNoNewlineAtEndOfFile(FileHeader fh) { |
||||||
|
HunkHeader lastHunk = fh.getHunks().get(fh.getHunks().size() - 1); |
||||||
|
RawText lhrt = new RawText(lastHunk.getBuffer()); |
||||||
|
return lhrt.getString(lhrt.size() - 1).equals( |
||||||
|
"\\ No newline at end of file"); //$NON-NLS-1$
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,73 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2011, 2012 IBM Corporation and others. |
||||||
|
* and other copyright owners as documented in the project's IP log. |
||||||
|
* |
||||||
|
* This program and the accompanying materials are made available |
||||||
|
* under the terms of the Eclipse Distribution License v1.0 which |
||||||
|
* accompanies this distribution, is reproduced below, and is |
||||||
|
* available at http://www.eclipse.org/org/documents/edl-v10.php
|
||||||
|
* |
||||||
|
* 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 Eclipse Foundation, Inc. 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.eclipse.jgit.api; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* Encapsulates the result of a {@link ApplyCommand} |
||||||
|
*/ |
||||||
|
public class ApplyResult { |
||||||
|
|
||||||
|
private List<File> updatedFiles = new ArrayList<File>(); |
||||||
|
|
||||||
|
/** |
||||||
|
* @param f |
||||||
|
* an updated file |
||||||
|
* @return this instance |
||||||
|
*/ |
||||||
|
public ApplyResult addUpdatedFile(File f) { |
||||||
|
updatedFiles.add(f); |
||||||
|
return this; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @return updated files |
||||||
|
*/ |
||||||
|
public List<File> getUpdatedFiles() { |
||||||
|
return updatedFiles; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,69 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2012, IBM Corporation and others. |
||||||
|
* and other copyright owners as documented in the project's IP log. |
||||||
|
* |
||||||
|
* This program and the accompanying materials are made available |
||||||
|
* under the terms of the Eclipse Distribution License v1.0 which |
||||||
|
* accompanies this distribution, is reproduced below, and is |
||||||
|
* available at http://www.eclipse.org/org/documents/edl-v10.php
|
||||||
|
* |
||||||
|
* 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 Eclipse Foundation, Inc. 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.eclipse.jgit.api.errors; |
||||||
|
|
||||||
|
/** |
||||||
|
* Exception thrown when applying a patch fails |
||||||
|
* |
||||||
|
* @since 2.0 |
||||||
|
* |
||||||
|
*/ |
||||||
|
public class PatchApplyException extends GitAPIException { |
||||||
|
private static final long serialVersionUID = 1L; |
||||||
|
|
||||||
|
/** |
||||||
|
* @param message |
||||||
|
* @param cause |
||||||
|
*/ |
||||||
|
public PatchApplyException(String message, Throwable cause) { |
||||||
|
super(message, cause); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @param message |
||||||
|
*/ |
||||||
|
public PatchApplyException(String message) { |
||||||
|
super(message); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,77 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2012, IBM Corporation and others. |
||||||
|
* and other copyright owners as documented in the project's IP log. |
||||||
|
* |
||||||
|
* This program and the accompanying materials are made available |
||||||
|
* under the terms of the Eclipse Distribution License v1.0 which |
||||||
|
* accompanies this distribution, is reproduced below, and is |
||||||
|
* available at http://www.eclipse.org/org/documents/edl-v10.php
|
||||||
|
* |
||||||
|
* 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 Eclipse Foundation, Inc. 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.eclipse.jgit.api.errors; |
||||||
|
|
||||||
|
import java.text.MessageFormat; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import org.eclipse.jgit.JGitText; |
||||||
|
import org.eclipse.jgit.patch.FormatError; |
||||||
|
|
||||||
|
/** |
||||||
|
* Exception thrown when applying a patch fails due to an invalid format |
||||||
|
* |
||||||
|
* @since 2.0 |
||||||
|
* |
||||||
|
*/ |
||||||
|
public class PatchFormatException extends GitAPIException { |
||||||
|
private static final long serialVersionUID = 1L; |
||||||
|
|
||||||
|
private List<FormatError> errors; |
||||||
|
|
||||||
|
/** |
||||||
|
* @param errors |
||||||
|
*/ |
||||||
|
public PatchFormatException(List<FormatError> errors) { |
||||||
|
super(MessageFormat.format(JGitText.get().patchFormatException, errors)); |
||||||
|
this.errors = errors; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @return all the errors where unresolved conflicts have been detected |
||||||
|
*/ |
||||||
|
public List<FormatError> getErrors() { |
||||||
|
return errors; |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue