blob: 5b2688f3be76a1c5c5b80e76ec895a76727da5ba [file] [log] [blame]
/*
* Copyright (c) 2014, 2015, 2017 Eike Stepper (Loehne, Germany) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.oomph.gitbash.repository;
import org.eclipse.oomph.gitbash.AbstractAction;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.NoHeadException;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.treewalk.TreeWalk;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import java.io.File;
import java.io.PrintStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author Eike Stepper
*/
public class ListFilesAction extends AbstractAction<Repository>
{
private static final IWorkbench WORKBENCH = PlatformUI.getWorkbench();
public ListFilesAction()
{
super(Repository.class);
}
@Override
protected void run(final Shell shell, final Repository repository) throws Exception
{
IRunnableWithProgress runnable = new IRunnableWithProgress()
{
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException
{
long start = System.currentTimeMillis();
try
{
final File file = checkHistory(repository, monitor);
shell.getDisplay().asyncExec(new Runnable()
{
public void run()
{
try
{
IFileStore fileStore = EFS.getLocalFileSystem().getStore(file.toURI());
IDE.openEditorOnFileStore(WORKBENCH.getActiveWorkbenchWindow().getActivePage(), fileStore);
}
catch (PartInitException ex)
{
ex.printStackTrace();
}
}
});
}
catch (OperationCanceledException ex)
{
// Do nothing
}
catch (Exception ex)
{
throw new InvocationTargetException(ex);
}
finally
{
System.out.println();
System.out.println("Took " + (System.currentTimeMillis() - start) + " millis");
}
}
};
WORKBENCH.getProgressService().run(true, true, runnable);
}
private File checkHistory(Repository repository, IProgressMonitor monitor) throws Exception
{
Git git = new Git(repository);
int commitCount = getCommitCount(git);
monitor.beginTask("Listing all files", commitCount);
Map<String, Set<String>> namesByExtension = new HashMap<String, Set<String>>();
for (RevCommit commit : git.log().call())
{
TreeWalk walk = new TreeWalk(repository);
walk.setRecursive(true);
walk.addTree(commit.getTree());
while (walk.next())
{
checkCancelation(monitor);
String name = walk.getNameString();
String extension;
int lastDot = name.lastIndexOf('.');
if (lastDot == -1)
{
extension = "";
}
else
{
extension = name.substring(lastDot + 1);
name = name.substring(0, lastDot);
}
Set<String> names = namesByExtension.get(extension);
if (names == null)
{
names = new HashSet<String>();
namesByExtension.put(extension, names);
}
names.add(name);
}
try
{
Method closeMethod = walk.getClass().getMethod("close");
closeMethod.invoke(walk);
}
catch (Throwable ex)
{
try
{
Method releaseMethod = walk.getClass().getMethod("release");
releaseMethod.invoke(walk);
}
catch (Throwable ignore)
{
//$FALL-THROUGH$
}
}
monitor.worked(1);
}
final File file = new File("files-in-" + repository.getWorkTree().getName() + ".txt");
PrintStream stream = new PrintStream(file);
try
{
for (String extension : sort(namesByExtension.keySet()))
{
List<String> names = sort(namesByExtension.get(extension));
System.out.println(extension + "\t" + names.size());
stream.println(extension + "\t" + names.size());
for (String name : names)
{
stream.println("\t" + name);
}
}
}
finally
{
stream.close();
}
return file;
}
private List<String> sort(Collection<String> c)
{
List<String> list = new ArrayList<String>(c);
Collections.sort(list);
return list;
}
private int getCommitCount(Git git) throws GitAPIException, NoHeadException
{
int commitCount = 0;
for (@SuppressWarnings("unused")
RevCommit commit : git.log().call())
{
++commitCount;
}
return commitCount;
}
private void checkCancelation(IProgressMonitor monitor)
{
if (monitor.isCanceled())
{
throw new OperationCanceledException();
}
}
}