/**
*
*/
package net.certware.history.egit.handlers;
import java.io.File;
import java.net.URI;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryBuilder;
import org.eclipse.jgit.revwalk.FooterLine;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevTree;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.treewalk.TreeWalk;
import org.eclipse.jgit.treewalk.filter.TreeFilter;
import org.eclipse.team.core.RepositoryProvider;
import org.eclipse.team.core.history.IFileHistory;
import org.eclipse.team.core.history.IFileHistoryProvider;
import org.eclipse.team.core.history.IFileRevision;
import org.eclipse.team.core.history.ITag;
import org.eclipse.team.core.subscribers.Subscriber;
/**
* Handles the dump command.
* @author mrb
*/
public class DumpHandler extends AbstractHandler {
@SuppressWarnings("unused")
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
System.out.println("reporting from from dump handler...");
// zeroth
try {
//GitProvider provider = new GitProvider();
//provider.configureProject();
// TODO derive from selection
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("net.certware.test");
System.out.println("programmatic access to project " + project);
RepositoryBuilder builder = new RepositoryBuilder();
Repository repository = builder.setGitDir(((IResource)project).getFullPath().toFile()).readEnvironment().findGitDir().build();
if (repository != null) {
// tags
Map<String, Ref> repoTags = repository.getTags();
System.out.println("tags: ");
{
Set<String> keyset = repoTags.keySet();
if ( keyset.isEmpty() == false ) {
Iterator<String> i = keyset.iterator();
while( i.hasNext() ) {
String key = i.next();
System.out.println("tags key " + key + " value " + repoTags.get(key));
}
}
}
//refs
Map<String, Ref> refs = repository.getAllRefs();
System.out.println("refs: ");
{
Set<String> keyset = repoTags.keySet();
if ( keyset.isEmpty() == false ) {
Iterator<String> i = keyset.iterator();
while( i.hasNext() ) {
String key = i.next();
System.out.println("refs key " + key + " value " + repoTags.get(key));
}
}
}
String branch = repository.getBranch();
System.out.println("branch: " + branch);
Ref head = repository.getRef("HEAD");
System.out.println("head: " + head);
RevWalk walk = new RevWalk(repository);
System.out.println("walk: " + walk);
ObjectId headObject = repository.resolve("HEAD");
System.out.println("head obj: " + headObject);
walk.markStart(walk.parseCommit(headObject));
Set<String> authorEmails = new HashSet<String>();
TreeFilter filter = walk.getTreeFilter();
// rev commit walk
for (RevCommit commit : walk) {
System.err.println(' ');
System.err.println("commit: " + commit);
PersonIdent author = commit.getAuthorIdent();
PersonIdent committer = commit.getCommitterIdent();
Date when = committer.getWhen();
String name = commit.getName();
int type = commit.getType();
int commitTime = commit.getCommitTime();
System.out.println("name " + name + " type " + type + " author " + author + " committer " + committer + " time " + commitTime + " when " + when);
int parentCount = commit.getParentCount();
List<FooterLine> footerLines = commit.getFooterLines();
String fullMessage = commit.getFullMessage();
String shortMessage = commit.getShortMessage();
System.out.println("parents " + parentCount + " full " + fullMessage + " short " + shortMessage);
System.out.println("footer lines:");
Iterator<FooterLine> i = footerLines.iterator();
while( i.hasNext() ) {
FooterLine fl = (FooterLine)i.next();
System.out.println("key " + fl.getKey() + " value " + fl.getValue() + " email " + fl.getEmailAddress());
}
// extract the commit fields you need, for example:
authorEmails.add(commit.getAuthorIdent().getEmailAddress());
RevTree revTree = commit.getTree();
int firstByte = revTree.getFirstByte();
ObjectId oi = revTree.getId();
String rtname = revTree.getName();
int rtype = revTree.getType();
System.out.println("commit rev tree:");
System.out.println("first " + firstByte + " id " + oi.getName() + " name " + rtname + " type " + rtype);
// commit.dispose();
// commit.reset();
}
//walk.dispose();
walk.close();
/**
* tree walk version
*/
TreeWalk treeWalk = new TreeWalk(repository);
System.out.println(' ');
System.err.println("tree walk: " + treeWalk);
/**
* from test case
*/
System.err.println("file provider test");
File workDir = repository.getWorkTree();
System.out.println("work dir " + workDir);
// GitProvider provider = (GitProvider)RepositoryProvider.getProvider(project);
RepositoryProvider provider = RepositoryProvider.getProvider(project);
String id = provider.getID();
Subscriber subscriber = provider.getSubscriber();
IFileHistoryProvider fileHistoryProvider = provider.getFileHistoryProvider();
IResource[] projectMembers = project.members();
for ( IResource resource : projectMembers ) {
System.err.println("");
System.err.println("resource " + resource);
IFileHistory fileHistory = fileHistoryProvider.getFileHistoryFor(resource,
IFileHistoryProvider.SINGLE_LINE_OF_DESCENT,
new NullProgressMonitor());
// System.err.println("file history " + fileHistory);
IFileRevision[] fileRevisions = fileHistory.getFileRevisions();
for ( IFileRevision fr : fileRevisions ) {
String author = fr.getAuthor();
String comment = fr.getComment();
String identifier = fr.getContentIdentifier();
String name = fr.getName();
ITag[] tags = fr.getTags();
long timestamp = fr.getTimestamp();
URI uri = fr.getURI();
System.err.println("file revision: " + author + ";" + comment + ";" + identifier + ";" + name + ";" + timestamp);
/*
System.err.print("tags: ");
for ( ITag t : tags ) {
System.err.print(t.getName() + ' ');
}
System.err.println("");
*/
} // revisions
} // members
// IFileRevision fileRevision = fileHistory.getFileRevision("60f0d7917fe2aed5c92b5bc35dfb55b9b8ada359");
//assertEquals("60f0d7917fe2aed5c92b5bc35dfb55b9b8ada359", fileRevision.getContentIdentifier());
//assertEquals("J. Author",fileRevision.getAuthor());
/*
final WorkingTreeIterator iterator = treeWalk.getTree(0,WorkingTreeIterator.class); // TODO broken also
System.out.println("iterator " + iterator);
while( iterator.eof() == false ) {
FileMode fileMode = iterator.getEntryFileMode();
long lastModified = iterator.getEntryLastModified();
long length = iterator.getEntryLength();
ObjectId objectId = iterator.getEntryObjectId();
int hashCode = iterator.getEntryPathHashCode();
String pathString = iterator.getEntryPathString();
System.out.println("path " + pathString + " hash code " + hashCode + " objectId " + objectId);
System.out.println("length " + length + " last modified " + lastModified + " file mode " + fileMode );
iterator.next(1);
}
*/
// walk must have two trees
/*
List<DiffEntry> diffList = DiffEntry.scan(treeWalk);
for ( DiffEntry diffEntry : diffList ) {
System.out.println("diff entry: " + diffEntry);
ChangeType changeType = diffEntry.getChangeType();
FileMode newMode = diffEntry.getNewMode();
FileMode oldMode = diffEntry.getOldMode();
String newPath = diffEntry.getNewPath();
String oldPath = diffEntry.getOldPath();
int score = diffEntry.getScore();
System.out.println("score " + score + " new path " + newPath + " old path " + oldPath);
System.out.println("new mode " + newMode + " old mode " + oldMode );
System.out.println("change type " + changeType );
AbbreviatedObjectId oldId = diffEntry.getId(Side.OLD);
AbbreviatedObjectId newId = diffEntry.getId(Side.NEW);
System.out.println("old id " + oldId + " new id " + newId);
} // diff entry
*/
treeWalk.close();
}
//provider.getData();
//GitProjectData gpd = GitProjectData.get(project);
//System.out.println("git project data: " + gpd); // okay
//RepositoryFinder finder = new RepositoryFinder(project); // okay
//Collection<RepositoryMapping> mapping = finder.find(Job.getJobManager().createProgressGroup()); // okay
//System.out.println("mapping: " + mapping); // okay
// RepositoryUtil ru = org.eclipse.egit.core.Activator.getDefault().getRepositoryUtil();
/*
for ( RepositoryMapping m : mapping) {
System.out.println("path: " + m.getGitDirAbsolutePath());
File workTree = m.getWorkTree();
System.out.println("work tree: " + workTree);
Repository r = m.getRepository();
System.out.println("repository branch: " + r.getBranch());
System.out.println("repository tags: " + r.getTags());
}
*/
} catch (Exception e2) {
e2.printStackTrace();
}
// first
/*
ru.addConfiguredRepository(new File("..",Constants.DOT_GIT));
List<String> repositories = ru.getConfiguredRepositories();
System.out.println("configured repositories: " + repositories.size());
for ( String r : repositories ) {
System.out.println("configured repository: " + r);
}
*/
// second
/*
try {
FileRepository fr = lookupRepository(new File("."));
System.err.println("lookup fr: " + fr);
RevWalk walk = new RevWalk(fr);
System.out.println("revision walk: " + walk);
ObjectId head = fr.resolve("HEAD");
System.out.println("repository head: " + head);
// walk.markStart(walk.parseCommit(head));
Set<String> authorEmails = new HashSet<String>();
for (RevCommit commit : walk) {
// extract the commit fields you need, for example:
authorEmails.add(commit.getAuthorIdent().getEmailAddress());
// commit.dispose();
// commit.reset();
}
} catch (Exception e1) {
e1.printStackTrace();
}
*/
/*
try {
RepositoryBuilder builder = new RepositoryBuilder();
// BaseRepositoryBuilder baseBuilder = builder.findGitDir();
builder.setWorkTree(new File("."));
builder.findGitDir(new File("."));
System.err.println("git dir: " + builder.getGitDir());
Repository repository = builder.build();
// .readEnvironment() // scan environment GIT_* variables
//.findGitDir() // scan up the file system tree
//.build();
ObjectId head = repository.resolve("HEAD");
System.out.println("repository head: " + head);
RevWalk walk = new RevWalk(repository);
System.out.println("revision walk: " + walk);
// ObjectId from = repository.resolve("refs/heads/master");
// ObjectId to = repository.resolve("refs/remotes/origin/master");
walk.markStart(walk.parseCommit(head));
// walk.markUninteresting(walk.parseCommit(to));
// more setup
Set<String> authorEmails = new HashSet<String>();
for (RevCommit commit : walk) {
// extract the commit fields you need, for example:
authorEmails.add(commit.getAuthorIdent().getEmailAddress());
// commit.dispose();
commit.reset();
}
walk.setTreeFilter(AndTreeFilter.create(
PathFilter.create("a/file/path"),
TreeFilter.ANY_DIFF));
} catch (IOException e) {
e.printStackTrace();
}
*/
return null;
}
// protected static org.eclipse.jgit.storage.file.FileRepository lookupRepository(File directory) throws Exception {
//return (org.eclipse.jgit.storage.file.FileRepository) org.eclipse.egit.core.Activator.getDefault()
//.getRepositoryCache().lookupRepository(directory);
//}
}