diff options
author | Tomasz Zarna | 2009-12-23 13:13:12 +0000 |
---|---|---|
committer | Tomasz Zarna | 2009-12-23 13:13:12 +0000 |
commit | 14ac51ff7954d2632eb55033793107809dd3ffa1 (patch) | |
tree | 76ce6c93e3bd2724204cf624cbd0b7f6ceb71301 | |
parent | 8f4be955e371fb1faf613e3ddbda284a826d9cb5 (diff) | |
download | eclipse.platform.team-14ac51ff7954d2632eb55033793107809dd3ffa1.tar.gz eclipse.platform.team-14ac51ff7954d2632eb55033793107809dd3ffa1.tar.xz eclipse.platform.team-14ac51ff7954d2632eb55033793107809dd3ffa1.zip |
bug 73683: [Apply Patch] Add URL option Apply Patch dialog
4 files changed, 263 insertions, 27 deletions
diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/Utilities.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/Utilities.java index 0ef89503f..8aec4b33c 100644 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/Utilities.java +++ b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/Utilities.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2008 IBM Corporation and others. + * Copyright (c) 2000, 2009 IBM Corporation and others. * 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 @@ -10,19 +10,57 @@ *******************************************************************************/ package org.eclipse.compare.internal; -import java.io.*; -import java.util.*; +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; +import java.util.Map; +import java.util.MissingResourceException; +import java.util.ResourceBundle; -import org.eclipse.compare.*; +import org.eclipse.compare.CompareConfiguration; +import org.eclipse.compare.CompareUI; +import org.eclipse.compare.IEncodedStreamContentAccessor; +import org.eclipse.compare.ISharedDocumentAdapter; +import org.eclipse.compare.IStreamContentAccessor; +import org.eclipse.compare.ITypedElement; +import org.eclipse.compare.SharedDocumentAdapter; import org.eclipse.compare.contentmergeviewer.IDocumentRange; import org.eclipse.compare.internal.core.patch.HunkResult; import org.eclipse.compare.patch.IHunk; import org.eclipse.compare.structuremergeviewer.DiffNode; import org.eclipse.compare.structuremergeviewer.ICompareInput; -import org.eclipse.core.resources.*; -import org.eclipse.core.resources.mapping.*; -import org.eclipse.core.runtime.*; +import org.eclipse.core.resources.IEncodedStorage; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourceAttributes; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.resources.mapping.ResourceMapping; +import org.eclipse.core.resources.mapping.ResourceMappingContext; +import org.eclipse.core.resources.mapping.ResourceTraversal; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.ISafeRunnable; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.ListenerList; +import org.eclipse.core.runtime.MultiStatus; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.SafeRunner; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.SubMonitor; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.ErrorDialog; @@ -33,8 +71,17 @@ import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.custom.BusyIndicator; -import org.eclipse.swt.widgets.*; -import org.eclipse.ui.*; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Widget; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IViewPart; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.IWorkbenchPartSite; +import org.eclipse.ui.IWorkbenchSite; import org.eclipse.ui.progress.IWorkbenchSiteProgressService; import org.eclipse.ui.texteditor.IDocumentProvider; @@ -582,6 +629,12 @@ public class Utilities { * Returns null if an error occurred. */ public static String readString(InputStream is, String encoding) throws IOException { + return readString(is, encoding, -1, null); + } + + public static String readString(InputStream is, String encoding, int length, IProgressMonitor monitor) throws IOException { + SubMonitor progress = SubMonitor.convert(monitor); + progress.setWorkRemaining(length); if (is == null) return null; BufferedReader reader= null; @@ -590,9 +643,13 @@ public class Utilities { char[] part= new char[2048]; int read= 0; reader= new BufferedReader(new InputStreamReader(is, encoding)); - while ((read= reader.read(part)) != -1) + while ((read= reader.read(part)) != -1) { buffer.append(part, 0, read); - + progress.worked(2048); + if (progress.isCanceled()) + throw new OperationCanceledException(); + } + return buffer.toString(); } finally { if (reader != null) { @@ -781,4 +838,24 @@ public class Utilities { }); } } + + /** + * @param connection a connection for which the timeout is set + * @param timeout an int that specifies the connect timeout value in milliseconds + * @return whether the timeout has been successfully set + */ + public static boolean setReadTimeout(URLConnection connection, int timeout) { + Method[] methods = connection.getClass().getMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals("setReadTimeout")) //$NON-NLS-1$ + try { + methods[i].invoke(connection, new Object[] {new Integer(timeout)}); + return true; + } catch (IllegalArgumentException e) { // ignore + } catch (IllegalAccessException e) { // ignore + } catch (InvocationTargetException e) { // ignore + } + } + return false; + } } diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/InputPatchPage.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/InputPatchPage.java index 9b51fb3c8..94c16351b 100644 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/InputPatchPage.java +++ b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/InputPatchPage.java @@ -19,6 +19,11 @@ import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.io.StringReader; +import java.lang.reflect.InvocationTargetException; +import java.net.MalformedURLException; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.net.URLConnection; import org.eclipse.compare.internal.ICompareContextIds; import org.eclipse.compare.internal.Utilities; @@ -29,11 +34,15 @@ import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.SubMonitor; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; @@ -80,6 +89,7 @@ import com.ibm.icu.text.MessageFormat; // dialog store id constants private final static String PAGE_NAME= "PatchWizardPage1"; //$NON-NLS-1$ private final static String STORE_PATCH_FILES_ID= PAGE_NAME+".PATCH_FILES"; //$NON-NLS-1$ + private final static String STORE_PATCH_URLS_ID= PAGE_NAME+".PATCH_URLS"; //$NON-NLS-1$ private final static String STORE_INPUT_METHOD_ID= PAGE_NAME+".INPUT_METHOD"; //$NON-NLS-1$ private final static String STORE_WORKSPACE_PATH_ID= PAGE_NAME+".WORKSPACE_PATH"; //$NON-NLS-1$ @@ -87,6 +97,7 @@ import com.ibm.icu.text.MessageFormat; protected final static int CLIPBOARD= 1; protected final static int FILE= 2; protected final static int WORKSPACE= 3; + protected final static int URL= 4; protected final static String INPUTPATCHPAGE_NAME= "InputPatchPage"; //$NON-NLS-1$ @@ -104,6 +115,8 @@ import com.ibm.icu.text.MessageFormat; private Button fPatchFileBrowseButton; private Button fUsePatchFileButton; private Button fUseWorkspaceButton; + private Button fUseURLButton; + private Combo fPatchURLField; private Label fWorkspaceSelectLabel; private TreeViewer fTreeViewer; @@ -115,7 +128,9 @@ import com.ibm.icu.text.MessageFormat; case FILE: fShowError= (fPatchFileNameField.getText() != ""); //$NON-NLS-1$ break; - + case URL: + fShowError = (fPatchURLField.getText() != ""); //$NON-NLS-1$ + break; case WORKSPACE: fShowError= (!fTreeViewer.getSelection().isEmpty()); break; @@ -160,7 +175,7 @@ import com.ibm.icu.text.MessageFormat; restoreWidgetValues(); // see if there are any better options presently selected (i.e workspace - // or clipboard) + // or clipboard or URL from clipboard) adjustToCurrentTarget(); // No error for dialog opening @@ -243,6 +258,14 @@ import com.ibm.icu.text.MessageFormat; } } fPatchSource= PatchMessages.InputPatchPage_PatchFile_title; + } else if (inputMethod==URL) { + String patchFileURL = fPatchURLField.getText(); + if (patchFileURL != null) { + String contents = getURLContents(patchFileURL); + if (contents != null) + reader = new StringReader(contents); + } + fPatchSource= PatchMessages.InputPatchPage_URL_title; } else if (inputMethod==WORKSPACE) { // Get the selected patch file (tree will only allow for one selection) IResource[] resources= Utilities.getResources(fTreeViewer.getSelection()); @@ -282,6 +305,43 @@ import com.ibm.icu.text.MessageFormat; } } + private String getURLContents(String patchFileURL) { + final URL url; + try { + url = new URL(patchFileURL); + final String[] result= new String[1]; + try { + getContainer().run(true, true, new IRunnableWithProgress() { + public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + SubMonitor progress = SubMonitor.convert(monitor, PatchMessages.InputPatchPage_URLConnecting, 100); + try { + URLConnection connection = url.openConnection(); + progress.worked(10); + if (monitor.isCanceled()) + throw new OperationCanceledException(); + Utilities.setReadTimeout(connection, 60*1000); + progress.setTaskName(PatchMessages.InputPatchPage_URLFetchingContent); + String enc = connection.getContentEncoding(); + if (enc == null) + enc = ResourcesPlugin.getEncoding(); + result[0] = Utilities.readString(connection.getInputStream(), enc, connection.getContentLength(), progress.newChild(90)); + } catch (SocketTimeoutException e) { // timeout + } catch (IOException e) { //ignore + } + monitor.done(); + } + }); + return result[0]; + } catch (OperationCanceledException e) { //ignore + } catch (InvocationTargetException e) { //ignore + } catch (InterruptedException e) { //ignore + } + } catch (MalformedURLException e) { + // ignore as we tested it with modify listener on combo + } + return null; + } + /* (non-JavaDoc) * Method declared in IWizardPage. */ @@ -301,6 +361,10 @@ import com.ibm.icu.text.MessageFormat; fTreeViewer.getTree().setEnabled(enable); } + private void setEnableURLPatch(boolean enable) { + fPatchURLField.setEnabled(enable); + } + /* * Create the group for selecting the patch file */ @@ -337,6 +401,15 @@ import com.ibm.icu.text.MessageFormat; fPatchFileBrowseButton.setLayoutData(data); //3rd row + fUseURLButton = new Button(composite, SWT.RADIO); + fUseURLButton.setText(PatchMessages.InputPatchPage_URLButton_text); + + fPatchURLField = new Combo(composite, SWT.BORDER); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = 2; + fPatchURLField.setLayoutData(gd); + + //4th row fUseWorkspaceButton= new Button(composite, SWT.RADIO); fUseWorkspaceButton.setText(PatchMessages.InputPatchPage_UseWorkspaceButton_text); gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); @@ -354,6 +427,7 @@ import com.ibm.icu.text.MessageFormat; fShowError= true; int state= getInputMethod(); setEnablePatchFile(state == FILE); + setEnableURLPatch(state == URL); setEnableWorkspacePatch(state == WORKSPACE); updateWidgetEnablements(); fPatchRead = false; @@ -368,8 +442,9 @@ import com.ibm.icu.text.MessageFormat; clearErrorMessage(); fShowError= (fPatchFileNameField.getText() != ""); //$NON-NLS-1$ int state= getInputMethod(); - setEnablePatchFile(state==FILE); - setEnableWorkspacePatch(state==WORKSPACE); + setEnablePatchFile(state == FILE); + setEnableURLPatch(state == URL); + setEnableWorkspacePatch(state == WORKSPACE); updateWidgetEnablements(); fPatchRead = false; } @@ -394,6 +469,24 @@ import com.ibm.icu.text.MessageFormat; updateWidgetEnablements(); } }); + fUseURLButton.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + clearErrorMessage(); + fShowError= (fPatchURLField.getText() != ""); //$NON-NLS-1$ + int state= getInputMethod(); + setEnablePatchFile(state == FILE); + setEnableURLPatch(state == URL); + setEnableWorkspacePatch(state == WORKSPACE); + updateWidgetEnablements(); + } + }); + fPatchURLField.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + clearErrorMessage(); + fShowError = true; + updateWidgetEnablements(); + } + }); fUseWorkspaceButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { if (!fUseWorkspaceButton.getSelection()) @@ -403,6 +496,7 @@ import com.ibm.icu.text.MessageFormat; fShowError= (!fTreeViewer.getSelection().isEmpty()); int state= getInputMethod(); setEnablePatchFile(state == FILE); + setEnableURLPatch(state == URL); setEnableWorkspacePatch(state == WORKSPACE); updateWidgetEnablements(); fPatchRead = false; @@ -492,6 +586,20 @@ import com.ibm.icu.text.MessageFormat; } else { error= PatchMessages.InputPatchPage_NoFileName_message; } + } else if (inputMethod == URL) { + String urlText = fPatchURLField.getText(); + if(urlText != null) { + try { + new URL(urlText); + // Checking the URL is a bit too heavy for each keystroke. + // Let's assume it contains a valid patch. + gotPatch = true; + } catch (MalformedURLException e) { + error= PatchMessages.InputPatchPage_MalformedURL; + } + } else { + error= PatchMessages.InputPatchPage_NoURL; + } } else if (inputMethod == WORKSPACE) { //Get the selected patch file (tree will only allow for one selection) IResource[] resources= Utilities.getResources(fTreeViewer.getSelection()); @@ -638,6 +746,13 @@ import com.ibm.icu.text.MessageFormat; if (patchFilePath != null) setSourceName(patchFilePath); + // set URLs history + String[] sourceURLs= settings.getArray(STORE_PATCH_URLS_ID); + if (sourceURLs != null) + for (int i= 0; i < sourceURLs.length; i++) + if (sourceURLs[i] != null && sourceURLs[i].length() > 0) + fPatchURLField.add(sourceURLs[i]); + // If the previous apply patch was used with a clipboard, we need to check // if there is a valid patch on the clipboard. This will be done in adjustToCurrentTarget() // so just set it to FILE now and, if there exists a patch on the clipboard, then clipboard @@ -693,6 +808,14 @@ import com.ibm.icu.text.MessageFormat; sourceNames= addToHistory(sourceNames, getPatchFilePath()); settings.put(STORE_PATCH_FILES_ID, sourceNames); + // update source URLs history + String[] sourceURLs= settings.getArray(STORE_PATCH_URLS_ID); + if (sourceURLs == null) + sourceURLs= new String[0]; + + sourceURLs= addToHistory(sourceURLs, fPatchURLField.getText()); + settings.put(STORE_PATCH_URLS_ID, sourceURLs); + // save the workspace selection settings.put(STORE_WORKSPACE_PATH_ID, getWorkspacePath()); @@ -712,12 +835,14 @@ import com.ibm.icu.text.MessageFormat; } // static helpers - + /** - * Checks to see if the file that has been selected for Apply Patch - * is actually a patch - * @return true if the file selected to run Apply Patch on in the workspace is a patch file - * or if the clipboard contains a patch + * Checks to see if the file that has been selected for Apply Patch is + * actually a patch + * + * @return true if the file selected to run Apply Patch on in the workspace + * is a patch file or if the clipboard contains a patch or if the + * clipboard contains an URL (we assume it points to a patch ) */ private boolean adjustToCurrentTarget() { // readjust selection if there is a patch selected in the workspace or on the clipboard @@ -757,16 +882,27 @@ import com.ibm.icu.text.MessageFormat; Reader reader = null; Control c = getControl(); if (c != null) { - Clipboard clipboard = new Clipboard(c.getDisplay()); - Object o = clipboard.getContents(TextTransfer.getInstance()); + Clipboard clipboard= new Clipboard(c.getDisplay()); + Object o= clipboard.getContents(TextTransfer.getInstance()); clipboard.dispose(); try { if (o instanceof String) { - reader = new StringReader((String) o); + reader= new StringReader((String) o); if (isPatchFile(reader)) { setInputButtonState(CLIPBOARD); return true; } + // maybe it's an URL + try { + URL url = new URL((String)o); + if(url != null) { + setInputButtonState(URL); + fPatchURLField.setText((String)o); + return true; + } + } catch (MalformedURLException e) { + // ignore + } } } finally { if (reader != null) { @@ -780,8 +916,6 @@ import com.ibm.icu.text.MessageFormat; } return false; } - - private boolean isPatchFile(Reader reader) { WorkspacePatcher patcher= ((PatchWizard) getWizard()).getPatcher(); @@ -811,24 +945,35 @@ import com.ibm.icu.text.MessageFormat; case CLIPBOARD: fUseClipboardButton.setSelection(true); fUsePatchFileButton.setSelection(false); + fUseURLButton.setSelection(false); fUseWorkspaceButton.setSelection(false); break; case FILE: fUseClipboardButton.setSelection(false); fUsePatchFileButton.setSelection(true); + fUseURLButton.setSelection(false); + fUseWorkspaceButton.setSelection(false); + break; + + case URL: + fUseClipboardButton.setSelection(false); + fUsePatchFileButton.setSelection(false); + fUseURLButton.setSelection(true); fUseWorkspaceButton.setSelection(false); break; case WORKSPACE: fUseClipboardButton.setSelection(false); fUsePatchFileButton.setSelection(false); + fUseURLButton.setSelection(false); fUseWorkspaceButton.setSelection(true); break; } setEnablePatchFile(state == FILE); setEnableWorkspacePatch(state == WORKSPACE); + setEnableURLPatch(state == URL); } protected int getInputMethod() { @@ -836,6 +981,8 @@ import com.ibm.icu.text.MessageFormat; return CLIPBOARD; if (fUsePatchFileButton.getSelection()) return FILE; + if(fUseURLButton.getSelection()) + return URL; return WORKSPACE; } diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.java index ff2241a22..6fde7b42a 100644 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.java +++ b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2008 IBM Corporation and others. + * Copyright (c) 2000, 2009 IBM Corporation and others. * 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 @@ -22,6 +22,10 @@ public final class PatchMessages extends NLS { public static String HunkMergePage_GenerateRejectFile; public static String HunkMergePage_Merged; + public static String InputPatchPage_MalformedURL; + public static String InputPatchPage_NoURL; + public static String InputPatchPage_URLButton_text; + public static String InputPatchPage_URL_title; public static String PatchCompareEditorInput_0; public static String PatcherCompareEditorInput_0; public static String PatcherCompareEditorInput_AfterPatch; @@ -58,6 +62,8 @@ public final class PatchMessages extends NLS { public static String InputPatchPage_WorkspacePatch_title; public static String InputPatchPage_NoDiffsFound_format; public static String InputPatchPage_SingleFileError_format; + public static String InputPatchPage_URLConnecting; + public static String InputPatchPage_URLFetchingContent; public static String PatchTargetPage_title; public static String PatchTargetPage_message; public static String PreviewPatchPage_title; diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.properties b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.properties index 29224b777..95ac4b8f2 100644 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.properties +++ b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.properties @@ -1,5 +1,5 @@ ############################################################################### -# Copyright (c) 2000, 2008 IBM Corporation and others. +# Copyright (c) 2000, 2009 IBM Corporation and others. # 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 @@ -31,11 +31,14 @@ PatcherCompareEditorInput_NotIncluded=(Not included) # InputPatchPage # InputPatchPage_title= Patch Input Specification +InputPatchPage_NoURL=Please enter an URL InputPatchPage_message= Select the patch location. InputPatchPage_Clipboard=Clipboard InputPatchPage_SelectInput=Apply the patch to the &selected file, folder or project: +InputPatchPage_MalformedURL=Malformed URL InputPatchPage_PatchErrorDialog_title=Patch Error InputPatchPage_FileButton_text=Fil&e +InputPatchPage_URLButton_text=&URL InputPatchPage_ChooseFileButton_text=&Browse... InputPatchPage_UseClipboardButton_text=&Clipboard InputPatchPage_UseWorkspaceButton_text=&Workspace @@ -53,9 +56,12 @@ InputPatchPage_PatchFileNotFound_message=Patch file not found. InputPatchPage_ParseError_message=Error while parsing patch InputPatchPage_Clipboard_title=Clipboard InputPatchPage_PatchFile_title=Patch file +InputPatchPage_URL_title=URL InputPatchPage_WorkspacePatch_title=Workspace file InputPatchPage_NoDiffsFound_format={0} does not contain valid patch. InputPatchPage_SingleFileError_format={0} contains multiple patches. You cannot apply them to a single file. +InputPatchPage_URLConnecting=Opening connection to the URL +InputPatchPage_URLFetchingContent=Fetching content from the URL # # PatchTargetPage # |