Merge "fix PackWriter excluded objects handling"

This commit is contained in:
Shawn Pearce 2012-06-04 11:08:12 -04:00 committed by Gerrit Code Review @ Eclipse.org
commit e83d096ec6
82 changed files with 851 additions and 454 deletions

View File

@ -110,7 +110,7 @@ public void execute() throws BuildException {
try {
clone.setURI(uri).setDirectory(destination).setBranch(branch).setBare(bare);
clone.call();
} catch (RuntimeException e) {
} catch (Exception e) {
log("Could not clone repository: " + e, e, Project.MSG_ERR);
throw new BuildException("Could not clone repository: " + e.getMessage(), e);
}

View File

@ -91,7 +91,7 @@ public void execute() throws BuildException {
InitCommand init = Git.init();
init.setBare(bare).setDirectory(destination);
init.call();
} catch (JGitInternalException e) {
} catch (Exception e) {
throw new BuildException("Could not initialize repository", e);
}
}

View File

@ -8,19 +8,20 @@ Bundle-Localization: plugin
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Import-Package: javax.servlet;version="[2.5.0,3.0.0)",
javax.servlet.http;version="[2.5.0,3.0.0)",
org.eclipse.jetty.continuation;version="[7.1.0,7.6.0)",
org.eclipse.jetty.http;version="[7.1.0,7.6.0)",
org.eclipse.jetty.http.security;version="[7.1.0,7.6.0)",
org.eclipse.jetty.io;version="[7.1.0,7.6.0)",
org.eclipse.jetty.security;version="[7.1.0,7.6.0)",
org.eclipse.jetty.security.authentication;version="[7.1.0,7.6.0)",
org.eclipse.jetty.server;version="[7.1.0,7.6.0)",
org.eclipse.jetty.server.handler;version="[7.1.0,7.6.0)",
org.eclipse.jetty.server.nio;version="[7.1.0,7.6.0)",
org.eclipse.jetty.servlet;version="[7.1.0,7.6.0)",
org.eclipse.jetty.util.component;version="[7.1.0,7.6.0)",
org.eclipse.jetty.util.log;version="[7.1.0,7.6.0)",
org.eclipse.jetty.util.thread;version="[7.1.0,7.6.0)",
org.eclipse.jetty.continuation;version="[7.6.0,8.0.0)",
org.eclipse.jetty.http;version="[7.6.0,8.0.0)",
org.eclipse.jetty.io;version="[7.6.0,8.0.0)",
org.eclipse.jetty.security;version="[7.6.0,8.0.0)",
org.eclipse.jetty.security.authentication;version="[7.6.0,8.0.0)",
org.eclipse.jetty.server;version="[7.6.0,8.0.0)",
org.eclipse.jetty.server.handler;version="[7.6.0,8.0.0)",
org.eclipse.jetty.server.nio;version="[7.6.0,8.0.0)",
org.eclipse.jetty.servlet;version="[7.6.0,8.0.0)",
org.eclipse.jetty.util;version="[7.6.0,8.0.0)",
org.eclipse.jetty.util.component;version="[7.6.0,8.0.0)",
org.eclipse.jetty.util.log;version="[7.6.0,8.0.0)",
org.eclipse.jetty.util.security;version="[7.6.0,8.0.0)",
org.eclipse.jetty.util.thread;version="[7.6.0,8.0.0)",
org.eclipse.jgit.errors;version="[2.0.0,2.1.0)",
org.eclipse.jgit.http.server;version="[2.0.0,2.1.0)",
org.eclipse.jgit.http.server.glue;version="[2.0.0,2.1.0)",

View File

@ -43,7 +43,6 @@
package org.eclipse.jgit.http.test;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@ -53,6 +52,7 @@
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.MultiException;
import org.eclipse.jgit.http.server.GitServlet;
import org.eclipse.jgit.junit.http.AppServer;
import org.eclipse.jgit.junit.http.MockServletConfig;
@ -100,15 +100,28 @@ public void testInitUnderContainer_NoBasePath() throws Exception {
ServletContextHandler app = server.addContext("/");
ServletHolder s = app.addServlet(GitServlet.class, "/git");
s.setInitOrder(1);
s.getServletHandler().setStartWithUnavailable(false);
server.setUp();
try {
server.setUp();
} catch (Exception e) {
Throwable why = null;
if (e instanceof MultiException) {
MultiException multi = (MultiException) e;
List<Throwable> reasons = multi.getThrowables();
why = reasons.get(0);
assertTrue("Expected ServletException",
why instanceof ServletException);
} else if (e instanceof ServletException)
why = e;
List<RecordingLogger.Warning> events = RecordingLogger.getWarnings();
assertFalse("Servlet started without base-path", events.isEmpty());
Throwable why = events.get(0).getCause();
assertTrue("Caught ServletException", why instanceof ServletException);
assertTrue("Wanted base-path", why.getMessage().contains("base-path"));
if (why != null) {
assertTrue("Wanted base-path",
why.getMessage().contains("base-path"));
return;
}
}
fail("Expected ServletException complaining about unset base-path");
}
@Test

View File

@ -9,19 +9,19 @@ Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Import-Package: javax.servlet;version="[2.5.0,3.0.0)",
javax.servlet.http;version="[2.5.0,3.0.0)",
org.eclipse.jetty.continuation;version="[7.1.0,7.6.0)",
org.eclipse.jetty.http;version="[7.1.0,7.6.0)",
org.eclipse.jetty.http.security;version="[7.1.0,7.6.0)",
org.eclipse.jetty.io;version="[7.1.0,7.6.0)",
org.eclipse.jetty.security;version="[7.1.0,7.6.0)",
org.eclipse.jetty.security.authentication;version="[7.1.0,7.6.0)",
org.eclipse.jetty.server;version="[7.1.0,7.6.0)",
org.eclipse.jetty.server.handler;version="[7.1.0,7.6.0)",
org.eclipse.jetty.server.nio;version="[7.1.0,7.6.0)",
org.eclipse.jetty.servlet;version="[7.1.0,7.6.0)",
org.eclipse.jetty.util.component;version="[7.1.0,7.6.0)",
org.eclipse.jetty.util.log;version="[7.1.0,7.6.0)",
org.eclipse.jetty.util.thread;version="[7.1.0,7.6.0)",
org.eclipse.jetty.continuation;version="[7.6.0,8.0.0)",
org.eclipse.jetty.http;version="[7.6.0,8.0.0)",
org.eclipse.jetty.io;version="[7.6.0,8.0.0)",
org.eclipse.jetty.security;version="[7.6.0,8.0.0)",
org.eclipse.jetty.security.authentication;version="[7.6.0,8.0.0)",
org.eclipse.jetty.server;version="[7.6.0,8.0.0)",
org.eclipse.jetty.server.handler;version="[7.6.0,8.0.0)",
org.eclipse.jetty.server.nio;version="[7.6.0,8.0.0)",
org.eclipse.jetty.servlet;version="[7.6.0,8.0.0)",
org.eclipse.jetty.util.component;version="[7.6.0,8.0.0)",
org.eclipse.jetty.util.log;version="[7.6.0,8.0.0)",
org.eclipse.jetty.util.security;version="[7.6.0,8.0.0)",
org.eclipse.jetty.util.thread;version="[7.6.0,8.0.0)",
org.eclipse.jgit.errors;version="[2.0.0,2.1.0)",
org.eclipse.jgit.http.server;version="[2.0.0,2.1.0)",
org.eclipse.jgit.http.server.resolver;version="[2.0.0,2.1.0)",

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2010, Google Inc.
* Copyright (C) 2010, 2012 Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
@ -54,8 +54,6 @@
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jetty.http.security.Constraint;
import org.eclipse.jetty.http.security.Password;
import org.eclipse.jetty.security.Authenticator;
import org.eclipse.jetty.security.ConstraintMapping;
import org.eclipse.jetty.security.ConstraintSecurityHandler;
@ -67,7 +65,8 @@
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.util.security.Constraint;
import org.eclipse.jetty.util.security.Password;
import org.eclipse.jgit.transport.URIish;
/**
@ -112,17 +111,6 @@ public AppServer() {
throw new RuntimeException("Cannot find localhost", e);
}
// We need a handful of threads in the thread pool, otherwise
// our tests will deadlock when they can't open enough requests.
// In theory we only need 1 concurrent connection at a time, but
// I suspect the JRE isn't doing request pipelining on existing
// connections like we want it to.
//
final QueuedThreadPool pool = new QueuedThreadPool();
pool.setMinThreads(1);
pool.setMaxThreads(4);
pool.setMaxQueued(8);
contexts = new ContextHandlerCollection();
log = new TestRequestLog();
@ -130,11 +118,7 @@ public AppServer() {
server = new Server();
server.setConnectors(new Connector[] { connector });
server.setThreadPool(pool);
server.setHandler(log);
server.setStopAtShutdown(false);
server.setGracefulShutdown(0);
}
/**

View File

@ -63,7 +63,7 @@
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>2.0.0-SNAPSHOT</version>
<version>${project.version}</version>
</dependency>
</dependencies>

View File

@ -63,17 +63,17 @@
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit.junit</artifactId>
<version>2.0.0-SNAPSHOT</version>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit.junit.http</artifactId>
<version>2.0.0-SNAPSHOT</version>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit.http.server</artifactId>
<version>2.0.0-SNAPSHOT</version>
<version>${project.version}</version>
</dependency>
</dependencies>

View File

@ -64,22 +64,22 @@
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>2.0.0-SNAPSHOT</version>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit.junit</artifactId>
<version>2.0.0-SNAPSHOT</version>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit.junit.http</artifactId>
<version>2.0.0-SNAPSHOT</version>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit.http.server</artifactId>
<version>2.0.0-SNAPSHOT</version>
<version>${project.version}</version>
</dependency>
</dependencies>

View File

@ -60,6 +60,7 @@
<properties>
<tycho-version>0.14.1</tycho-version>
<jetty-version>7.6.0.v20120127</jetty-version>
<eclipse-site>http://download.eclipse.org/releases/indigo</eclipse-site>
</properties>
@ -76,6 +77,11 @@
<layout>p2</layout>
<url>${eclipse-site}</url>
</repository>
<repository>
<id>jetty</id>
<layout>p2</layout>
<url>http://download.eclipse.org/jetty/updates/jetty-bundles-7.x/${jetty-version}/</url>
</repository>
</repositories>
<dependencies>
@ -83,7 +89,7 @@
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>2.0.0-SNAPSHOT</version>
<version>${project.version}</version>
<classifier>sources</classifier>
</dependency>
</dependencies>

View File

@ -52,6 +52,7 @@
import java.io.IOException;
import java.io.PrintWriter;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.NoFilepatternException;
import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.dircache.DirCacheBuilder;
@ -72,7 +73,7 @@
public class AddCommandTest extends RepositoryTestCase {
@Test
public void testAddNothing() {
public void testAddNothing() throws GitAPIException {
Git git = new Git(db);
try {
@ -85,7 +86,7 @@ public void testAddNothing() {
}
@Test
public void testAddNonExistingSingleFile() throws NoFilepatternException {
public void testAddNonExistingSingleFile() throws GitAPIException {
Git git = new Git(db);
DirCache dc = git.add().addFilepattern("a.txt").call();
@ -94,7 +95,7 @@ public void testAddNonExistingSingleFile() throws NoFilepatternException {
}
@Test
public void testAddExistingSingleFile() throws IOException, NoFilepatternException {
public void testAddExistingSingleFile() throws IOException, GitAPIException {
File file = new File(db.getWorkTree(), "a.txt");
FileUtils.createNewFile(file);
PrintWriter writer = new PrintWriter(file);
@ -112,7 +113,7 @@ public void testAddExistingSingleFile() throws IOException, NoFilepatternExcepti
@Test
public void testAddExistingSingleSmallFileWithNewLine() throws IOException,
NoFilepatternException {
GitAPIException {
File file = new File(db.getWorkTree(), "a.txt");
FileUtils.createNewFile(file);
PrintWriter writer = new PrintWriter(file);
@ -136,7 +137,7 @@ public void testAddExistingSingleSmallFileWithNewLine() throws IOException,
@Test
public void testAddExistingSingleMediumSizeFileWithNewLine()
throws IOException, NoFilepatternException {
throws IOException, GitAPIException {
File file = new File(db.getWorkTree(), "a.txt");
FileUtils.createNewFile(file);
StringBuilder data = new StringBuilder();
@ -165,7 +166,7 @@ public void testAddExistingSingleMediumSizeFileWithNewLine()
@Test
public void testAddExistingSingleBinaryFile() throws IOException,
NoFilepatternException {
GitAPIException {
File file = new File(db.getWorkTree(), "a.txt");
FileUtils.createNewFile(file);
PrintWriter writer = new PrintWriter(file);
@ -188,7 +189,8 @@ public void testAddExistingSingleBinaryFile() throws IOException,
}
@Test
public void testAddExistingSingleFileInSubDir() throws IOException, NoFilepatternException {
public void testAddExistingSingleFileInSubDir() throws IOException,
GitAPIException {
FileUtils.mkdir(new File(db.getWorkTree(), "sub"));
File file = new File(db.getWorkTree(), "sub/a.txt");
FileUtils.createNewFile(file);
@ -206,7 +208,8 @@ public void testAddExistingSingleFileInSubDir() throws IOException, NoFilepatter
}
@Test
public void testAddExistingSingleFileTwice() throws IOException, NoFilepatternException {
public void testAddExistingSingleFileTwice() throws IOException,
GitAPIException {
File file = new File(db.getWorkTree(), "a.txt");
FileUtils.createNewFile(file);
PrintWriter writer = new PrintWriter(file);

View File

@ -466,9 +466,7 @@ public void testCreationImplicitStart() throws JGitInternalException,
public Ref createBranch(Git actGit, String name, boolean force,
String startPoint, SetupUpstreamMode mode)
throws JGitInternalException, RefAlreadyExistsException,
RefNotFoundException,
InvalidRefNameException {
throws JGitInternalException, GitAPIException {
CreateBranchCommand cmd = actGit.branchCreate();
cmd.setName(name);
cmd.setForce(force);

View File

@ -56,11 +56,11 @@
import java.io.IOException;
import org.eclipse.jgit.api.CheckoutResult.Status;
import org.eclipse.jgit.api.errors.CheckoutConflictException;
import org.eclipse.jgit.api.errors.InvalidRefNameException;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.RefAlreadyExistsException;
import org.eclipse.jgit.api.errors.RefNotFoundException;
import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.dircache.DirCacheEntry;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.RefUpdate;
@ -127,9 +127,7 @@ public void testCreateBranchOnCheckout() throws Exception {
}
@Test
public void testCheckoutToNonExistingBranch() throws JGitInternalException,
RefAlreadyExistsException, InvalidRefNameException,
CheckoutConflictException {
public void testCheckoutToNonExistingBranch() throws GitAPIException {
try {
git.checkout().setName("badbranch").call();
fail("Should have failed");
@ -223,8 +221,7 @@ public void testCheckoutRemoteTrackingWithoutLocalBranch() throws Exception {
@Test
public void testDetachedHeadOnCheckout() throws JGitInternalException,
RefAlreadyExistsException, RefNotFoundException,
InvalidRefNameException, IOException, CheckoutConflictException {
IOException, GitAPIException {
CheckoutCommand co = git.checkout();
co.setName("master").call();
@ -236,4 +233,41 @@ public void testDetachedHeadOnCheckout() throws JGitInternalException,
assertFalse(head.isSymbolic());
assertSame(head, head.getTarget());
}
@Test
public void testUpdateSmudgedEntries() throws Exception {
git.branchCreate().setName("test2").call();
RefUpdate rup = db.updateRef(Constants.HEAD);
rup.link("refs/heads/test2");
File file = new File(db.getWorkTree(), "Test.txt");
long size = file.length();
long mTime = file.lastModified() - 5000L;
assertTrue(file.setLastModified(mTime));
DirCache cache = DirCache.lock(db.getIndexFile(), db.getFS());
DirCacheEntry entry = cache.getEntry("Test.txt");
assertNotNull(entry);
entry.setLength(0);
entry.setLastModified(0);
cache.write();
assertTrue(cache.commit());
cache = DirCache.read(db.getIndexFile(), db.getFS());
entry = cache.getEntry("Test.txt");
assertNotNull(entry);
assertEquals(0, entry.getLength());
assertEquals(0, entry.getLastModified());
db.getIndexFile().setLastModified(
db.getIndexFile().lastModified() - 5000);
assertNotNull(git.checkout().setName("test").call());
cache = DirCache.read(db.getIndexFile(), db.getFS());
entry = cache.getEntry("Test.txt");
assertNotNull(entry);
assertEquals(size, entry.getLength());
assertEquals(mTime, entry.getLastModified());
}
}

View File

@ -44,10 +44,10 @@
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.Set;
import java.util.TreeSet;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.errors.NoWorkTreeException;
import org.eclipse.jgit.lib.RepositoryTestCase;
import org.junit.Before;
@ -75,7 +75,7 @@ public void setUp() throws Exception {
}
@Test
public void testClean() throws NoWorkTreeException, IOException {
public void testClean() throws NoWorkTreeException, GitAPIException {
// create status
StatusCommand command = git.status();
Status status = command.call();
@ -94,7 +94,8 @@ public void testClean() throws NoWorkTreeException, IOException {
}
@Test
public void testCleanWithPaths() throws NoWorkTreeException, IOException {
public void testCleanWithPaths() throws NoWorkTreeException,
GitAPIException {
// create status
StatusCommand command = git.status();
Status status = command.call();
@ -114,7 +115,8 @@ public void testCleanWithPaths() throws NoWorkTreeException, IOException {
}
@Test
public void testCleanWithDryRun() throws NoWorkTreeException, IOException {
public void testCleanWithDryRun() throws NoWorkTreeException,
GitAPIException {
// create status
StatusCommand command = git.status();
Status status = command.call();

View File

@ -55,6 +55,7 @@
import java.util.Map;
import org.eclipse.jgit.api.ListBranchCommand.ListMode;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.lib.ConfigConstants;
@ -103,7 +104,8 @@ public void setUp() throws Exception {
}
@Test
public void testCloneRepository() throws IOException {
public void testCloneRepository() throws IOException,
JGitInternalException, GitAPIException {
File directory = createTempDirectory("testCloneRepository");
CloneCommand command = Git.cloneRepository();
command.setDirectory(directory);
@ -131,7 +133,8 @@ public void testCloneRepository() throws IOException {
}
@Test
public void testCloneRepositoryWithBranch() throws IOException {
public void testCloneRepositoryWithBranch() throws IOException,
JGitInternalException, GitAPIException {
File directory = createTempDirectory("testCloneRepositoryWithBranch");
CloneCommand command = Git.cloneRepository();
command.setBranch("refs/heads/master");
@ -178,7 +181,8 @@ public void testCloneRepositoryWithBranch() throws IOException {
}
@Test
public void testCloneRepositoryOnlyOneBranch() throws IOException {
public void testCloneRepositoryOnlyOneBranch() throws IOException,
JGitInternalException, GitAPIException {
File directory = createTempDirectory("testCloneRepositoryWithBranch");
CloneCommand command = Git.cloneRepository();
command.setBranch("refs/heads/master");
@ -222,7 +226,7 @@ public static String allRefNames(List<Ref> refs) {
@Test
public void testCloneRepositoryWhenDestinationDirectoryExistsAndIsNotEmpty()
throws IOException {
throws IOException, JGitInternalException, GitAPIException {
String dirName = "testCloneTargetDirectoryNotEmpty";
File directory = createTempDirectory(dirName);
CloneCommand command = Git.cloneRepository();

View File

@ -50,15 +50,12 @@
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.NoFilepatternException;
import org.eclipse.jgit.api.errors.NoHeadException;
import org.eclipse.jgit.api.errors.NoMessageException;
import org.eclipse.jgit.api.errors.WrongRepositoryStateException;
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.errors.UnmergedPathException;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.PersonIdent;
@ -77,9 +74,8 @@
*/
public class CommitAndLogCommandTests extends RepositoryTestCase {
@Test
public void testSomeCommits() throws NoHeadException, NoMessageException,
ConcurrentRefUpdateException, JGitInternalException,
WrongRepositoryStateException, IOException {
public void testSomeCommits() throws JGitInternalException, IOException,
GitAPIException {
// do 4 commits
Git git = new Git(db);
@ -115,9 +111,8 @@ public void testSomeCommits() throws NoHeadException, NoMessageException,
}
@Test
public void testLogWithFilter() throws IOException, NoFilepatternException,
NoHeadException, NoMessageException, ConcurrentRefUpdateException,
JGitInternalException, WrongRepositoryStateException {
public void testLogWithFilter() throws IOException, JGitInternalException,
GitAPIException {
Git git = new Git(db);
@ -170,9 +165,7 @@ public void testLogWithFilter() throws IOException, NoFilepatternException,
// try to do a commit without specifying a message. Should fail!
@Test
public void testWrongParams() throws UnmergedPathException,
NoHeadException, ConcurrentRefUpdateException,
JGitInternalException, WrongRepositoryStateException {
public void testWrongParams() throws GitAPIException {
Git git = new Git(db);
try {
git.commit().setAuthor(author).call();
@ -185,10 +178,7 @@ public void testWrongParams() throws UnmergedPathException,
// try to work with Commands after command has been invoked. Should throw
// exceptions
@Test
public void testMultipleInvocations() throws NoHeadException,
ConcurrentRefUpdateException, NoMessageException,
UnmergedPathException, JGitInternalException,
WrongRepositoryStateException {
public void testMultipleInvocations() throws GitAPIException {
Git git = new Git(db);
CommitCommand commitCmd = git.commit();
commitCmd.setMessage("initial commit").call();
@ -211,9 +201,8 @@ public void testMultipleInvocations() throws NoHeadException,
}
@Test
public void testMergeEmptyBranches() throws IOException, NoHeadException,
NoMessageException, ConcurrentRefUpdateException,
JGitInternalException, WrongRepositoryStateException {
public void testMergeEmptyBranches() throws IOException,
JGitInternalException, GitAPIException {
Git git = new Git(db);
git.commit().setMessage("initial commit").call();
RefUpdate r = db.updateRef("refs/heads/side");
@ -235,10 +224,8 @@ public void testMergeEmptyBranches() throws IOException, NoHeadException,
}
@Test
public void testAddUnstagedChanges() throws IOException, NoHeadException,
NoMessageException, ConcurrentRefUpdateException,
JGitInternalException, WrongRepositoryStateException,
NoFilepatternException {
public void testAddUnstagedChanges() throws IOException,
JGitInternalException, GitAPIException {
File file = new File(db.getWorkTree(), "a.txt");
FileUtils.createNewFile(file);
PrintWriter writer = new PrintWriter(file);
@ -268,9 +255,7 @@ public void testAddUnstagedChanges() throws IOException, NoHeadException,
}
@Test
public void testModeChange() throws IOException, NoFilepatternException,
NoHeadException, NoMessageException, ConcurrentRefUpdateException,
JGitInternalException, WrongRepositoryStateException {
public void testModeChange() throws IOException, GitAPIException {
Git git = new Git(db);
// create file
@ -298,10 +283,9 @@ public void testModeChange() throws IOException, NoFilepatternException,
}
@Test
public void testCommitRange() throws NoHeadException, NoMessageException,
UnmergedPathException, ConcurrentRefUpdateException,
JGitInternalException, WrongRepositoryStateException,
IncorrectObjectTypeException, MissingObjectException {
public void testCommitRange() throws GitAPIException,
JGitInternalException, MissingObjectException,
IncorrectObjectTypeException {
// do 4 commits and set the range to the second and fourth one
Git git = new Git(db);
git.commit().setMessage("first commit").call();
@ -334,9 +318,8 @@ public void testCommitRange() throws NoHeadException, NoMessageException,
}
@Test
public void testCommitAmend() throws NoHeadException, NoMessageException,
ConcurrentRefUpdateException, JGitInternalException,
WrongRepositoryStateException, IOException {
public void testCommitAmend() throws JGitInternalException, IOException,
GitAPIException {
Git git = new Git(db);
git.commit().setMessage("first comit").call(); // typo
git.commit().setAmend(true).setMessage("first commit").call();
@ -357,10 +340,8 @@ public void testCommitAmend() throws NoHeadException, NoMessageException,
}
@Test
public void testInsertChangeId() throws NoHeadException,
NoMessageException,
UnmergedPathException, ConcurrentRefUpdateException,
JGitInternalException, WrongRepositoryStateException {
public void testInsertChangeId() throws JGitInternalException,
GitAPIException {
Git git = new Git(db);
String messageHeader = "Some header line\n\nSome detail explanation\n";
String changeIdTemplate = "\nChange-Id: I"

View File

@ -50,6 +50,7 @@
import java.util.List;
import org.eclipse.jgit.diff.DiffEntry;
import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.FileMode;
@ -258,4 +259,110 @@ public void commitSubmoduleUpdate() throws Exception {
assertEquals(path, subDiff.getNewPath());
assertEquals(path, subDiff.getOldPath());
}
@Test
public void commitUpdatesSmudgedEntries() throws Exception {
Git git = new Git(db);
File file1 = writeTrashFile("file1.txt", "content1");
assertTrue(file1.setLastModified(file1.lastModified() - 5000));
File file2 = writeTrashFile("file2.txt", "content2");
assertTrue(file2.setLastModified(file2.lastModified() - 5000));
File file3 = writeTrashFile("file3.txt", "content3");
assertTrue(file3.setLastModified(file3.lastModified() - 5000));
assertNotNull(git.add().addFilepattern("file1.txt")
.addFilepattern("file2.txt").addFilepattern("file3.txt").call());
RevCommit commit = git.commit().setMessage("add files").call();
assertNotNull(commit);
DirCache cache = DirCache.read(db.getIndexFile(), db.getFS());
int file1Size = cache.getEntry("file1.txt").getLength();
int file2Size = cache.getEntry("file2.txt").getLength();
int file3Size = cache.getEntry("file3.txt").getLength();
ObjectId file2Id = cache.getEntry("file2.txt").getObjectId();
ObjectId file3Id = cache.getEntry("file3.txt").getObjectId();
assertTrue(file1Size > 0);
assertTrue(file2Size > 0);
assertTrue(file3Size > 0);
// Smudge entries
cache = DirCache.lock(db.getIndexFile(), db.getFS());
cache.getEntry("file1.txt").setLength(0);
cache.getEntry("file2.txt").setLength(0);
cache.getEntry("file3.txt").setLength(0);
cache.write();
assertTrue(cache.commit());
// Verify entries smudged
cache = DirCache.read(db.getIndexFile(), db.getFS());
assertEquals(0, cache.getEntry("file1.txt").getLength());
assertEquals(0, cache.getEntry("file2.txt").getLength());
assertEquals(0, cache.getEntry("file3.txt").getLength());
long indexTime = db.getIndexFile().lastModified();
db.getIndexFile().setLastModified(indexTime - 5000);
write(file1, "content4");
assertTrue(file1.setLastModified(file1.lastModified() + 1000));
assertNotNull(git.commit().setMessage("edit file").setOnly("file1.txt")
.call());
cache = db.readDirCache();
assertEquals(file1Size, cache.getEntry("file1.txt").getLength());
assertEquals(file2Size, cache.getEntry("file2.txt").getLength());
assertEquals(file3Size, cache.getEntry("file3.txt").getLength());
assertEquals(file2Id, cache.getEntry("file2.txt").getObjectId());
assertEquals(file3Id, cache.getEntry("file3.txt").getObjectId());
}
@Test
public void commitIgnoresSmudgedEntryWithDifferentId() throws Exception {
Git git = new Git(db);
File file1 = writeTrashFile("file1.txt", "content1");
assertTrue(file1.setLastModified(file1.lastModified() - 5000));
File file2 = writeTrashFile("file2.txt", "content2");
assertTrue(file2.setLastModified(file2.lastModified() - 5000));
assertNotNull(git.add().addFilepattern("file1.txt")
.addFilepattern("file2.txt").call());
RevCommit commit = git.commit().setMessage("add files").call();
assertNotNull(commit);
DirCache cache = DirCache.read(db.getIndexFile(), db.getFS());
int file1Size = cache.getEntry("file1.txt").getLength();
int file2Size = cache.getEntry("file2.txt").getLength();
assertTrue(file1Size > 0);
assertTrue(file2Size > 0);
writeTrashFile("file2.txt", "content3");
assertNotNull(git.add().addFilepattern("file2.txt").call());
writeTrashFile("file2.txt", "content4");
// Smudge entries
cache = DirCache.lock(db.getIndexFile(), db.getFS());
cache.getEntry("file1.txt").setLength(0);
cache.getEntry("file2.txt").setLength(0);
cache.write();
assertTrue(cache.commit());
// Verify entries smudged
cache = db.readDirCache();
assertEquals(0, cache.getEntry("file1.txt").getLength());
assertEquals(0, cache.getEntry("file2.txt").getLength());
long indexTime = db.getIndexFile().lastModified();
db.getIndexFile().setLastModified(indexTime - 5000);
write(file1, "content5");
assertTrue(file1.setLastModified(file1.lastModified() + 1000));
assertNotNull(git.commit().setMessage("edit file").setOnly("file1.txt")
.call());
cache = db.readDirCache();
assertEquals(file1Size, cache.getEntry("file1.txt").getLength());
assertEquals(0, cache.getEntry("file2.txt").getLength());
}
}

View File

@ -48,6 +48,8 @@
import java.io.IOException;
import org.eclipse.jgit.api.ListBranchCommand.ListMode;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryTestCase;
@ -84,7 +86,7 @@ public void tearDown() throws Exception {
}
@Test
public void testWrap() {
public void testWrap() throws JGitInternalException, GitAPIException {
Git git = Git.wrap(db);
assertEquals(1, git.branchList().call().size());
@ -101,7 +103,8 @@ public void testWrap() {
}
@Test
public void testOpen() throws IOException {
public void testOpen() throws IOException, JGitInternalException,
GitAPIException {
Git git = Git.open(db.getDirectory());
assertEquals(1, git.branchList().call().size());

View File

@ -48,6 +48,8 @@
import java.io.File;
import java.io.IOException;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryTestCase;
import org.junit.Before;
@ -62,7 +64,8 @@ public void setUp() throws Exception {
}
@Test
public void testInitRepository() throws IOException {
public void testInitRepository() throws IOException, JGitInternalException,
GitAPIException {
File directory = createTempDirectory("testInitRepository");
InitCommand command = new InitCommand();
command.setDirectory(directory);
@ -72,7 +75,8 @@ public void testInitRepository() throws IOException {
}
@Test
public void testInitNonEmptyRepository() throws IOException {
public void testInitNonEmptyRepository() throws IOException,
JGitInternalException, GitAPIException {
File directory = createTempDirectory("testInitRepository2");
File someFile = new File(directory, "someFile");
someFile.createNewFile();
@ -86,7 +90,8 @@ public void testInitNonEmptyRepository() throws IOException {
}
@Test
public void testInitBareRepository() throws IOException {
public void testInitBareRepository() throws IOException,
JGitInternalException, GitAPIException {
File directory = createTempDirectory("testInitBareRepository");
InitCommand command = new InitCommand();
command.setDirectory(directory);

View File

@ -293,7 +293,8 @@ public void testConflictFreeWithSingleFile() throws Exception {
// change third line in topic branch
writeTrashFile(FILE1, "1\n2\n3\ntopic\n");
git.add().addFilepattern(FILE1).call();
git.commit().setMessage("change file1 in topic").call();
RevCommit origHead = git.commit().setMessage("change file1 in topic")
.call();
RebaseResult res = git.rebase().setUpstream("refs/heads/master").call();
assertEquals(Status.OK, res.getStatus());
@ -302,6 +303,7 @@ public void testConflictFreeWithSingleFile() throws Exception {
assertEquals("refs/heads/topic", db.getFullBranch());
assertEquals(lastMasterChange, new RevWalk(db).parseCommit(
db.resolve(Constants.HEAD)).getParent(0));
assertEquals(origHead, db.readOrigHead());
}
@Test

View File

@ -54,12 +54,8 @@
import java.io.PrintWriter;
import org.eclipse.jgit.api.ResetCommand.ResetType;
import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.NoFilepatternException;
import org.eclipse.jgit.api.errors.NoHeadException;
import org.eclipse.jgit.api.errors.NoMessageException;
import org.eclipse.jgit.api.errors.WrongRepositoryStateException;
import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.dircache.DirCacheEntry;
import org.eclipse.jgit.errors.AmbiguousObjectException;
@ -87,9 +83,8 @@ public class ResetCommandTest extends RepositoryTestCase {
private DirCacheEntry prestage;
public void setupRepository() throws IOException, NoFilepatternException,
NoHeadException, NoMessageException, ConcurrentRefUpdateException,
JGitInternalException, WrongRepositoryStateException {
public void setupRepository() throws IOException, JGitInternalException,
GitAPIException {
// create initial commit
git = new Git(db);
@ -138,9 +133,7 @@ public void setupRepository() throws IOException, NoFilepatternException,
@Test
public void testHardReset() throws JGitInternalException,
AmbiguousObjectException, IOException, NoFilepatternException,
NoHeadException, NoMessageException, ConcurrentRefUpdateException,
WrongRepositoryStateException {
AmbiguousObjectException, IOException, GitAPIException {
setupRepository();
ObjectId prevHead = db.resolve(Constants.HEAD);
git.reset().setMode(ResetType.HARD).setRef(initialCommit.getName())
@ -156,11 +149,12 @@ public void testHardReset() throws JGitInternalException,
assertFalse(inHead(fileInIndexPath));
assertFalse(inIndex(indexFile.getName()));
assertReflog(prevHead, head);
assertEquals(prevHead, db.readOrigHead());
}
@Test
public void testResetToNonexistingHEAD() throws JGitInternalException,
AmbiguousObjectException, IOException {
AmbiguousObjectException, IOException, GitAPIException {
// create a file in the working tree of a fresh repo
git = new Git(db);
@ -176,9 +170,7 @@ public void testResetToNonexistingHEAD() throws JGitInternalException,
@Test
public void testSoftReset() throws JGitInternalException,
AmbiguousObjectException, IOException, NoFilepatternException,
NoHeadException, NoMessageException, ConcurrentRefUpdateException,
WrongRepositoryStateException {
AmbiguousObjectException, IOException, GitAPIException {
setupRepository();
ObjectId prevHead = db.resolve(Constants.HEAD);
git.reset().setMode(ResetType.SOFT).setRef(initialCommit.getName())
@ -194,13 +186,12 @@ public void testSoftReset() throws JGitInternalException,
assertFalse(inHead(fileInIndexPath));
assertTrue(inIndex(indexFile.getName()));
assertReflog(prevHead, head);
assertEquals(prevHead, db.readOrigHead());
}
@Test
public void testMixedReset() throws JGitInternalException,
AmbiguousObjectException, IOException, NoFilepatternException,
NoHeadException, NoMessageException, ConcurrentRefUpdateException,
WrongRepositoryStateException {
AmbiguousObjectException, IOException, GitAPIException {
setupRepository();
ObjectId prevHead = db.resolve(Constants.HEAD);
git.reset().setMode(ResetType.MIXED).setRef(initialCommit.getName())
@ -217,6 +208,49 @@ public void testMixedReset() throws JGitInternalException,
assertFalse(inIndex(indexFile.getName()));
assertReflog(prevHead, head);
assertEquals(prevHead, db.readOrigHead());
}
@Test
public void testMixedResetRetainsSizeAndModifiedTime() throws Exception {
git = new Git(db);
writeTrashFile("a.txt", "a").setLastModified(
System.currentTimeMillis() - 60 * 1000);
assertNotNull(git.add().addFilepattern("a.txt").call());
assertNotNull(git.commit().setMessage("a commit").call());
writeTrashFile("b.txt", "b").setLastModified(
System.currentTimeMillis() - 60 * 1000);
assertNotNull(git.add().addFilepattern("b.txt").call());
RevCommit commit2 = git.commit().setMessage("b commit").call();
assertNotNull(commit2);
DirCache cache = db.readDirCache();
DirCacheEntry aEntry = cache.getEntry("a.txt");
assertNotNull(aEntry);
assertTrue(aEntry.getLength() > 0);
assertTrue(aEntry.getLastModified() > 0);
DirCacheEntry bEntry = cache.getEntry("b.txt");
assertNotNull(bEntry);
assertTrue(bEntry.getLength() > 0);
assertTrue(bEntry.getLastModified() > 0);
git.reset().setMode(ResetType.MIXED).setRef(commit2.getName()).call();
cache = db.readDirCache();
DirCacheEntry mixedAEntry = cache.getEntry("a.txt");
assertNotNull(mixedAEntry);
assertEquals(aEntry.getLastModified(), mixedAEntry.getLastModified());
assertEquals(aEntry.getLastModified(), mixedAEntry.getLastModified());
DirCacheEntry mixedBEntry = cache.getEntry("b.txt");
assertNotNull(mixedBEntry);
assertEquals(bEntry.getLastModified(), mixedBEntry.getLastModified());
assertEquals(bEntry.getLastModified(), mixedBEntry.getLastModified());
}
@Test

View File

@ -46,8 +46,8 @@
import java.io.IOException;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.NoFilepatternException;
import org.eclipse.jgit.lib.RepositoryTestCase;
import org.junit.Before;
import org.junit.Test;
@ -71,7 +71,7 @@ public void setUp() throws Exception {
@Test
public void testRemove() throws JGitInternalException,
NoFilepatternException, IllegalStateException, IOException {
IllegalStateException, IOException, GitAPIException {
assertEquals("[test.txt, mode:100644, content:Hello world]",
indexState(CONTENT));
RmCommand command = git.rm();

View File

@ -52,13 +52,15 @@
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.NoFilepatternException;
import org.eclipse.jgit.errors.NoWorkTreeException;
import org.eclipse.jgit.lib.RepositoryTestCase;
import org.junit.Test;
public class StatusCommandTest extends RepositoryTestCase {
@Test
public void testEmptyStatus() throws IOException {
public void testEmptyStatus() throws NoWorkTreeException,
GitAPIException {
Git git = new Git(db);
Status stat = git.status().call();

View File

@ -48,15 +48,9 @@
import java.io.IOException;
import java.util.List;
import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.InvalidTagNameException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.NoHeadException;
import org.eclipse.jgit.api.errors.NoMessageException;
import org.eclipse.jgit.api.errors.WrongRepositoryStateException;
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.errors.UnmergedPathException;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryTestCase;
@ -67,10 +61,7 @@
public class TagCommandTest extends RepositoryTestCase {
@Test
public void testTaggingOnHead() throws NoHeadException, NoMessageException,
ConcurrentRefUpdateException, JGitInternalException,
WrongRepositoryStateException, InvalidTagNameException,
MissingObjectException, IncorrectObjectTypeException, IOException {
public void testTaggingOnHead() throws GitAPIException, IOException {
Git git = new Git(db);
RevCommit commit = git.commit().setMessage("initial commit").call();
Ref tagRef = git.tag().setName("tag").call();
@ -80,10 +71,7 @@ public void testTaggingOnHead() throws NoHeadException, NoMessageException,
}
@Test
public void testTagging() throws NoHeadException, NoMessageException,
UnmergedPathException, ConcurrentRefUpdateException,
JGitInternalException, WrongRepositoryStateException,
InvalidTagNameException {
public void testTagging() throws GitAPIException, JGitInternalException {
Git git = new Git(db);
git.commit().setMessage("initial commit").call();
RevCommit commit = git.commit().setMessage("second commit").call();
@ -93,9 +81,7 @@ public void testTagging() throws NoHeadException, NoMessageException,
}
@Test
public void testEmptyTagName() throws NoHeadException, NoMessageException,
UnmergedPathException, ConcurrentRefUpdateException,
JGitInternalException, WrongRepositoryStateException {
public void testEmptyTagName() throws GitAPIException {
Git git = new Git(db);
git.commit().setMessage("initial commit").call();
try {
@ -108,10 +94,7 @@ public void testEmptyTagName() throws NoHeadException, NoMessageException,
}
@Test
public void testInvalidTagName() throws NoHeadException,
NoMessageException, UnmergedPathException,
ConcurrentRefUpdateException, JGitInternalException,
WrongRepositoryStateException {
public void testInvalidTagName() throws GitAPIException {
Git git = new Git(db);
git.commit().setMessage("initial commit").call();
try {
@ -123,10 +106,7 @@ public void testInvalidTagName() throws NoHeadException,
}
@Test
public void testFailureOnSignedTags() throws NoHeadException,
NoMessageException, UnmergedPathException,
ConcurrentRefUpdateException, JGitInternalException,
WrongRepositoryStateException, InvalidTagNameException {
public void testFailureOnSignedTags() throws GitAPIException {
Git git = new Git(db);
git.commit().setMessage("initial commit").call();
try {

View File

@ -46,14 +46,8 @@
import java.util.Arrays;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.CheckoutConflictException;
import org.eclipse.jgit.api.errors.InvalidRefNameException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.RefAlreadyExistsException;
import org.eclipse.jgit.api.errors.RefNotFoundException;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.dircache.InvalidPathException;
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.junit.MockSystemReader;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.util.SystemReader;
@ -338,20 +332,11 @@ private void testMaliciousPathGoodSecondCheckout(String... paths) throws Excepti
* perform the actual test on the second checkout
* @param path
* to the blob, one or more levels
* @throws GitAPIException
* @throws IOException
* @throws RefAlreadyExistsException
* @throws RefNotFoundException
* @throws InvalidRefNameException
* @throws MissingObjectException
* @throws IncorrectObjectTypeException
* @throws CheckoutConflictException
* @throws JGitInternalException
*/
private void testMaliciousPath(boolean good, boolean secondCheckout, String... path)
throws IOException, RefAlreadyExistsException,
RefNotFoundException, InvalidRefNameException,
MissingObjectException, IncorrectObjectTypeException,
JGitInternalException, CheckoutConflictException {
private void testMaliciousPath(boolean good, boolean secondCheckout,
String... path) throws GitAPIException, IOException {
Git git = new Git(db);
ObjectInserter newObjectInserter;
newObjectInserter = git.getRepository().newObjectInserter();

View File

@ -59,7 +59,7 @@
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.MergeResult;
import org.eclipse.jgit.api.MergeResult.MergeStatus;
import org.eclipse.jgit.api.errors.NoFilepatternException;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.dircache.DirCacheEditor;
import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
@ -139,7 +139,7 @@ public void testRemoved() throws IOException {
}
@Test
public void testModified() throws IOException, NoFilepatternException {
public void testModified() throws IOException, GitAPIException {
writeTrashFile("file2", "file2");
writeTrashFile("dir/file3", "dir/file3");
@ -291,8 +291,7 @@ public void testConflictingFromMultipleCreations() throws Exception {
}
@Test
public void testUnchangedSimple() throws IOException,
NoFilepatternException {
public void testUnchangedSimple() throws IOException, GitAPIException {
writeTrashFile("a.b", "a.b");
writeTrashFile("a.c", "a.c");
writeTrashFile("a=c", "a=c");
@ -328,11 +327,10 @@ public void testUnchangedSimple() throws IOException,
* used by Git.
*
* @throws IOException
* @throws NoFilepatternException
* @throws GitAPIException
*/
@Test
public void testUnchangedComplex() throws IOException,
NoFilepatternException {
public void testUnchangedComplex() throws IOException, GitAPIException {
Git git = new Git(db);
writeTrashFile("a.b", "a.b");
writeTrashFile("a.c", "a.c");

View File

@ -63,10 +63,14 @@
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.junit.JGitTestUtil;
import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.junit.TestRepository.BranchBuilder;
import org.eclipse.jgit.lib.NullProgressMonitor;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectInserter;
import org.eclipse.jgit.lib.SampleDataRepositoryTestCase;
import org.eclipse.jgit.revwalk.RevBlob;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevObject;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.storage.file.PackIndex.MutableEntry;
@ -447,6 +451,68 @@ public void testWriteIndex() throws Exception {
}
}
@Test
public void testExclude() throws Exception {
FileRepository repo = createBareRepository();
TestRepository<FileRepository> testRepo = new TestRepository<FileRepository>(
repo);
BranchBuilder bb = testRepo.branch("refs/heads/master");
RevBlob contentA = testRepo.blob("A");
RevCommit c1 = bb.commit().add("f", contentA).create();
testRepo.getRevWalk().parseHeaders(c1);
PackIndex pf1 = writePack(repo, Collections.singleton(c1),
Collections.<PackIndex> emptySet());
assertContent(
pf1,
Arrays.asList(c1.getId(), c1.getTree().getId(),
contentA.getId()));
RevBlob contentB = testRepo.blob("B");
RevCommit c2 = bb.commit().add("f", contentB).create();
testRepo.getRevWalk().parseHeaders(c2);
PackIndex pf2 = writePack(repo, Collections.singleton(c2),
Collections.singleton(pf1));
assertContent(
pf2,
Arrays.asList(c2.getId(), c2.getTree().getId(),
contentB.getId()));
}
private void assertContent(PackIndex pi, List<ObjectId> expected) {
assertEquals("Pack index has wrong size.", expected.size(),
pi.getObjectCount());
for (int i = 0; i < pi.getObjectCount(); i++)
assertTrue(
"Pack index didn't contain the expected id "
+ pi.getObjectId(i),
expected.contains(pi.getObjectId(i)));
}
private PackIndex writePack(FileRepository repo,
Set<? extends ObjectId> want, Set<PackIndex> excludeObjects)
throws IOException {
PackWriter pw = new PackWriter(repo);
pw.setDeltaBaseAsOffset(true);
pw.setReuseDeltaCommits(false);
for (PackIndex idx : excludeObjects)
pw.excludeObjects(idx);
pw.preparePack(NullProgressMonitor.INSTANCE, want,
Collections.<ObjectId> emptySet());
String id = pw.computeName().getName();
File packdir = new File(repo.getObjectsDirectory(), "pack");
File packFile = new File(packdir, "pack-" + id + ".pack");
FileOutputStream packOS = new FileOutputStream(packFile);
pw.writePack(NullProgressMonitor.INSTANCE,
NullProgressMonitor.INSTANCE, packOS);
packOS.close();
File idxFile = new File(packdir, "pack-" + id + ".idx");
FileOutputStream idxOS = new FileOutputStream(idxFile);
pw.writeIndex(idxOS);
idxOS.close();
pw.release();
return PackIndex.open(idxFile);
}
// TODO: testWritePackDeltasCycle()
// TODO: testWritePackDeltasDepth()

View File

@ -60,6 +60,8 @@
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import org.eclipse.jgit.events.ListenerHandle;
import org.eclipse.jgit.events.RefsChangedEvent;
@ -1077,6 +1079,36 @@ public void testPeelCommit() throws IOException {
assertSame(master_p2, refdir.peel(master_p2));
}
@Test
public void testRefsChangedStackOverflow() throws Exception {
final FileRepository newRepo = createBareRepository();
final RefDatabase refDb = newRepo.getRefDatabase();
File packedRefs = new File(newRepo.getDirectory(), "packed-refs");
assertTrue(packedRefs.createNewFile());
final AtomicReference<StackOverflowError> error = new AtomicReference<StackOverflowError>();
final AtomicReference<IOException> exception = new AtomicReference<IOException>();
final AtomicInteger changeCount = new AtomicInteger();
newRepo.getListenerList().addRefsChangedListener(
new RefsChangedListener() {
public void onRefsChanged(RefsChangedEvent event) {
try {
refDb.getRefs("ref");
changeCount.incrementAndGet();
} catch (StackOverflowError soe) {
error.set(soe);
} catch (IOException ioe) {
exception.set(ioe);
}
}
});
refDb.getRefs("ref");
refDb.getRefs("ref");
assertNull(error.get());
assertNull(exception.get());
assertEquals(1, changeCount.get());
}
private void writeLooseRef(String name, AnyObjectId id) throws IOException {
writeLooseRef(name, id.name() + "\n");
}

View File

@ -53,6 +53,7 @@
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.Status;
import org.eclipse.jgit.api.SubmoduleAddCommand;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.dircache.DirCacheEditor;
@ -75,7 +76,7 @@
public class SubmoduleAddTest extends RepositoryTestCase {
@Test
public void commandWithNullPath() {
public void commandWithNullPath() throws GitAPIException {
try {
new SubmoduleAddCommand(db).setURI("uri").call();
fail("Exception not thrown");
@ -85,7 +86,7 @@ public void commandWithNullPath() {
}
@Test
public void commandWithEmptyPath() {
public void commandWithEmptyPath() throws GitAPIException {
try {
new SubmoduleAddCommand(db).setPath("").setURI("uri").call();
fail("Exception not thrown");
@ -95,7 +96,7 @@ public void commandWithEmptyPath() {
}
@Test
public void commandWithNullUri() {
public void commandWithNullUri() throws GitAPIException {
try {
new SubmoduleAddCommand(db).setPath("sub").call();
fail("Exception not thrown");
@ -105,7 +106,7 @@ public void commandWithNullUri() {
}
@Test
public void commandWithEmptyUri() {
public void commandWithEmptyUri() throws GitAPIException {
try {
new SubmoduleAddCommand(db).setPath("sub").setURI("").call();
fail("Exception not thrown");

View File

@ -53,6 +53,7 @@
import java.util.Collection;
import org.eclipse.jgit.api.SubmoduleInitCommand;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.dircache.DirCacheEditor;
@ -73,7 +74,7 @@
public class SubmoduleInitTest extends RepositoryTestCase {
@Test
public void repositoryWithNoSubmodules() {
public void repositoryWithNoSubmodules() throws GitAPIException {
SubmoduleInitCommand command = new SubmoduleInitCommand(db);
Collection<String> modules = command.call();
assertNotNull(modules);
@ -82,7 +83,7 @@ public void repositoryWithNoSubmodules() {
@Test
public void repositoryWithUninitializedModule() throws IOException,
ConfigInvalidException {
ConfigInvalidException, GitAPIException {
final String path = addSubmoduleToIndex();
SubmoduleWalk generator = SubmoduleWalk.forIndex(db);
@ -156,7 +157,7 @@ public void resolveSameLevelRelativeUrl() throws Exception {
@Test
public void resolveOneLevelHigherRelativeUrl() throws IOException,
ConfigInvalidException {
ConfigInvalidException, GitAPIException {
final String path = addSubmoduleToIndex();
String base = "git://server/repo.git";
@ -197,7 +198,7 @@ public void resolveOneLevelHigherRelativeUrl() throws IOException,
@Test
public void resolveTwoLevelHigherRelativeUrl() throws IOException,
ConfigInvalidException {
ConfigInvalidException, GitAPIException {
final String path = addSubmoduleToIndex();
String base = "git://server/repo.git";
@ -238,7 +239,7 @@ public void resolveTwoLevelHigherRelativeUrl() throws IOException,
@Test
public void resolveWorkingDirectoryRelativeUrl() throws IOException,
ConfigInvalidException {
GitAPIException, ConfigInvalidException {
final String path = addSubmoduleToIndex();
String base = db.getWorkTree().getAbsolutePath();
@ -281,7 +282,7 @@ public void resolveWorkingDirectoryRelativeUrl() throws IOException,
@Test
public void resolveInvalidParentUrl() throws IOException,
ConfigInvalidException {
ConfigInvalidException, GitAPIException {
final String path = addSubmoduleToIndex();
String base = "no_slash";

View File

@ -53,6 +53,7 @@
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.SubmoduleStatusCommand;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.dircache.DirCacheEditor;
import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
@ -74,7 +75,7 @@
public class SubmoduleStatusTest extends RepositoryTestCase {
@Test
public void repositoryWithNoSubmodules() {
public void repositoryWithNoSubmodules() throws GitAPIException {
SubmoduleStatusCommand command = new SubmoduleStatusCommand(db);
Map<String, SubmoduleStatus> statuses = command.call();
assertNotNull(statuses);
@ -82,7 +83,8 @@ public void repositoryWithNoSubmodules() {
}
@Test
public void repositoryWithMissingSubmodule() throws IOException {
public void repositoryWithMissingSubmodule() throws IOException,
GitAPIException {
final ObjectId id = ObjectId
.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
final String path = "sub";
@ -113,7 +115,8 @@ public void apply(DirCacheEntry ent) {
}
@Test
public void repositoryWithUninitializedSubmodule() throws IOException {
public void repositoryWithUninitializedSubmodule() throws IOException,
GitAPIException {
final ObjectId id = ObjectId
.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
final String path = "sub";
@ -152,7 +155,8 @@ public void apply(DirCacheEntry ent) {
}
@Test
public void repositoryWithNoHeadInSubmodule() throws IOException {
public void repositoryWithNoHeadInSubmodule() throws IOException,
GitAPIException {
final ObjectId id = ObjectId
.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
final String path = "sub";
@ -202,7 +206,8 @@ public void apply(DirCacheEntry ent) {
}
@Test
public void repositoryWithNoSubmoduleRepository() throws IOException {
public void repositoryWithNoSubmoduleRepository() throws IOException,
GitAPIException {
final ObjectId id = ObjectId
.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
final String path = "sub";
@ -247,7 +252,8 @@ public void apply(DirCacheEntry ent) {
}
@Test
public void repositoryWithInitializedSubmodule() throws IOException {
public void repositoryWithInitializedSubmodule() throws IOException,
GitAPIException {
final ObjectId id = ObjectId
.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
final String path = "sub";
@ -302,7 +308,7 @@ public void apply(DirCacheEntry ent) {
@Test
public void repositoryWithDifferentRevCheckedOutSubmodule()
throws IOException {
throws IOException, GitAPIException {
final ObjectId id = ObjectId
.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
final String path = "sub";

View File

@ -53,6 +53,7 @@
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.SubmoduleSyncCommand;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.dircache.DirCacheEditor;
import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
@ -73,7 +74,7 @@
public class SubmoduleSyncTest extends RepositoryTestCase {
@Test
public void repositoryWithNoSubmodules() {
public void repositoryWithNoSubmodules() throws GitAPIException {
SubmoduleSyncCommand command = new SubmoduleSyncCommand(db);
Map<String, String> modules = command.call();
assertNotNull(modules);

View File

@ -52,6 +52,7 @@
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.SubmoduleUpdateCommand;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.dircache.DirCacheEditor;
import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
@ -73,7 +74,7 @@
public class SubmoduleUpdateTest extends RepositoryTestCase {
@Test
public void repositoryWithNoSubmodules() {
public void repositoryWithNoSubmodules() throws GitAPIException {
SubmoduleUpdateCommand command = new SubmoduleUpdateCommand(db);
Collection<String> modules = command.call();
assertNotNull(modules);
@ -125,7 +126,8 @@ public void apply(DirCacheEntry ent) {
}
@Test
public void repositoryWithUnconfiguredSubmodule() throws IOException {
public void repositoryWithUnconfiguredSubmodule() throws IOException,
GitAPIException {
final ObjectId id = ObjectId
.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
final String path = "sub";
@ -159,7 +161,8 @@ public void apply(DirCacheEntry ent) {
}
@Test
public void repositoryWithInitializedSubmodule() throws IOException {
public void repositoryWithInitializedSubmodule() throws IOException,
GitAPIException {
final ObjectId id = ObjectId
.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
final String path = "sub";

View File

@ -48,6 +48,7 @@
import java.util.Collection;
import java.util.LinkedList;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.NoFilepatternException;
import org.eclipse.jgit.dircache.DirCache;
@ -122,7 +123,7 @@ public AddCommand setWorkingTreeIterator(WorkingTreeIterator f) {
*
* @return the DirCache after Add
*/
public DirCache call() throws NoFilepatternException {
public DirCache call() throws GitAPIException, NoFilepatternException {
if (filepatterns.isEmpty())
throw new NoFilepatternException(JGitText.get().atLeastOnePatternIsRequired);

View File

@ -44,6 +44,7 @@
import java.io.IOException;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.lib.CommitBuilder;
import org.eclipse.jgit.lib.Constants;
@ -80,11 +81,7 @@ protected AddNoteCommand(Repository repo) {
super(repo);
}
/**
* @throws JGitInternalException
* upon internal failure
*/
public Note call() throws JGitInternalException {
public Note call() throws GitAPIException {
checkCallable();
RevWalk walk = new RevWalk(repo);
ObjectInserter inserter = repo.newObjectInserter();

View File

@ -48,6 +48,7 @@
import java.util.Collection;
import java.util.Collections;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.blame.BlameGenerator;
import org.eclipse.jgit.blame.BlameResult;
@ -189,7 +190,7 @@ public BlameCommand reverse(AnyObjectId start, Collection<ObjectId> end)
*
* @return list of lines
*/
public BlameResult call() throws JGitInternalException {
public BlameResult call() throws GitAPIException {
checkCallable();
BlameGenerator gen = new BlameGenerator(repo, path);
try {

View File

@ -51,6 +51,7 @@
import org.eclipse.jgit.api.CheckoutResult.Status;
import org.eclipse.jgit.api.errors.CheckoutConflictException;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.InvalidRefNameException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.RefAlreadyExistsException;
@ -121,9 +122,11 @@ protected CheckoutCommand(Repository repo) {
* @throws InvalidRefNameException
* if the provided name is <code>null</code> or otherwise
* invalid
* @throws CheckoutConflictException
* if the checkout results in a conflict
* @return the newly created branch
*/
public Ref call() throws JGitInternalException, RefAlreadyExistsException,
public Ref call() throws GitAPIException, RefAlreadyExistsException,
RefNotFoundException, InvalidRefNameException,
CheckoutConflictException {
checkCallable();

View File

@ -49,6 +49,7 @@
import java.util.Set;
import java.util.TreeSet;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.util.FileUtils;
@ -81,7 +82,7 @@ protected CleanCommand(Repository repo) {
*
* @return a set of strings representing each file cleaned.
*/
public Set<String> call() {
public Set<String> call() throws GitAPIException {
Set<String> files = new TreeSet<String>();
try {
StatusCommand command = new StatusCommand(repo);
@ -113,7 +114,7 @@ public CleanCommand setPaths(Set<String> paths) {
/**
* If dryRun is set, the paths in question will not actually be deleted.
*
*
* @param dryRun
* whether to do a dry run or not
* @return {@code this}

View File

@ -50,6 +50,7 @@
import java.util.Collection;
import java.util.List;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.InvalidRemoteException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.dircache.DirCache;
@ -111,11 +112,9 @@ public CloneCommand() {
/**
* Executes the {@code Clone} command.
*
* @throws JGitInternalException
* if the repository can't be created
* @return the newly created {@code Git} object with associated repository
*/
public Git call() throws JGitInternalException {
public Git call() throws GitAPIException {
try {
URIish u = new URIish(uri);
Repository repository = init(u);
@ -132,7 +131,7 @@ public Git call() throws JGitInternalException {
}
}
private Repository init(URIish u) {
private Repository init(URIish u) throws GitAPIException {
InitCommand command = Git.init();
command.setBare(bare);
if (directory == null)
@ -145,9 +144,7 @@ private Repository init(URIish u) {
}
private FetchResult fetch(Repository clonedRepo, URIish u)
throws URISyntaxException,
JGitInternalException,
InvalidRemoteException, IOException {
throws URISyntaxException, IOException, GitAPIException {
// create the remote config and save it
RemoteConfig config = new RemoteConfig(clonedRepo.getConfig(), remote);
config.addURI(u);
@ -193,8 +190,8 @@ else if (branchesToClone != null
}
private void checkout(Repository clonedRepo, FetchResult result)
throws JGitInternalException,
MissingObjectException, IncorrectObjectTypeException, IOException {
throws MissingObjectException, IncorrectObjectTypeException,
IOException, GitAPIException {
Ref head = result.getAdvertisedRef(branch);
if (branch.equals(Constants.HEAD)) {
@ -230,7 +227,8 @@ private void checkout(Repository clonedRepo, FetchResult result)
}
}
private void cloneSubmodules(Repository clonedRepo) throws IOException {
private void cloneSubmodules(Repository clonedRepo) throws IOException,
GitAPIException {
SubmoduleInitCommand init = new SubmoduleInitCommand(clonedRepo);
if (init.call().isEmpty())
return;

View File

@ -50,10 +50,12 @@
import java.util.List;
import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.NoFilepatternException;
import org.eclipse.jgit.api.errors.NoHeadException;
import org.eclipse.jgit.api.errors.NoMessageException;
import org.eclipse.jgit.api.errors.UnmergedPathsException;
import org.eclipse.jgit.api.errors.WrongRepositoryStateException;
import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.dircache.DirCacheBuilder;
@ -134,21 +136,18 @@ protected CommitCommand(Repository repo) {
* when called on a git repo without a HEAD reference
* @throws NoMessageException
* when called without specifying a commit message
* @throws UnmergedPathException
* @throws UnmergedPathsException
* when the current index contained unmerged paths (conflicts)
* @throws ConcurrentRefUpdateException
* when HEAD or branch ref is updated concurrently by someone
* else
* @throws WrongRepositoryStateException
* when repository is not in the right state for committing
* @throws JGitInternalException
* a low-level exception of JGit has occurred. The original
* exception can be retrieved by calling
* {@link Exception#getCause()}. Expect only
* {@code IOException's} to be wrapped. Subclasses of
* {@link IOException} (e.g. {@link UnmergedPathException}) are
* typically not wrapped here but thrown as original exception
*/
public RevCommit call() throws NoHeadException, NoMessageException,
UnmergedPathException, ConcurrentRefUpdateException,
JGitInternalException, WrongRepositoryStateException {
public RevCommit call() throws GitAPIException, NoHeadException,
NoMessageException, UnmergedPathsException,
ConcurrentRefUpdateException,
WrongRepositoryStateException {
checkCallable();
RepositoryState state = repo.getRepositoryState();
@ -269,10 +268,7 @@ public RevCommit call() throws NoHeadException, NoMessageException,
index.unlock();
}
} catch (UnmergedPathException e) {
// since UnmergedPathException is a subclass of IOException
// which should not be wrapped by a JGitInternalException we
// have to catch and re-throw it here
throw e;
throw new UnmergedPathsException(e);
} catch (IOException e) {
throw new JGitInternalException(
JGitText.get().exceptionCaughtDuringExecutionOfCommitCommand, e);

View File

@ -46,6 +46,7 @@
import java.io.IOException;
import java.text.MessageFormat;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.InvalidRefNameException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.RefAlreadyExistsException;
@ -57,9 +58,9 @@
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.RefUpdate;
import org.eclipse.jgit.lib.RefUpdate.Result;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.lib.RefUpdate.Result;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
@ -119,7 +120,7 @@ protected CreateBranchCommand(Repository repo) {
* invalid
* @return the newly created branch
*/
public Ref call() throws JGitInternalException, RefAlreadyExistsException,
public Ref call() throws GitAPIException, RefAlreadyExistsException,
RefNotFoundException, InvalidRefNameException {
checkCallable();
processOptions();

View File

@ -51,6 +51,7 @@
import java.util.Set;
import org.eclipse.jgit.api.errors.CannotDeleteCurrentBranchException;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.NotMergedException;
import org.eclipse.jgit.internal.JGitText;
@ -58,9 +59,9 @@
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.RefUpdate;
import org.eclipse.jgit.lib.RefUpdate.Result;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.lib.RefUpdate.Result;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
@ -93,9 +94,10 @@ protected DeleteBranchCommand(Repository repo) {
* @throws NotMergedException
* when trying to delete a branch which has not been merged into
* the currently checked out branch without force
* @throws CannotDeleteCurrentBranchException
* @return the list with the (full) names of the deleted branches
*/
public List<String> call() throws JGitInternalException,
public List<String> call() throws GitAPIException,
NotMergedException, CannotDeleteCurrentBranchException {
checkCallable();
List<String> result = new ArrayList<String>();

View File

@ -49,6 +49,7 @@
import java.util.List;
import java.util.Set;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.internal.JGitText;
import org.eclipse.jgit.lib.Ref;
@ -77,12 +78,9 @@ protected DeleteTagCommand(Repository repo) {
}
/**
* @throws JGitInternalException
* when trying to delete a tag that doesn't exist
*
* @return the list with the full names of the deleted tags
*/
public List<String> call() throws JGitInternalException {
public List<String> call() throws GitAPIException {
checkCallable();
List<String> result = new ArrayList<String>();
if (tags.isEmpty())

View File

@ -50,6 +50,7 @@
import java.util.List;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.NoHeadException;
import org.eclipse.jgit.diff.DiffEntry;
import org.eclipse.jgit.diff.DiffFormatter;
@ -108,7 +109,7 @@ protected DiffCommand(Repository repo) {
*
* @return a DiffEntry for each path which is different
*/
public List<DiffEntry> call() throws GitAPIException, IOException {
public List<DiffEntry> call() throws GitAPIException {
final DiffFormatter diffFmt;
if (out != null && !showNameAndStatusOnly)
diffFmt = new DiffFormatter(new BufferedOutputStream(out));
@ -155,6 +156,8 @@ public List<DiffEntry> call() throws GitAPIException, IOException {
diffFmt.flush();
return result;
}
} catch (IOException e) {
throw new JGitInternalException(e.getMessage(), e);
} finally {
diffFmt.release();
}

View File

@ -47,6 +47,7 @@
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.InvalidRemoteException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.errors.NoRemoteRepositoryException;
@ -106,13 +107,11 @@ protected FetchCommand(Repository repo) {
* result
* @throws InvalidRemoteException
* when called with an invalid remote uri
* @throws JGitInternalException
* a low-level exception of JGit has occurred. The original
* exception can be retrieved by calling
* {@link Exception#getCause()}.
* @throws org.eclipse.jgit.api.errors.TransportException
* when an error occurs during transport
*/
public FetchResult call() throws JGitInternalException,
InvalidRemoteException {
public FetchResult call() throws GitAPIException, InvalidRemoteException,
org.eclipse.jgit.api.errors.TransportException {
checkCallable();
try {
@ -135,7 +134,7 @@ public FetchResult call() throws JGitInternalException,
throw new InvalidRemoteException(MessageFormat.format(
JGitText.get().invalidRemote, remote), e);
} catch (TransportException e) {
throw new JGitInternalException(
throw new org.eclipse.jgit.api.errors.TransportException(
JGitText.get().exceptionCaughtDuringExecutionOfFetchCommand,
e);
} catch (URISyntaxException e) {

View File

@ -40,6 +40,7 @@
import java.text.MessageFormat;
import java.util.concurrent.Callable;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.internal.JGitText;
import org.eclipse.jgit.lib.Repository;
@ -116,4 +117,13 @@ protected void checkCallable() {
JGitText.get().commandWasCalledInTheWrongState
, this.getClass().getName()));
}
/**
* Executes the command
*
* @return T a result. Each command has its own return type
* @throws GitAPIException
* or subclass thereof when an error occurs
*/
public abstract T call() throws GitAPIException;
}

View File

@ -46,6 +46,7 @@
import java.io.IOException;
import java.util.concurrent.Callable;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Repository;
@ -65,11 +66,9 @@ public class InitCommand implements Callable<Git> {
/**
* Executes the {@code Init} command.
*
* @throws JGitInternalException
* if the repository can't be created
* @return the newly created {@code Git} object with associated repository
*/
public Git call() throws JGitInternalException {
public Git call() throws GitAPIException {
try {
RepositoryBuilder builder = new RepositoryBuilder();
if (bare)

View File

@ -47,10 +47,11 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Ref;
@ -88,11 +89,7 @@ protected ListBranchCommand(Repository repo) {
super(repo);
}
/**
* @throws JGitInternalException
* upon internal failure
*/
public List<Ref> call() throws JGitInternalException {
public List<Ref> call() throws GitAPIException {
checkCallable();
Map<String, Ref> refList;
try {

View File

@ -47,6 +47,7 @@
import java.util.Iterator;
import java.util.List;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Ref;
@ -74,10 +75,9 @@ protected ListNotesCommand(Repository repo) {
}
/**
* @throws JGitInternalException
* upon internal failure
* @return the requested notes
*/
public List<Note> call() throws JGitInternalException {
public List<Note> call() throws GitAPIException {
checkCallable();
List<Note> notes = new ArrayList<Note>();
RevWalk walk = new RevWalk(repo);

View File

@ -49,6 +49,7 @@
import java.util.List;
import java.util.Map;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Ref;
@ -71,11 +72,9 @@ protected ListTagCommand(Repository repo) {
}
/**
* @throws JGitInternalException
* upon internal failure
* @return the tags available
*/
public List<Ref> call() throws JGitInternalException {
public List<Ref> call() throws GitAPIException {
checkCallable();
Map<String, Ref> refList;
List<Ref> tags = new ArrayList<Ref>();

View File

@ -47,6 +47,7 @@
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.NoHeadException;
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
@ -108,9 +109,10 @@ protected LogCommand(Repository repo) {
* method twice on an instance.
*
* @return an iteration over RevCommits
* @throws NoHeadException
* of the references ref cannot be resolved
*/
public Iterable<RevCommit> call() throws NoHeadException,
JGitInternalException {
public Iterable<RevCommit> call() throws GitAPIException, NoHeadException {
checkCallable();
if (pathFilters.size() > 0)
walk.setTreeFilter(AndTreeFilter.create(
@ -166,7 +168,7 @@ else if (maxCount > -1)
* typically not wrapped here but thrown as original exception
*/
public LogCommand add(AnyObjectId start) throws MissingObjectException,
IncorrectObjectTypeException, JGitInternalException {
IncorrectObjectTypeException {
return add(true, start);
}
@ -194,7 +196,7 @@ public LogCommand add(AnyObjectId start) throws MissingObjectException,
* typically not wrapped here but thrown as original exception
*/
public LogCommand not(AnyObjectId start) throws MissingObjectException,
IncorrectObjectTypeException, JGitInternalException {
IncorrectObjectTypeException {
return add(false, start);
}
@ -223,8 +225,7 @@ public LogCommand not(AnyObjectId start) throws MissingObjectException,
* typically not wrapped here but thrown as original exception
*/
public LogCommand addRange(AnyObjectId since, AnyObjectId until)
throws MissingObjectException, IncorrectObjectTypeException,
JGitInternalException {
throws MissingObjectException, IncorrectObjectTypeException {
return not(since).add(until);
}

View File

@ -144,13 +144,11 @@ public LsRemoteCommand setUploadPack(String uploadPack) {
* @return a collection of references in the remote repository
* @throws InvalidRemoteException
* when called with an invalid remote uri
* @throws JGitInternalException
* a low-level exception of JGit has occurred. The original
* exception can be retrieved by calling
* {@link Exception#getCause()}.
* @throws org.eclipse.jgit.api.errors.TransportException
* for errors that occurs during transport
*/
public Collection<Ref> call() throws GitAPIException,
JGitInternalException {
org.eclipse.jgit.api.errors.TransportException {
checkCallable();
Transport transport = null;

View File

@ -54,6 +54,7 @@
import org.eclipse.jgit.api.MergeResult.MergeStatus;
import org.eclipse.jgit.api.errors.CheckoutConflictException;
import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.InvalidMergeHeadsException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.NoHeadException;
@ -109,7 +110,7 @@ protected MergeCommand(Repository repo) {
*
* @return the result of the merge
*/
public MergeResult call() throws NoHeadException,
public MergeResult call() throws GitAPIException, NoHeadException,
ConcurrentRefUpdateException, CheckoutConflictException,
InvalidMergeHeadsException, WrongRepositoryStateException, NoMessageException {
checkCallable();

View File

@ -110,7 +110,7 @@ public PullCommand setProgressMonitor(ProgressMonitor monitor) {
*
* @return the result of the pull
*/
public PullResult call() throws WrongRepositoryStateException,
public PullResult call() throws GitAPIException, WrongRepositoryStateException,
InvalidConfigurationException, DetachedHeadException,
InvalidRemoteException, CanceledException, RefNotFoundException,
NoHeadException {

View File

@ -50,6 +50,7 @@
import java.util.Collections;
import java.util.List;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.InvalidRemoteException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.errors.NotSupportedException;
@ -108,12 +109,8 @@ protected PushCommand(Repository repo) {
* @return an iteration over {@link PushResult} objects
* @throws InvalidRemoteException
* when called with an invalid remote uri
* @throws JGitInternalException
* a low-level exception of JGit has occurred. The original
* exception can be retrieved by calling
* {@link Exception#getCause()}.
*/
public Iterable<PushResult> call() throws JGitInternalException,
public Iterable<PushResult> call() throws GitAPIException,
InvalidRemoteException {
checkCallable();
@ -325,7 +322,7 @@ public PushCommand add(Ref ref) {
* @throws JGitInternalException
* the reference name cannot be resolved.
*/
public PushCommand add(String nameOrSpec) throws JGitInternalException {
public PushCommand add(String nameOrSpec) {
if (0 <= nameOrSpec.indexOf(':')) {
refSpecs.add(new RefSpec(nameOrSpec));
} else {

View File

@ -190,8 +190,8 @@ protected RebaseCommand(Repository repo) {
*
* @return an object describing the result of this command
*/
public RebaseResult call() throws NoHeadException, RefNotFoundException,
JGitInternalException, GitAPIException {
public RebaseResult call() throws GitAPIException, NoHeadException,
RefNotFoundException {
RevCommit newHead = null;
boolean lastStepWasForward = false;
checkCallable();
@ -325,8 +325,7 @@ private void updateHead(String headName, RevCommit newHead)
}
}
private RevCommit checkoutCurrentHead() throws IOException,
NoHeadException, JGitInternalException {
private RevCommit checkoutCurrentHead() throws IOException, NoHeadException {
ObjectId headTree = repo.resolve(Constants.HEAD + "^{tree}");
if (headTree == null)
throw new NoHeadException(
@ -517,8 +516,8 @@ private void popSteps(int numSteps) throws IOException {
}
}
private RebaseResult initFilesAndRewind() throws RefNotFoundException,
IOException, NoHeadException, JGitInternalException {
private RebaseResult initFilesAndRewind() throws IOException,
GitAPIException {
// we need to store everything into files so that we can implement
// --skip, --continue, and --abort
@ -576,7 +575,7 @@ else if (walk.isMergedInto(headCommit, upstream)) {
// create the folder for the meta information
FileUtils.mkdir(rebaseDir);
createFile(repo.getDirectory(), Constants.ORIG_HEAD, headId.name());
repo.writeOrigHead(headId);
createFile(rebaseDir, REBASE_HEAD, headId.name());
createFile(rebaseDir, HEAD_NAME, headName);
createFile(rebaseDir, ONTO, upstreamCommit.name());
@ -626,11 +625,11 @@ else if (walk.isMergedInto(headCommit, upstream)) {
*
* @param newCommit
* @return the new head, or null
* @throws RefNotFoundException
* @throws IOException
* @throws GitAPIException
*/
public RevCommit tryFastForward(RevCommit newCommit)
throws RefNotFoundException, IOException {
public RevCommit tryFastForward(RevCommit newCommit) throws IOException,
GitAPIException {
Ref head = repo.getRef(Constants.HEAD);
if (head == null || head.getObjectId() == null)
throw new RefNotFoundException(MessageFormat.format(
@ -653,7 +652,7 @@ public RevCommit tryFastForward(RevCommit newCommit)
}
private RevCommit tryFastForward(String headName, RevCommit oldCommit,
RevCommit newCommit) throws IOException, JGitInternalException {
RevCommit newCommit) throws IOException, GitAPIException {
boolean tryRebase = false;
for (RevCommit parentCommit : newCommit.getParents())
if (parentCommit.equals(oldCommit))
@ -733,7 +732,8 @@ private void createFile(File parentDir, String name, String content)
private RebaseResult abort(RebaseResult result) throws IOException {
try {
String commitId = readFile(repo.getDirectory(), Constants.ORIG_HEAD);
ObjectId origHead = repo.readOrigHead();
String commitId = origHead != null ? origHead.name() : null;
monitor.beginTask(MessageFormat.format(
JGitText.get().abortingRebase, commitId),
ProgressMonitor.UNKNOWN);

View File

@ -46,6 +46,7 @@
import java.text.MessageFormat;
import java.util.Collection;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.InvalidRefNameException;
import org.eclipse.jgit.internal.JGitText;
import org.eclipse.jgit.lib.Constants;
@ -84,7 +85,7 @@ public ReflogCommand setRef(String ref) {
return this;
}
public Collection<ReflogEntry> call() throws Exception {
public Collection<ReflogEntry> call() throws GitAPIException {
checkCallable();
try {

View File

@ -44,6 +44,7 @@
import java.io.IOException;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.lib.CommitBuilder;
import org.eclipse.jgit.lib.Constants;
@ -78,11 +79,7 @@ protected RemoveNoteCommand(Repository repo) {
super(repo);
}
/**
* @throws JGitInternalException
* upon internal failure
*/
public Note call() throws JGitInternalException {
public Note call() throws GitAPIException {
checkCallable();
RevWalk walk = new RevWalk(repo);
ObjectInserter inserter = repo.newObjectInserter();

View File

@ -48,6 +48,7 @@
import java.util.Arrays;
import org.eclipse.jgit.api.errors.DetachedHeadException;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.InvalidRefNameException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.RefAlreadyExistsException;
@ -58,9 +59,9 @@
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.RefRename;
import org.eclipse.jgit.lib.RefUpdate.Result;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.lib.RefUpdate.Result;
/**
* Used to rename branches.
@ -94,7 +95,7 @@ protected RenameBranchCommand(Repository repo) {
* if rename is tried without specifying the old name and HEAD
* is detached
*/
public Ref call() throws RefNotFoundException, InvalidRefNameException,
public Ref call() throws GitAPIException, RefNotFoundException, InvalidRefNameException,
RefAlreadyExistsException, DetachedHeadException {
checkCallable();

View File

@ -47,11 +47,13 @@
import java.util.Collection;
import java.util.LinkedList;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.dircache.DirCacheBuilder;
import org.eclipse.jgit.dircache.DirCacheCheckout;
import org.eclipse.jgit.dircache.DirCacheEditor;
import org.eclipse.jgit.dircache.DirCacheEditor.DeletePath;
import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
import org.eclipse.jgit.dircache.DirCacheEntry;
import org.eclipse.jgit.dircache.DirCacheIterator;
import org.eclipse.jgit.internal.JGitText;
@ -64,6 +66,7 @@
import org.eclipse.jgit.lib.RepositoryState;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.treewalk.AbstractTreeIterator;
import org.eclipse.jgit.treewalk.CanonicalTreeParser;
import org.eclipse.jgit.treewalk.TreeWalk;
import org.eclipse.jgit.treewalk.filter.PathFilterGroup;
@ -133,7 +136,7 @@ public ResetCommand(Repository repo) {
*
* @return the Ref after reset
*/
public Ref call() throws IOException {
public Ref call() throws GitAPIException {
checkCallable();
Ref r;
@ -192,6 +195,10 @@ public Ref call() throws IOException {
throw new JGitInternalException(MessageFormat.format(
JGitText.get().cannotLock, ru.getName()));
ObjectId origHead = ru.getOldObjectId();
if (origHead != null)
repo.writeOrigHead(origHead);
switch (mode) {
case HARD:
checkoutIndex(commit);
@ -313,14 +320,49 @@ public void apply(DirCacheEntry ent) {
private void resetIndex(RevCommit commit) throws IOException {
DirCache dc = repo.lockDirCache();
TreeWalk walk = null;
try {
dc.clear();
DirCacheBuilder dcb = dc.builder();
dcb.addTree(new byte[0], 0, repo.newObjectReader(),
commit.getTree());
dcb.commit();
DirCacheEditor editor = dc.editor();
walk = new TreeWalk(repo);
walk.addTree(commit.getTree());
walk.addTree(new DirCacheIterator(dc));
walk.setRecursive(true);
while (walk.next()) {
AbstractTreeIterator cIter = walk.getTree(0,
AbstractTreeIterator.class);
if (cIter == null) {
editor.add(new DeletePath(walk.getPathString()));
continue;
}
final DirCacheEntry entry = new DirCacheEntry(walk.getRawPath());
entry.setFileMode(cIter.getEntryFileMode());
entry.setObjectIdFromRaw(cIter.idBuffer(), cIter.idOffset());
DirCacheIterator dcIter = walk.getTree(1,
DirCacheIterator.class);
if (dcIter != null && dcIter.idEqual(cIter)) {
DirCacheEntry indexEntry = dcIter.getDirCacheEntry();
entry.setLastModified(indexEntry.getLastModified());
entry.setLength(indexEntry.getLength());
}
editor.add(new PathEdit(entry) {
@Override
public void apply(DirCacheEntry ent) {
ent.copyMetaData(entry);
}
});
}
editor.commit();
} finally {
dc.unlock();
if (walk != null)
walk.release();
}
}

View File

@ -50,8 +50,8 @@
import org.eclipse.jgit.api.MergeResult.MergeStatus;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.MultipleParentsNotAllowedException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.MultipleParentsNotAllowedException;
import org.eclipse.jgit.api.errors.NoHeadException;
import org.eclipse.jgit.dircache.DirCacheCheckout;
import org.eclipse.jgit.internal.JGitText;

View File

@ -47,6 +47,7 @@
import java.util.Collection;
import java.util.LinkedList;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.NoFilepatternException;
import org.eclipse.jgit.dircache.DirCache;
@ -99,7 +100,8 @@ public RmCommand addFilepattern(String filepattern) {
*
* @return the DirCache after Rm
*/
public DirCache call() throws NoFilepatternException {
public DirCache call() throws GitAPIException,
NoFilepatternException {
if (filepatterns.isEmpty())
throw new NoFilepatternException(JGitText.get().atLeastOnePatternIsRequired);

View File

@ -44,6 +44,7 @@
import java.io.IOException;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Ref;
@ -73,11 +74,7 @@ protected ShowNoteCommand(Repository repo) {
super(repo);
}
/**
* @throws JGitInternalException
* upon internal failure
*/
public Note call() throws JGitInternalException {
public Note call() throws GitAPIException {
checkCallable();
RevWalk walk = new RevWalk(repo);
NoteMap map = NoteMap.newEmptyMap();

View File

@ -189,8 +189,7 @@ private boolean isConflict(AbstractTreeIterator stashIndexIter,
return false;
}
private ObjectId getHeadTree() throws JGitInternalException,
GitAPIException {
private ObjectId getHeadTree() throws GitAPIException {
final ObjectId headTree;
try {
headTree = repo.resolve(Constants.HEAD + "^{tree}");
@ -202,7 +201,7 @@ private ObjectId getHeadTree() throws JGitInternalException,
return headTree;
}
private ObjectId getStashId() throws JGitInternalException, GitAPIException {
private ObjectId getStashId() throws GitAPIException {
final String revision = stashRef != null ? stashRef : DEFAULT_REF;
final ObjectId stashId;
try {
@ -298,7 +297,7 @@ public void apply(DirCacheEntry ent) {
*
* @return id of stashed commit that was applied
*/
public ObjectId call() throws GitAPIException, JGitInternalException {
public ObjectId call() throws GitAPIException {
checkCallable();
if (repo.getRepositoryState() != RepositoryState.SAFE)

View File

@ -212,7 +212,7 @@ private Ref getHead() throws GitAPIException {
*
* @return stashed commit or null if no changes to stash
*/
public RevCommit call() throws GitAPIException, JGitInternalException {
public RevCommit call() throws GitAPIException {
checkCallable();
Ref head = getHead();

View File

@ -168,7 +168,7 @@ private void updateRef(Ref stashRef, ObjectId newId) {
*
* @return commit id of stash reference or null if no more stashed changes
*/
public ObjectId call() throws GitAPIException, JGitInternalException {
public ObjectId call() throws GitAPIException {
checkCallable();
Ref stashRef = getRef();

View File

@ -49,6 +49,7 @@
import java.util.Collections;
import java.util.List;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.InvalidRefNameException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.internal.JGitText;
@ -75,7 +76,7 @@ public StashListCommand(final Repository repo) {
super(repo);
}
public Collection<RevCommit> call() throws Exception {
public Collection<RevCommit> call() throws GitAPIException {
checkCallable();
try {

View File

@ -44,6 +44,8 @@
import java.io.IOException;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.errors.NoWorkTreeException;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.IndexDiff;
@ -80,14 +82,17 @@ protected StatusCommand(Repository repo) {
* @return a {@link Status} object telling about each path where working
* tree, index or HEAD differ from each other.
*/
public Status call() throws IOException, NoWorkTreeException {
public Status call() throws GitAPIException, NoWorkTreeException {
if (workingTreeIt == null)
workingTreeIt = new FileTreeIterator(repo);
IndexDiff diff = new IndexDiff(repo, Constants.HEAD, workingTreeIt);
diff.diff();
return new Status(diff);
try {
IndexDiff diff = new IndexDiff(repo, Constants.HEAD, workingTreeIt);
diff.diff();
return new Status(diff);
} catch (IOException e) {
throw new JGitInternalException(e.getMessage(), e);
}
}
/**

View File

@ -46,6 +46,7 @@
import java.io.IOException;
import java.text.MessageFormat;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.NoFilepatternException;
import org.eclipse.jgit.errors.ConfigInvalidException;
@ -134,7 +135,7 @@ protected boolean submoduleExists() throws IOException {
return SubmoduleWalk.forIndex(repo).setFilter(filter).next();
}
public Repository call() throws JGitInternalException {
public Repository call() throws GitAPIException {
checkCallable();
if (path == null || path.length() == 0)
throw new IllegalArgumentException(JGitText.get().pathNotConfigured);

View File

@ -47,6 +47,7 @@
import java.util.Collection;
import java.util.List;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.ConfigConstants;
@ -89,7 +90,7 @@ public SubmoduleInitCommand addPath(final String path) {
return this;
}
public Collection<String> call() throws JGitInternalException {
public Collection<String> call() throws GitAPIException {
checkCallable();
try {

View File

@ -48,6 +48,7 @@
import java.util.HashMap;
import java.util.Map;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.Constants;
@ -89,7 +90,7 @@ public SubmoduleStatusCommand addPath(final String path) {
return this;
}
public Map<String, SubmoduleStatus> call() throws JGitInternalException {
public Map<String, SubmoduleStatus> call() throws GitAPIException {
checkCallable();
try {

View File

@ -48,6 +48,7 @@
import java.util.HashMap;
import java.util.Map;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.ConfigConstants;
@ -106,7 +107,7 @@ protected String getHeadBranch(final Repository subRepo) throws IOException {
return null;
}
public Map<String, String> call() throws JGitInternalException {
public Map<String, String> call() throws GitAPIException {
checkCallable();
try {

View File

@ -109,7 +109,7 @@ public SubmoduleUpdateCommand addPath(final String path) {
return this;
}
public Collection<String> call() throws JGitInternalException {
public Collection<String> call() throws GitAPIException {
checkCallable();
try {

View File

@ -46,6 +46,7 @@
import java.text.MessageFormat;
import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.InvalidTagNameException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.NoHeadException;
@ -100,15 +101,10 @@ protected TagCommand(Repository repo) {
* @return a {@link Ref} a ref pointing to a tag
* @throws NoHeadException
* when called on a git repo without a HEAD reference
* @throws JGitInternalException
* a low-level exception of JGit has occurred. The original
* exception can be retrieved by calling
* {@link Exception#getCause()}. Expect only
* {@code IOException's} to be wrapped.
* @since 2.0
*/
public Ref call() throws JGitInternalException,
ConcurrentRefUpdateException, InvalidTagNameException, NoHeadException {
public Ref call() throws GitAPIException, ConcurrentRefUpdateException,
InvalidTagNameException, NoHeadException {
checkCallable();
RepositoryState state = repo.getRepositoryState();

View File

@ -49,6 +49,16 @@ public class UnmergedPathsException extends GitAPIException {
* The default constructor with a default message
*/
public UnmergedPathsException() {
super(JGitText.get().unmergedPaths);
this(null);
}
/**
* The default constructor with a default message
*
* @param cause
* original exception
*/
public UnmergedPathsException(Throwable cause) {
super(JGitText.get().unmergedPaths, cause);
}
}

View File

@ -69,8 +69,11 @@
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectInserter;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.storage.file.FileSnapshot;
import org.eclipse.jgit.storage.file.LockFile;
import org.eclipse.jgit.treewalk.FileTreeIterator;
import org.eclipse.jgit.treewalk.TreeWalk;
import org.eclipse.jgit.util.FS;
import org.eclipse.jgit.util.IO;
import org.eclipse.jgit.util.MutableInteger;
@ -138,6 +141,30 @@ public static DirCache newInCore() {
return new DirCache(null, null);
}
/**
* Create a new in-core index representation and read an index from disk.
* <p>
* The new index will be read before it is returned to the caller. Read
* failures are reported as exceptions and therefore prevent the method from
* returning a partially populated index.
*
* @param repository
* repository containing the index to read
* @return a cache representing the contents of the specified index file (if
* it exists) or an empty cache if the file does not exist.
* @throws IOException
* the index file is present but could not be read.
* @throws CorruptObjectException
* the index file is using a format or extension that this
* library does not support.
*/
public static DirCache read(final Repository repository)
throws CorruptObjectException, IOException {
final DirCache c = read(repository.getIndexFile(), repository.getFS());
c.repository = repository;
return c;
}
/**
* Create a new in-core index representation and read an index from disk.
* <p>
@ -209,6 +236,37 @@ public static DirCache lock(final File indexLocation, final FS fs)
return c;
}
/**
* Create a new in-core index representation, lock it, and read from disk.
* <p>
* The new index will be locked and then read before it is returned to the
* caller. Read failures are reported as exceptions and therefore prevent
* the method from returning a partially populated index. On read failure,
* the lock is released.
*
* @param repository
* repository containing the index to lock and read
* @param indexChangedListener
* listener to be informed when DirCache is committed
* @return a cache representing the contents of the specified index file (if
* it exists) or an empty cache if the file does not exist.
* @throws IOException
* the index file is present but could not be read, or the lock
* could not be obtained.
* @throws CorruptObjectException
* the index file is using a format or extension that this
* library does not support.
* @since 2.0
*/
public static DirCache lock(final Repository repository,
final IndexChangedListener indexChangedListener)
throws CorruptObjectException, IOException {
DirCache c = lock(repository.getIndexFile(), repository.getFS(),
indexChangedListener);
c.repository = repository;
return c;
}
/**
* Create a new in-core index representation, lock it, and read from disk.
* <p>
@ -272,6 +330,9 @@ public static DirCache lock(final File indexLocation, final FS fs,
/** listener to be informed on commit */
private IndexChangedListener indexChangedListener;
/** Repository containing this index */
private Repository repository;
/**
* Create a new in-core index representation.
* <p>
@ -591,6 +652,13 @@ void writeTo(final OutputStream os) throws IOException {
smudge_s = 0;
}
// Check if tree is non-null here since calling updateSmudgedEntries
// will automatically build it via creating a DirCacheIterator
final boolean writeTree = tree != null;
if (repository != null && entryCnt > 0)
updateSmudgedEntries();
for (int i = 0; i < entryCnt; i++) {
final DirCacheEntry e = sortedEntries[i];
if (e.mightBeRacilyClean(smudge_s, smudge_ns))
@ -598,7 +666,7 @@ void writeTo(final OutputStream os) throws IOException {
e.write(dos);
}
if (tree != null) {
if (writeTree) {
final TemporaryBuffer bb = new TemporaryBuffer.LocalFile();
tree.write(tmp, bb);
bb.close();
@ -865,4 +933,35 @@ public boolean hasUnmergedPaths() {
private void registerIndexChangedListener(IndexChangedListener listener) {
this.indexChangedListener = listener;
}
/**
* Update any smudged entries with information from the working tree.
*
* @throws IOException
*/
private void updateSmudgedEntries() throws IOException {
TreeWalk walk = new TreeWalk(repository);
try {
DirCacheIterator iIter = new DirCacheIterator(this);
FileTreeIterator fIter = new FileTreeIterator(repository);
walk.addTree(iIter);
walk.addTree(fIter);
walk.setRecursive(true);
while (walk.next()) {
iIter = walk.getTree(0, DirCacheIterator.class);
if (iIter == null)
continue;
fIter = walk.getTree(1, FileTreeIterator.class);
if (fIter == null)
continue;
DirCacheEntry entry = iIter.getDirCacheEntry();
if (entry.isSmudged() && iIter.idEqual(fIter)) {
entry.setLength(fIter.getEntryLength());
entry.setLastModified(fIter.getEntryLastModified());
}
}
} finally {
walk.release();
}
}
}

View File

@ -1,65 +0,0 @@
/*
* Copyright (C) 2009, Jonas Fonseca <fonseca@diku.dk>
* Copyright (C) 2007, Robin Rosenberg <robin.rosenberg@dewire.com>
* Copyright (C) 2007, Shawn O. Pearce <spearce@spearce.org>
* 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.errors;
import java.io.IOException;
/**
* An exception thrown when a gitlink entry is found and cannot be
* handled.
*/
public class GitlinksNotSupportedException extends IOException {
private static final long serialVersionUID = 1L;
/**
* Construct a GitlinksNotSupportedException for the specified link
*
* @param s name of link in tree or workdir
*/
public GitlinksNotSupportedException(final String s) {
super(s);
}
}

View File

@ -871,7 +871,7 @@ public File getIndexFile() throws NoWorkTreeException {
*/
public DirCache readDirCache() throws NoWorkTreeException,
CorruptObjectException, IOException {
return DirCache.read(getIndexFile(), getFS());
return DirCache.read(this);
}
/**
@ -903,7 +903,7 @@ public void onIndexChanged(IndexChangedEvent event) {
notifyIndexChanged();
}
};
return DirCache.lock(getIndexFile(), getFS(), l);
return DirCache.lock(this, l);
}
static byte[] gitInternalSlash(byte[] bytes) {
@ -1247,6 +1247,39 @@ public void writeCherryPickHead(ObjectId head) throws IOException {
writeHeadsFile(heads, Constants.CHERRY_PICK_HEAD);
}
/**
* Write original HEAD commit into $GIT_DIR/ORIG_HEAD.
*
* @param head
* an object id of the original HEAD commit or <code>null</code>
* to delete the file
* @throws IOException
*/
public void writeOrigHead(ObjectId head) throws IOException {
List<ObjectId> heads = head != null ? Collections.singletonList(head)
: null;
writeHeadsFile(heads, Constants.ORIG_HEAD);
}
/**
* Return the information stored in the file $GIT_DIR/ORIG_HEAD.
*
* @return object id from ORIG_HEAD file or {@code null} if this file
* doesn't exist. Also if the file exists but is empty {@code null}
* will be returned
* @throws IOException
* @throws NoWorkTreeException
* if this is bare, which implies it has no working directory.
* See {@link #isBare()}.
*/
public ObjectId readOrigHead() throws IOException, NoWorkTreeException {
if (isBare() || getDirectory() == null)
throw new NoWorkTreeException();
byte[] raw = readGitDirectoryFile(Constants.ORIG_HEAD);
return raw != null ? ObjectId.fromString(raw, 0) : null;
}
/**
* Read a file from the git directory.
*

View File

@ -172,6 +172,11 @@ long timeof(RevObject o) {
return ((RevCommit) o).getCommitTime();
if (o instanceof RevTag) {
RevTag tag = (RevTag) o;
try {
parseBody(tag);
} catch (IOException e) {
return 0;
}
PersonIdent who = tag.getTaggerIdent();
return who != null ? who.getWhen().getTime() : 0;
}

View File

@ -63,6 +63,8 @@
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.LinkedList;
@ -626,24 +628,27 @@ private PackedRefList getPackedRefs() throws IOException {
return curList;
final PackedRefList newList = readPackedRefs();
if (packedRefs.compareAndSet(curList, newList))
if (packedRefs.compareAndSet(curList, newList)
&& !curList.id.equals(newList.id))
modCnt.incrementAndGet();
return newList;
}
private PackedRefList readPackedRefs()
throws IOException {
private PackedRefList readPackedRefs() throws IOException {
final FileSnapshot snapshot = FileSnapshot.save(packedRefsFile);
final BufferedReader br;
final MessageDigest digest = Constants.newMessageDigest();
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(
packedRefsFile), CHARSET));
br = new BufferedReader(new InputStreamReader(
new DigestInputStream(new FileInputStream(packedRefsFile),
digest), CHARSET));
} catch (FileNotFoundException noPackedRefs) {
// Ignore it and leave the new list empty.
return PackedRefList.NO_PACKED_REFS;
}
try {
return new PackedRefList(parsePackedRefs(br), snapshot);
return new PackedRefList(parsePackedRefs(br), snapshot,
ObjectId.fromRaw(digest.digest()));
} finally {
br.close();
}
@ -724,8 +729,9 @@ protected void writeFile(String name, byte[] content)
if (!lck.commit())
throw new ObjectWritingException(MessageFormat.format(JGitText.get().unableToWrite, name));
packedRefs.compareAndSet(oldPackedList, new PackedRefList(
refs, lck.getCommitSnapshot()));
byte[] digest = Constants.newMessageDigest().digest(content);
packedRefs.compareAndSet(oldPackedList, new PackedRefList(refs,
lck.getCommitSnapshot(), ObjectId.fromRaw(digest)));
}
}.writePackedRefs();
}
@ -899,13 +905,17 @@ static void delete(final File file, final int depth) throws IOException {
private static class PackedRefList extends RefList<Ref> {
static final PackedRefList NO_PACKED_REFS = new PackedRefList(
RefList.emptyList(), FileSnapshot.MISSING_FILE);
RefList.emptyList(), FileSnapshot.MISSING_FILE,
ObjectId.zeroId());
final FileSnapshot snapshot;
PackedRefList(RefList<Ref> src, FileSnapshot s) {
final ObjectId id;
PackedRefList(RefList<Ref> src, FileSnapshot s, ObjectId i) {
super(src);
snapshot = s;
id = i;
}
}

View File

@ -1660,7 +1660,8 @@ private void findObjectsToPack(final ProgressMonitor countingMonitor,
for (int i = 0; i < cmit.getParentCount(); i++) {
RevCommit p = cmit.getParent(i);
if (!p.has(added) && !p.has(RevFlag.UNINTERESTING)) {
if (!p.has(added) && !p.has(RevFlag.UNINTERESTING)
&& !exclude(p)) {
p.add(added);
addObject(p, 0);
commitCnt++;

View File

@ -173,7 +173,7 @@
<junit-version>4.5</junit-version>
<args4j-version>2.0.12</args4j-version>
<servlet-api-version>2.5</servlet-api-version>
<jetty-version>7.1.6.v20100715</jetty-version>
<jetty-version>7.6.0.v20120127</jetty-version>
<protobuf-version>2.4.0a</protobuf-version>
<clirr-version>2.3</clirr-version>
</properties>
@ -183,6 +183,11 @@
<id>jgit-repository</id>
<url>http://download.eclipse.org/jgit/maven</url>
</repository>
<repository>
<id>jetty</id>
<layout>p2</layout>
<url>http://download.eclipse.org/jetty/updates/jetty-bundles-7.x/${jetty-version}/</url>
</repository>
</repositories>
<build>