Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Sohn2011-08-17 11:21:29 +0000
committerCode Review2011-08-17 11:21:29 +0000
commitf1ad64cb5fa45b4a9769464e165d7cbac9a111c4 (patch)
treec5671bb289ea99371d9fdde284a9ce0e05ff8bec /org.eclipse.egit.ui/src/org/eclipse/egit
parent389d7c558716e76af681e1249f3883032fdeebed (diff)
parent66cf6e8995b6e2338e8fd1dddf0cd751d2169e2e (diff)
downloadegit-f1ad64cb5fa45b4a9769464e165d7cbac9a111c4.tar.gz
egit-f1ad64cb5fa45b4a9769464e165d7cbac9a111c4.tar.xz
egit-f1ad64cb5fa45b4a9769464e165d7cbac9a111c4.zip
Merge "Extract 'Create Patch' into operation for reusability"
Diffstat (limited to 'org.eclipse.egit.ui/src/org/eclipse/egit')
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/CompareUtils.java58
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffStyleRangeFormatter.java4
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/GitDocument.java4
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CompareTreeView.java3
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitInfoBuilder.java4
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GitCreatePatchWizard.java138
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/CreatePatchHandler.java7
7 files changed, 44 insertions, 174 deletions
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/CompareUtils.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/CompareUtils.java
index f6c16e9fa5..018e9a9427 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/CompareUtils.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/CompareUtils.java
@@ -18,22 +18,17 @@ import java.io.IOException;
import org.eclipse.compare.CompareEditorInput;
import org.eclipse.compare.CompareUI;
import org.eclipse.compare.ITypedElement;
-import org.eclipse.core.resources.IEncodedStorage;
import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.egit.core.internal.CompareCoreUtils;
import org.eclipse.egit.core.internal.storage.GitFileRevision;
import org.eclipse.egit.core.internal.storage.WorkingTreeFileRevision;
import org.eclipse.egit.core.internal.storage.WorkspaceFileRevision;
@@ -114,7 +109,7 @@ public class CompareUtils {
IFileRevision nextFile = getFileRevision(gitPath, commit, db,
blobId);
if (nextFile != null) {
- String encoding = getResourceEncoding(db, gitPath);
+ String encoding = CompareCoreUtils.getResourceEncoding(db, gitPath);
right = new FileRevisionTypedElement(nextFile, encoding);
}
} catch (IOException e) {
@@ -179,55 +174,6 @@ public class CompareUtils {
}
/**
- * Determine the encoding used by Eclipse for the resource which belongs to
- * repoPath in the eclipse workspace or null if no resource is found
- *
- * @param db
- * the repository
- * @param repoPath
- * the path in the git repository
- * @return the encoding used in eclipse for the resource or null if
- *
- */
- public static String getResourceEncoding(Repository db, String repoPath) {
- if (db.isBare())
- return null;
- IWorkspace workspace = ResourcesPlugin.getWorkspace();
- IWorkspaceRoot root = workspace.getRoot();
- IPath absolutePath = new Path(db.getWorkTree().getAbsolutePath())
- .append(repoPath);
- IResource resource = root.getFileForLocation(absolutePath);
- if (resource == null)
- return null;
-
- return getResourceEncoding(resource);
- }
-
- /**
- * Determine the encoding used by eclipse for the resource.
- *
- * @param resource
- * must be an instance of IEncodedStorage
- * @return the encoding used in Eclipse for the resource if found or null
- */
- public static String getResourceEncoding(IResource resource) {
- // Get the encoding for the current version. As a matter of
- // principle one might want to use the eclipse settings for the
- // version we are retrieving as that may be defined by the
- // project settings, but there is no historic API for this.
- String charset;
- IEncodedStorage encodedStorage = ((IEncodedStorage) resource);
- try {
- charset = encodedStorage.getCharset();
- if (charset == null)
- charset = resource.getParent().getDefaultCharset();
- } catch (CoreException e) {
- charset = Constants.CHARACTER_ENCODING;
- }
- return charset;
- }
-
- /**
* @param element
* @param adapterType
* @param load
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffStyleRangeFormatter.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffStyleRangeFormatter.java
index 82ef5bb01c..d05931c420 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffStyleRangeFormatter.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffStyleRangeFormatter.java
@@ -15,7 +15,7 @@ import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
-import org.eclipse.egit.ui.internal.CompareUtils;
+import org.eclipse.egit.core.internal.CompareCoreUtils;
import org.eclipse.egit.ui.internal.commit.DiffStyleRangeFormatter.DiffStyleRange.Type;
import org.eclipse.egit.ui.internal.history.FileDiff;
import org.eclipse.jface.text.BadLocationException;
@@ -159,7 +159,7 @@ public class DiffStyleRangeFormatter extends DiffFormatter {
*/
public DiffStyleRangeFormatter write(Repository repository, FileDiff diff)
throws IOException {
- this.stream.charset = CompareUtils.getResourceEncoding(repository,
+ this.stream.charset = CompareCoreUtils.getResourceEncoding(repository,
diff.getPath());
diff.outputDiff(null, repository, this, true);
flush();
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/GitDocument.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/GitDocument.java
index af6e24ad18..cf61b79356 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/GitDocument.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/GitDocument.java
@@ -14,10 +14,10 @@ import java.util.WeakHashMap;
import org.eclipse.core.resources.IResource;
import org.eclipse.egit.core.GitProvider;
+import org.eclipse.egit.core.internal.CompareCoreUtils;
import org.eclipse.egit.core.project.RepositoryMapping;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.UIText;
-import org.eclipse.egit.ui.internal.CompareUtils;
import org.eclipse.egit.ui.internal.trace.GitTraceLocation;
import org.eclipse.jface.text.Document;
import org.eclipse.jgit.events.ListenerHandle;
@@ -172,7 +172,7 @@ class GitDocument extends Document implements RefsChangedListener {
ObjectLoader loader = repository.open(id, Constants.OBJ_BLOB);
byte[] bytes = loader.getBytes();
String charset;
- charset = CompareUtils.getResourceEncoding(resource);
+ charset = CompareCoreUtils.getResourceEncoding(resource);
// Finally we could consider validating the content with respect
// to the content. We don't do that here.
String s = new String(bytes, charset);
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CompareTreeView.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CompareTreeView.java
index c820fb6149..c7830e9eb8 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CompareTreeView.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CompareTreeView.java
@@ -35,6 +35,7 @@ import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.egit.core.AdaptableFileTreeIterator;
+import org.eclipse.egit.core.internal.CompareCoreUtils;
import org.eclipse.egit.core.internal.storage.GitFileRevision;
import org.eclipse.egit.core.project.RepositoryMapping;
import org.eclipse.egit.ui.Activator;
@@ -256,7 +257,7 @@ public class CompareTreeView extends ViewPart {
UIText.CompareTreeView_ItemNotFoundInVersionMessage,
res.getName(), getCompareVersion()));
} else {
- String encoding = CompareUtils.getResourceEncoding(res);
+ String encoding = CompareCoreUtils.getResourceEncoding(res);
right = new FileRevisionTypedElement(rightRevision, encoding);
}
GitCompareFileRevisionEditorInput compareInput = new GitCompareFileRevisionEditorInput(
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitInfoBuilder.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitInfoBuilder.java
index acd9097cac..4e751b642e 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitInfoBuilder.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitInfoBuilder.java
@@ -31,10 +31,10 @@ import java.util.regex.Pattern;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.egit.core.internal.CompareCoreUtils;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.UIPreferences;
import org.eclipse.egit.ui.UIText;
-import org.eclipse.egit.ui.internal.CompareUtils;
import org.eclipse.egit.ui.internal.history.CommitMessageViewer.ObjectLink;
import org.eclipse.egit.ui.internal.trace.GitTraceLocation;
import org.eclipse.jgit.diff.DiffFormatter;
@@ -410,7 +410,7 @@ public class CommitInfoBuilder {
String path = currentDiff.getPath();
monitor.setTaskName(NLS.bind(
UIText.CommitMessageViewer_BuildDiffTaskName, path));
- currentEncoding[0] = CompareUtils.getResourceEncoding(db,
+ currentEncoding[0] = CompareCoreUtils.getResourceEncoding(db,
path);
d.append(formatPathLine(path)).append(LF);
currentDiff.outputDiff(d, db, diffFmt, true);
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GitCreatePatchWizard.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GitCreatePatchWizard.java
index 9caba48d1d..eb6d172f14 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GitCreatePatchWizard.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GitCreatePatchWizard.java
@@ -11,25 +11,20 @@
*******************************************************************************/
package org.eclipse.egit.ui.internal.history;
-import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
-import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
-import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.lang.reflect.InvocationTargetException;
-import java.net.URLEncoder;
-import java.text.SimpleDateFormat;
-import java.util.Locale;
+import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
+import org.eclipse.egit.core.op.CreatePatchOperation;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.UIIcons;
import org.eclipse.egit.ui.UIText;
-import org.eclipse.egit.ui.internal.CompareUtils;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.operation.IRunnableWithProgress;
@@ -37,10 +32,8 @@ import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jgit.diff.DiffFormatter;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.treewalk.TreeWalk;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
@@ -65,17 +58,12 @@ public class GitCreatePatchWizard extends Wizard {
private RevCommit commit;
- private TreeWalk walker;
-
private Repository db;
private LocationPage locationPage;
private OptionsPage optionsPage;
- // the encoding for the currently processed file
- private String currentEncoding = null;
-
// The initial size of this wizard.
private final static int INITIAL_WIDTH = 300;
@@ -85,14 +73,12 @@ public class GitCreatePatchWizard extends Wizard {
*
* @param part
* @param commit
- * @param walker
* @param db
*/
public static void run(IWorkbenchPart part, final RevCommit commit,
- TreeWalk walker, Repository db) {
+ Repository db) {
final String title = UIText.GitCreatePatchWizard_CreatePatchTitle;
- final GitCreatePatchWizard wizard = new GitCreatePatchWizard(commit,
- walker, db);
+ final GitCreatePatchWizard wizard = new GitCreatePatchWizard(commit, db);
wizard.setWindowTitle(title);
WizardDialog dialog = new WizardDialog(part.getSite().getShell(),
wizard);
@@ -103,15 +89,13 @@ public class GitCreatePatchWizard extends Wizard {
/**
* Creates a wizard which is used to export the changes introduced by a
- * commit, filtered by a TreeWalk
+ * commit.
*
* @param commit
- * @param walker
* @param db
*/
- public GitCreatePatchWizard(RevCommit commit, TreeWalk walker, Repository db) {
+ public GitCreatePatchWizard(RevCommit commit, Repository db) {
this.commit = commit;
- this.walker = walker;
this.db = db;
}
@@ -133,59 +117,30 @@ public class GitCreatePatchWizard extends Wizard {
@Override
public boolean performFinish() {
- final boolean isGit = optionsPage.gitFormat.getSelection();
+ final CreatePatchOperation operation = new CreatePatchOperation(db,
+ commit);
+ operation.useGitFormat(optionsPage.gitFormat.getSelection());
+
final boolean isFile = locationPage.fsRadio.getSelection();
final String fileName = locationPage.fsPathText.getText();
try {
getContainer().run(true, true, new IRunnableWithProgress() {
- public void run(IProgressMonitor monitor) {
- final StringBuilder sb = new StringBuilder();
- final DiffFormatter diffFmt = new DiffFormatter(
- new BufferedOutputStream(new ByteArrayOutputStream() {
-
- @Override
- public synchronized void write(byte[] b, int off, int len) {
- super.write(b, off, len);
- if (currentEncoding == null)
- sb.append(toString());
- else try {
- sb.append(toString(currentEncoding));
- } catch (UnsupportedEncodingException e) {
- sb.append(toString());
- }
- reset();
- }
-
- }));
-
- if (isGit)
- writeGitPatchHeader(sb);
+ public void run(IProgressMonitor monitor)
+ throws InvocationTargetException {
try {
- FileDiff[] diffs = FileDiff.compute(walker, commit);
- for (FileDiff diff : diffs) {
- currentEncoding = CompareUtils.
- getResourceEncoding(db, diff.getPath());
- diff.outputDiff(sb, db, diffFmt, isGit);
- diffFmt.flush();
- }
+ operation.execute(monitor);
+ String content = operation.getPatchContent();
if (isFile) {
- Writer output = new BufferedWriter(new FileWriter(
- fileName));
- try {
- // FileWriter always assumes default encoding is
- // OK!
- output.write(sb.toString());
- } finally {
- output.close();
- }
+ writeToFile(fileName, content);
} else {
- copyToClipboard(sb.toString());
+ copyToClipboard(content);
}
} catch (IOException e) {
- Activator
- .logError("Patch file could not be written", e); //$NON-NLS-1$
+ throw new InvocationTargetException(e);
+ } catch (CoreException e) {
+ throw new InvocationTargetException(e);
}
}
});
@@ -202,31 +157,6 @@ public class GitCreatePatchWizard extends Wizard {
return true;
}
- private void writeGitPatchHeader(StringBuilder sb) {
-
- final SimpleDateFormat dtfmt;
- dtfmt = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.US); //$NON-NLS-1$
- dtfmt.setTimeZone(commit.getAuthorIdent().getTimeZone());
- sb.append("From").append(" ") //$NON-NLS-1$ //$NON-NLS-2$
- .append(commit.getId().getName()).append(" ") //$NON-NLS-1$
- .append(dtfmt.format(Long.valueOf(System.currentTimeMillis())))
- .append("\n"); //$NON-NLS-1$
- sb.append("From") //$NON-NLS-1$
- .append(": ") //$NON-NLS-1$
- .append(commit.getAuthorIdent().getName())
- .append(" <").append(commit.getAuthorIdent().getEmailAddress()) //$NON-NLS-1$
- .append(">\n"); //$NON-NLS-1$
- sb.append("Date").append(": ") //$NON-NLS-1$ //$NON-NLS-2$
- .append(dtfmt.format(commit.getAuthorIdent().getWhen()))
- .append("\n"); //$NON-NLS-1$
- sb.append("Subject").append(": [PATCH] ") //$NON-NLS-1$ //$NON-NLS-2$
- .append(commit.getShortMessage());
-
- String message = commit.getFullMessage().substring(
- commit.getShortMessage().length());
- sb.append(message).append("\n\n"); //$NON-NLS-1$
- }
-
private void copyToClipboard(final String content) {
getShell().getDisplay().syncExec(new Runnable() {
public void run() {
@@ -239,6 +169,18 @@ public class GitCreatePatchWizard extends Wizard {
});
}
+ private void writeToFile(final String fileName, String content)
+ throws IOException {
+ Writer output = new BufferedWriter(new FileWriter(fileName));
+ try {
+ // FileWriter always assumes default encoding is
+ // OK!
+ output.write(content);
+ } finally {
+ output.close();
+ }
+ }
+
/**
* A wizard page to choose the target location
*/
@@ -358,23 +300,9 @@ public class GitCreatePatchWizard extends Wizard {
}
private String createFileName() {
- String name = commit.getShortMessage();
-
- name = name.trim();
- try {
- name = URLEncoder.encode(name, "UTF-8"); //$NON-NLS-1$
- } catch (UnsupportedEncodingException e) {
- // We're pretty sure that UTF-8 will be supported in future
- }
- if (name.length() > 80)
- name = name.substring(0, 80);
- while (name.endsWith(".")) //$NON-NLS-1$
- name = name.substring(0, name.length() - 1);
- name = name.concat(".patch"); //$NON-NLS-1$
-
+ String suggestedFileName = CreatePatchOperation.suggestFileName(commit);
String defaultPath = db.getWorkTree().getAbsolutePath();
-
- return (new File(defaultPath, name)).getPath();
+ return (new File(defaultPath, suggestedFileName)).getPath();
}
/**
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/CreatePatchHandler.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/CreatePatchHandler.java
index ddd8eefcca..3df9d7d548 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/CreatePatchHandler.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/CreatePatchHandler.java
@@ -15,8 +15,6 @@ import org.eclipse.egit.ui.internal.history.GitHistoryPage;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.treewalk.TreeWalk;
-import org.eclipse.jgit.treewalk.filter.TreeFilter;
/**
* Create a patch based on a commit.
@@ -28,10 +26,7 @@ public class CreatePatchHandler extends AbstractHistoryCommandHandler {
if (selection.size() == 1) {
RevCommit commit = (RevCommit) selection.getFirstElement();
Repository repo = getRepository(event);
- TreeWalk fileWalker = new TreeWalk(repo);
- fileWalker.setRecursive(true);
- fileWalker.setFilter(TreeFilter.ANY_DIFF);
- GitCreatePatchWizard.run(getPart(event), commit, fileWalker, repo);
+ GitCreatePatchWizard.run(getPart(event), commit, repo);
}
return null;
}

Back to the top