Bug: 361548 CQ: 6243 Change-Id: I08e1369e142bb19f42a8d7bbb5a7d062cc8533fc Signed-off-by: Chris Aniszczyk <zx@twitter.com>tags/v2.0.0.201206130900-r
diff --git a/A1 b/A1 | |||||
new file mode 100644 | |||||
index 0000000..de98044 | |||||
--- /dev/null | |||||
+++ b/A1 | |||||
@@ -0,0 +1,3 @@ | |||||
+a | |||||
+b | |||||
+c |
a | |||||
b | |||||
c |
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 |
a | |||||
b | |||||
c |
diff --git a/D b/D | |||||
deleted file mode 100644 | |||||
index a3648a1..0000000 | |||||
--- a/D | |||||
+++ /dev/null | |||||
@@ -1,3 +0,0 @@ | |||||
-a | |||||
-b | |||||
-c |
a | |||||
b | |||||
c |
@@ -2,2 +2,3 @@ a | |||||
b | |||||
+c | |||||
d |
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 |
diff --git a/F2 b/F2 | |||||
index a3648a1..2d44096 100644 | |||||
--- a/F2 | |||||
+++ b/F2 | |||||
@@ -2,2 +2,3 @@ a | |||||
B | |||||
+c | |||||
d |
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 |
/* | |||||
* 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(); | |||||
} | |||||
} | |||||
} |
packObjectCountMismatch=Pack object count mismatch: pack {0} index {1}: {2} | packObjectCountMismatch=Pack object count mismatch: pack {0} index {1}: {2} | ||||
packTooLargeForIndexVersion1=Pack too large for index version 1 | packTooLargeForIndexVersion1=Pack too large for index version 1 | ||||
packWriterStatistics=Total {0,number,#0} (delta {1,number,#0}), reused {2,number,#0} (delta {3,number,#0}) | packWriterStatistics=Total {0,number,#0} (delta {1,number,#0}), reused {2,number,#0} (delta {3,number,#0}) | ||||
patchApplyException=Cannot apply: {0} | |||||
patchFormatException=Format error: {0} | |||||
pathIsNotInWorkingDir=Path is not in working dir | pathIsNotInWorkingDir=Path is not in working dir | ||||
pathNotConfigured=Submodule path is not configured | pathNotConfigured=Submodule path is not configured | ||||
peeledLineBeforeRef=Peeled line before ref. | peeledLineBeforeRef=Peeled line before ref. | ||||
renameBranchFailedBecauseTag=Can not rename as Ref {0} is a tag | renameBranchFailedBecauseTag=Can not rename as Ref {0} is a tag | ||||
renameBranchFailedUnknownReason=Rename failed with unknown reason | renameBranchFailedUnknownReason=Rename failed with unknown reason | ||||
renameBranchUnexpectedResult=Unexpected rename result {0} | renameBranchUnexpectedResult=Unexpected rename result {0} | ||||
renameFileFailed=Could not rename file {0} to {1} | |||||
renamesAlreadyFound=Renames have already been found. | renamesAlreadyFound=Renames have already been found. | ||||
renamesBreakingModifies=Breaking apart modified file pairs | renamesBreakingModifies=Breaking apart modified file pairs | ||||
renamesFindingByContent=Finding renames by content similarity | renamesFindingByContent=Finding renames by content similarity |
/***/ public String packObjectCountMismatch; | /***/ public String packObjectCountMismatch; | ||||
/***/ public String packTooLargeForIndexVersion1; | /***/ public String packTooLargeForIndexVersion1; | ||||
/***/ public String packWriterStatistics; | /***/ public String packWriterStatistics; | ||||
/***/ public String patchApplyException; | |||||
/***/ public String patchFormatException; | |||||
/***/ public String pathIsNotInWorkingDir; | /***/ public String pathIsNotInWorkingDir; | ||||
/***/ public String pathNotConfigured; | /***/ public String pathNotConfigured; | ||||
/***/ public String peeledLineBeforeRef; | /***/ public String peeledLineBeforeRef; | ||||
/***/ public String renameBranchFailedBecauseTag; | /***/ public String renameBranchFailedBecauseTag; | ||||
/***/ public String renameBranchFailedUnknownReason; | /***/ public String renameBranchFailedUnknownReason; | ||||
/***/ public String renameBranchUnexpectedResult; | /***/ public String renameBranchUnexpectedResult; | ||||
/***/ public String renameFileFailed; | |||||
/***/ public String renamesAlreadyFound; | /***/ public String renamesAlreadyFound; | ||||
/***/ public String renamesBreakingModifies; | /***/ public String renamesBreakingModifies; | ||||
/***/ public String renamesFindingByContent; | /***/ public String renamesFindingByContent; |
/* | |||||
* 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$ | |||||
} | |||||
} |
/* | |||||
* 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; | |||||
} | |||||
} |
return new StashApplyCommand(repo); | return new StashApplyCommand(repo); | ||||
} | } | ||||
/** | |||||
* Returns a command object to execute a {@code apply} command | |||||
* | |||||
* @see <a | |||||
* href="http://www.kernel.org/pub/software/scm/git/docs/git-apply.html" | |||||
* >Git documentation about apply</a> | |||||
* | |||||
* @return a {@link ApplyCommand} used to collect all optional parameters | |||||
* and to finally execute the {@code apply} command | |||||
*/ | |||||
public ApplyCommand apply() { | |||||
return new ApplyCommand(repo); | |||||
} | |||||
/** | /** | ||||
* @return the git repository this class is interacting with | * @return the git repository this class is interacting with | ||||
*/ | */ |
/* | |||||
* 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); | |||||
} | |||||
} |
/* | |||||
* 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; | |||||
} | |||||
} |
/** | /** | ||||
* Get the line delimiter for the first line. | * Get the line delimiter for the first line. | ||||
* | * | ||||
* @since 2.0 | |||||
* @return the line delimiter or <code>null</code> | * @return the line delimiter or <code>null</code> | ||||
*/ | */ | ||||
public String getLineDelimiter() { | public String getLineDelimiter() { | ||||
else | else | ||||
return "\n"; | return "\n"; | ||||
} | } | ||||
/** | |||||
* Get the EOL chars for the first line. | |||||
* | |||||
* @since 2.0 | |||||
* @return the EOL chars or <code>null</code> | |||||
*/ | |||||
public String getEOL() { | |||||
int e = getEnd(0); | |||||
if (content.length > 1 && content[e - 2] == '\r' | |||||
&& content[e - 1] == '\n') | |||||
return "\r\n"; | |||||
if (content.length > 0 && content[e - 1] == '\n') | |||||
return "\n"; | |||||
if (content.length > 0 && content[e - 1] == '\r') | |||||
return "\r"; | |||||
return null; | |||||
} | |||||
} | } |