/* license-start
*
* Copyright (C) 2008 - 2013 Crispico, <http://www.crispico.com/>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details, at <http://www.gnu.org/licenses/>.
*
* Contributors:
* Crispico - Initial API and implementation
*
* license-end
*/
package org.flowerplatform.web.git.operation;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.MergeCommand;
import org.eclipse.jgit.api.MergeCommand.FastForwardMode;
import org.eclipse.jgit.api.MergeResult;
import org.eclipse.jgit.api.errors.CheckoutConflictException;
import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.NoHeadException;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.flowerplatform.common.CommonPlugin;
import org.flowerplatform.communication.channel.CommunicationChannel;
import org.flowerplatform.communication.command.DisplaySimpleMessageClientCommand;
import org.flowerplatform.communication.progress_monitor.ProgressMonitor;
import org.flowerplatform.web.git.GitPlugin;
/**
* @author Cristina Constantinescu
*/
public class MergeOperation {
private Repository repository;
private String refName;
private boolean squash;
private CommunicationChannel channel;
private MergeResult mergeResult;
public MergeOperation(Repository repository, String refName, boolean squash, CommunicationChannel channel) {
this.repository = repository;
this.refName = refName;
this.squash = squash;
this.channel = channel;
}
public MergeResult getMergeResult() {
return mergeResult;
}
public void execute() {
ProgressMonitor monitor = ProgressMonitor.create(GitPlugin.getInstance().getMessage("git.merge"), channel);
try {
monitor.beginTask(GitPlugin.getInstance().getMessage("git.merge.title", new Object[] {refName}), 3);
// IProject[] validProjects = GitPlugin.getInstance().getUtils().getValidProjects(repository);
//
// GitPlugin.getInstance().getGitUtils().backupProjectConfigFiles(null, validProjects);
//
Git git = new Git(repository);
monitor.worked(1);
MergeCommand merge;
FastForwardMode ffmode = FastForwardMode.FF;
Ref ref = repository.getRef(refName);
if (ref != null) {
merge = git.merge().include(ref).setFastForward(ffmode);
} else {
merge = git.merge()
.include(ObjectId.fromString(refName))
.setFastForward(ffmode);
}
merge.setSquash(squash);
mergeResult = (MergeResult) GitPlugin.getInstance().getUtils().runGitCommandInUserRepoConfig(repository, merge);
monitor.worked(1);
// GitPlugin.getInstance().getUtils().refreshValidProjects(validProjects, new SubProgressMonitor(monitor, 1));
} catch (NoHeadException e) {
channel.appendOrSendCommand(
new DisplaySimpleMessageClientCommand(
CommonPlugin.getInstance().getMessage("error"),
GitPlugin.getInstance().getMessage("git.merge.mergeOperation.mergeFailedNoHead"),
DisplaySimpleMessageClientCommand.ICON_ERROR));
} catch (ConcurrentRefUpdateException e) {
channel.appendOrSendCommand(
new DisplaySimpleMessageClientCommand(
CommonPlugin.getInstance().getMessage("error"),
GitPlugin.getInstance().getMessage("git.merge.mergeOperation.mergeFailedRefUpdate"),
DisplaySimpleMessageClientCommand.ICON_ERROR));
} catch (CheckoutConflictException e) {
mergeResult = new MergeResult(e.getConflictingPaths());
} catch (GitAPIException e) {
channel.appendOrSendCommand(
new DisplaySimpleMessageClientCommand(
CommonPlugin.getInstance().getMessage("error"),
e.getLocalizedMessage(),
e.getCause().getMessage(),
DisplaySimpleMessageClientCommand.ICON_ERROR));
} catch (Exception e) {
channel.appendOrSendCommand(
new DisplaySimpleMessageClientCommand(
CommonPlugin.getInstance().getMessage("error"),
e.getMessage(),
DisplaySimpleMessageClientCommand.ICON_ERROR));
} finally {
monitor.done();
// GitPlugin.getInstance().getUtils().restoreProjectConfigFiles(repository, null);
}
}
}