diff options
author | Matthias Sohn | 2011-08-17 11:21:29 +0000 |
---|---|---|
committer | Code Review | 2011-08-17 11:21:29 +0000 |
commit | f1ad64cb5fa45b4a9769464e165d7cbac9a111c4 (patch) | |
tree | c5671bb289ea99371d9fdde284a9ce0e05ff8bec /org.eclipse.egit.ui/src/org/eclipse/egit | |
parent | 389d7c558716e76af681e1249f3883032fdeebed (diff) | |
parent | 66cf6e8995b6e2338e8fd1dddf0cd751d2169e2e (diff) | |
download | egit-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')
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; } |