/*******************************************************************************
* Copyright (c) 2011 GitHub Inc.
* 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:
* Kevin Sawicki (GitHub Inc.) - initial API and implementation
*******************************************************************************/
package org.eclipse.egit.ui.internal.commit;
import java.io.File;
import java.io.IOException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.egit.core.Activator;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.ui.IElementFactory;
import org.eclipse.ui.IMemento;
/**
* Element factory for saving and restoring the state of a
* {@link CommitEditorInput} instance.
*/
public class CommitEditorInputFactory implements IElementFactory {
/**
* ID
*/
public static final String ID = "org.eclipse.egit.ui.internal.commit.CommitEditorInputFactory"; //$NON-NLS-1$
/**
* COMMIT
*/
public static final String COMMIT = "commit"; //$NON-NLS-1$
/**
* PATH
*/
public static final String PATH = "path"; //$NON-NLS-1$
/**
* STASH
*/
public static final String STASH = "stash"; //$NON-NLS-1$
/**
* Save state of input to memento
*
* @param memento
* @param input
*/
public static void saveState(IMemento memento, CommitEditorInput input) {
RepositoryCommit commit = input.getCommit();
memento.putString(COMMIT, commit.getRevCommit().name());
memento.putString(PATH, commit.getRepository().getDirectory()
.getAbsolutePath());
memento.putBoolean(STASH, commit.isStash());
}
/**
* Get repository from memento
*
* @param memento
* @return repository
*/
protected Repository getRepository(IMemento memento) {
String path = memento.getString(PATH);
if (path == null)
return null;
File gitDir = new File(path);
if (!gitDir.exists())
return null;
try {
return Activator.getDefault().getRepositoryCache()
.lookupRepository(gitDir);
} catch (IOException e) {
return null;
}
}
/**
* Get commit from memento and repository
*
* @param memento
* @param repository
* @return rev commit
*/
protected RepositoryCommit getCommit(IMemento memento, Repository repository) {
String id = memento.getString(COMMIT);
if (id == null)
return null;
try (RevWalk walk = new RevWalk(repository)) {
RevCommit commit = walk.parseCommit(ObjectId.fromString(id));
for (RevCommit parent : commit.getParents())
walk.parseBody(parent);
RepositoryCommit repositoryCommit = new RepositoryCommit(
repository, commit);
Boolean isStash = memento.getBoolean(STASH);
if (isStash != null)
repositoryCommit.setStash(isStash.booleanValue());
return repositoryCommit;
} catch (IOException e) {
return null;
}
}
/**
* @see org.eclipse.ui.IElementFactory#createElement(org.eclipse.ui.IMemento)
*/
@Override
public IAdaptable createElement(IMemento memento) {
Repository repository = getRepository(memento);
if (repository == null)
return null;
RepositoryCommit commit = getCommit(memento, repository);
if (commit == null)
return null;
return new CommitEditorInput(commit);
}
}