Git.java
- /*
- * Copyright (C) 2010, Christian Halstrick <christian.halstrick@sap.com>
- * Copyright (C) 2010, 2021 Chris Aniszczyk <caniszczyk@gmail.com> and others
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0 which is available at
- * https://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
- package org.eclipse.jgit.api;
- import static java.util.Objects.requireNonNull;
- import java.io.File;
- import java.io.IOException;
- import org.eclipse.jgit.lib.Repository;
- import org.eclipse.jgit.lib.RepositoryBuilder;
- import org.eclipse.jgit.lib.RepositoryCache;
- import org.eclipse.jgit.lib.internal.WorkQueue;
- import org.eclipse.jgit.nls.NLS;
- import org.eclipse.jgit.util.FS;
- /**
- * Offers a "GitPorcelain"-like API to interact with a git repository.
- * <p>
- * The GitPorcelain commands are described in the <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git.html#_high_level_commands_porcelain"
- * >Git Documentation</a>.
- * <p>
- * This class only offers methods to construct so-called command classes. Each
- * GitPorcelain command is represented by one command class.<br>
- * Example: this class offers a {@code commit()} method returning an instance of
- * the {@code CommitCommand} class. The {@code CommitCommand} class has setters
- * for all the arguments and options. The {@code CommitCommand} class also has a
- * {@code call} method to actually execute the commit. The following code show's
- * how to do a simple commit:
- *
- * <pre>
- * Git git = new Git(myRepo);
- * git.commit().setMessage("Fix393").setAuthor(developerIdent).call();
- * </pre>
- *
- * All mandatory parameters for commands have to be specified in the methods of
- * this class, the optional parameters have to be specified by the
- * setter-methods of the Command class.
- * <p>
- * This class is intended to be used internally (e.g. by JGit tests) or by
- * external components (EGit, third-party tools) when they need exactly the
- * functionality of a GitPorcelain command. There are use-cases where this class
- * is not optimal and where you should use the more low-level JGit classes. The
- * methods in this class may for example offer too much functionality or they
- * offer the functionality with the wrong arguments.
- */
- public class Git implements AutoCloseable {
- /** The git repository this class is interacting with */
- private final Repository repo;
- private final boolean closeRepo;
- /**
- * Open repository
- *
- * @param dir
- * the repository to open. May be either the GIT_DIR, or the
- * working tree directory that contains {@code .git}.
- * @return a {@link org.eclipse.jgit.api.Git} object for the existing git
- * repository
- * @throws java.io.IOException
- */
- public static Git open(File dir) throws IOException {
- return open(dir, FS.DETECTED);
- }
- /**
- * Open repository
- *
- * @param dir
- * the repository to open. May be either the GIT_DIR, or the
- * working tree directory that contains {@code .git}.
- * @param fs
- * filesystem abstraction to use when accessing the repository.
- * @return a {@link org.eclipse.jgit.api.Git} object for the existing git
- * repository. Closing this instance will close the repo.
- * @throws java.io.IOException
- */
- public static Git open(File dir, FS fs) throws IOException {
- RepositoryCache.FileKey key;
- key = RepositoryCache.FileKey.lenient(dir, fs);
- Repository db = new RepositoryBuilder().setFS(fs).setGitDir(key.getFile())
- .setMustExist(true).build();
- return new Git(db, true);
- }
- /**
- * Wrap repository
- *
- * @param repo
- * the git repository this class is interacting with;
- * {@code null} is not allowed.
- * @return a {@link org.eclipse.jgit.api.Git} object for the existing git
- * repository. The caller is responsible for closing the repository;
- * {@link #close()} on this instance does not close the repo.
- */
- public static Git wrap(Repository repo) {
- return new Git(repo);
- }
- /**
- * {@inheritDoc}
- * <p>
- * Free resources associated with this instance.
- * <p>
- * If the repository was opened by a static factory method in this class,
- * then this method calls {@link Repository#close()} on the underlying
- * repository instance. (Whether this actually releases underlying
- * resources, such as file handles, may vary; see {@link Repository} for
- * more details.)
- * <p>
- * If the repository was created by a caller and passed into
- * {@link #Git(Repository)} or a static factory method in this class, then
- * this method does not call close on the underlying repository.
- * <p>
- * In all cases, after calling this method you should not use this
- * {@link Git} instance anymore.
- *
- * @since 3.2
- */
- @Override
- public void close() {
- if (closeRepo)
- repo.close();
- }
- /**
- * Return a command object to execute a {@code clone} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-clone.html"
- * >Git documentation about clone</a>
- * @return a {@link org.eclipse.jgit.api.CloneCommand} used to collect all
- * optional parameters and to finally execute the {@code clone}
- * command
- */
- public static CloneCommand cloneRepository() {
- return new CloneCommand();
- }
- /**
- * Return a command to list remote branches/tags without a local repository.
- *
- * @return a {@link org.eclipse.jgit.api.LsRemoteCommand}
- * @since 3.1
- */
- public static LsRemoteCommand lsRemoteRepository() {
- return new LsRemoteCommand(null);
- }
- /**
- * Return a command object to execute a {@code init} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-init.html" >Git
- * documentation about init</a>
- * @return a {@link org.eclipse.jgit.api.InitCommand} used to collect all
- * optional parameters and to finally execute the {@code init}
- * command
- */
- public static InitCommand init() {
- return new InitCommand();
- }
- /**
- * Shutdown JGit and release resources it holds like NLS and thread pools
- * @since 5.8
- */
- public static void shutdown() {
- WorkQueue.getExecutor().shutdownNow();
- NLS.clear();
- }
- /**
- * Construct a new {@link org.eclipse.jgit.api.Git} object which can
- * interact with the specified git repository.
- * <p>
- * All command classes returned by methods of this class will always
- * interact with this git repository.
- * <p>
- * The caller is responsible for closing the repository; {@link #close()} on
- * this instance does not close the repo.
- *
- * @param repo
- * the git repository this class is interacting with;
- * {@code null} is not allowed.
- */
- public Git(Repository repo) {
- this(repo, false);
- }
- Git(Repository repo, boolean closeRepo) {
- this.repo = requireNonNull(repo);
- this.closeRepo = closeRepo;
- }
- /**
- * Return a command object to execute a {@code Commit} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-commit.html"
- * >Git documentation about Commit</a>
- * @return a {@link org.eclipse.jgit.api.CommitCommand} used to collect all
- * optional parameters and to finally execute the {@code Commit}
- * command
- */
- public CommitCommand commit() {
- return new CommitCommand(repo);
- }
- /**
- * Return a command object to execute a {@code Log} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-log.html" >Git
- * documentation about Log</a>
- * @return a {@link org.eclipse.jgit.api.LogCommand} used to collect all
- * optional parameters and to finally execute the {@code Log}
- * command
- */
- public LogCommand log() {
- return new LogCommand(repo);
- }
- /**
- * Return a command object to execute a {@code Merge} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-merge.html"
- * >Git documentation about Merge</a>
- * @return a {@link org.eclipse.jgit.api.MergeCommand} used to collect all
- * optional parameters and to finally execute the {@code Merge}
- * command
- */
- public MergeCommand merge() {
- return new MergeCommand(repo);
- }
- /**
- * Return a command object to execute a {@code Pull} command
- *
- * @return a {@link org.eclipse.jgit.api.PullCommand}
- */
- public PullCommand pull() {
- return new PullCommand(repo);
- }
- /**
- * Return a command object used to create branches
- *
- * @return a {@link org.eclipse.jgit.api.CreateBranchCommand}
- */
- public CreateBranchCommand branchCreate() {
- return new CreateBranchCommand(repo);
- }
- /**
- * Return a command object used to delete branches
- *
- * @return a {@link org.eclipse.jgit.api.DeleteBranchCommand}
- */
- public DeleteBranchCommand branchDelete() {
- return new DeleteBranchCommand(repo);
- }
- /**
- * Return a command object used to list branches
- *
- * @return a {@link org.eclipse.jgit.api.ListBranchCommand}
- */
- public ListBranchCommand branchList() {
- return new ListBranchCommand(repo);
- }
- /**
- *
- * Return a command object used to list tags
- *
- * @return a {@link org.eclipse.jgit.api.ListTagCommand}
- */
- public ListTagCommand tagList() {
- return new ListTagCommand(repo);
- }
- /**
- * Return a command object used to rename branches
- *
- * @return a {@link org.eclipse.jgit.api.RenameBranchCommand}
- */
- public RenameBranchCommand branchRename() {
- return new RenameBranchCommand(repo);
- }
- /**
- * Return a command object to execute a {@code Add} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-add.html" >Git
- * documentation about Add</a>
- * @return a {@link org.eclipse.jgit.api.AddCommand} used to collect all
- * optional parameters and to finally execute the {@code Add}
- * command
- */
- public AddCommand add() {
- return new AddCommand(repo);
- }
- /**
- * Return a command object to execute a {@code Tag} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-tag.html" >Git
- * documentation about Tag</a>
- * @return a {@link org.eclipse.jgit.api.TagCommand} used to collect all
- * optional parameters and to finally execute the {@code Tag}
- * command
- */
- public TagCommand tag() {
- return new TagCommand(repo);
- }
- /**
- * Return a command object to execute a {@code Fetch} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-fetch.html"
- * >Git documentation about Fetch</a>
- * @return a {@link org.eclipse.jgit.api.FetchCommand} used to collect all
- * optional parameters and to finally execute the {@code Fetch}
- * command
- */
- public FetchCommand fetch() {
- return new FetchCommand(repo);
- }
- /**
- * Return a command object to execute a {@code Push} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-push.html" >Git
- * documentation about Push</a>
- * @return a {@link org.eclipse.jgit.api.PushCommand} used to collect all
- * optional parameters and to finally execute the {@code Push}
- * command
- */
- public PushCommand push() {
- return new PushCommand(repo);
- }
- /**
- * Return a command object to execute a {@code cherry-pick} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-cherry-pick.html"
- * >Git documentation about cherry-pick</a>
- * @return a {@link org.eclipse.jgit.api.CherryPickCommand} used to collect
- * all optional parameters and to finally execute the
- * {@code cherry-pick} command
- */
- public CherryPickCommand cherryPick() {
- return new CherryPickCommand(repo);
- }
- /**
- * Return a command object to execute a {@code revert} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-revert.html"
- * >Git documentation about reverting changes</a>
- * @return a {@link org.eclipse.jgit.api.RevertCommand} used to collect all
- * optional parameters and to finally execute the
- * {@code cherry-pick} command
- */
- public RevertCommand revert() {
- return new RevertCommand(repo);
- }
- /**
- * Return a command object to execute a {@code Rebase} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-rebase.html"
- * >Git documentation about rebase</a>
- * @return a {@link org.eclipse.jgit.api.RebaseCommand} used to collect all
- * optional parameters and to finally execute the {@code rebase}
- * command
- */
- public RebaseCommand rebase() {
- return new RebaseCommand(repo);
- }
- /**
- * Return a command object to execute a {@code rm} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-rm.html" >Git
- * documentation about rm</a>
- * @return a {@link org.eclipse.jgit.api.RmCommand} used to collect all
- * optional parameters and to finally execute the {@code rm} command
- */
- public RmCommand rm() {
- return new RmCommand(repo);
- }
- /**
- * Return a command object to execute a {@code checkout} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-checkout.html"
- * >Git documentation about checkout</a>
- * @return a {@link org.eclipse.jgit.api.CheckoutCommand} used to collect
- * all optional parameters and to finally execute the
- * {@code checkout} command
- */
- public CheckoutCommand checkout() {
- return new CheckoutCommand(repo);
- }
- /**
- * Return a command object to execute a {@code reset} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-reset.html"
- * >Git documentation about reset</a>
- * @return a {@link org.eclipse.jgit.api.ResetCommand} used to collect all
- * optional parameters and to finally execute the {@code reset}
- * command
- */
- public ResetCommand reset() {
- return new ResetCommand(repo);
- }
- /**
- * Return a command object to execute a {@code status} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-status.html"
- * >Git documentation about status</a>
- * @return a {@link org.eclipse.jgit.api.StatusCommand} used to collect all
- * optional parameters and to finally execute the {@code status}
- * command
- */
- public StatusCommand status() {
- return new StatusCommand(repo);
- }
- /**
- * Return a command to create an archive from a tree
- *
- * @return a {@link org.eclipse.jgit.api.ArchiveCommand}
- * @since 3.1
- */
- public ArchiveCommand archive() {
- return new ArchiveCommand(repo);
- }
- /**
- * Return a command to add notes to an object
- *
- * @return a {@link org.eclipse.jgit.api.AddNoteCommand}
- */
- public AddNoteCommand notesAdd() {
- return new AddNoteCommand(repo);
- }
- /**
- * Return a command to remove notes on an object
- *
- * @return a {@link org.eclipse.jgit.api.RemoveNoteCommand}
- */
- public RemoveNoteCommand notesRemove() {
- return new RemoveNoteCommand(repo);
- }
- /**
- * Return a command to list all notes
- *
- * @return a {@link org.eclipse.jgit.api.ListNotesCommand}
- */
- public ListNotesCommand notesList() {
- return new ListNotesCommand(repo);
- }
- /**
- * Return a command to show notes on an object
- *
- * @return a {@link org.eclipse.jgit.api.ShowNoteCommand}
- */
- public ShowNoteCommand notesShow() {
- return new ShowNoteCommand(repo);
- }
- /**
- * Return a command object to execute a {@code ls-remote} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-ls-remote.html"
- * >Git documentation about ls-remote</a>
- * @return a {@link org.eclipse.jgit.api.LsRemoteCommand} used to collect
- * all optional parameters and to finally execute the {@code status}
- * command
- */
- public LsRemoteCommand lsRemote() {
- return new LsRemoteCommand(repo);
- }
- /**
- * Return a command object to execute a {@code clean} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-clean.html"
- * >Git documentation about Clean</a>
- * @return a {@link org.eclipse.jgit.api.CleanCommand} used to collect all
- * optional parameters and to finally execute the {@code clean}
- * command
- */
- public CleanCommand clean() {
- return new CleanCommand(repo);
- }
- /**
- * Return a command object to execute a {@code blame} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-blame.html"
- * >Git documentation about Blame</a>
- * @return a {@link org.eclipse.jgit.api.BlameCommand} used to collect all
- * optional parameters and to finally execute the {@code blame}
- * command
- */
- public BlameCommand blame() {
- return new BlameCommand(repo);
- }
- /**
- * Return a command object to execute a {@code reflog} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-reflog.html"
- * >Git documentation about reflog</a>
- * @return a {@link org.eclipse.jgit.api.ReflogCommand} used to collect all
- * optional parameters and to finally execute the {@code reflog}
- * command
- */
- public ReflogCommand reflog() {
- return new ReflogCommand(repo);
- }
- /**
- * Return a command object to execute a {@code diff} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-diff.html" >Git
- * documentation about diff</a>
- * @return a {@link org.eclipse.jgit.api.DiffCommand} used to collect all
- * optional parameters and to finally execute the {@code diff}
- * command
- */
- public DiffCommand diff() {
- return new DiffCommand(repo);
- }
- /**
- * Return a command object used to delete tags
- *
- * @return a {@link org.eclipse.jgit.api.DeleteTagCommand}
- */
- public DeleteTagCommand tagDelete() {
- return new DeleteTagCommand(repo);
- }
- /**
- * Return a command object to execute a {@code submodule add} command
- *
- * @return a {@link org.eclipse.jgit.api.SubmoduleAddCommand} used to add a
- * new submodule to a parent repository
- */
- public SubmoduleAddCommand submoduleAdd() {
- return new SubmoduleAddCommand(repo);
- }
- /**
- * Return a command object to execute a {@code submodule init} command
- *
- * @return a {@link org.eclipse.jgit.api.SubmoduleInitCommand} used to
- * initialize the repository's config with settings from the
- * .gitmodules file in the working tree
- */
- public SubmoduleInitCommand submoduleInit() {
- return new SubmoduleInitCommand(repo);
- }
- /**
- * Returns a command object to execute a {@code submodule deinit} command
- *
- * @return a {@link org.eclipse.jgit.api.SubmoduleDeinitCommand} used to
- * remove a submodule's working tree manifestation
- * @since 4.10
- */
- public SubmoduleDeinitCommand submoduleDeinit() {
- return new SubmoduleDeinitCommand(repo);
- }
- /**
- * Returns a command object to execute a {@code submodule status} command
- *
- * @return a {@link org.eclipse.jgit.api.SubmoduleStatusCommand} used to
- * report the status of a repository's configured submodules
- */
- public SubmoduleStatusCommand submoduleStatus() {
- return new SubmoduleStatusCommand(repo);
- }
- /**
- * Return a command object to execute a {@code submodule sync} command
- *
- * @return a {@link org.eclipse.jgit.api.SubmoduleSyncCommand} used to
- * update the URL of a submodule from the parent repository's
- * .gitmodules file
- */
- public SubmoduleSyncCommand submoduleSync() {
- return new SubmoduleSyncCommand(repo);
- }
- /**
- * Return a command object to execute a {@code submodule update} command
- *
- * @return a {@link org.eclipse.jgit.api.SubmoduleUpdateCommand} used to
- * update the submodules in a repository to the configured revision
- */
- public SubmoduleUpdateCommand submoduleUpdate() {
- return new SubmoduleUpdateCommand(repo);
- }
- /**
- * Return a command object used to list stashed commits
- *
- * @return a {@link org.eclipse.jgit.api.StashListCommand}
- */
- public StashListCommand stashList() {
- return new StashListCommand(repo);
- }
- /**
- * Return a command object used to create a stashed commit
- *
- * @return a {@link org.eclipse.jgit.api.StashCreateCommand}
- * @since 2.0
- */
- public StashCreateCommand stashCreate() {
- return new StashCreateCommand(repo);
- }
- /**
- * Returs a command object used to apply a stashed commit
- *
- * @return a {@link org.eclipse.jgit.api.StashApplyCommand}
- * @since 2.0
- */
- public StashApplyCommand stashApply() {
- return new StashApplyCommand(repo);
- }
- /**
- * Return a command object used to drop a stashed commit
- *
- * @return a {@link org.eclipse.jgit.api.StashDropCommand}
- * @since 2.0
- */
- public StashDropCommand stashDrop() {
- return new StashDropCommand(repo);
- }
- /**
- * Return a command object to execute a {@code apply} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-apply.html"
- * >Git documentation about apply</a>
- * @return a {@link org.eclipse.jgit.api.ApplyCommand} used to collect all
- * optional parameters and to finally execute the {@code apply}
- * command
- * @since 2.0
- */
- public ApplyCommand apply() {
- return new ApplyCommand(repo);
- }
- /**
- * Return a command object to execute a {@code gc} command
- *
- * @see <a href=
- * "http://www.kernel.org/pub/software/scm/git/docs/git-gc.html" >Git
- * documentation about gc</a>
- * @return a {@link org.eclipse.jgit.api.GarbageCollectCommand} used to
- * collect all optional parameters and to finally execute the
- * {@code gc} command
- * @since 2.2
- */
- public GarbageCollectCommand gc() {
- return new GarbageCollectCommand(repo);
- }
- /**
- * Return a command object to find human-readable names of revisions.
- *
- * @return a {@link org.eclipse.jgit.api.NameRevCommand}.
- * @since 3.0
- */
- public NameRevCommand nameRev() {
- return new NameRevCommand(repo);
- }
- /**
- * Return a command object to come up with a short name that describes a
- * commit in terms of the nearest git tag.
- *
- * @return a {@link org.eclipse.jgit.api.DescribeCommand}.
- * @since 3.2
- */
- public DescribeCommand describe() {
- return new DescribeCommand(repo);
- }
- /**
- * Return a command used to list the available remotes.
- *
- * @return a {@link org.eclipse.jgit.api.RemoteListCommand}
- * @since 4.2
- */
- public RemoteListCommand remoteList() {
- return new RemoteListCommand(repo);
- }
- /**
- * Return a command used to add a new remote.
- *
- * @return a {@link org.eclipse.jgit.api.RemoteAddCommand}
- * @since 4.2
- */
- public RemoteAddCommand remoteAdd() {
- return new RemoteAddCommand(repo);
- }
- /**
- * Return a command used to remove an existing remote.
- *
- * @return a {@link org.eclipse.jgit.api.RemoteRemoveCommand}
- * @since 4.2
- */
- public RemoteRemoveCommand remoteRemove() {
- return new RemoteRemoveCommand(repo);
- }
- /**
- * Return a command used to change the URL of an existing remote.
- *
- * @return a {@link org.eclipse.jgit.api.RemoteSetUrlCommand}
- * @since 4.2
- */
- public RemoteSetUrlCommand remoteSetUrl() {
- return new RemoteSetUrlCommand(repo);
- }
- /**
- * Return a command to verify signatures of tags or commits.
- *
- * @return a {@link VerifySignatureCommand}
- * @since 5.11
- */
- public VerifySignatureCommand verifySignature() {
- return new VerifySignatureCommand(repo);
- }
- /**
- * Get repository
- *
- * @return the git repository this class is interacting with; see
- * {@link #close()} for notes on closing this repository.
- */
- public Repository getRepository() {
- return repo;
- }
- /** {@inheritDoc} */
- @Override
- public String toString() {
- return "Git[" + repo + "]"; //$NON-NLS-1$//$NON-NLS-2$
- }
- }