Kaynağa Gözat

Enable calling of smudge filters when checking out paths

When checking out commits/branches JGit was triggering correctly
configured smudge filters. But when checking out paths (either from
index or from commits) JGit was not triggering smudge filters. Fix
CheckoutCommand to properly call filters.

Bug: 486560
Also-by: Pascal Krause <pascal.krausek@sap.com>
Change-Id: I5ff893054defe57ab12e201d901fe74e1376efea
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
tags/v4.3.0.201604071810-r
Christian Halstrick 8 yıl önce
ebeveyn
işleme
47dd98e362

+ 107
- 0
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java Dosyayı Görüntüle

assertEquals("fee\n", read("src/a.txt")); assertEquals("fee\n", read("src/a.txt"));
} }


@Test
public void testSmudgeFilter_deleteFileAndRestoreFromCommit()
throws IOException, GitAPIException {
File script = writeTempFile("sed s/o/e/g");
StoredConfig config = git.getRepository().getConfig();
config.setString("filter", "tstFilter", "smudge",
"sh " + slashify(script.getPath()));
config.save();

writeTrashFile("foo", "foo");
git.add().addFilepattern("foo").call();
git.commit().setMessage("initial").call();

writeTrashFile(".gitattributes", "*.txt filter=tstFilter");
git.add().addFilepattern(".gitattributes").call();
git.commit().setMessage("add filter").call();

writeTrashFile("src/a.tmp", "foo");
// Caution: we need a trailing '\n' since sed on mac always appends
// linefeeds if missing
writeTrashFile("src/a.txt", "foo\n");
git.add().addFilepattern("src/a.tmp").addFilepattern("src/a.txt")
.call();
RevCommit content = git.commit().setMessage("added content").call();

deleteTrashFile("src/a.txt");
git.checkout().setStartPoint(content.getName()).addPath("src/a.txt")
.call();

assertEquals(
"[.gitattributes, mode:100644, content:*.txt filter=tstFilter][Test.txt, mode:100644, content:Some change][foo, mode:100644, content:foo][src/a.tmp, mode:100644, content:foo][src/a.txt, mode:100644, content:foo\n]",
indexState(CONTENT));
assertEquals("foo", read("src/a.tmp"));
assertEquals("fee\n", read("src/a.txt"));
}

@Test
public void testSmudgeFilter_deleteFileAndRestoreFromIndex()
throws IOException, GitAPIException {
File script = writeTempFile("sed s/o/e/g");
StoredConfig config = git.getRepository().getConfig();
config.setString("filter", "tstFilter", "smudge",
"sh " + slashify(script.getPath()));
config.save();

writeTrashFile("foo", "foo");
git.add().addFilepattern("foo").call();
git.commit().setMessage("initial").call();

writeTrashFile(".gitattributes", "*.txt filter=tstFilter");
git.add().addFilepattern(".gitattributes").call();
git.commit().setMessage("add filter").call();

writeTrashFile("src/a.tmp", "foo");
// Caution: we need a trailing '\n' since sed on mac always appends
// linefeeds if missing
writeTrashFile("src/a.txt", "foo\n");
git.add().addFilepattern("src/a.tmp").addFilepattern("src/a.txt")
.call();
git.commit().setMessage("added content").call();

deleteTrashFile("src/a.txt");
git.checkout().addPath("src/a.txt").call();

assertEquals(
"[.gitattributes, mode:100644, content:*.txt filter=tstFilter][Test.txt, mode:100644, content:Some change][foo, mode:100644, content:foo][src/a.tmp, mode:100644, content:foo][src/a.txt, mode:100644, content:foo\n]",
indexState(CONTENT));
assertEquals("foo", read("src/a.tmp"));
assertEquals("fee\n", read("src/a.txt"));
}

@Test
public void testSmudgeFilter_deleteFileAndCreateBranchAndRestoreFromCommit()
throws IOException, GitAPIException {
File script = writeTempFile("sed s/o/e/g");
StoredConfig config = git.getRepository().getConfig();
config.setString("filter", "tstFilter", "smudge",
"sh " + slashify(script.getPath()));
config.save();

writeTrashFile("foo", "foo");
git.add().addFilepattern("foo").call();
git.commit().setMessage("initial").call();

writeTrashFile(".gitattributes", "*.txt filter=tstFilter");
git.add().addFilepattern(".gitattributes").call();
git.commit().setMessage("add filter").call();

writeTrashFile("src/a.tmp", "foo");
// Caution: we need a trailing '\n' since sed on mac always appends
// linefeeds if missing
writeTrashFile("src/a.txt", "foo\n");
git.add().addFilepattern("src/a.tmp").addFilepattern("src/a.txt")
.call();
RevCommit content = git.commit().setMessage("added content").call();

deleteTrashFile("src/a.txt");
git.checkout().setName("newBranch").setCreateBranch(true)
.setStartPoint(content).addPath("src/a.txt").call();

assertEquals(
"[.gitattributes, mode:100644, content:*.txt filter=tstFilter][Test.txt, mode:100644, content:Some change][foo, mode:100644, content:foo][src/a.tmp, mode:100644, content:foo][src/a.txt, mode:100644, content:foo\n]",
indexState(CONTENT));
assertEquals("foo", read("src/a.tmp"));
assertEquals("fee\n", read("src/a.txt"));
}

@Test @Test
@Ignore @Ignore
public void testSmudgeAndClean() throws IOException, GitAPIException { public void testSmudgeAndClean() throws IOException, GitAPIException {

+ 8
- 4
org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java Dosyayı Görüntüle

continue; continue;


final EolStreamType eolStreamType = treeWalk.getEolStreamType(); final EolStreamType eolStreamType = treeWalk.getEolStreamType();
final String filterCommand = treeWalk
.getFilterCommand(Constants.ATTR_FILTER_TYPE_SMUDGE);
editor.add(new PathEdit(path) { editor.add(new PathEdit(path) {
public void apply(DirCacheEntry ent) { public void apply(DirCacheEntry ent) {
int stage = ent.getStage(); int stage = ent.getStage();
if (checkoutStage != null) { if (checkoutStage != null) {
if (stage == checkoutStage.number) if (stage == checkoutStage.number)
checkoutPath(ent, r, new CheckoutMetadata( checkoutPath(ent, r, new CheckoutMetadata(
eolStreamType, null));
eolStreamType, filterCommand));
} else { } else {
UnmergedPathException e = new UnmergedPathException( UnmergedPathException e = new UnmergedPathException(
ent); ent);
throw new JGitInternalException(e.getMessage(), e); throw new JGitInternalException(e.getMessage(), e);
} }
} else { } else {
checkoutPath(ent, r,
new CheckoutMetadata(eolStreamType, null));
checkoutPath(ent, r, new CheckoutMetadata(eolStreamType,
filterCommand));
} }
} }
}); });
final ObjectId blobId = treeWalk.getObjectId(0); final ObjectId blobId = treeWalk.getObjectId(0);
final FileMode mode = treeWalk.getFileMode(0); final FileMode mode = treeWalk.getFileMode(0);
final EolStreamType eolStreamType = treeWalk.getEolStreamType(); final EolStreamType eolStreamType = treeWalk.getEolStreamType();
final String filterCommand = treeWalk
.getFilterCommand(Constants.ATTR_FILTER_TYPE_SMUDGE);
editor.add(new PathEdit(treeWalk.getPathString()) { editor.add(new PathEdit(treeWalk.getPathString()) {
public void apply(DirCacheEntry ent) { public void apply(DirCacheEntry ent) {
ent.setObjectId(blobId); ent.setObjectId(blobId);
ent.setFileMode(mode); ent.setFileMode(mode);
checkoutPath(ent, r, checkoutPath(ent, r,
new CheckoutMetadata(eolStreamType, null));
new CheckoutMetadata(eolStreamType, filterCommand));
} }
}); });
} }

Loading…
İptal
Kaydet