/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.plugin.pullrequest.client.vcs;
import com.google.gwt.user.client.rpc.AsyncCallback;
import org.eclipse.che.api.core.model.project.ProjectConfig;
import org.eclipse.che.api.git.shared.Branch;
import org.eclipse.che.api.git.shared.PushResponse;
import org.eclipse.che.api.git.shared.Remote;
import org.eclipse.che.api.promises.client.Promise;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* Service for VCS operations.
*/
public interface VcsService {
/**
* Add a remote to the project VCS metadata.
*
* @param project
* the project descriptor.
* @param remote
* the remote name.
* @param remoteUrl
* the remote URL.
* @param callback
* callback when the operation is done.
*/
void addRemote(@NotNull ProjectConfig project, @NotNull String remote, @NotNull String remoteUrl,
@NotNull AsyncCallback<Void> callback);
/**
* Checkout a branch of the given project.
*
* @param project
* the project descriptor.
* @param branchName
* the name of the branch to checkout.
* @param createNew
* create a new branch if {@code true}.
* @param callback
* callback when the operation is done.
*/
void checkoutBranch(@NotNull ProjectConfig project, @NotNull String branchName, boolean createNew,
@NotNull AsyncCallback<String> callback);
/**
* Commits the current changes of the given project.
*
* @param project
* the project descriptor.
* @param includeUntracked
* {@code true} to include untracked files, {@code false} otherwise.
* @param commitMessage
* the commit message.
* @param callback
* callback when the operation is done.
*/
void commit(@NotNull ProjectConfig project, boolean includeUntracked, @NotNull String commitMessage,
@NotNull AsyncCallback<Void> callback);
/**
* Removes a remote to the project VCS metadata.
*
* @param project
* the project descriptor.
* @param remote
* the remote name.
* @param callback
* callback when the operation is done.
*/
void deleteRemote(@NotNull ProjectConfig project, @NotNull String remote, @NotNull AsyncCallback<Void> callback);
/**
* Returns the name of the current branch for the given {@code project}.
*
* @param project
* the project.
* @return the promise that resolves branch name or rejects with an error
*/
Promise<String> getBranchName(ProjectConfig project);
/**
* Returns if the given project has uncommitted changes.
*
* @param project
* the project descriptor.
* @param callback
* what to do if the project has uncommitted changes.
*/
void hasUncommittedChanges(@NotNull ProjectConfig project, @NotNull AsyncCallback<Boolean> callback);
/**
* Returns if a local branch with the given name exists in the given project.
*
* @param project
* the project descriptor.
* @param branchName
* the branch name.
* @param callback
* callback called when operation is done.
*/
void isLocalBranchWithName(@NotNull ProjectConfig project, @NotNull String branchName, @NotNull AsyncCallback<Boolean> callback);
/**
* List the local branches.
*
* @param project
* the project descriptor.
* @param callback
* what to do with the branches list.
*/
void listLocalBranches(@NotNull ProjectConfig project, @NotNull AsyncCallback<List<Branch>> callback);
/**
* Returns the list of the remotes for given {@code project}.
*
* @param project
* the project
* @return the promise which resolves {@literal List<Remote>} or rejects with an error
*/
Promise<List<Remote>> listRemotes(ProjectConfig project);
/**
* Push a local branch to remote.
*
* @param project
* the project descriptor.
* @param remote
* the remote name
* @param localBranchName
* the local branch name
*/
Promise<PushResponse> pushBranch(ProjectConfig project,
String remote,
String localBranchName);
}