diff --git a/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitInitTask.java b/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitInitTask.java index efdab42aa..91e57c0d6 100644 --- a/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitInitTask.java +++ b/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitInitTask.java @@ -48,7 +48,6 @@ import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.InitCommand; -import org.eclipse.jgit.api.errors.JGitInternalException; /** * Create an empty git repository. diff --git a/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/RecordingLogger.java b/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/RecordingLogger.java index ba7ee9782..0accfc8b6 100644 --- a/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/RecordingLogger.java +++ b/org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/RecordingLogger.java @@ -184,7 +184,6 @@ public class RecordingLogger implements Logger { // Ignore (not relevant to test failures) } - @SuppressWarnings("unused") public void ignore(Throwable arg0) { // Ignore (not relevant to test failures) } diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java index f4a3a6289..1afc6d808 100644 --- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java +++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java @@ -459,9 +459,13 @@ public class TestRepository { */ public T update(String ref, T obj) throws Exception { if (Constants.HEAD.equals(ref)) { + // nothing } else if ("FETCH_HEAD".equals(ref)) { + // nothing } else if ("MERGE_HEAD".equals(ref)) { + // nothing } else if (ref.startsWith(Constants.R_REFS)) { + // nothing } else ref = Constants.R_HEADS + ref; @@ -537,7 +541,9 @@ public class TestRepository { */ public BranchBuilder branch(String ref) { if (Constants.HEAD.equals(ref)) { + // nothing } else if (ref.startsWith(Constants.R_REFS)) { + // nothing } else ref = Constants.R_HEADS + ref; return new BranchBuilder(ref); diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/assembly.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/assembly.xml deleted file mode 100644 index 5bcf74602..000000000 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/assembly.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - site - - zip - - false - - - ${project.build.directory}/site - / - - - \ No newline at end of file diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/site.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/category.xml similarity index 100% rename from org.eclipse.jgit.packaging/org.eclipse.jgit.repository/site.xml rename to org.eclipse.jgit.packaging/org.eclipse.jgit.repository/category.xml diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml index e87f4498d..05f35f071 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml @@ -54,9 +54,7 @@ org.eclipse.jgit.repository - - eclipse-update-site + eclipse-repository JGit P2 Repository @@ -82,28 +80,4 @@ ${project.version} - - - - - org.apache.maven.plugins - maven-assembly-plugin - 2.3 - - - assembly.xml - - - - - make-assembly - package - - single - - - - - - diff --git a/org.eclipse.jgit.packaging/pom.xml b/org.eclipse.jgit.packaging/pom.xml index d3a956307..c23dd96db 100644 --- a/org.eclipse.jgit.packaging/pom.xml +++ b/org.eclipse.jgit.packaging/pom.xml @@ -59,7 +59,7 @@ JGit Tycho Parent - 0.14.1 + 0.15.0 7.6.0.v20120127 http://download.eclipse.org/releases/indigo diff --git a/org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/ChunkIndex.java b/org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/ChunkIndex.java index 91a2d0efc..89029c0cc 100644 --- a/org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/ChunkIndex.java +++ b/org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/ChunkIndex.java @@ -204,7 +204,6 @@ public abstract class ChunkIndex { return fmt; } - @SuppressWarnings("unchecked") private static void sortObjectList(List list) { Collections.sort(list); } diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CherryPickCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CherryPickCommandTest.java index 9f92c045c..469739c57 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CherryPickCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CherryPickCommandTest.java @@ -44,6 +44,7 @@ package org.eclipse.jgit.api; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.File; @@ -54,7 +55,10 @@ import org.eclipse.jgit.api.CherryPickResult.CherryPickStatus; import org.eclipse.jgit.api.ResetCommand.ResetType; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.JGitInternalException; +import org.eclipse.jgit.dircache.DirCache; +import org.eclipse.jgit.lib.ConfigConstants; import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.RepositoryState; import org.eclipse.jgit.lib.RepositoryTestCase; import org.eclipse.jgit.merge.ResolveMerger.MergeFailureReason; @@ -183,6 +187,42 @@ public class CherryPickCommandTest extends RepositoryTestCase { .exists()); } + @Test + public void testCherryPickOverExecutableChangeOnNonExectuableFileSystem() + throws Exception { + Git git = new Git(db); + File file = writeTrashFile("test.txt", "a"); + assertNotNull(git.add().addFilepattern("test.txt").call()); + assertNotNull(git.commit().setMessage("commit1").call()); + + assertNotNull(git.checkout().setCreateBranch(true).setName("a").call()); + + writeTrashFile("test.txt", "b"); + assertNotNull(git.add().addFilepattern("test.txt").call()); + RevCommit commit2 = git.commit().setMessage("commit2").call(); + assertNotNull(commit2); + + assertNotNull(git.checkout().setName(Constants.MASTER).call()); + + DirCache cache = db.lockDirCache(); + cache.getEntry("test.txt").setFileMode(FileMode.EXECUTABLE_FILE); + cache.write(); + assertTrue(cache.commit()); + cache.unlock(); + + assertNotNull(git.commit().setMessage("commit3").call()); + + db.getFS().setExecute(file, false); + git.getRepository() + .getConfig() + .setBoolean(ConfigConstants.CONFIG_CORE_SECTION, null, + ConfigConstants.CONFIG_KEY_FILEMODE, false); + + CherryPickResult result = git.cherryPick().include(commit2).call(); + assertNotNull(result); + assertEquals(CherryPickStatus.OK, result.getStatus()); + } + private RevCommit prepareCherryPick(final Git git) throws Exception { // create, add and commit file a writeTrashFile("a", "a"); diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/FileRepositoryBuilderTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/FileRepositoryBuilderTest.java index aed48aa5f..b6377482d 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/FileRepositoryBuilderTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/FileRepositoryBuilderTest.java @@ -45,13 +45,16 @@ package org.eclipse.jgit.storage.file; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; +import java.io.FileWriter; import java.io.IOException; import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase; import org.eclipse.jgit.lib.ConfigConstants; +import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.util.FileUtils; import org.junit.Test; @@ -108,4 +111,58 @@ public class FileRepositoryBuilderTest extends LocalDiskRepositoryTestCase { assertNotNull(e.getMessage()); } } + + @Test + public void absoluteGitDirRef() throws Exception { + FileRepository repo1 = createWorkRepository(); + File dir = createTempDirectory("dir"); + File dotGit = new File(dir, Constants.DOT_GIT); + new FileWriter(dotGit).append( + "gitdir: " + repo1.getDirectory().getAbsolutePath()).close(); + FileRepositoryBuilder builder = new FileRepositoryBuilder(); + + builder.setWorkTree(dir); + builder.setMustExist(true); + FileRepository repo2 = builder.build(); + + assertEquals(repo1.getDirectory(), repo2.getDirectory()); + assertEquals(dir, repo2.getWorkTree()); + } + + @Test + public void relativeGitDirRef() throws Exception { + FileRepository repo1 = createWorkRepository(); + File dir = new File(repo1.getWorkTree(), "dir"); + assertTrue(dir.mkdir()); + File dotGit = new File(dir, Constants.DOT_GIT); + new FileWriter(dotGit).append("gitdir: ../" + Constants.DOT_GIT) + .close(); + + FileRepositoryBuilder builder = new FileRepositoryBuilder(); + builder.setWorkTree(dir); + builder.setMustExist(true); + FileRepository repo2 = builder.build(); + + assertEquals(repo1.getDirectory(), repo2.getDirectory()); + assertEquals(dir, repo2.getWorkTree()); + } + + @Test + public void scanWithGitDirRef() throws Exception { + FileRepository repo1 = createWorkRepository(); + File dir = createTempDirectory("dir"); + File dotGit = new File(dir, Constants.DOT_GIT); + new FileWriter(dotGit).append( + "gitdir: " + repo1.getDirectory().getAbsolutePath()).close(); + FileRepositoryBuilder builder = new FileRepositoryBuilder(); + + builder.setWorkTree(dir); + builder.findGitDir(dir); + assertEquals(repo1.getDirectory(), builder.getGitDir()); + builder.setMustExist(true); + FileRepository repo2 = builder.build(); + + assertEquals(repo1.getDirectory(), repo2.getDirectory()); + assertEquals(dir, repo2.getWorkTree()); + } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java index 8658b0709..32abf86ed 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java @@ -102,8 +102,12 @@ public class ApplyCommand extends GitCommand { * method twice on an instance. * * @return an {@link ApplyResult} object representing the command result + * @throws GitAPIException + * @throws PatchFormatException + * @throws PatchApplyException */ - public ApplyResult call() throws GitAPIException { + public ApplyResult call() throws GitAPIException, PatchFormatException, + PatchApplyException { checkCallable(); ApplyResult r = new ApplyResult(); try { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java index 41265e832..b5bf11908 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java @@ -47,10 +47,14 @@ import java.text.MessageFormat; import java.util.LinkedList; 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.MultipleParentsNotAllowedException; 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.DirCacheCheckout; import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.lib.AnyObjectId; @@ -94,8 +98,16 @@ public class CherryPickCommand extends GitCommand { * invocation of the command. Don't call this method twice on an instance. * * @return the result of the cherry-pick + * @throws GitAPIException + * @throws WrongRepositoryStateException + * @throws ConcurrentRefUpdateException + * @throws UnmergedPathsException + * @throws NoMessageException + * @throws NoHeadException */ - public CherryPickResult call() throws GitAPIException { + public CherryPickResult call() throws GitAPIException, NoMessageException, + UnmergedPathsException, ConcurrentRefUpdateException, + WrongRepositoryStateException, NoHeadException { RevCommit newHead = null; List cherryPickedRefs = new LinkedList(); checkCallable(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CleanCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CleanCommand.java index 341be91da..1c19e9373 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CleanCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CleanCommand.java @@ -51,6 +51,7 @@ import java.util.TreeSet; 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.Repository; import org.eclipse.jgit.util.FileUtils; @@ -81,8 +82,10 @@ public class CleanCommand extends GitCommand> { * call to {@link #call()}) * * @return a set of strings representing each file cleaned. + * @throws GitAPIException + * @throws NoWorkTreeException */ - public Set call() throws GitAPIException { + public Set call() throws NoWorkTreeException, GitAPIException { Set files = new TreeSet(); try { StatusCommand command = new StatusCommand(repo); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java index 23bbc2aa9..067e92a96 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java @@ -113,8 +113,12 @@ public class CloneCommand extends TransportCommand { * Executes the {@code Clone} command. * * @return the newly created {@code Git} object with associated repository + * @throws InvalidRemoteException + * @throws org.eclipse.jgit.api.errors.TransportException + * @throws GitAPIException */ - public Git call() throws GitAPIException { + public Git call() throws GitAPIException, InvalidRemoteException, + org.eclipse.jgit.api.errors.TransportException { try { URIish u = new URIish(uri); Repository repository = init(u); @@ -124,10 +128,9 @@ public class CloneCommand extends TransportCommand { return new Git(repository); } catch (IOException ioe) { throw new JGitInternalException(ioe.getMessage(), ioe); - } catch (InvalidRemoteException e) { - throw new JGitInternalException(e.getMessage(), e); } catch (URISyntaxException e) { - throw new JGitInternalException(e.getMessage(), e); + throw new InvalidRemoteException(MessageFormat.format( + JGitText.get().invalidRemote, remote)); } } @@ -144,7 +147,9 @@ public class CloneCommand extends TransportCommand { } private FetchResult fetch(Repository clonedRepo, URIish u) - throws URISyntaxException, IOException, GitAPIException { + throws URISyntaxException, + org.eclipse.jgit.api.errors.TransportException, IOException, + GitAPIException { // create the remote config and save it RemoteConfig config = new RemoteConfig(clonedRepo.getConfig(), remote); config.addURI(u); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/FetchCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/FetchCommand.java index 6df244bcc..69c492372 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/FetchCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/FetchCommand.java @@ -135,8 +135,7 @@ public class FetchCommand extends TransportCommand { JGitText.get().invalidRemote, remote), e); } catch (TransportException e) { throw new org.eclipse.jgit.api.errors.TransportException( - JGitText.get().exceptionCaughtDuringExecutionOfFetchCommand, - e); + e.getMessage(), e); } catch (URISyntaxException e) { throw new InvalidRemoteException(MessageFormat.format( JGitText.get().invalidRemote, remote)); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/LsRemoteCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/LsRemoteCommand.java index b041f33c4..c450ea962 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/LsRemoteCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/LsRemoteCommand.java @@ -148,6 +148,7 @@ public class LsRemoteCommand extends * for errors that occurs during transport */ public Collection call() throws GitAPIException, + InvalidRemoteException, org.eclipse.jgit.api.errors.TransportException { checkCallable(); @@ -186,8 +187,8 @@ public class LsRemoteCommand extends JGitText.get().exceptionCaughtDuringExecutionOfLsRemoteCommand, e); } catch (TransportException e) { - throw new org.eclipse.jgit.api.errors.TransportException( - JGitText.get().exceptionCaughtDuringExecutionOfLsRemoteCommand, + throw new org.eclipse.jgit.api.errors.TransportException( + e.getMessage(), e); } finally { if (fc != null) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java index 86d38fb36..fa425d37f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/PullCommand.java @@ -48,16 +48,12 @@ import java.text.MessageFormat; import org.eclipse.jgit.api.RebaseCommand.Operation; import org.eclipse.jgit.api.errors.CanceledException; -import org.eclipse.jgit.api.errors.CheckoutConflictException; -import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException; import org.eclipse.jgit.api.errors.DetachedHeadException; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.InvalidConfigurationException; -import org.eclipse.jgit.api.errors.InvalidMergeHeadsException; import org.eclipse.jgit.api.errors.InvalidRemoteException; 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.RefNotFoundException; import org.eclipse.jgit.api.errors.WrongRepositoryStateException; import org.eclipse.jgit.internal.JGitText; @@ -109,11 +105,21 @@ public class PullCommand extends TransportCommand { * command. Don't call this method twice on an instance. * * @return the result of the pull + * @throws WrongRepositoryStateException + * @throws InvalidConfigurationException + * @throws DetachedHeadException + * @throws InvalidRemoteException + * @throws CanceledException + * @throws RefNotFoundException + * @throws NoHeadException + * @throws org.eclipse.jgit.api.errors.TransportException + * @throws GitAPIException */ - public PullResult call() throws GitAPIException, WrongRepositoryStateException, - InvalidConfigurationException, DetachedHeadException, - InvalidRemoteException, CanceledException, RefNotFoundException, - NoHeadException { + public PullResult call() throws GitAPIException, + WrongRepositoryStateException, InvalidConfigurationException, + DetachedHeadException, InvalidRemoteException, CanceledException, + RefNotFoundException, NoHeadException, + org.eclipse.jgit.api.errors.TransportException { checkCallable(); monitor.beginTask(JGitText.get().pullTaskName, 2); @@ -239,44 +245,19 @@ public class PullCommand extends TransportCommand { PullResult result; if (doRebase) { RebaseCommand rebase = new RebaseCommand(repo); - try { - RebaseResult rebaseRes = rebase.setUpstream(commitToMerge) - .setProgressMonitor(monitor).setOperation( - Operation.BEGIN).call(); - result = new PullResult(fetchRes, remote, rebaseRes); - } catch (NoHeadException e) { - throw new JGitInternalException(e.getMessage(), e); - } catch (RefNotFoundException e) { - throw new JGitInternalException(e.getMessage(), e); - } catch (JGitInternalException e) { - throw new JGitInternalException(e.getMessage(), e); - } catch (GitAPIException e) { - throw new JGitInternalException(e.getMessage(), e); - } + RebaseResult rebaseRes = rebase.setUpstream(commitToMerge) + .setProgressMonitor(monitor).setOperation(Operation.BEGIN) + .call(); + result = new PullResult(fetchRes, remote, rebaseRes); } else { MergeCommand merge = new MergeCommand(repo); String name = "branch \'" + Repository.shortenRefName(remoteBranchName) + "\' of " + remoteUri; merge.include(name, commitToMerge); - MergeResult mergeRes; - try { - mergeRes = merge.call(); - monitor.update(1); - result = new PullResult(fetchRes, remote, mergeRes); - } catch (NoHeadException e) { - throw new JGitInternalException(e.getMessage(), e); - } catch (ConcurrentRefUpdateException e) { - throw new JGitInternalException(e.getMessage(), e); - } catch (CheckoutConflictException e) { - throw new JGitInternalException(e.getMessage(), e); - } catch (InvalidMergeHeadsException e) { - throw new JGitInternalException(e.getMessage(), e); - } catch (WrongRepositoryStateException e) { - throw new JGitInternalException(e.getMessage(), e); - } catch (NoMessageException e) { - throw new JGitInternalException(e.getMessage(), e); - } + MergeResult mergeRes = merge.call(); + monitor.update(1); + result = new PullResult(fetchRes, remote, mergeRes); } monitor.endTask(); return result; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/PushCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/PushCommand.java index edfb2f7b7..1a4058e12 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/PushCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/PushCommand.java @@ -109,9 +109,13 @@ public class PushCommand extends * @return an iteration over {@link PushResult} objects * @throws InvalidRemoteException * when called with an invalid remote uri + * @throws org.eclipse.jgit.api.errors.TransportException + * when an error occurs with the transport + * @throws GitAPIException */ public Iterable call() throws GitAPIException, - InvalidRemoteException { + InvalidRemoteException, + org.eclipse.jgit.api.errors.TransportException { checkCallable(); ArrayList pushResults = new ArrayList(3); @@ -150,9 +154,8 @@ public class PushCommand extends pushResults.add(result); } catch (TransportException e) { - throw new JGitInternalException( - JGitText.get().exceptionCaughtDuringExecutionOfPushCommand, - e); + throw new org.eclipse.jgit.api.errors.TransportException( + e.getMessage(), e); } finally { transport.close(); } @@ -161,6 +164,9 @@ public class PushCommand extends } catch (URISyntaxException e) { throw new InvalidRemoteException(MessageFormat.format( JGitText.get().invalidRemote, remote)); + } catch (TransportException e) { + throw new org.eclipse.jgit.api.errors.TransportException( + e.getMessage(), e); } catch (NotSupportedException e) { throw new JGitInternalException( JGitText.get().exceptionCaughtDuringExecutionOfPushCommand, diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java index ecf85932e..645c9ff1f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java @@ -189,9 +189,13 @@ public class RebaseCommand extends GitCommand { * this method twice on an instance. * * @return an object describing the result of this command + * @throws GitAPIException + * @throws WrongRepositoryStateException + * @throws NoHeadException + * @throws RefNotFoundException */ public RebaseResult call() throws GitAPIException, NoHeadException, - RefNotFoundException { + RefNotFoundException, WrongRepositoryStateException { RevCommit newHead = null; boolean lastStepWasForward = false; checkCallable(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ReflogCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ReflogCommand.java index c4d112a31..ef344b5c3 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ReflogCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ReflogCommand.java @@ -85,7 +85,14 @@ public class ReflogCommand extends GitCommand> { return this; } - public Collection call() throws GitAPIException { + /** + * Run the reflog command + * + * @throws GitAPIException + * @throws InvalidRefNameException + */ + public Collection call() throws GitAPIException, + InvalidRefNameException { checkCallable(); try { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java index a6d425ea3..b34b902ce 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java @@ -47,6 +47,7 @@ import java.text.MessageFormat; import java.util.Collection; import java.util.LinkedList; +import org.eclipse.jgit.api.errors.CheckoutConflictException; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.JGitInternalException; import org.eclipse.jgit.dircache.DirCache; @@ -135,8 +136,9 @@ public class ResetCommand extends GitCommand { * twice on an instance. * * @return the Ref after reset + * @throws GitAPIException */ - public Ref call() throws GitAPIException { + public Ref call() throws GitAPIException, CheckoutConflictException { checkCallable(); Ref r; @@ -366,13 +368,19 @@ public class ResetCommand extends GitCommand { } } - private void checkoutIndex(RevCommit commit) throws IOException { + private void checkoutIndex(RevCommit commit) throws IOException, + GitAPIException { DirCache dc = repo.lockDirCache(); try { DirCacheCheckout checkout = new DirCacheCheckout(repo, dc, commit.getTree()); checkout.setFailOnConflict(false); - checkout.checkout(); + try { + checkout.checkout(); + } catch (org.eclipse.jgit.errors.CheckoutConflictException cce) { + throw new CheckoutConflictException(checkout.getConflicts(), + cce); + } } finally { dc.unlock(); } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RevertCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RevertCommand.java index 416677c40..fde6b94d2 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RevertCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RevertCommand.java @@ -49,10 +49,14 @@ import java.util.List; import java.util.Map; import org.eclipse.jgit.api.MergeResult.MergeStatus; +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.MultipleParentsNotAllowedException; 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.DirCacheCheckout; import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.lib.AnyObjectId; @@ -105,8 +109,15 @@ public class RevertCommand extends GitCommand { * returned. If a failure occurred during revert null * is returned. The list of successfully reverted {@link Ref}'s can * be obtained by calling {@link #getRevertedRefs()} + * @throws GitAPIException + * @throws WrongRepositoryStateException + * @throws ConcurrentRefUpdateException + * @throws UnmergedPathsException + * @throws NoMessageException */ - public RevCommit call() throws GitAPIException { + public RevCommit call() throws NoMessageException, UnmergedPathsException, + ConcurrentRefUpdateException, WrongRepositoryStateException, + GitAPIException { RevCommit newHead = null; checkCallable(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java index 4992d3ccd..c26a48525 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java @@ -296,8 +296,11 @@ public class StashApplyCommand extends GitCommand { * Apply the changes in a stashed commit to the working directory and index * * @return id of stashed commit that was applied + * @throws GitAPIException + * @throws WrongRepositoryStateException */ - public ObjectId call() throws GitAPIException { + public ObjectId call() throws GitAPIException, + WrongRepositoryStateException { checkCallable(); if (repo.getRepositoryState() != RepositoryState.SAFE) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashCreateCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashCreateCommand.java index 4056894c9..4c7ae6ade 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashCreateCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashCreateCommand.java @@ -211,6 +211,7 @@ public class StashCreateCommand extends GitCommand { * and reset to the current HEAD commit. * * @return stashed commit or null if no changes to stash + * @throws GitAPIException */ public RevCommit call() throws GitAPIException { checkCallable(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashDropCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashDropCommand.java index eb61298e2..dde736bb5 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashDropCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashDropCommand.java @@ -167,6 +167,7 @@ public class StashDropCommand extends GitCommand { * stash reference after the drop occurs * * @return commit id of stash reference or null if no more stashed changes + * @throws GitAPIException */ public ObjectId call() throws GitAPIException { checkCallable(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashListCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashListCommand.java index 407b5ab1e..697790596 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashListCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashListCommand.java @@ -76,7 +76,8 @@ public class StashListCommand extends GitCommand> { super(repo); } - public Collection call() throws GitAPIException { + public Collection call() throws GitAPIException, + InvalidRefNameException { checkCallable(); try { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleUpdateCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleUpdateCommand.java index be705ee6d..caf2cedc4 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleUpdateCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleUpdateCommand.java @@ -47,8 +47,16 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +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.InvalidConfigurationException; +import org.eclipse.jgit.api.errors.InvalidMergeHeadsException; 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.RefNotFoundException; +import org.eclipse.jgit.api.errors.WrongRepositoryStateException; import org.eclipse.jgit.dircache.DirCacheCheckout; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.ConfigConstants; @@ -109,7 +117,25 @@ public class SubmoduleUpdateCommand extends return this; } - public Collection call() throws GitAPIException { + /** + * Execute the SubmoduleUpdateCommand command. + * + * @return a collection of updated submodule paths + * @throws ConcurrentRefUpdateException + * @throws CheckoutConflictException + * @throws InvalidMergeHeadsException + * @throws InvalidConfigurationException + * @throws NoHeadException + * @throws NoMessageException + * @throws RefNotFoundException + * @throws WrongRepositoryStateException + * @throws GitAPIException + */ + public Collection call() throws InvalidConfigurationException, + NoHeadException, ConcurrentRefUpdateException, + CheckoutConflictException, InvalidMergeHeadsException, + WrongRepositoryStateException, NoMessageException, NoHeadException, + RefNotFoundException, GitAPIException { checkCallable(); try { @@ -168,9 +194,7 @@ public class SubmoduleUpdateCommand extends } catch (IOException e) { throw new JGitInternalException(e.getMessage(), e); } catch (ConfigInvalidException e) { - throw new JGitInternalException(e.getMessage(), e); - } catch (GitAPIException e) { - throw new JGitInternalException(e.getMessage(), e); + throw new InvalidConfigurationException(e.getMessage(), e); } } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java index ceb4cb0c0..4258f7409 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java @@ -963,7 +963,7 @@ public class DiffFormatter { if (entry.getMode(side).getObjectType() != Constants.OBJ_BLOB) return EMPTY; - if (isBinary(entry.getPath(side))) + if (isBinary()) return BINARY; AbbreviatedObjectId id = entry.getId(side); @@ -1004,7 +1004,7 @@ public class DiffFormatter { } } - private boolean isBinary(String path) { + private boolean isBinary() { return false; } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java index 8b15a27a0..f46869e42 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java @@ -1021,10 +1021,9 @@ public class DirCacheCheckout { } private static boolean isValidPathSegment(CanonicalTreeParser t) { - boolean isWindows = "Windows".equals(SystemReader.getInstance() - .getProperty("os.name")); - boolean isOSX = "Mac OS X".equals(SystemReader.getInstance() - .getProperty("os.name")); + String osName = SystemReader.getInstance().getProperty("os.name"); + boolean isWindows = "Windows".equals(osName); + boolean isOSX = "Darwin".equals(osName) || "Mac OS X".equals(osName); boolean ignCase = isOSX || isWindows; int ptr = t.getNameOffset(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/RevisionSyntaxException.java b/org.eclipse.jgit/src/org/eclipse/jgit/errors/RevisionSyntaxException.java index 6b7f12d4b..386d4c9e0 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/RevisionSyntaxException.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/errors/RevisionSyntaxException.java @@ -45,13 +45,12 @@ package org.eclipse.jgit.errors; -import java.io.IOException; /** * This signals a revision or object reference was not * properly formatted. */ -public class RevisionSyntaxException extends IOException { +public class RevisionSyntaxException extends IllegalArgumentException { private static final long serialVersionUID = 1L; private final String revstr; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BaseRepositoryBuilder.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BaseRepositoryBuilder.java index 17e06039b..f80c80360 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BaseRepositoryBuilder.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BaseRepositoryBuilder.java @@ -100,6 +100,29 @@ public class BaseRepositoryBuilder result = contentMerge(base, ours, theirs); @@ -507,7 +507,7 @@ public class ResolveMerger extends ThreeWayMerger { // OURS was deleted checkout THEIRS if (modeO == 0) { // Check worktree before checking out THEIRS - if (isWorktreeDirty()) + if (isWorktreeDirty(work)) return false; if (nonTree(modeT)) { if (e != null) @@ -563,7 +563,7 @@ public class ResolveMerger extends ThreeWayMerger { return isDirty; } - private boolean isWorktreeDirty() { + private boolean isWorktreeDirty(WorkingTreeIterator work) { if (inCore) return false; @@ -571,8 +571,13 @@ public class ResolveMerger extends ThreeWayMerger { final int modeO = tw.getRawMode(T_OURS); // Worktree entry has to match ours to be considered clean - final boolean isDirty = nonTree(modeF) - && !(modeO == modeF && tw.idEqual(T_FILE, T_OURS)); + final boolean isDirty; + if (nonTree(modeF)) + isDirty = work.isModeDifferent(modeO) + || !tw.idEqual(T_FILE, T_OURS); + else + isDirty = false; + if (isDirty) failingPaths.put(tw.getPathString(), MergeFailureReason.DIRTY_WORKTREE); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsInserter.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsInserter.java index 335e284e2..0e02e00bc 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsInserter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsInserter.java @@ -231,7 +231,6 @@ public class DfsInserter extends ObjectInserter { packOut.write(buf, 0, 12); } - @SuppressWarnings("unchecked") private void sortObjectsById() { Collections.sort(objectList); } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpAuthMethod.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpAuthMethod.java index d9673f74e..bcf0a8ba2 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpAuthMethod.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpAuthMethod.java @@ -277,12 +277,14 @@ abstract class HttpAuthMethod { r.append("://"); r.append(u.getHost()); if (0 < u.getPort()) { - if (u.getPort() == 80 && "http".equals(u.getProtocol())) - /* nothing */; - else if (u.getPort() == 443 && "https".equals(u.getProtocol())) - /* nothing */; - else + if (u.getPort() == 80 && "http".equals(u.getProtocol())) { + /* nothing */ + } else if (u.getPort() == 443 + && "https".equals(u.getProtocol())) { + /* nothing */ + } else { r.append(':').append(u.getPort()); + } } r.append(u.getPath()); if (u.getQuery() != null) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java index 9b061329f..f2d3c8c23 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java @@ -591,15 +591,14 @@ public class URIish implements Serializable { * @return the URI, including its password field, if any. */ public String toPrivateString() { - return format(true, false, false); + return format(true, false); } public String toString() { - return format(false, false, false); + return format(false, false); } - private String format(final boolean includePassword, boolean escape, - boolean escapeNonAscii) { + private String format(final boolean includePassword, boolean escapeNonAscii) { final StringBuilder r = new StringBuilder(); if (getScheme() != null) { r.append(getScheme()); @@ -646,7 +645,7 @@ public class URIish implements Serializable { * @return the URI as an ASCII string. Password is not included. */ public String toASCIIString() { - return format(false, true, true); + return format(false, true); } /** @@ -654,7 +653,7 @@ public class URIish implements Serializable { * such that it will be valid for use over the network. */ public String toPrivateASCIIString() { - return format(true, true, true); + return format(true, true); } /** diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java index 759613ba2..ebe9f73fb 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java @@ -695,6 +695,33 @@ public abstract class WorkingTreeIterator extends AbstractTreeIterator { DIFFER_BY_TIMESTAMP } + /** + * Is the file mode of the current entry different than the given raw mode? + * + * @param rawMode + * @return true if different, false otherwise + */ + public boolean isModeDifferent(final int rawMode) { + // Determine difference in mode-bits of file and index-entry. In the + // bitwise presentation of modeDiff we'll have a '1' when the two modes + // differ at this position. + int modeDiff = getEntryRawMode() ^ rawMode; + + if (modeDiff == 0) + return false; + + // Do not rely on filemode differences in case of symbolic links + if (FileMode.SYMLINK.equals(rawMode)) + return false; + + // Ignore the executable file bits if WorkingTreeOptions tell me to + // do so. Ignoring is done by setting the bits representing a + // EXECUTABLE_FILE to '0' in modeDiff + if (!state.options.isFileMode()) + modeDiff &= ~FileMode.EXECUTABLE_FILE.getBits(); + return modeDiff != 0; + } + /** * Compare the metadata (mode, length, modification-timestamp) of the * current entry and a {@link DirCacheEntry} @@ -714,23 +741,8 @@ public abstract class WorkingTreeIterator extends AbstractTreeIterator { if (!entry.isSmudged() && entry.getLength() != (int) getEntryLength()) return MetadataDiff.DIFFER_BY_METADATA; - // Determine difference in mode-bits of file and index-entry. In the - // bitwise presentation of modeDiff we'll have a '1' when the two modes - // differ at this position. - int modeDiff = getEntryRawMode() ^ entry.getRawMode(); - - // Do not rely on filemode differences in case of symbolic links - if (modeDiff != 0 && !FileMode.SYMLINK.equals(entry.getRawMode())) { - // Ignore the executable file bits if WorkingTreeOptions tell me to - // do so. Ignoring is done by setting the bits representing a - // EXECUTABLE_FILE to '0' in modeDiff - if (!state.options.isFileMode()) - modeDiff &= ~FileMode.EXECUTABLE_FILE.getBits(); - if (modeDiff != 0) - // Report a modification if the modes still (after potentially - // ignoring EXECUTABLE_FILE bits) differ - return MetadataDiff.DIFFER_BY_METADATA; - } + if (isModeDifferent(entry.getRawMode())) + return MetadataDiff.DIFFER_BY_METADATA; // Git under windows only stores seconds so we round the timestamp // Java gives us if it looks like the timestamp in index is seconds diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java index c181a7a74..f04bb6fe0 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java @@ -105,6 +105,6 @@ abstract class FS_POSIX extends FS { return System.getProperty("os.name"); } }); - return "Mac OS X".equals(osDotName); + return "Mac OS X".equals(osDotName) || "Darwin".equals(osDotName); } } diff --git a/pom.xml b/pom.xml index cf744197d..ad17122ff 100644 --- a/pom.xml +++ b/pom.xml @@ -183,11 +183,6 @@ jgit-repository http://download.eclipse.org/jgit/maven - - jetty - p2 - http://download.eclipse.org/jetty/updates/jetty-bundles-7.x/${jetty-version}/ - @@ -377,6 +372,20 @@ + + org.apache.maven.plugins + maven-source-plugin + true + + + attach-sources + process-classes + + jar + + + +