/*******************************************************************************
* Copyright 2012 - Joakim Erdfelt
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package net.erdfelt.android.sdkfido.git.internal;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import net.erdfelt.android.sdkfido.git.GitException;
import net.erdfelt.android.sdkfido.git.GitMirrors;
import net.erdfelt.android.sdkfido.git.IGit;
import org.eclipse.jgit.api.CheckoutCommand;
import org.eclipse.jgit.api.FetchCommand;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ProgressMonitor;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryState;
import org.eclipse.jgit.lib.TextProgressMonitor;
import org.eclipse.jgit.storage.file.FileRepository;
import org.eclipse.jgit.transport.FetchResult;
import org.eclipse.jgit.transport.RefSpec;
import org.eclipse.jgit.transport.Transport;
/**
* Implementation of GIT that uses jgit (git implemented in 100% java)
*/
public class InternalGit implements IGit {
@SuppressWarnings("unused")
private static final Logger LOG = Logger.getLogger(InternalGit.class.getName());
private File repoDirectory;
private FileRepository repo;
private ProgressMonitor progressMonitor;
private GitMirrors mirrors;
public InternalGit(File workDirectory, GitMirrors mirrors) throws GitException {
try {
this.mirrors = mirrors;
this.repoDirectory = new File(workDirectory, Constants.DOT_GIT);
this.repo = new FileRepository(repoDirectory);
} catch (IOException e) {
throw new GitException(e.getMessage(), e);
}
}
@Override
public void checkoutBranch(String branchName) throws GitException {
try {
CheckoutCommand command = new Git(repo).checkout();
command.setCreateBranch(false);
command.setName(branchName);
command.setForce(false);
command.call();
} catch (Throwable t) {
throw new GitException(t.getMessage(), t);
}
}
@Override
public void clone(String url) throws GitException {
try {
GitCloneCommand command = new GitCloneCommand(repo);
command.setProgressMonitor(getProgressMonitor());
String giturl = mirrors.getNewUrl(url);
command.setRemoteUrl(giturl);
command.call();
} catch (Throwable t) {
throw new GitException(t.getMessage(), t);
}
}
@Override
public boolean exists() {
return repo.getConfig().getFile().exists();
}
@Override
public String getCurrentBranch() throws GitException {
try {
return repo.getFullBranch();
} catch (Throwable t) {
throw new GitException(t.getMessage(), t);
}
}
public ProgressMonitor getProgressMonitor() {
if (this.progressMonitor == null) {
this.progressMonitor = new TextProgressMonitor();
}
return this.progressMonitor;
}
public Repository getRepo() {
return this.repo;
}
public RepositoryState getState() {
return repo.getRepositoryState();
}
@Override
public void pullRemote() throws GitException {
try {
Git git = new Git(repo);
FetchCommand fetch = git.fetch();
fetch.setCheckFetchedObjects(false);
fetch.setRemoveDeletedRefs(true);
List<RefSpec> specs = new ArrayList<RefSpec>();
fetch.setRefSpecs(specs);
fetch.setTimeout(5000);
fetch.setDryRun(false);
fetch.setRemote(IGit.REMOTE_NAME);
fetch.setThin(Transport.DEFAULT_FETCH_THIN);
fetch.setProgressMonitor(getProgressMonitor());
FetchResult result = fetch.call();
if (result.getTrackingRefUpdates().isEmpty()) {
return;
}
GitInfo.infoFetchResults(repo, result);
} catch (Throwable t) {
throw new GitException(t.getMessage(), t);
}
}
public void setMonitor(ProgressMonitor progressMonitor) {
this.progressMonitor = progressMonitor;
}
@Override
public File getDir() {
return this.repo.getWorkTree();
}
}