package com.door43.translationstudio.tasks;
import com.door43.tools.reporting.Logger;
import com.door43.translationstudio.AppContext;
import com.door43.translationstudio.R;
import com.door43.translationstudio.git.TransportCallback;
import com.door43.util.FileUtilities;
import com.door43.util.tasks.ManagedTask;
import org.apache.commons.io.FileUtils;
import org.eclipse.jgit.api.CloneCommand;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.TransportException;
import org.eclipse.jgit.errors.NoRemoteRepositoryException;
import java.io.File;
/**
* Clones a repository from the server
*/
public class CloneRepositoryTask extends ManagedTask {
public static final String TASK_ID = "clone_target_translation";
private final File destDir;
private final String cloneUrl;
private Status status = Status.UNKNOWN;
public CloneRepositoryTask(String cloneUrl, File dest) {
this.destDir = dest;
this.cloneUrl = cloneUrl;
}
/**
* Returns the path where the repository was cloned
* @return
*/
public File getDestDir() {
return destDir;
}
@Override
public void start() {
if(AppContext.context().isNetworkAvailable()) {
publishProgress(-1, AppContext.context().getResources().getString(R.string.downloading));
FileUtilities.deleteRecursive(destDir);
try {
// prepare destination
destDir.mkdirs();
CloneCommand cloneCommand = Git.cloneRepository()
.setURI(cloneUrl)
.setTransportConfigCallback(new TransportCallback())
.setDirectory(destDir);
try {
Git result = cloneCommand.call();
result.getRepository().close();
this.status = Status.SUCCESS;
} catch (TransportException e) {
Logger.e(this.getClass().getName(), e.getMessage(), e);
Throwable cause = e.getCause();
if(cause != null) {
Throwable subException = cause.getCause();
if(subException != null) {
String detail = subException.getMessage();
if ("Auth fail".equals(detail)) {
this.status = Status.AUTH_FAILURE;
}
} else if(cause instanceof NoRemoteRepositoryException) {
this.status = Status.NO_REMOTE_REPO;
} else if(cause.getMessage().contains("not permitted")) {
this.status = Status.AUTH_FAILURE;
}
}
} catch (Exception e) {
Logger.e(this.getClass().getName(), e.getMessage(), e);
} catch (OutOfMemoryError e) {
Logger.e(this.getClass().getName(), e.getMessage(), e);
this.status = Status.OUT_OF_MEMORY;
} catch (Throwable e) {
Logger.e(this.getClass().getName(), e.getMessage(), e);
}
} catch (Exception e) {
Logger.e(this.getClass().getName(), "Failed to clone the repository " + cloneUrl, e);
FileUtils.deleteQuietly(destDir);
stop();
}
}
}
public Status getStatus() {
return status;
}
public String getCloneUrl() {
return cloneUrl;
}
public enum Status {
NO_REMOTE_REPO,
UNKNOWN,
AUTH_FAILURE,
OUT_OF_MEMORY,
SUCCESS
}
}