/*******************************************************************************
* 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.ide.api.git;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.eclipse.che.api.core.model.project.ProjectConfig;
import org.eclipse.che.api.git.shared.AddRequest;
import org.eclipse.che.api.git.shared.Branch;
import org.eclipse.che.api.git.shared.BranchCreateRequest;
import org.eclipse.che.api.git.shared.BranchListMode;
import org.eclipse.che.api.git.shared.CheckoutRequest;
import org.eclipse.che.api.git.shared.CloneRequest;
import org.eclipse.che.api.git.shared.CommitRequest;
import org.eclipse.che.api.git.shared.Commiters;
import org.eclipse.che.api.git.shared.DiffType;
import org.eclipse.che.api.git.shared.FetchRequest;
import org.eclipse.che.api.git.shared.GitUrlVendorInfo;
import org.eclipse.che.api.git.shared.LogResponse;
import org.eclipse.che.api.git.shared.MergeRequest;
import org.eclipse.che.api.git.shared.MergeResult;
import org.eclipse.che.api.git.shared.PullRequest;
import org.eclipse.che.api.git.shared.PullResponse;
import org.eclipse.che.api.git.shared.PushRequest;
import org.eclipse.che.api.git.shared.PushResponse;
import org.eclipse.che.api.git.shared.Remote;
import org.eclipse.che.api.git.shared.RemoteAddRequest;
import org.eclipse.che.api.git.shared.RepoInfo;
import org.eclipse.che.api.git.shared.ResetRequest;
import org.eclipse.che.api.git.shared.Revision;
import org.eclipse.che.api.git.shared.ShowFileContentResponse;
import org.eclipse.che.api.git.shared.Status;
import org.eclipse.che.api.git.shared.StatusFormat;
import org.eclipse.che.ide.api.machine.DevMachine;
import org.eclipse.che.api.promises.client.Operation;
import org.eclipse.che.api.promises.client.OperationException;
import org.eclipse.che.api.promises.client.Promise;
import org.eclipse.che.api.promises.client.callback.AsyncPromiseHelper.RequestCall;
import org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto;
import org.eclipse.che.commons.annotation.Nullable;
import org.eclipse.che.ide.MimeType;
import org.eclipse.che.ide.api.app.AppContext;
import org.eclipse.che.ide.api.machine.WsAgentStateController;
import org.eclipse.che.ide.dto.DtoFactory;
import org.eclipse.che.ide.resource.Path;
import org.eclipse.che.ide.rest.AsyncRequest;
import org.eclipse.che.ide.rest.AsyncRequestCallback;
import org.eclipse.che.ide.rest.AsyncRequestFactory;
import org.eclipse.che.ide.rest.AsyncRequestLoader;
import org.eclipse.che.ide.rest.DtoUnmarshallerFactory;
import org.eclipse.che.ide.rest.HTTPHeader;
import org.eclipse.che.ide.rest.StringMapUnmarshaller;
import org.eclipse.che.ide.rest.StringUnmarshaller;
import org.eclipse.che.ide.ui.loaders.request.LoaderFactory;
import org.eclipse.che.ide.websocket.Message;
import org.eclipse.che.ide.websocket.MessageBuilder;
import org.eclipse.che.ide.websocket.MessageBus;
import org.eclipse.che.ide.websocket.WebSocketException;
import org.eclipse.che.ide.websocket.rest.RequestCallback;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static com.google.gwt.http.client.RequestBuilder.DELETE;
import static com.google.gwt.http.client.RequestBuilder.POST;
import static org.eclipse.che.api.git.shared.StatusFormat.PORCELAIN;
import static org.eclipse.che.api.promises.client.callback.AsyncPromiseHelper.createFromAsyncRequest;
import static org.eclipse.che.ide.MimeType.APPLICATION_JSON;
import static org.eclipse.che.ide.MimeType.TEXT_PLAIN;
import static org.eclipse.che.ide.rest.HTTPHeader.ACCEPT;
import static org.eclipse.che.ide.rest.HTTPHeader.CONTENTTYPE;
/**
* Implementation of the {@link GitServiceClient}.
*
* @author Ann Zhuleva
* @author Valeriy Svydenko
*/
@Singleton
public class GitServiceClientImpl implements GitServiceClient {
private static final String ADD = "/git/add";
private static final String BRANCH = "/git/branch";
private static final String CHECKOUT = "/git/checkout";
private static final String CLONE = "/git/clone";
private static final String COMMIT = "/git/commit";
private static final String CONFIG = "/git/config";
private static final String DIFF = "/git/diff";
private static final String FETCH = "/git/fetch";
private static final String INIT = "/git/init";
private static final String LOG = "/git/log";
private static final String SHOW = "/git/show";
private static final String MERGE = "/git/merge";
private static final String STATUS = "/git/status";
private static final String PUSH = "/git/push";
private static final String PULL = "/git/pull";
private static final String REMOTE = "/git/remote";
private static final String REMOVE = "/git/remove";
private static final String RESET = "/git/reset";
private static final String COMMITERS = "/git/commiters";
private static final String REPOSITORY = "/git/repository";
/** Loader to be displayed. */
private final AsyncRequestLoader loader;
private final DtoFactory dtoFactory;
private final DtoUnmarshallerFactory dtoUnmarshallerFactory;
private final AsyncRequestFactory asyncRequestFactory;
private final WsAgentStateController wsAgentStateController;
private final AppContext appContext;
@Inject
protected GitServiceClientImpl(LoaderFactory loaderFactory,
WsAgentStateController wsAgentStateController,
DtoFactory dtoFactory,
AsyncRequestFactory asyncRequestFactory,
DtoUnmarshallerFactory dtoUnmarshallerFactory,
AppContext appContext) {
this.wsAgentStateController = wsAgentStateController;
this.appContext = appContext;
this.loader = loaderFactory.newLoader();
this.dtoFactory = dtoFactory;
this.asyncRequestFactory = asyncRequestFactory;
this.dtoUnmarshallerFactory = dtoUnmarshallerFactory;
}
@Override
public void init(DevMachine devMachine, ProjectConfigDto project, boolean bare, final RequestCallback<Void> callback)
throws WebSocketException {
String url = INIT + "?projectPath=" + project.getPath() + "&bare=" + bare;
Message message = new MessageBuilder(POST, url).header(ACCEPT, TEXT_PLAIN).build();
sendMessageToWS(message, callback);
}
@Override
public Promise<Void> init(DevMachine devMachine, final Path project, final boolean bare) {
return createFromAsyncRequest(new RequestCall<Void>() {
@Override
public void makeCall(final AsyncCallback<Void> callback) {
String url = INIT + "?projectPath=" + project.toString() + "&bare=" + bare;
Message message = new MessageBuilder(POST, url).header(ACCEPT, TEXT_PLAIN).build();
sendMessageToWS(message, new RequestCallback<Void>() {
@Override
protected void onSuccess(Void result) {
callback.onSuccess(result);
}
@Override
protected void onFailure(Throwable exception) {
callback.onFailure(exception);
}
});
}
});
}
@Override
public void cloneRepository(DevMachine devMachine,
ProjectConfigDto project,
String remoteUri,
String remoteName,
RequestCallback<RepoInfo> callback) throws WebSocketException {
CloneRequest cloneRequest = dtoFactory.createDto(CloneRequest.class)
.withRemoteName(remoteName)
.withRemoteUri(remoteUri)
.withWorkingDir(project.getPath());
String params = "?projectPath=" + project.getPath();
String url = CLONE + params;
MessageBuilder builder = new MessageBuilder(POST, url);
builder.data(dtoFactory.toJson(cloneRequest))
.header(CONTENTTYPE, APPLICATION_JSON)
.header(ACCEPT, APPLICATION_JSON);
Message message = builder.build();
sendMessageToWS(message, callback);
}
private void sendMessageToWS(final @NotNull Message message, final @NotNull RequestCallback<?> callback) {
wsAgentStateController.getMessageBus().then(new Operation<MessageBus>() {
@Override
public void apply(MessageBus arg) throws OperationException {
try {
arg.send(message, callback);
} catch (WebSocketException e) {
throw new OperationException(e.getMessage(), e);
}
}
});
}
@Override
@Deprecated
public void statusText(DevMachine devMachine, ProjectConfigDto project, StatusFormat format, AsyncRequestCallback<String> callback) {
String params = "?projectPath=" + project.getPath() + "&format=" + format;
String url = appContext.getDevMachine().getWsAgentBaseUrl() + STATUS + params;
asyncRequestFactory.createGetRequest(url)
.loader(loader)
.header(CONTENTTYPE, APPLICATION_JSON)
.header(ACCEPT, TEXT_PLAIN)
.send(callback);
}
@Override
public Promise<String> statusText(DevMachine devMachine, Path project, StatusFormat format) {
String params = "?projectPath=" + project.toString() + "&format=" + format;
String url = appContext.getDevMachine().getWsAgentBaseUrl() + STATUS + params;
return asyncRequestFactory.createGetRequest(url)
.loader(loader)
.header(CONTENTTYPE, APPLICATION_JSON)
.header(ACCEPT, TEXT_PLAIN)
.send(new StringUnmarshaller());
}
@Override
public void add(DevMachine devMachine,
ProjectConfig project,
boolean update,
@Nullable List<String> filePattern,
RequestCallback<Void> callback) throws WebSocketException {
AddRequest addRequest = dtoFactory.createDto(AddRequest.class).withUpdate(update);
if (filePattern == null) {
addRequest.setFilePattern(AddRequest.DEFAULT_PATTERN);
} else {
addRequest.setFilePattern(filePattern);
}
String url = ADD + "?projectPath=" + project.getPath();
MessageBuilder builder = new MessageBuilder(POST, url);
builder.data(dtoFactory.toJson(addRequest))
.header(CONTENTTYPE, APPLICATION_JSON);
Message message = builder.build();
sendMessageToWS(message, callback);
}
@Override
public Promise<Void> add(final DevMachine devMachine, final Path project, final boolean update, final Path[] paths) {
return createFromAsyncRequest(new RequestCall<Void>() {
@Override
public void makeCall(final AsyncCallback<Void> callback) {
final AddRequest addRequest = dtoFactory.createDto(AddRequest.class).withUpdate(update);
if (paths == null) {
addRequest.setFilePattern(AddRequest.DEFAULT_PATTERN);
} else {
final List<String> patterns = new ArrayList<>(); //need for compatible with server side
for (Path path : paths) {
patterns.add(path.isEmpty() ? "." : path.toString());
}
addRequest.setFilePattern(patterns);
}
final String url = ADD + "?projectPath=" + project.toString();
final Message message = new MessageBuilder(POST, url).data(dtoFactory.toJson(addRequest))
.header(CONTENTTYPE, APPLICATION_JSON)
.build();
sendMessageToWS(message, new RequestCallback<Void>() {
@Override
protected void onSuccess(Void result) {
callback.onSuccess(result);
}
@Override
protected void onFailure(Throwable exception) {
callback.onFailure(exception);
}
});
}
});
}
@Override
public void commit(DevMachine devMachine,
ProjectConfig project,
String message,
boolean all,
boolean amend,
AsyncRequestCallback<Revision> callback) {
CommitRequest commitRequest = dtoFactory.createDto(CommitRequest.class)
.withMessage(message)
.withAmend(amend)
.withAll(all);
String url = appContext.getDevMachine().getWsAgentBaseUrl() + COMMIT + "?projectPath=" + project.getPath();
asyncRequestFactory.createPostRequest(url, commitRequest).loader(loader).send(callback);
}
@Override
public Promise<Revision> commit(DevMachine devMachine, Path project, String message, boolean all, boolean amend) {
CommitRequest commitRequest = dtoFactory.createDto(CommitRequest.class)
.withMessage(message)
.withAmend(amend)
.withAll(all);
String url = devMachine.getWsAgentBaseUrl() + COMMIT + "?projectPath=" + project;
return asyncRequestFactory.createPostRequest(url, commitRequest)
.loader(loader)
.send(dtoUnmarshallerFactory.newUnmarshaller(Revision.class));
}
@Override
public void commit(final DevMachine devMachine,
final ProjectConfigDto project,
final String message,
final List<String> files,
final boolean amend,
final AsyncRequestCallback<Revision> callback) {
CommitRequest commitRequest = dtoFactory.createDto(CommitRequest.class)
.withMessage(message)
.withAmend(amend)
.withAll(false)
.withFiles(files);
String url = appContext.getDevMachine().getWsAgentBaseUrl() + COMMIT + "?projectPath=" + project.getPath();
asyncRequestFactory.createPostRequest(url, commitRequest).loader(loader).send(callback);
}
@Override
public Promise<Revision> commit(DevMachine devMachine, Path project, String message, Path[] files, boolean amend) {
return commit(devMachine, project, message, false, files, amend);
}
@Override
public Promise<Revision> commit(DevMachine devMachine, Path project, String message, boolean all, Path[] files, boolean amend) {
List<String> paths = new ArrayList<>(files.length);
for (Path file : files) {
if (!file.isEmpty()) {
paths.add(file.toString());
}
}
CommitRequest commitRequest = dtoFactory.createDto(CommitRequest.class)
.withMessage(message)
.withAmend(amend)
.withAll(all)
.withFiles(paths);
String url = devMachine.getWsAgentBaseUrl() + COMMIT + "?projectPath=" + project;
return asyncRequestFactory.createPostRequest(url, commitRequest)
.loader(loader)
.send(dtoUnmarshallerFactory.newUnmarshaller(Revision.class));
}
/** {@inheritDoc} */
@Override
public void config(DevMachine devMachine,
ProjectConfigDto project,
List<String> requestedConfig,
AsyncRequestCallback<Map<String, String>> callback) {
String params = "?projectPath=" + project.getPath();
if (requestedConfig != null) {
for (String entry : requestedConfig) {
params += "&requestedConfig=" + entry;
}
}
String url = appContext.getDevMachine().getWsAgentBaseUrl() + CONFIG + params;
asyncRequestFactory.createGetRequest(url).loader(loader).send(callback);
}
@Override
public Promise<Map<String, String>> config(DevMachine devMachine, Path project, List<String> requestedConfig) {
String params = "?projectPath=" + project.toString();
if (requestedConfig != null) {
for (String entry : requestedConfig) {
params += "&requestedConfig=" + entry;
}
}
String url = appContext.getDevMachine().getWsAgentBaseUrl() + CONFIG + params;
return asyncRequestFactory.createGetRequest(url).loader(loader).send(new StringMapUnmarshaller());
}
@Override
public void push(DevMachine devMachine,
ProjectConfigDto project,
List<String> refSpec,
String remote,
boolean force,
AsyncRequestCallback<PushResponse> callback) {
PushRequest pushRequest = dtoFactory.createDto(PushRequest.class).withRemote(remote).withRefSpec(refSpec).withForce(force);
String url = appContext.getDevMachine().getWsAgentBaseUrl() + PUSH + "?projectPath=" + project.getPath();
asyncRequestFactory.createPostRequest(url, pushRequest).send(callback);
}
@Override
public Promise<PushResponse> push(DevMachine devMachine, ProjectConfig project, List<String> refSpec, String remote, boolean force) {
PushRequest pushRequest = dtoFactory.createDto(PushRequest.class)
.withRemote(remote)
.withRefSpec(refSpec)
.withForce(force);
return asyncRequestFactory.createPostRequest(appContext.getDevMachine().getWsAgentBaseUrl() + PUSH +
"?projectPath=" + project.getPath(), pushRequest)
.send(dtoUnmarshallerFactory.newUnmarshaller(PushResponse.class));
}
@Override
public Promise<PushResponse> push(DevMachine devMachine, Path project, List<String> refSpec, String remote, boolean force) {
PushRequest pushRequest = dtoFactory.createDto(PushRequest.class)
.withRemote(remote)
.withRefSpec(refSpec)
.withForce(force);
return asyncRequestFactory.createPostRequest(devMachine.getWsAgentBaseUrl() + PUSH + "?projectPath=" + project, pushRequest)
.send(dtoUnmarshallerFactory.newUnmarshaller(PushResponse.class));
}
@Override
public void remoteList(DevMachine devMachine,
ProjectConfigDto project,
@Nullable String remoteName,
boolean verbose,
AsyncRequestCallback<List<Remote>> callback) {
String params = "?projectPath=" + project.getPath() + (remoteName != null ? "&remoteName=" + remoteName : "") +
"&verbose=" + String.valueOf(verbose);
String url = appContext.getDevMachine().getWsAgentBaseUrl() + REMOTE + params;
asyncRequestFactory.createGetRequest(url).loader(loader).send(callback);
}
@Override
public Promise<List<Remote>> remoteList(DevMachine devMachine, ProjectConfig project, @Nullable String remoteName, boolean verbose) {
String params = "?projectPath=" + project.getPath() + "&verbose=" + String.valueOf(verbose);
if (remoteName != null) {
params += "&remoteName=" + remoteName;
}
String url = appContext.getDevMachine().getWsAgentBaseUrl() + REMOTE + params;
return asyncRequestFactory.createGetRequest(url)
.loader(loader)
.send(dtoUnmarshallerFactory.newListUnmarshaller(Remote.class));
}
@Override
public Promise<List<Remote>> remoteList(DevMachine devMachine, Path project, String remoteName, boolean verbose) {
String params = "?projectPath=" + project.toString() + (remoteName != null ? "&remoteName=" + remoteName : "") +
"&verbose=" + String.valueOf(verbose);
String url = appContext.getDevMachine().getWsAgentBaseUrl() + REMOTE + params;
return asyncRequestFactory.createGetRequest(url)
.loader(loader)
.send(dtoUnmarshallerFactory.newListUnmarshaller(Remote.class));
}
@Override
@Deprecated
public void branchList(DevMachine devMachine,
ProjectConfig project,
BranchListMode listMode,
AsyncRequestCallback<List<Branch>> callback) {
String url = appContext.getDevMachine().getWsAgentBaseUrl() + BRANCH + "?projectPath=" + project.getPath() +
(listMode == null ? "" : "&listMode=" + listMode);
asyncRequestFactory.createGetRequest(url).send(callback);
}
@Override
public Promise<List<Branch>> branchList(DevMachine devMachine, Path project, BranchListMode listMode) {
String url = appContext.getDevMachine().getWsAgentBaseUrl() + BRANCH + "?projectPath=" + project.toString() +
(listMode == null ? "" : "&listMode=" + listMode);
return asyncRequestFactory.createGetRequest(url).send(dtoUnmarshallerFactory.newListUnmarshaller(Branch.class));
}
@Override
public Promise<Status> getStatus(DevMachine devMachine, Path project) {
final String params = "?projectPath=" + project.toString() + "&format=" + PORCELAIN;
final String url = appContext.getDevMachine().getWsAgentBaseUrl() + STATUS + params;
return asyncRequestFactory.createGetRequest(url)
.loader(loader)
.header(CONTENTTYPE, APPLICATION_JSON)
.header(ACCEPT, APPLICATION_JSON)
.send(dtoUnmarshallerFactory.newUnmarshaller(Status.class));
}
@Override
public void status(DevMachine devMachine, ProjectConfigDto project, AsyncRequestCallback<Status> callback) {
String params = "?projectPath=" + project.getPath() + "&format=" + PORCELAIN;
String url = appContext.getDevMachine().getWsAgentBaseUrl() + STATUS + params;
asyncRequestFactory.createGetRequest(url).loader(loader)
.header(CONTENTTYPE, APPLICATION_JSON)
.header(ACCEPT, APPLICATION_JSON)
.send(callback);
}
@Override
public void branchDelete(DevMachine devMachine,
ProjectConfigDto project,
String name,
boolean force,
AsyncRequestCallback<String> callback) {
String url = appContext.getDevMachine().getWsAgentBaseUrl() + BRANCH + "?projectPath=" + project.getPath()
+ "&name=" + name + "&force=" + force;
asyncRequestFactory.createDeleteRequest(url).loader(loader).send(callback);
}
@Override
public Promise<Void> branchDelete(DevMachine devMachine, Path project, String name, boolean force) {
String url = appContext.getDevMachine().getWsAgentBaseUrl() + BRANCH + "?projectPath=" + project.toString()
+ "&name=" + name + "&force=" + force;
return asyncRequestFactory.createDeleteRequest(url).loader(loader).send();
}
@Override
public void branchRename(DevMachine devMachine,
ProjectConfigDto project,
String oldName,
String newName,
AsyncRequestCallback<String> callback) {
String params = "?projectPath=" + project.getPath() + "&oldName=" + oldName + "&newName=" + newName;
String url = appContext.getDevMachine().getWsAgentBaseUrl() + BRANCH + params;
asyncRequestFactory.createPostRequest(url, null).loader(loader)
.header(CONTENTTYPE, MimeType.APPLICATION_FORM_URLENCODED)
.send(callback);
}
@Override
public Promise<Void> branchRename(DevMachine devMachine, Path project, String oldName, String newName) {
String params = "?projectPath=" + project.toString() + "&oldName=" + oldName + "&newName=" + newName;
String url = appContext.getDevMachine().getWsAgentBaseUrl() + BRANCH + params;
return asyncRequestFactory.createPostRequest(url, null).loader(loader)
.header(CONTENTTYPE, MimeType.APPLICATION_FORM_URLENCODED)
.send();
}
@Override
public void branchCreate(DevMachine devMachine, ProjectConfigDto project, String name, String startPoint,
AsyncRequestCallback<Branch> callback) {
BranchCreateRequest branchCreateRequest = dtoFactory.createDto(BranchCreateRequest.class).withName(name).withStartPoint(startPoint);
String url = appContext.getDevMachine().getWsAgentBaseUrl() + BRANCH + "?projectPath=" + project.getPath();
asyncRequestFactory.createPostRequest(url, branchCreateRequest).loader(loader).header(ACCEPT, APPLICATION_JSON).send(callback);
}
@Override
public Promise<Branch> branchCreate(DevMachine devMachine, Path project, String name, String startPoint) {
BranchCreateRequest branchCreateRequest = dtoFactory.createDto(BranchCreateRequest.class).withName(name).withStartPoint(startPoint);
String url = appContext.getDevMachine().getWsAgentBaseUrl() + BRANCH + "?projectPath=" + project.toString();
return asyncRequestFactory.createPostRequest(url, branchCreateRequest)
.loader(loader)
.header(ACCEPT, APPLICATION_JSON)
.send(dtoUnmarshallerFactory.newUnmarshaller(Branch.class));
}
@Override
public void checkout(DevMachine devMachine,
ProjectConfig project,
CheckoutRequest checkoutRequest,
AsyncRequestCallback<String> callback) {
String url = appContext.getDevMachine().getWsAgentBaseUrl() + CHECKOUT + "?projectPath=" + project.getPath();
asyncRequestFactory.createPostRequest(url, checkoutRequest).loader(loader).send(callback);
}
@Override
public Promise<Void> checkout(DevMachine devMachine,
Path project,
CheckoutRequest request) {
final String url = devMachine.getWsAgentBaseUrl() + CHECKOUT + "?projectPath=" + project.toString();
return asyncRequestFactory.createPostRequest(url, request).loader(loader).send();
}
@Override
public void remove(DevMachine devMachine,
ProjectConfigDto project,
List<String> items,
boolean cached,
AsyncRequestCallback<String> callback) {
String params = "?projectPath=" + project.getPath();
if (items != null) {
for (String item : items) {
params += "&items=" + item;
}
}
params += "&cached=" + String.valueOf(cached);
String url = appContext.getDevMachine().getWsAgentBaseUrl() + REMOVE + params;
asyncRequestFactory.createDeleteRequest(url).loader(loader).send(callback);
}
@Override
public Promise<Void> remove(DevMachine devMachine, Path project, Path[] items, boolean cached) {
String params = "?projectPath=" + project.toString();
if (items != null) {
for (Path item : items) {
params += "&items=" + item.toString();
}
}
params += "&cached=" + String.valueOf(cached);
String url = appContext.getDevMachine().getWsAgentBaseUrl() + REMOVE + params;
return asyncRequestFactory.createDeleteRequest(url).loader(loader).send();
}
@Override
public void reset(DevMachine devMachine,
ProjectConfigDto project,
String commit,
@Nullable ResetRequest.ResetType resetType,
@Nullable List<String> filePattern,
AsyncRequestCallback<Void> callback) {
ResetRequest resetRequest = dtoFactory.createDto(ResetRequest.class).withCommit(commit);
if (resetType != null) {
resetRequest.setType(resetType);
}
if (filePattern != null) {
resetRequest.setFilePattern(filePattern);
}
String url = appContext.getDevMachine().getWsAgentBaseUrl() + RESET + "?projectPath=" + project.getPath();
asyncRequestFactory.createPostRequest(url, resetRequest).loader(loader).send(callback);
}
@Override
public Promise<Void> reset(DevMachine devMachine, Path project, String commit, ResetRequest.ResetType resetType, Path[] files) {
ResetRequest resetRequest = dtoFactory.createDto(ResetRequest.class).withCommit(commit);
if (resetType != null) {
resetRequest.setType(resetType);
}
if (files != null) {
List<String> fileList = new ArrayList<>(files.length);
for (Path file : files) {
fileList.add(file.isEmpty() ? "." : file.toString());
}
resetRequest.setFilePattern(fileList);
}
String url = devMachine.getWsAgentBaseUrl() + RESET + "?projectPath=" + project;
return asyncRequestFactory.createPostRequest(url, resetRequest).loader(loader).send();
}
@Override
public void log(DevMachine devMachine, ProjectConfigDto project, List<String> fileFilter, boolean isTextFormat,
@NotNull AsyncRequestCallback<LogResponse> callback) {
StringBuilder params = new StringBuilder().append("?projectPath=").append(project.getPath());
if (fileFilter != null) {
for (String file : fileFilter) {
params.append("&fileFilter=").append(file);
}
}
String url = appContext.getDevMachine().getWsAgentBaseUrl() + LOG + params;
if (isTextFormat) {
asyncRequestFactory.createGetRequest(url).send(callback);
} else {
asyncRequestFactory.createGetRequest(url).loader(loader).header(ACCEPT, APPLICATION_JSON).send(callback);
}
}
@Override
public Promise<LogResponse> log(DevMachine devMachine, Path project, Path[] fileFilter, boolean plainText) {
return log(devMachine, project, fileFilter, -1, -1, plainText);
}
@Override
public Promise<LogResponse> log(DevMachine devMachine, Path project, Path[] fileFilter, int skip, int maxCount, boolean plainText) {
StringBuilder params = new StringBuilder().append("?projectPath=").append(project.toString());
if (fileFilter != null) {
for (Path file : fileFilter) {
params.append("&fileFilter=").append(file.toString());
}
}
params.append("&skip=").append(skip);
params.append("&maxCount=").append(maxCount);
String url = appContext.getDevMachine().getWsAgentBaseUrl() + LOG + params;
if (plainText) {
return asyncRequestFactory.createGetRequest(url)
.send(dtoUnmarshallerFactory.newUnmarshaller(LogResponse.class));
} else {
return asyncRequestFactory.createGetRequest(url)
.header(ACCEPT, APPLICATION_JSON)
.send(dtoUnmarshallerFactory.newUnmarshaller(LogResponse.class));
}
}
@Override
public void remoteAdd(DevMachine devMachine,
ProjectConfig project,
String name,
String repositoryURL,
AsyncRequestCallback<String> callback) {
RemoteAddRequest remoteAddRequest = dtoFactory.createDto(RemoteAddRequest.class).withName(name).withUrl(repositoryURL);
String url = appContext.getDevMachine().getWsAgentBaseUrl() + REMOTE + "?projectPath=" + project.getPath();
asyncRequestFactory.createPutRequest(url, remoteAddRequest).loader(loader).send(callback);
}
@Override
public Promise<Void> remoteAdd(DevMachine devMachine, Path project, String name, String url) {
RemoteAddRequest remoteAddRequest = dtoFactory.createDto(RemoteAddRequest.class).withName(name).withUrl(url);
String requestUrl = appContext.getDevMachine().getWsAgentBaseUrl() + REMOTE + "?projectPath=" + project.toString();
return asyncRequestFactory.createPutRequest(requestUrl, remoteAddRequest).loader(loader).send();
}
@Override
public void remoteDelete(DevMachine devMachine,
ProjectConfig project,
String name,
AsyncRequestCallback<String> callback) {
String url = appContext.getDevMachine().getWsAgentBaseUrl() + REMOTE + '/' + name + "?projectPath=" + project.getPath();
asyncRequestFactory.createDeleteRequest(url).loader(loader).send(callback);
}
@Override
public Promise<Void> remoteDelete(DevMachine devMachine, Path project, String name) {
String url = appContext.getDevMachine().getWsAgentBaseUrl() + REMOTE + '/' + name + "?projectPath=" + project.toString();
return asyncRequestFactory.createDeleteRequest(url).loader(loader).send();
}
@Override
public void fetch(DevMachine devMachine,
ProjectConfigDto project,
String remote,
List<String> refspec,
boolean removeDeletedRefs,
RequestCallback<String> callback) throws WebSocketException {
FetchRequest fetchRequest = dtoFactory.createDto(FetchRequest.class)
.withRefSpec(refspec)
.withRemote(remote)
.withRemoveDeletedRefs(removeDeletedRefs);
String url = FETCH + "?projectPath=" + project.getPath();
MessageBuilder builder = new MessageBuilder(POST, url);
builder.data(dtoFactory.toJson(fetchRequest))
.header(CONTENTTYPE, APPLICATION_JSON);
Message message = builder.build();
sendMessageToWS(message, callback);
}
@Override
public Promise<Void> fetch(DevMachine devMachine, Path project, String remote, List<String> refspec, boolean removeDeletedRefs) {
FetchRequest fetchRequest = dtoFactory.createDto(FetchRequest.class)
.withRefSpec(refspec)
.withRemote(remote)
.withRemoveDeletedRefs(removeDeletedRefs);
String url = devMachine.getWsAgentBaseUrl() + FETCH + "?projectPath=" + project;
return asyncRequestFactory.createPostRequest(url, fetchRequest).send();
}
@Override
public void pull(DevMachine devMachine,
ProjectConfigDto project,
String refSpec,
String remote,
AsyncRequestCallback<PullResponse> callback) {
PullRequest pullRequest = dtoFactory.createDto(PullRequest.class).withRemote(remote).withRefSpec(refSpec);
String url = appContext.getDevMachine().getWsAgentBaseUrl() + PULL + "?projectPath=" + project.getPath();
asyncRequestFactory.createPostRequest(url, pullRequest).send(callback);
}
@Override
public Promise<PullResponse> pull(DevMachine devMachine, Path project, String refSpec, String remote) {
PullRequest pullRequest = dtoFactory.createDto(PullRequest.class).withRemote(remote).withRefSpec(refSpec);
String url = devMachine.getWsAgentBaseUrl() + PULL + "?projectPath=" + project;
return asyncRequestFactory.createPostRequest(url, pullRequest).send(dtoUnmarshallerFactory.newUnmarshaller(PullResponse.class));
}
@Override
public void diff(DevMachine devMachine,
ProjectConfigDto project,
List<String> fileFilter,
DiffType type,
boolean noRenames,
int renameLimit,
String commitA,
String commitB, @NotNull AsyncRequestCallback<String> callback) {
diff(Path.valueOf(project.getPath()), fileFilter, type, noRenames, renameLimit, commitA, commitB, false).send(callback);
}
@Override
public void diff(DevMachine devMachine,
ProjectConfigDto project,
List<String> fileFilter,
DiffType type,
boolean noRenames,
int renameLimit,
String commitA,
boolean cached,
AsyncRequestCallback<String> callback) {
diff(Path.valueOf(project.getPath()), fileFilter, type, noRenames, renameLimit, commitA, null, cached).send(callback);
}
@Override
public Promise<String> diff(DevMachine devMachine,
Path project,
List<String> fileFilter,
DiffType type,
boolean noRenames,
int renameLimit,
String commitA,
String commitB) {
return diff(project, fileFilter, type, noRenames, renameLimit, commitA, commitB, false).send(new StringUnmarshaller());
}
@Override
public Promise<String> diff(DevMachine devMachine,
Path project,
List<String> files,
DiffType type,
boolean noRenames,
int renameLimit,
String commitA,
boolean cached) {
return diff(project, files, type, noRenames, renameLimit, commitA, null, cached).send(new StringUnmarshaller());
}
private AsyncRequest diff(Path project,
List<String> fileFilter,
DiffType type,
boolean noRenames,
int renameLimit,
String commitA,
String commitB,
boolean cached) {
StringBuilder params = new StringBuilder().append("?projectPath=").append(project.toString());
if (fileFilter != null) {
for (String file : fileFilter) {
if (file.isEmpty()) {
continue;
}
params.append("&fileFilter=").append(file);
}
}
if (type != null) {
params.append("&diffType=").append(type);
}
params.append("&noRenames=").append(noRenames);
params.append("&renameLimit=").append(renameLimit);
if (commitA != null) {
params.append("&commitA=").append(commitA);
}
if (commitB != null) {
params.append("&commitB=").append(commitB);
}
params.append("&cached=").append(cached);
String url = appContext.getDevMachine().getWsAgentBaseUrl() + DIFF + params;
return asyncRequestFactory.createGetRequest(url).loader(loader);
}
@Override
public void showFileContent(DevMachine devMachine,
@NotNull ProjectConfigDto project,
String file,
String version,
@NotNull AsyncRequestCallback<ShowFileContentResponse> callback) {
String params = "?projectPath=" + project.getPath() + "&file=" + file + "&version=" + version ;
String url = appContext.getDevMachine().getWsAgentBaseUrl() + SHOW + params;
asyncRequestFactory.createGetRequest(url).loader(loader).send(callback);
}
@Override
public Promise<ShowFileContentResponse> showFileContent(DevMachine devMachine, Path project, Path file, String version) {
String params = "?projectPath=" + project.toString() + "&file=" + file + "&version=" + version ;
String url = appContext.getDevMachine().getWsAgentBaseUrl() + SHOW + params;
return asyncRequestFactory.createGetRequest(url)
.loader(loader)
.send(dtoUnmarshallerFactory.newUnmarshaller(ShowFileContentResponse.class));
}
@Override
public void merge(DevMachine devMachine,
ProjectConfigDto project,
String commit,
AsyncRequestCallback<MergeResult> callback) {
MergeRequest mergeRequest = dtoFactory.createDto(MergeRequest.class).withCommit(commit);
String url = appContext.getDevMachine().getWsAgentBaseUrl() + MERGE + "?projectPath=" + project.getPath();
asyncRequestFactory.createPostRequest(url, mergeRequest).loader(loader)
.header(ACCEPT, APPLICATION_JSON)
.send(callback);
}
@Override
public Promise<MergeResult> merge(DevMachine devMachine, Path project, String commit) {
MergeRequest mergeRequest = dtoFactory.createDto(MergeRequest.class).withCommit(commit);
String url = devMachine.getWsAgentBaseUrl() + MERGE + "?projectPath=" + project;
return asyncRequestFactory.createPostRequest(url, mergeRequest)
.loader(loader)
.header(ACCEPT, APPLICATION_JSON)
.send(dtoUnmarshallerFactory.newUnmarshaller(MergeResult.class));
}
@Override
public void getCommitters(DevMachine devMachine, ProjectConfigDto project, AsyncRequestCallback<Commiters> callback) {
String url = appContext.getDevMachine().getWsAgentBaseUrl() + COMMITERS + "?projectPath=" + project.getPath();
asyncRequestFactory.createGetRequest(url).header(ACCEPT, APPLICATION_JSON).send(callback);
}
@Override
public void deleteRepository(DevMachine devMachine, ProjectConfigDto project, AsyncRequestCallback<Void> callback) {
String url = appContext.getDevMachine().getWsAgentBaseUrl() + REPOSITORY + "?projectPath=" + project.getPath();
asyncRequestFactory.createDeleteRequest(url).loader(loader)
.header(ACCEPT, TEXT_PLAIN)
.send(callback);
}
@Override
public Promise<Void> deleteRepository(DevMachine devMachine, final Path project) {
return createFromAsyncRequest(new RequestCall<Void>() {
@Override
public void makeCall(final AsyncCallback<Void> callback) {
String url = REPOSITORY + "?projectPath=" + project.toString();
final Message message = new MessageBuilder(DELETE, url).header(ACCEPT, TEXT_PLAIN)
.build();
sendMessageToWS(message, new RequestCallback<Void>() {
@Override
protected void onSuccess(Void result) {
callback.onSuccess(result);
}
@Override
protected void onFailure(Throwable exception) {
callback.onFailure(exception);
}
});
}
});
}
@Override
public void getUrlVendorInfo(DevMachine devMachine, @NotNull String vcsUrl, @NotNull AsyncRequestCallback<GitUrlVendorInfo> callback) {
asyncRequestFactory.createGetRequest(appContext.getDevMachine().getWsAgentBaseUrl() + "/git-service/info?vcsurl=" + vcsUrl)
.header(HTTPHeader.ACCEPT, MimeType.APPLICATION_JSON).send(callback);
}
}