blob: e3bc85a512602b830e56f9691b6381f62eaa5fdb [file] [log] [blame]
/*
* Copyright (C) 2023 Thomas Wolf <twolf@apache.org> and others
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Distribution License v. 1.0 which is available at
* https://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
package org.eclipse.jgit.dircache;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThrows;
import java.io.File;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.ResetCommand.ResetType;
import org.eclipse.jgit.junit.RepositoryTestCase;
import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevBlob;
import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.Test;
/**
* Tests for checking out with invalid paths.
*/
public class InvalidPathCheckoutTest extends RepositoryTestCase {
private DirCacheEntry brokenEntry(String fileName, RevBlob blob) {
DirCacheEntry entry = new DirCacheEntry("XXXX/" + fileName);
entry.path[0] = '.';
entry.path[1] = 'g';
entry.path[2] = 'i';
entry.path[3] = 't';
entry.setFileMode(FileMode.REGULAR_FILE);
entry.setObjectId(blob);
return entry;
}
@Test
public void testCheckoutIntoDotGit() throws Exception {
try (TestRepository<Repository> repo = new TestRepository<>(db)) {
db.incrementOpen();
// DirCacheEntry does not allow any path component to contain
// ".git". C git also forbids this. But what if somebody creates
// such an entry explicitly?
RevCommit base = repo
.commit(repo.tree(brokenEntry("b", repo.blob("test"))));
try (Git git = new Git(db)) {
assertThrows(InvalidPathException.class, () -> git.reset()
.setMode(ResetType.HARD).setRef(base.name()).call());
File b = new File(new File(trash, ".git"), "b");
assertFalse(".git/b should not exist", b.exists());
}
}
}
}