use of org.eclipse.che.api.git.exception.GitException in project che by eclipse.
the class JGitConnection method fetch.
@Override
public void fetch(FetchParams params) throws GitException, UnauthorizedException {
String remoteName = params.getRemote();
String remoteUri;
try {
List<RefSpec> fetchRefSpecs;
List<String> refSpec = params.getRefSpec();
if (!refSpec.isEmpty()) {
fetchRefSpecs = new ArrayList<>(refSpec.size());
for (String refSpecItem : refSpec) {
RefSpec fetchRefSpec = //
(refSpecItem.indexOf(':') < 0) ? //
new RefSpec(Constants.R_HEADS + refSpecItem + ":") : new RefSpec(refSpecItem);
fetchRefSpecs.add(fetchRefSpec);
}
} else {
fetchRefSpecs = Collections.emptyList();
}
FetchCommand fetchCommand = getGit().fetch();
// (otherwise JGit fails)
if (remoteName != null && refSpec.isEmpty()) {
boolean found = false;
List<Remote> configRemotes = remoteList(null, false);
for (Remote configRemote : configRemotes) {
if (remoteName.equals(configRemote.getName())) {
found = true;
break;
}
}
if (!found) {
fetchRefSpecs = Collections.singletonList(new RefSpec(Constants.HEAD + ":" + Constants.FETCH_HEAD));
}
}
if (remoteName == null) {
remoteName = Constants.DEFAULT_REMOTE_NAME;
}
fetchCommand.setRemote(remoteName);
remoteUri = getRepository().getConfig().getString(ConfigConstants.CONFIG_REMOTE_SECTION, remoteName, ConfigConstants.CONFIG_KEY_URL);
fetchCommand.setRefSpecs(fetchRefSpecs);
int timeout = params.getTimeout();
if (timeout > 0) {
fetchCommand.setTimeout(timeout);
}
fetchCommand.setRemoveDeletedRefs(params.isRemoveDeletedRefs());
executeRemoteCommand(remoteUri, fetchCommand, params.getUsername(), params.getPassword());
} catch (GitException | GitAPIException exception) {
String errorMessage;
if (exception.getMessage().contains("Invalid remote: ")) {
errorMessage = ERROR_NO_REMOTE_REPOSITORY;
} else if ("Nothing to fetch.".equals(exception.getMessage())) {
return;
} else {
errorMessage = generateExceptionMessage(exception);
}
throw new GitException(errorMessage, exception);
}
}
use of org.eclipse.che.api.git.exception.GitException in project che by eclipse.
the class JGitConnection method merge.
@Override
public MergeResult merge(String commit) throws GitException {
org.eclipse.jgit.api.MergeResult jGitMergeResult;
MergeResult.MergeStatus status;
try {
Ref ref = repository.findRef(commit);
if (ref == null) {
throw new GitException("Invalid reference to commit for merge " + commit);
}
// Shorten local branch names by removing '/refs/heads/' from the beginning
String name = ref.getName();
if (name.startsWith(Constants.R_HEADS)) {
name = name.substring(Constants.R_HEADS.length());
}
jGitMergeResult = getGit().merge().include(name, ref.getObjectId()).call();
} catch (CheckoutConflictException exception) {
jGitMergeResult = new org.eclipse.jgit.api.MergeResult(exception.getConflictingPaths());
} catch (IOException | GitAPIException exception) {
throw new GitException(exception.getMessage(), exception);
}
switch(jGitMergeResult.getMergeStatus()) {
case ALREADY_UP_TO_DATE:
status = MergeResult.MergeStatus.ALREADY_UP_TO_DATE;
break;
case CONFLICTING:
status = MergeResult.MergeStatus.CONFLICTING;
break;
case FAILED:
status = MergeResult.MergeStatus.FAILED;
break;
case FAST_FORWARD:
status = MergeResult.MergeStatus.FAST_FORWARD;
break;
case MERGED:
status = MergeResult.MergeStatus.MERGED;
break;
case NOT_SUPPORTED:
status = MergeResult.MergeStatus.NOT_SUPPORTED;
break;
case CHECKOUT_CONFLICT:
status = MergeResult.MergeStatus.CONFLICTING;
break;
default:
throw new IllegalStateException("Unknown merge status " + jGitMergeResult.getMergeStatus());
}
ObjectId[] jGitMergedCommits = jGitMergeResult.getMergedCommits();
List<String> mergedCommits = new ArrayList<>();
if (jGitMergedCommits != null) {
for (ObjectId jGitMergedCommit : jGitMergedCommits) {
mergedCommits.add(jGitMergedCommit.getName());
}
}
List<String> conflicts;
if (org.eclipse.jgit.api.MergeResult.MergeStatus.CHECKOUT_CONFLICT.equals(jGitMergeResult.getMergeStatus())) {
conflicts = jGitMergeResult.getCheckoutConflicts();
} else {
Map<String, int[][]> jGitConflicts = jGitMergeResult.getConflicts();
conflicts = jGitConflicts != null ? new ArrayList<>(jGitConflicts.keySet()) : Collections.emptyList();
}
Map<String, ResolveMerger.MergeFailureReason> jGitFailing = jGitMergeResult.getFailingPaths();
ObjectId newHead = jGitMergeResult.getNewHead();
return newDto(MergeResult.class).withFailed(jGitFailing != null ? new ArrayList<>(jGitFailing.keySet()) : Collections.emptyList()).withNewHead(newHead != null ? newHead.getName() : null).withMergeStatus(status).withConflicts(conflicts).withMergedCommits(mergedCommits);
}
use of org.eclipse.che.api.git.exception.GitException in project che by eclipse.
the class JGitConnection method push.
@Override
public PushResponse push(PushParams params) throws GitException, UnauthorizedException {
List<Map<String, String>> updates = new ArrayList<>();
String currentBranch = getCurrentBranch();
String remoteName = params.getRemote();
String remoteUri = getRepository().getConfig().getString(ConfigConstants.CONFIG_REMOTE_SECTION, remoteName, ConfigConstants.CONFIG_KEY_URL);
PushCommand pushCommand = getGit().push();
if (params.getRemote() != null) {
pushCommand.setRemote(remoteName);
}
List<String> refSpec = params.getRefSpec();
if (!refSpec.isEmpty()) {
pushCommand.setRefSpecs(refSpec.stream().map(RefSpec::new).collect(Collectors.toList()));
}
pushCommand.setForce(params.isForce());
int timeout = params.getTimeout();
if (timeout > 0) {
pushCommand.setTimeout(timeout);
}
try {
@SuppressWarnings("unchecked") Iterable<PushResult> pushResults = (Iterable<PushResult>) executeRemoteCommand(remoteUri, pushCommand, params.getUsername(), params.getPassword());
PushResult pushResult = pushResults.iterator().next();
String commandOutput = pushResult.getMessages().isEmpty() ? "Successfully pushed to " + remoteUri : pushResult.getMessages();
Collection<RemoteRefUpdate> refUpdates = pushResult.getRemoteUpdates();
for (RemoteRefUpdate remoteRefUpdate : refUpdates) {
final String remoteRefName = remoteRefUpdate.getRemoteName();
// check status only for branch given in the URL or tags - (handle special "refs/for" case)
String shortenRefFor = remoteRefName.startsWith("refs/for/") ? remoteRefName.substring("refs/for/".length()) : remoteRefName;
if (!currentBranch.equals(Repository.shortenRefName(remoteRefName)) && !currentBranch.equals(shortenRefFor) && !remoteRefName.startsWith(Constants.R_TAGS)) {
continue;
}
Map<String, String> update = new HashMap<>();
RemoteRefUpdate.Status status = remoteRefUpdate.getStatus();
if (status != RemoteRefUpdate.Status.OK) {
List<String> refSpecs = params.getRefSpec();
if (remoteRefUpdate.getStatus() == RemoteRefUpdate.Status.UP_TO_DATE) {
commandOutput = INFO_PUSH_IGNORED_UP_TO_DATE;
} else {
String remoteBranch = !refSpecs.isEmpty() ? refSpecs.get(0).split(REFSPEC_COLON)[1] : "master";
String errorMessage = format(ERROR_PUSH_CONFLICTS_PRESENT, currentBranch + BRANCH_REFSPEC_SEPERATOR + remoteBranch, remoteUri);
if (remoteRefUpdate.getMessage() != null) {
errorMessage += "\nError errorMessage: " + remoteRefUpdate.getMessage() + ".";
}
throw new GitException(errorMessage);
}
}
if (status != RemoteRefUpdate.Status.UP_TO_DATE || !remoteRefName.startsWith(Constants.R_TAGS)) {
update.put(KEY_COMMIT_MESSAGE, remoteRefUpdate.getMessage());
update.put(KEY_RESULT, status.name());
TrackingRefUpdate refUpdate = remoteRefUpdate.getTrackingRefUpdate();
if (refUpdate != null) {
update.put(KEY_REMOTENAME, Repository.shortenRefName(refUpdate.getLocalName()));
update.put(KEY_LOCALNAME, Repository.shortenRefName(refUpdate.getRemoteName()));
} else {
update.put(KEY_REMOTENAME, Repository.shortenRefName(remoteRefUpdate.getSrcRef()));
update.put(KEY_LOCALNAME, Repository.shortenRefName(remoteRefUpdate.getRemoteName()));
}
updates.add(update);
}
}
return newDto(PushResponse.class).withCommandOutput(commandOutput).withUpdates(updates);
} catch (GitAPIException exception) {
if ("origin: not found.".equals(exception.getMessage())) {
throw new GitException(ERROR_NO_REMOTE_REPOSITORY, exception);
} else {
String message = generateExceptionMessage(exception);
throw new GitException(message, exception);
}
}
}
use of org.eclipse.che.api.git.exception.GitException in project che by eclipse.
the class JGitConnection method remoteList.
@Override
public List<Remote> remoteList(String remoteName, boolean verbose) throws GitException {
StoredConfig config = repository.getConfig();
Set<String> remoteNames = new HashSet<>(config.getSubsections(ConfigConstants.CONFIG_KEY_REMOTE));
if (remoteName != null && remoteNames.contains(remoteName)) {
remoteNames.clear();
remoteNames.add(remoteName);
}
List<Remote> result = new ArrayList<>(remoteNames.size());
for (String remote : remoteNames) {
try {
List<URIish> uris = new RemoteConfig(config, remote).getURIs();
result.add(newDto(Remote.class).withName(remote).withUrl(uris.isEmpty() ? null : uris.get(0).toString()));
} catch (URISyntaxException exception) {
throw new GitException(exception.getMessage(), exception);
}
}
return result;
}
use of org.eclipse.che.api.git.exception.GitException in project che by eclipse.
the class JGitConnection method branchList.
@Override
public List<Branch> branchList(BranchListMode listMode) throws GitException {
ListBranchCommand listBranchCommand = getGit().branchList();
if (LIST_ALL == listMode || listMode == null) {
listBranchCommand.setListMode(ListMode.ALL);
} else if (LIST_REMOTE == listMode) {
listBranchCommand.setListMode(ListMode.REMOTE);
}
List<Ref> refs;
String currentRef;
try {
refs = listBranchCommand.call();
String headBranch = getRepository().getBranch();
Optional<Ref> currentTag = getGit().tagList().call().stream().filter(tag -> tag.getObjectId().getName().equals(headBranch)).findFirst();
if (currentTag.isPresent()) {
currentRef = currentTag.get().getName();
} else {
currentRef = "refs/heads/" + headBranch;
}
} catch (GitAPIException | IOException exception) {
throw new GitException(exception.getMessage(), exception);
}
List<Branch> branches = new ArrayList<>();
for (Ref ref : refs) {
String refName = ref.getName();
boolean isCommitOrTag = Constants.HEAD.equals(refName);
String branchName = isCommitOrTag ? currentRef : refName;
String branchDisplayName;
if (isCommitOrTag) {
branchDisplayName = "(detached from " + Repository.shortenRefName(currentRef) + ")";
} else {
branchDisplayName = Repository.shortenRefName(refName);
}
Branch branch = newDto(Branch.class).withName(branchName).withActive(isCommitOrTag || refName.equals(currentRef)).withDisplayName(branchDisplayName).withRemote(refName.startsWith("refs/remotes"));
branches.add(branch);
}
return branches;
}
Aggregations