{"thread":{"id":"15223","subject":"[EGIT PATCH 0/6] Fetch UI, minor improvements/fixes","startedAt":"2008-08-27T18:41:40Z","lastAt":"2008-08-27T21:51:10Z","messageCount":10,"participants":["Marek Zawirski","Robin Rosenberg","Shawn O. Pearce"],"isPatch":true,"patchVersion":1,"patchTotal":6},"messages":[{"id":"88748","messageId":"1219862506-11075-1-git-send-email-marek.zawirski@gmail.com","threadId":"15223","inReplyTo":null,"subject":"[EGIT PATCH 0/6] Fetch UI, minor improvements/fixes","fromName":"Marek Zawirski","fromEmail":"marek.zawirski@gmail.com","sentAt":"2008-08-27T18:41:40Z","receivedAt":"2008-08-27T18:41:40Z","isPatch":true,"sender":{"key":"marek.zawirski@gmail.com","avatar":null},"body":"Simple fetch UI - made smiliar as push UI: no surprise, the same\ncomponents are used, code is analogous.\n\nWe can later decide to switch to some more complex result displaying\ncomponent, like common Transport View as suggested by Shawn. Anyway,\nnow we have working UI for push and fetch, and other signifficant\nchanges were introduced in both jgit and egit in the mean time...\nisn't that right time to release next version?\n\nOT(?): The only strange thing I observe now is how \"refresh\" resources\nworks in egit (master), but maybe I'll open new issues for that.\n\nMarek Zawirski (6):\n  Reduce PushOperationResult contructor visibility, accept null instead\n  Fix RefSpecPanel to not display mode column in fetch version\n  Handle null remoteName in RefSpecPanel better\n  Add tag fetching strategy selection to fetch version of RefSpecPage\n  Rename ResultDialog to PushResultDialog\n  Fetch GUI\n\n .../spearce/egit/core/op/PushOperationResult.java  |    2 +-\n org.spearce.egit.ui/plugin.properties              |    3 +\n org.spearce.egit.ui/plugin.xml                     |   15 ++\n .../src/org/spearce/egit/ui/UIText.java            |  102 ++++++++++\n .../egit/ui/internal/actions/FetchAction.java      |   51 +++++\n .../egit/ui/internal/components/RefSpecPage.java   |   70 ++++++-\n .../egit/ui/internal/components/RefSpecPanel.java  |   36 +++-\n .../FetchResultDialog.java}                        |   35 ++-\n .../egit/ui/internal/fetch/FetchResultTable.java   |  213 ++++++++++++++++++++\n .../egit/ui/internal/fetch/FetchWizard.java        |  189 +++++++++++++++++\n .../fetch/TrackingRefUpdateContentProvider.java    |   41 ++++\n .../egit/ui/internal/push/ConfirmationPage.java    |    2 +-\n .../{ResultDialog.java => PushResultDialog.java}   |    4 +-\n .../egit/ui/internal/push/PushResultTable.java     |    9 +-\n .../spearce/egit/ui/internal/push/PushWizard.java  |    5 +-\n .../ui/internal/push/RefUpdateContentProvider.java |    8 +-\n .../src/org/spearce/egit/ui/uitext.properties      |   38 ++++\n 17 files changed, 784 insertions(+), 39 deletions(-)\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/FetchAction.java\n copy org.spearce.egit.ui/src/org/spearce/egit/ui/internal/{push/ResultDialog.java => fetch/FetchResultDialog.java} (67%)\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/fetch/FetchResultTable.java\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/fetch/FetchWizard.java\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/fetch/TrackingRefUpdateContentProvider.java\n rename org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/{ResultDialog.java => PushResultDialog.java} (95%)\n"},{"id":"88749","messageId":"1219862506-11075-2-git-send-email-marek.zawirski@gmail.com","threadId":"15223","inReplyTo":"1219862506-11075-1-git-send-email-marek.zawirski@gmail.com","subject":"[EGIT PATCH 1/6] Reduce PushOperationResult contructor visibility, accept null instead","fromName":"Marek Zawirski","fromEmail":"marek.zawirski@gmail.com","sentAt":"2008-08-27T18:41:41Z","receivedAt":"2008-08-27T18:41:41Z","isPatch":true,"sender":{"key":"marek.zawirski@gmail.com","avatar":null},"body":"This constructor should be instantiated only by PushOperation.\n\nSome changes were needed in RefUpdateContentProvider (and related) - to\naccept null value instead of empty PushOperationResult.\n\nSigned-off-by: Marek Zawirski <marek.zawirski@gmail.com>\n---\n .../spearce/egit/core/op/PushOperationResult.java  |    2 +-\n .../egit/ui/internal/push/ConfirmationPage.java    |    2 +-\n .../egit/ui/internal/push/PushResultTable.java     |    9 +++++++--\n .../ui/internal/push/RefUpdateContentProvider.java |    8 ++++++--\n 4 files changed, 15 insertions(+), 6 deletions(-)\n\ndiff --git a/org.spearce.egit.core/src/org/spearce/egit/core/op/PushOperationResult.java b/org.spearce.egit.core/src/org/spearce/egit/core/op/PushOperationResult.java\nindex 6ffe998..e3a392d 100644\n--- a/org.spearce.egit.core/src/org/spearce/egit/core/op/PushOperationResult.java\n+++ b/org.spearce.egit.core/src/org/spearce/egit/core/op/PushOperationResult.java\n@@ -35,7 +35,7 @@\n \t/**\n \t * Construct empty push operation result.\n \t */\n-\tpublic PushOperationResult() {\n+\tPushOperationResult() {\n \t\tthis.urisEntries = new LinkedHashMap<URIish, Entry>();\n \t}\n \ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/ConfirmationPage.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/ConfirmationPage.java\nindex c8cdf29..08d21b3 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/ConfirmationPage.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/ConfirmationPage.java\n@@ -139,7 +139,7 @@ private void checkPreviousPagesSelections() {\n \n \tprivate void revalidate() {\n \t\t// always update this page\n-\t\tresultPanel.setData(local, new PushOperationResult());\n+\t\tresultPanel.setData(local, null);\n \t\tconfirmedResult = null;\n \t\tdisplayedRepoSelection = repoPage.getSelection();\n \t\tdisplayedRefSpecs = refSpecPage.getRefSpecs();\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/PushResultTable.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/PushResultTable.java\nindex 2cf2be4..c5e476b 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/PushResultTable.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/PushResultTable.java\n@@ -120,7 +120,7 @@ public int hashCode(Object element) {\n \t\t\t}\n \t\t});\n \t\ttableViewer.setContentProvider(new RefUpdateContentProvider());\n-\t\ttableViewer.setInput(new PushOperationResult());\n+\t\ttableViewer.setInput(null);\n \t}\n \n \tvoid setData(final Repository localDb, final PushOperationResult result) {\n@@ -128,7 +128,7 @@ void setData(final Repository localDb, final PushOperationResult result) {\n \t\tfor (final TableColumn tc : tableViewer.getTable().getColumns())\n \t\t\ttc.dispose();\n \t\t// Set empty result for a while.\n-\t\ttableViewer.setInput(new PushOperationResult());\n+\t\ttableViewer.setInput(null);\n \n \t\t// Layout should be recreated to work properly.\n \t\tfinal TableColumnLayout layout = new TableColumnLayout();\n@@ -171,6 +171,11 @@ public String getText(Object element) {\n \t\t\t}\n \t\t});\n \n+\t\tif (result == null) {\n+\t\t\ttablePanel.layout();\n+\t\t\treturn;\n+\t\t}\n+\n \t\tint i = 0;\n \t\tfor (final URIish uri : result.getURIs()) {\n \t\t\tfinal TableViewerColumn statusViewer = createColumn(layout, NLS\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/RefUpdateContentProvider.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/RefUpdateContentProvider.java\nindex 862fe59..884c9a3 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/RefUpdateContentProvider.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/RefUpdateContentProvider.java\n@@ -21,13 +21,17 @@\n  * Content provided for push result table viewer.\n  * <p>\n  * Input of this provided must be {@link PushOperationResult} instance, while\n- * returned elements are instances of {@link RefUpdateElement}.\n- *\n+ * returned elements are instances of {@link RefUpdateElement}. Null input is\n+ * allowed, resulting in no elements.\n+ * \n  * @see PushOperationResult\n  * @see RefUpdateElement\n  */\n class RefUpdateContentProvider implements IStructuredContentProvider {\n \tpublic Object[] getElements(final Object inputElement) {\n+\t\tif (inputElement == null)\n+\t\t\treturn new RefUpdateElement[0];\n+\n \t\tfinal PushOperationResult result = (PushOperationResult) inputElement;\n \n \t\tfinal SortedMap<String, String> dstToSrc = new TreeMap<String, String>();\n-- \n1.5.6.3\n"},{"id":"88753","messageId":"1219862506-11075-3-git-send-email-marek.zawirski@gmail.com","threadId":"15223","inReplyTo":"1219862506-11075-2-git-send-email-marek.zawirski@gmail.com","subject":"[EGIT PATCH 2/6] Fix RefSpecPanel to not display mode column in fetch version","fromName":"Marek Zawirski","fromEmail":"marek.zawirski@gmail.com","sentAt":"2008-08-27T18:41:42Z","receivedAt":"2008-08-27T18:41:42Z","isPatch":true,"sender":{"key":"marek.zawirski@gmail.com","avatar":null},"body":"\"Delete\" mode is valid only for push, we need only \"update/create\"\nmode for fetch, so there is no need to display this column here.\n\nSigned-off-by: Marek Zawirski <marek.zawirski@gmail.com>\n---\n .../egit/ui/internal/components/RefSpecPanel.java  |    6 ++++--\n 1 files changed, 4 insertions(+), 2 deletions(-)\n\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/components/RefSpecPanel.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/components/RefSpecPanel.java\nindex 34d37fd..de82480 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/components/RefSpecPanel.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/components/RefSpecPanel.java\n@@ -951,7 +951,8 @@ private void createTableColumns(final Composite tablePanel) {\n \t\ttablePanel.setLayout(columnLayout);\n \n \t\tcreateDummyColumn(columnLayout);\n-\t\tcreateModeColumn(columnLayout);\n+\t\tif (pushSpecs)\n+\t\t\tcreateModeColumn(columnLayout);\n \t\tcreateSrcColumn(columnLayout);\n \t\tcreateDstColumn(columnLayout);\n \t\tcreateForceColumn(columnLayout);\n@@ -1277,7 +1278,8 @@ private TableViewerColumn createColumn(\n \t}\n \n \tprivate void createCellEditors(final Table table) {\n-\t\tmodeCellEditor = new CheckboxCellEditor(table);\n+\t\tif (pushSpecs)\n+\t\t\tmodeCellEditor = new CheckboxCellEditor(table);\n \t\tlocalRefCellEditor = createLocalRefCellEditor(table);\n \t\tremoteRefCellEditor = createRemoteRefCellEditor(table);\n \t\tforceUpdateCellEditor = new CheckboxCellEditor(table);\n-- \n1.5.6.3\n"},{"id":"88750","messageId":"1219862506-11075-4-git-send-email-marek.zawirski@gmail.com","threadId":"15223","inReplyTo":"1219862506-11075-3-git-send-email-marek.zawirski@gmail.com","subject":"[EGIT PATCH 3/6] Handle null remoteName in RefSpecPanel better","fromName":"Marek Zawirski","fromEmail":"marek.zawirski@gmail.com","sentAt":"2008-08-27T18:41:43Z","receivedAt":"2008-08-27T18:41:43Z","isPatch":true,"sender":{"key":"marek.zawirski@gmail.com","avatar":null},"body":"Create more sensible \"all branches\" ref spec\n(refs/remotes/choose_remote_name/*), and don't use RemoteConfig\ncontructor with null remoteName value, as this behavior is unspecified.\n\nSigned-off-by: Marek Zawirski <marek.zawirski@gmail.com>\n---\n .../src/org/spearce/egit/ui/UIText.java            |    3 ++\n .../egit/ui/internal/components/RefSpecPanel.java  |   30 +++++++++++++------\n .../src/org/spearce/egit/ui/uitext.properties      |    1 +\n 3 files changed, 24 insertions(+), 10 deletions(-)\n\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/UIText.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/UIText.java\nindex b45d2e9..2bbe218 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/UIText.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/UIText.java\n@@ -182,6 +182,9 @@\n \tpublic static String RefSpecPanel_refChooseSomeWildcard;\n \n \t/** */\n+\tpublic static String RefSpecPanel_refChooseRemoteName;\n+\n+\t/** */\n \tpublic static String RefSpecPanel_clickToChange;\n \n \t/** */\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/components/RefSpecPanel.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/components/RefSpecPanel.java\nindex de82480..a2661ae 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/components/RefSpecPanel.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/components/RefSpecPanel.java\n@@ -413,14 +413,18 @@ public void setAssistanceData(final Repository localRepo,\n \t\t}\n \n \t\ttry {\n-\t\t\tfinal RemoteConfig rc = new RemoteConfig(localDb.getConfig(),\n-\t\t\t\t\tremoteName);\n-\t\t\tif (pushSpecs)\n-\t\t\t\tpredefinedConfigured = rc.getPushRefSpecs();\n-\t\t\telse\n-\t\t\t\tpredefinedConfigured = rc.getFetchRefSpecs();\n-\t\t\tfor (final RefSpec spec : predefinedConfigured)\n-\t\t\t\taddRefSpec(spec);\n+\t\t\tif (remoteName == null)\n+\t\t\t\tpredefinedConfigured = Collections.emptyList();\n+\t\t\telse {\n+\t\t\t\tfinal RemoteConfig rc = new RemoteConfig(localDb.getConfig(),\n+\t\t\t\t\t\tremoteName);\n+\t\t\t\tif (pushSpecs)\n+\t\t\t\t\tpredefinedConfigured = rc.getPushRefSpecs();\n+\t\t\t\telse\n+\t\t\t\t\tpredefinedConfigured = rc.getFetchRefSpecs();\n+\t\t\t\tfor (final RefSpec spec : predefinedConfigured)\n+\t\t\t\t\taddRefSpec(spec);\n+\t\t\t}\n \t\t} catch (URISyntaxException e) {\n \t\t\tpredefinedConfigured = null;\n \t\t\tErrorDialog.openError(panel.getShell(),\n@@ -432,9 +436,15 @@ public void setAssistanceData(final Repository localRepo,\n \t\tupdateAddPredefinedButton(addConfiguredButton, predefinedConfigured);\n \t\tif (pushSpecs)\n \t\t\tpredefinedBranches = Transport.REFSPEC_PUSH_ALL;\n-\t\telse\n+\t\telse {\n+\t\t\tfinal String r;\n+\t\t\tif (remoteName == null)\n+\t\t\t\tr = UIText.RefSpecPanel_refChooseRemoteName;\n+\t\t\telse\n+\t\t\t\tr = remoteName;\n \t\t\tpredefinedBranches = new RefSpec(\"refs/heads/*:refs/remotes/\" //$NON-NLS-1$\n-\t\t\t\t\t+ remoteName + \"/*\"); //$NON-NLS-1$\n+\t\t\t\t\t+ r + \"/*\"); //$NON-NLS-1$\n+\t\t}\n \t\tupdateAddPredefinedButton(addBranchesButton, predefinedBranches);\n \t\tsetEnable(true);\n \t}\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/uitext.properties b/org.spearce.egit.ui/src/org/spearce/egit/ui/uitext.properties\nindex 7fcc77b..c2b91f7 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/uitext.properties\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/uitext.properties\n@@ -116,6 +116,7 @@ RefSpecPanel_predefinedTagsDescription=Add specification covering all tags.\n RefSpecPanel_push=push\n RefSpecPanel_refChooseSome=choose/some/ref\n RefSpecPanel_refChooseSomeWildcard=choose/some/ref/*\n+RefSpecPanel_refChooseRemoteName=choose_remote_name\n RefSpecPanel_removeAll=Remove all specs\n RefSpecPanel_removeAllDescription=Remove all speficications.\n RefSpecPanel_removeDescription=Click to remove this specification.\n-- \n1.5.6.3\n"},{"id":"88754","messageId":"1219862506-11075-5-git-send-email-marek.zawirski@gmail.com","threadId":"15223","inReplyTo":"1219862506-11075-4-git-send-email-marek.zawirski@gmail.com","subject":"[EGIT PATCH 4/6] Add tag fetching strategy selection to fetch version of RefSpecPage","fromName":"Marek Zawirski","fromEmail":"marek.zawirski@gmail.com","sentAt":"2008-08-27T18:41:44Z","receivedAt":"2008-08-27T18:41:44Z","isPatch":true,"sender":{"key":"marek.zawirski@gmail.com","avatar":null},"body":"Tag strategy selection determines tagOpt for Transport, which should be\nunder user control for fetch operation. RefSpecPage seems to be the best\nplace for such setting.\n\nSigned-off-by: Marek Zawirski <marek.zawirski@gmail.com>\n---\n .../src/org/spearce/egit/ui/UIText.java            |   12 ++++\n .../egit/ui/internal/components/RefSpecPage.java   |   70 ++++++++++++++++++--\n .../src/org/spearce/egit/ui/uitext.properties      |    4 +\n 3 files changed, 81 insertions(+), 5 deletions(-)\n\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/UIText.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/UIText.java\nindex 2bbe218..ab70048 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/UIText.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/UIText.java\n@@ -386,6 +386,18 @@\n \tpublic static String RefSpecPage_titlePush;\n \n \t/** */\n+\tpublic static String RefSpecPage_annotatedTagsGroup;\n+\n+\t/** */\n+\tpublic static String RefSpecPage_annotatedTagsAutoFollow;\n+\n+\t/** */\n+\tpublic static String RefSpecPage_annotatedTagsFetchTags;\n+\n+\t/** */\n+\tpublic static String RefSpecPage_annotatedTagsNoTags;\n+\n+\t/** */\n \tpublic static String Decorator_failedLazyLoading;\n \n \t/** */\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/components/RefSpecPage.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/components/RefSpecPage.java\nindex 45a8505..586e5d9 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/components/RefSpecPage.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/components/RefSpecPage.java\n@@ -23,11 +23,13 @@\n import org.eclipse.swt.layout.GridLayout;\n import org.eclipse.swt.widgets.Button;\n import org.eclipse.swt.widgets.Composite;\n+import org.eclipse.swt.widgets.Group;\n import org.spearce.egit.core.op.ListRemoteOperation;\n import org.spearce.egit.ui.Activator;\n import org.spearce.egit.ui.UIText;\n import org.spearce.jgit.lib.Repository;\n import org.spearce.jgit.transport.RefSpec;\n+import org.spearce.jgit.transport.TagOpt;\n import org.spearce.jgit.transport.URIish;\n \n /**\n@@ -54,6 +56,12 @@\n \n \tprivate Button saveButton;\n \n+\tprivate Button tagsAutoFollowButton;\n+\n+\tprivate Button tagsFetchTagsButton;\n+\n+\tprivate Button tagsNoTagsButton;\n+\n \tprivate String transportError;\n \n \t/**\n@@ -106,14 +114,35 @@ public void selectionChanged() {\n \t\t\t}\n \t\t});\n \n-\t\tsaveButton = new Button(panel, SWT.CHECK);\n-\t\tsaveButton.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, true, false));\n-\t\tsaveButton.addSelectionListener(new SelectionAdapter() {\n+\t\tfinal SelectionAdapter changesNotifier = new SelectionAdapter() {\n \t\t\t@Override\n \t\t\tpublic void widgetSelected(SelectionEvent e) {\n \t\t\t\tnotifySelectionChanged();\n \t\t\t}\n-\t\t});\n+\t\t};\n+\t\tif (!pushPage) {\n+\t\t\tfinal Group tagsGroup = new Group(panel, SWT.NULL);\n+\t\t\ttagsGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,\n+\t\t\t\t\tfalse));\n+\t\t\ttagsGroup.setText(UIText.RefSpecPage_annotatedTagsGroup);\n+\t\t\ttagsGroup.setLayout(new GridLayout());\n+\t\t\ttagsAutoFollowButton = new Button(tagsGroup, SWT.RADIO);\n+\t\t\ttagsAutoFollowButton\n+\t\t\t\t\t.setText(UIText.RefSpecPage_annotatedTagsAutoFollow);\n+\t\t\ttagsFetchTagsButton = new Button(tagsGroup, SWT.RADIO);\n+\t\t\ttagsFetchTagsButton\n+\t\t\t\t\t.setText(UIText.RefSpecPage_annotatedTagsFetchTags);\n+\t\t\ttagsNoTagsButton = new Button(tagsGroup, SWT.RADIO);\n+\t\t\ttagsNoTagsButton\n+\t\t\t\t\t.setText(UIText.RefSpecPage_annotatedTagsNoTags);\n+\t\t\ttagsAutoFollowButton.addSelectionListener(changesNotifier);\n+\t\t\ttagsFetchTagsButton.addSelectionListener(changesNotifier);\n+\t\t\ttagsNoTagsButton.addSelectionListener(changesNotifier);\n+\t\t}\n+\n+\t\tsaveButton = new Button(panel, SWT.CHECK);\n+\t\tsaveButton.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, true, false));\n+\t\tsaveButton.addSelectionListener(changesNotifier);\n \n \t\tsetControl(panel);\n \t\tnotifySelectionChanged();\n@@ -147,6 +176,18 @@ public boolean isSaveRequested() {\n \t}\n \n \t/**\n+\t * @return selected tag fetching strategy. This result is relevant only for\n+\t *         fetch page.\n+\t */\n+\tpublic TagOpt getTagOpt() {\n+\t\tif (tagsAutoFollowButton.getSelection())\n+\t\t\treturn TagOpt.AUTO_FOLLOW;\n+\t\tif (tagsFetchTagsButton.getSelection())\n+\t\t\treturn TagOpt.FETCH_TAGS;\n+\t\treturn TagOpt.NO_TAGS;\n+\t}\n+\n+\t/**\n \t * Compare provided specifications to currently selected ones.\n \t *\n \t * @param specs\n@@ -206,12 +247,31 @@ private void revalidateImpl(final RepositorySelection newRepoSelection) {\n \t\tfinal String remoteName = validatedRepoSelection.getConfigName();\n \t\tspecsPanel.setAssistanceData(local, listRemotesOp.getRemoteRefs(),\n \t\t\t\tremoteName);\n+\n+\t\ttagsAutoFollowButton.setSelection(false);\n+\t\ttagsFetchTagsButton.setSelection(false);\n+\t\ttagsNoTagsButton.setSelection(false);\n+\n \t\tif (newRepoSelection.isConfigSelected()) {\n \t\t\tsaveButton.setVisible(true);\n \t\t\tsaveButton.setText(NLS.bind(UIText.RefSpecPage_saveSpecifications,\n \t\t\t\t\tremoteName));\n \t\t\tsaveButton.getParent().layout();\n-\t\t}\n+\t\t\tfinal TagOpt tagOpt = newRepoSelection.getConfig().getTagOpt();\n+\t\t\tswitch (tagOpt) {\n+\t\t\tcase AUTO_FOLLOW:\n+\t\t\t\ttagsAutoFollowButton.setSelection(true);\n+\t\t\t\tbreak;\n+\t\t\tcase FETCH_TAGS:\n+\t\t\t\ttagsFetchTagsButton.setSelection(true);\n+\t\t\t\tbreak;\n+\t\t\tcase NO_TAGS:\n+\t\t\t\ttagsNoTagsButton.setSelection(true);\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t} else\n+\t\t\ttagsAutoFollowButton.setSelection(true);\n+\n \t\tcheckPage();\n \t}\n \ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/uitext.properties b/org.spearce.egit.ui/src/org/spearce/egit/ui/uitext.properties\nindex c2b91f7..2349334 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/uitext.properties\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/uitext.properties\n@@ -147,6 +147,10 @@ RefSpecPage_operationCancelled=Operation cancelled.\n RefSpecPage_saveSpecifications=Save specifications in \"{0}\" configuration\n RefSpecPage_titleFetch=Fetch Ref Specifications\n RefSpecPage_titlePush=Push Ref Specifications\n+RefSpecPage_annotatedTagsGroup=Annotated tags fetching strategy\n+RefSpecPage_annotatedTagsAutoFollow=Automatically follow tags if we fetch the thing they point at\n+RefSpecPage_annotatedTagsFetchTags=Always fetch tags, even if we do not have the thing it points at\n+RefSpecPage_annotatedTagsNoTags=Never fetch tags, even if we have the thing it points at\n \n Decorator_failedLazyLoading=Resource decorator failed to load tree contents on demand.\n QuickDiff_failedLoading=Quick diff failed to obtain file data.\n-- \n1.5.6.3\n"},{"id":"88752","messageId":"1219862506-11075-6-git-send-email-marek.zawirski@gmail.com","threadId":"15223","inReplyTo":"1219862506-11075-5-git-send-email-marek.zawirski@gmail.com","subject":"[EGIT PATCH 5/6] Rename ResultDialog to PushResultDialog","fromName":"Marek Zawirski","fromEmail":"marek.zawirski@gmail.com","sentAt":"2008-08-27T18:41:45Z","receivedAt":"2008-08-27T18:41:45Z","isPatch":true,"sender":{"key":"marek.zawirski@gmail.com","avatar":null},"body":"Let's avoid ambiguity in UIText and other places when we also use\nFetchResultDialog.\n\nSigned-off-by: Marek Zawirski <marek.zawirski@gmail.com>\n---\n .../{ResultDialog.java => PushResultDialog.java}   |    4 ++--\n .../spearce/egit/ui/internal/push/PushWizard.java  |    5 +++--\n 2 files changed, 5 insertions(+), 4 deletions(-)\n rename org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/{ResultDialog.java => PushResultDialog.java} (95%)\n\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/ResultDialog.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/PushResultDialog.java\nsimilarity index 95%\nrename from org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/ResultDialog.java\nrename to org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/PushResultDialog.java\nindex 920494f..bace9ad 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/ResultDialog.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/PushResultDialog.java\n@@ -20,14 +20,14 @@\n import org.spearce.egit.ui.UIText;\n import org.spearce.jgit.lib.Repository;\n \n-class ResultDialog extends Dialog {\n+class PushResultDialog extends Dialog {\n \tprivate final Repository localDb;\n \n \tprivate final PushOperationResult result;\n \n \tprivate final String destinationString;\n \n-\tResultDialog(final Shell parentShell, final Repository localDb,\n+\tPushResultDialog(final Shell parentShell, final Repository localDb,\n \t\t\tfinal PushOperationResult result, final String destinationString) {\n \t\tsuper(parentShell);\n \t\tsetShellStyle(getShellStyle() | SWT.RESIZE);\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/PushWizard.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/PushWizard.java\nindex a5c6339..b2ef5ae 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/PushWizard.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/push/PushWizard.java\n@@ -238,8 +238,9 @@ protected IStatus run(final IProgressMonitor monitor) {\n \t\t\t\t\t\t\tpublic void run() {\n \t\t\t\t\t\t\t\tfinal Shell shell = PlatformUI.getWorkbench()\n \t\t\t\t\t\t\t\t\t\t.getActiveWorkbenchWindow().getShell();\n-\t\t\t\t\t\t\t\tfinal Dialog dialog = new ResultDialog(shell,\n-\t\t\t\t\t\t\t\t\t\tlocalDb, result, destinationString);\n+\t\t\t\t\t\t\t\tfinal Dialog dialog = new PushResultDialog(\n+\t\t\t\t\t\t\t\t\t\tshell, localDb, result,\n+\t\t\t\t\t\t\t\t\t\tdestinationString);\n \t\t\t\t\t\t\t\tdialog.open();\n \t\t\t\t\t\t\t}\n \t\t\t\t\t\t});\n-- \n1.5.6.3\n"},{"id":"88751","messageId":"1219862506-11075-7-git-send-email-marek.zawirski@gmail.com","threadId":"15223","inReplyTo":"1219862506-11075-6-git-send-email-marek.zawirski@gmail.com","subject":"[EGIT PATCH 6/6] Fetch GUI","fromName":"Marek Zawirski","fromEmail":"marek.zawirski@gmail.com","sentAt":"2008-08-27T18:41:46Z","receivedAt":"2008-08-27T18:41:46Z","isPatch":true,"sender":{"key":"marek.zawirski@gmail.com","avatar":null},"body":"Fetch GUI is currently implemented similarly to push GUI - it's a wizard\nconsisting of 2 pages:\n- repository seleciton page (configured remote or custom URI)\n- ref specs selection page (ref specs + tag options)\n\nBackground fetch job is started upon wizard finish. When operation\ncompletes, simple dialog with fetch results is displayed.\n\nSigned-off-by: Marek Zawirski <marek.zawirski@gmail.com>\n---\n org.spearce.egit.ui/plugin.properties              |    3 +\n org.spearce.egit.ui/plugin.xml                     |   15 ++\n .../src/org/spearce/egit/ui/UIText.java            |   87 ++++++++\n .../egit/ui/internal/actions/FetchAction.java      |   51 +++++\n .../egit/ui/internal/fetch/FetchResultDialog.java  |   76 +++++++\n .../egit/ui/internal/fetch/FetchResultTable.java   |  213 ++++++++++++++++++++\n .../egit/ui/internal/fetch/FetchWizard.java        |  189 +++++++++++++++++\n .../fetch/TrackingRefUpdateContentProvider.java    |   41 ++++\n .../src/org/spearce/egit/ui/uitext.properties      |   33 +++\n 9 files changed, 708 insertions(+), 0 deletions(-)\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/FetchAction.java\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/fetch/FetchResultDialog.java\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/fetch/FetchResultTable.java\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/fetch/FetchWizard.java\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/fetch/TrackingRefUpdateContentProvider.java\n\ndiff --git a/org.spearce.egit.ui/plugin.properties b/org.spearce.egit.ui/plugin.properties\nindex 8ac3474..da91e48 100644\n--- a/org.spearce.egit.ui/plugin.properties\n+++ b/org.spearce.egit.ui/plugin.properties\n@@ -41,6 +41,9 @@ ResetAction_tooltip=Reset the current branch to the same or another commit\n BranchAction_label=&Branch...\n BranchAction_tooltip=Switch to another branch\n \n+FetchAction_label=&Fetch From...\n+FetchAction_tooltip=Fetch from another repository\n+\n PushAction_label=&Push To...\n PushAction_tooltip=Push to another repository\n \ndiff --git a/org.spearce.egit.ui/plugin.xml b/org.spearce.egit.ui/plugin.xml\nindex 4012f19..55207eb 100644\n--- a/org.spearce.egit.ui/plugin.xml\n+++ b/org.spearce.egit.ui/plugin.xml\n@@ -40,6 +40,12 @@\n                id=\"org.spearce.egit.ui.internal.actions.Disconnect\">\n          </action>\n          <action\n+               class=\"org.spearce.egit.ui.internal.actions.FetchAction\"\n+               id=\"org.spearce.egit.ui.internal.actions.FetchAction\"\n+               label=\"%FetchAction_label\"\n+               menubarPath=\"team.main/projectGroup\"\n+               tooltip=\"%FetchAction_tooltip\"/>\n+         <action\n                class=\"org.spearce.egit.ui.internal.actions.PushAction\"\n                id=\"org.spearce.egit.ui.internal.actions.PushAction\"\n                label=\"%PushAction_label\"\n@@ -259,6 +265,15 @@\n         </separator>\n \t    </menu>\n \t\t<action\n+\t\t       class=\"org.spearce.egit.ui.internal.actions.FetchAction\"\n+\t\t       id=\"org.spearce.egit.ui.actionfetch\"\n+\t\t       label=\"%FetchAction_label\"\n+\t\t       style=\"push\"\n+\t\t       menubarPath=\"org.spearce.egit.ui.gitmenu/repo\"\n+\t\t       toolbarPath=\"org.spearce.egit.ui\"\n+\t\t       tooltip=\"%FetchAction_tooltip\">\n+\t\t</action>\n+\t\t<action\n \t\t       class=\"org.spearce.egit.ui.internal.actions.PushAction\"\n \t\t       id=\"org.spearce.egit.ui.actionpush\"\n \t\t       label=\"%PushAction_label\"\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/UIText.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/UIText.java\nindex ab70048..b2cb340 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/UIText.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/UIText.java\n@@ -614,6 +614,93 @@\n \tpublic static String ResultDialog_label;\n \n \t/** */\n+\tpublic static String FetchAction_wrongURITitle;\n+\n+\t/** */\n+\tpublic static String FetchAction_wrongURIMessage;\n+\n+\t/** */\n+\tpublic static String FetchResultDialog_labelEmptyResult;\n+\n+\t/** */\n+\tpublic static String FetchResultDialog_labelNonEmptyResult;\n+\n+\t/** */\n+\tpublic static String FetchResultDialog_title;\n+\n+\t/** */\n+\tpublic static String FetchResultTable_columnDst;\n+\n+\t/** */\n+\tpublic static String FetchResultTable_columnSrc;\n+\n+\t/** */\n+\tpublic static String FetchResultTable_columnStatus;\n+\n+\t/** */\n+\tpublic static String FetchResultTable_statusDetailCouldntLock;\n+\n+\t/** */\n+\tpublic static String FetchResultTable_statusDetailFastForward;\n+\n+\t/** */\n+\tpublic static String FetchResultTable_statusDetailIOError;\n+\n+\t/** */\n+\tpublic static String FetchResultTable_statusDetailNonFastForward;\n+\n+\t/** */\n+\tpublic static String FetchResultTable_statusIOError;\n+\n+\t/** */\n+\tpublic static String FetchResultTable_statusLockFailure;\n+\n+\t/** */\n+\tpublic static String FetchResultTable_statusNewBranch;\n+\n+\t/** */\n+\tpublic static String FetchResultTable_statusNew;\n+\n+\t/** */\n+\tpublic static String FetchResultTable_statusNewTag;\n+\n+\t/** */\n+\tpublic static String FetchResultTable_statusRejected;\n+\n+\t/** */\n+\tpublic static String FetchResultTable_statusUnexpected;\n+\n+\t/** */\n+\tpublic static String FetchResultTable_statusUpToDate;\n+\n+\t/** */\n+\tpublic static String FetchWizard_cantSaveMessage;\n+\n+\t/** */\n+\tpublic static String FetchWizard_cantSaveTitle;\n+\n+\t/** */\n+\tpublic static String FetchWizard_fetchNotSupported;\n+\n+\t/** */\n+\tpublic static String FetchWizard_jobName;\n+\n+\t/** */\n+\tpublic static String FetchWizard_transportError;\n+\n+\t/** */\n+\tpublic static String FetchWizard_transportNotSupportedMessage;\n+\n+\t/** */\n+\tpublic static String FetchWizard_transportNotSupportedTitle;\n+\n+\t/** */\n+\tpublic static String FetchWizard_windowTitleDefault;\n+\n+\t/** */\n+\tpublic static String FetchWizard_windowTitleWithSource;\n+\n+\t/** */\n \tpublic static String WindowCachePreferencePage_title;\n \n \t/** */\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/FetchAction.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/FetchAction.java\nnew file mode 100644\nindex 0000000..582cb46\n--- /dev/null\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/FetchAction.java\n@@ -0,0 +1,51 @@\n+/*******************************************************************************\n+ * Copyright (C) 2008, Marek Zawirski <marek.zawirski@gmail.com>\n+ *\n+ * All rights reserved. This program and the accompanying materials\n+ * are made available under the terms of the Eclipse Public License v1.0\n+ * See LICENSE for the full license text, also available.\n+ *******************************************************************************/\n+package org.spearce.egit.ui.internal.actions;\n+\n+import java.net.URISyntaxException;\n+\n+import org.eclipse.core.runtime.IStatus;\n+import org.eclipse.core.runtime.Status;\n+import org.eclipse.jface.action.IAction;\n+import org.eclipse.jface.dialogs.ErrorDialog;\n+import org.eclipse.jface.wizard.WizardDialog;\n+import org.spearce.egit.ui.Activator;\n+import org.spearce.egit.ui.UIText;\n+import org.spearce.egit.ui.internal.fetch.FetchWizard;\n+import org.spearce.jgit.lib.Repository;\n+\n+/**\n+ * Action for displaying fetch wizard - allowing selection of specifications for\n+ * fetch, and fetching objects/refs from another repository.\n+ */\n+public class FetchAction extends RepositoryAction {\n+\t@Override\n+\tpublic void run(IAction action) {\n+\t\tfinal Repository repository = getRepository(true);\n+\t\tif (repository == null)\n+\t\t\treturn;\n+\n+\t\tfinal FetchWizard fetchWizard;\n+\t\ttry {\n+\t\t\tfetchWizard = new FetchWizard(repository);\n+\t\t} catch (URISyntaxException x) {\n+\t\t\tErrorDialog.openError(getShell(), UIText.FetchAction_wrongURITitle,\n+\t\t\t\t\tUIText.FetchAction_wrongURIMessage, new Status(\n+\t\t\t\t\t\t\tIStatus.ERROR, Activator.getPluginId(), x\n+\t\t\t\t\t\t\t\t\t.getMessage(), x));\n+\t\t\treturn;\n+\t\t}\n+\t\tfinal WizardDialog dialog = new WizardDialog(getShell(), fetchWizard);\n+\t\tdialog.open();\n+\t}\n+\n+\t@Override\n+\tpublic boolean isEnabled() {\n+\t\treturn getRepository(false) != null;\n+\t}\n+}\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/fetch/FetchResultDialog.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/fetch/FetchResultDialog.java\nnew file mode 100644\nindex 0000000..4b52b8d\n--- /dev/null\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/fetch/FetchResultDialog.java\n@@ -0,0 +1,76 @@\n+/*******************************************************************************\n+ * Copyright (C) 2008, Marek Zawirski <marek.zawirski@gmail.com>\n+ *\n+ * All rights reserved. This program and the accompanying materials\n+ * are made available under the terms of the Eclipse Public License v1.0\n+ * See LICENSE for the full license text, also available.\n+ *******************************************************************************/\n+package org.spearce.egit.ui.internal.fetch;\n+\n+import org.eclipse.jface.dialogs.Dialog;\n+import org.eclipse.jface.dialogs.IDialogConstants;\n+import org.eclipse.osgi.util.NLS;\n+import org.eclipse.swt.SWT;\n+import org.eclipse.swt.layout.GridData;\n+import org.eclipse.swt.widgets.Composite;\n+import org.eclipse.swt.widgets.Control;\n+import org.eclipse.swt.widgets.Label;\n+import org.eclipse.swt.widgets.Shell;\n+import org.spearce.egit.ui.UIText;\n+import org.spearce.jgit.lib.Repository;\n+import org.spearce.jgit.transport.FetchResult;\n+\n+/**\n+ * Dialog displaying result of fetch operation.\n+ */\n+class FetchResultDialog extends Dialog {\n+\tprivate final Repository localDb;\n+\n+\tprivate final FetchResult result;\n+\n+\tprivate final String sourceString;\n+\n+\tFetchResultDialog(final Shell parentShell, final Repository localDb,\n+\t\t\tfinal FetchResult result, final String sourceString) {\n+\t\tsuper(parentShell);\n+\t\tsetShellStyle(getShellStyle() | SWT.RESIZE);\n+\t\tthis.localDb = localDb;\n+\t\tthis.result = result;\n+\t\tthis.sourceString = sourceString;\n+\t}\n+\n+\t@Override\n+\tprotected void createButtonsForButtonBar(final Composite parent) {\n+\t\tcreateButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,\n+\t\t\t\ttrue);\n+\t}\n+\n+\t@Override\n+\tprotected Control createDialogArea(final Composite parent) {\n+\t\tfinal Composite composite = (Composite) super.createDialogArea(parent);\n+\n+\t\tfinal Label label = new Label(composite, SWT.NONE);\n+\t\tfinal String text;\n+\t\tif (!result.getTrackingRefUpdates().isEmpty())\n+\t\t\ttext = NLS.bind(UIText.FetchResultDialog_labelNonEmptyResult,\n+\t\t\t\t\tsourceString);\n+\t\telse\n+\t\t\ttext = NLS.bind(UIText.FetchResultDialog_labelEmptyResult,\n+\t\t\t\t\tsourceString);\n+\t\tlabel.setText(text);\n+\t\tlabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));\n+\n+\t\tfinal FetchResultTable table = new FetchResultTable(composite);\n+\t\ttable.setData(localDb, result);\n+\t\tfinal Control tableControl = table.getControl();\n+\t\tfinal GridData tableLayout = new GridData(SWT.FILL, SWT.FILL, true,\n+\t\t\t\ttrue);\n+\t\ttableLayout.widthHint = 600;\n+\t\ttableLayout.heightHint = 300;\n+\t\ttableControl.setLayoutData(tableLayout);\n+\n+\t\tgetShell().setText(\n+\t\t\t\tNLS.bind(UIText.FetchResultDialog_title, sourceString));\n+\t\treturn composite;\n+\t}\n+}\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/fetch/FetchResultTable.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/fetch/FetchResultTable.java\nnew file mode 100644\nindex 0000000..868ca94\n--- /dev/null\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/fetch/FetchResultTable.java\n@@ -0,0 +1,213 @@\n+package org.spearce.egit.ui.internal.fetch;\n+\n+import org.eclipse.jface.layout.TableColumnLayout;\n+import org.eclipse.jface.resource.ColorRegistry;\n+import org.eclipse.jface.viewers.ColumnLabelProvider;\n+import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;\n+import org.eclipse.jface.viewers.ColumnWeightData;\n+import org.eclipse.jface.viewers.TableViewer;\n+import org.eclipse.jface.viewers.TableViewerColumn;\n+import org.eclipse.osgi.util.NLS;\n+import org.eclipse.swt.SWT;\n+import org.eclipse.swt.graphics.Color;\n+import org.eclipse.swt.graphics.RGB;\n+import org.eclipse.swt.layout.GridData;\n+import org.eclipse.swt.layout.GridLayout;\n+import org.eclipse.swt.widgets.Composite;\n+import org.eclipse.swt.widgets.Control;\n+import org.eclipse.swt.widgets.Table;\n+import org.eclipse.swt.widgets.TableColumn;\n+import org.spearce.egit.ui.UIText;\n+import org.spearce.jgit.lib.Constants;\n+import org.spearce.jgit.lib.RefUpdate;\n+import org.spearce.jgit.lib.Repository;\n+import org.spearce.jgit.lib.RefUpdate.Result;\n+import org.spearce.jgit.transport.FetchResult;\n+import org.spearce.jgit.transport.TrackingRefUpdate;\n+\n+/**\n+ * Component displaying table with results of fetch operation.\n+ */\n+class FetchResultTable {\n+\tprivate static final int TABLE_PREFERRED_HEIGHT = 600;\n+\n+\tprivate static final int TABLE_PREFERRED_WIDTH = 300;\n+\n+\tprivate static final int COLUMN_SRC_WEIGHT = 10;\n+\n+\tprivate static final int COLUMN_DST_WEIGHT = 10;\n+\n+\tprivate static final int COLUMN_STATUS_WEIGHT = 7;\n+\n+\tprivate static final String COLOR_REJECTED_KEY = \"REJECTED\"; //$NON-NLS-1$\n+\n+\tprivate static final RGB COLOR_REJECTED = new RGB(255, 0, 0);\n+\n+\tprivate static final String COLOR_UPDATED_KEY = \"UPDATED\"; //$NON-NLS-1$\n+\n+\tprivate static final RGB COLOR_UPDATED = new RGB(0, 255, 0);\n+\n+\tprivate static final String COLOR_UP_TO_DATE_KEY = \"UP_TO_DATE\"; //$NON-NLS-1$\n+\n+\tprivate static final RGB COLOR_UP_TO_DATE = new RGB(245, 245, 245);\n+\n+\tprivate final Composite tablePanel;\n+\n+\tprivate final TableViewer tableViewer;\n+\n+\tprivate final ColorRegistry colorRegistry;\n+\n+\tprivate Repository db;\n+\n+\tFetchResultTable(final Composite parent) {\n+\t\ttablePanel = new Composite(parent, SWT.NONE);\n+\t\ttablePanel.setLayout(new GridLayout());\n+\t\tfinal GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true);\n+\t\tlayoutData.heightHint = TABLE_PREFERRED_HEIGHT;\n+\t\tlayoutData.widthHint = TABLE_PREFERRED_WIDTH;\n+\t\ttableViewer = new TableViewer(tablePanel);\n+\t\tColumnViewerToolTipSupport.enableFor(tableViewer);\n+\t\tfinal Table table = tableViewer.getTable();\n+\t\ttable.setLinesVisible(true);\n+\t\ttable.setHeaderVisible(true);\n+\n+\t\tcolorRegistry = new ColorRegistry(table.getDisplay());\n+\t\tcolorRegistry.put(COLOR_REJECTED_KEY, COLOR_REJECTED);\n+\t\tcolorRegistry.put(COLOR_UPDATED_KEY, COLOR_UPDATED);\n+\t\tcolorRegistry.put(COLOR_UP_TO_DATE_KEY, COLOR_UP_TO_DATE);\n+\n+\t\ttableViewer.setContentProvider(new TrackingRefUpdateContentProvider());\n+\t\ttableViewer.setInput(null);\n+\n+\t\tcreateTableColumns();\n+\t}\n+\n+\tvoid setData(final Repository db, final FetchResult fetchResult) {\n+\t\ttableViewer.setInput(null);\n+\t\tthis.db = db;\n+\t\ttableViewer.setInput(fetchResult);\n+\t}\n+\n+\tControl getControl() {\n+\t\treturn tablePanel;\n+\t}\n+\n+\tprivate void createTableColumns() {\n+\t\tfinal TableColumnLayout layout = new TableColumnLayout();\n+\t\ttablePanel.setLayout(layout);\n+\n+\t\tfinal TableViewerColumn srcViewer = createColumn(layout,\n+\t\t\t\tUIText.FetchResultTable_columnSrc, COLUMN_SRC_WEIGHT, SWT.LEFT);\n+\t\tsrcViewer.setLabelProvider(new ColumnLabelProvider() {\n+\t\t\t@Override\n+\t\t\tpublic String getText(Object element) {\n+\t\t\t\treturn ((TrackingRefUpdate) element).getRemoteName();\n+\t\t\t}\n+\t\t});\n+\n+\t\tfinal TableViewerColumn dstViewer = createColumn(layout,\n+\t\t\t\tUIText.FetchResultTable_columnDst, COLUMN_DST_WEIGHT, SWT.LEFT);\n+\t\tdstViewer.setLabelProvider(new ColumnLabelProvider() {\n+\t\t\t@Override\n+\t\t\tpublic String getText(Object element) {\n+\t\t\t\treturn ((TrackingRefUpdate) element).getLocalName();\n+\t\t\t}\n+\t\t});\n+\n+\t\tfinal TableViewerColumn statusViewer = createColumn(layout,\n+\t\t\t\tUIText.FetchResultTable_columnStatus, COLUMN_STATUS_WEIGHT,\n+\t\t\t\tSWT.LEFT);\n+\t\tstatusViewer.setLabelProvider(new ColumnLabelProvider() {\n+\t\t\t@Override\n+\t\t\tpublic String getText(final Object element) {\n+\t\t\t\tfinal TrackingRefUpdate tru = (TrackingRefUpdate) element;\n+\t\t\t\tfinal RefUpdate.Result r = tru.getResult();\n+\t\t\t\tif (r == RefUpdate.Result.LOCK_FAILURE)\n+\t\t\t\t\treturn UIText.FetchResultTable_statusLockFailure;\n+\n+\t\t\t\tif (r == RefUpdate.Result.IO_FAILURE)\n+\t\t\t\t\treturn UIText.FetchResultTable_statusIOError;\n+\n+\t\t\t\tif (r == RefUpdate.Result.NEW) {\n+\t\t\t\t\tif (tru.getRemoteName().startsWith(Constants.R_HEADS))\n+\t\t\t\t\t\treturn UIText.FetchResultTable_statusNewBranch;\n+\t\t\t\t\telse if (tru.getLocalName().startsWith(Constants.R_TAGS))\n+\t\t\t\t\t\treturn UIText.FetchResultTable_statusNewTag;\n+\t\t\t\t\treturn UIText.FetchResultTable_statusNew;\n+\t\t\t\t}\n+\n+\t\t\t\tif (r == RefUpdate.Result.FORCED) {\n+\t\t\t\t\tfinal String aOld = tru.getOldObjectId().abbreviate(db);\n+\t\t\t\t\tfinal String aNew = tru.getNewObjectId().abbreviate(db);\n+\t\t\t\t\treturn aOld + \"...\" + aNew; //$NON-NLS-1$\n+\t\t\t\t}\n+\n+\t\t\t\tif (r == RefUpdate.Result.FAST_FORWARD) {\n+\t\t\t\t\tfinal String aOld = tru.getOldObjectId().abbreviate(db);\n+\t\t\t\t\tfinal String aNew = tru.getNewObjectId().abbreviate(db);\n+\t\t\t\t\treturn aOld + \"..\" + aNew; //$NON-NLS-1$\n+\t\t\t\t}\n+\n+\t\t\t\tif (r == RefUpdate.Result.REJECTED)\n+\t\t\t\t\treturn UIText.FetchResultTable_statusRejected;\n+\t\t\t\tif (r == RefUpdate.Result.NO_CHANGE)\n+\t\t\t\t\treturn UIText.FetchResultTable_statusUpToDate;\n+\t\t\t\tthrow new IllegalArgumentException(NLS.bind(\n+\t\t\t\t\t\tUIText.FetchResultTable_statusUnexpected, r));\n+\t\t\t}\n+\n+\t\t\t@Override\n+\t\t\tpublic String getToolTipText(final Object element) {\n+\t\t\t\tfinal Result result = ((TrackingRefUpdate) element).getResult();\n+\t\t\t\tswitch (result) {\n+\t\t\t\tcase FAST_FORWARD:\n+\t\t\t\t\treturn UIText.FetchResultTable_statusDetailFastForward;\n+\t\t\t\tcase FORCED:\n+\t\t\t\tcase REJECTED:\n+\t\t\t\t\treturn UIText.FetchResultTable_statusDetailNonFastForward;\n+\t\t\t\tcase NEW:\n+\t\t\t\tcase NO_CHANGE:\n+\t\t\t\t\treturn null;\n+\t\t\t\tcase IO_FAILURE:\n+\t\t\t\t\treturn UIText.FetchResultTable_statusDetailIOError;\n+\t\t\t\tcase LOCK_FAILURE:\n+\t\t\t\t\treturn UIText.FetchResultTable_statusDetailCouldntLock;\n+\t\t\t\tdefault:\n+\t\t\t\t\tthrow new IllegalArgumentException(NLS.bind(\n+\t\t\t\t\t\t\tUIText.FetchResultTable_statusUnexpected, result));\n+\t\t\t\t}\n+\t\t\t}\n+\n+\t\t\t@Override\n+\t\t\tpublic Color getBackground(final Object element) {\n+\t\t\t\tfinal Result result = ((TrackingRefUpdate) element).getResult();\n+\t\t\t\tswitch (result) {\n+\t\t\t\tcase FAST_FORWARD:\n+\t\t\t\tcase FORCED:\n+\t\t\t\tcase NEW:\n+\t\t\t\t\treturn colorRegistry.get(COLOR_UPDATED_KEY);\n+\t\t\t\tcase NO_CHANGE:\n+\t\t\t\t\treturn colorRegistry.get(COLOR_UP_TO_DATE_KEY);\n+\t\t\t\tcase IO_FAILURE:\n+\t\t\t\tcase LOCK_FAILURE:\n+\t\t\t\tcase REJECTED:\n+\t\t\t\t\treturn colorRegistry.get(COLOR_REJECTED_KEY);\n+\t\t\t\tdefault:\n+\t\t\t\t\tthrow new IllegalArgumentException(NLS.bind(\n+\t\t\t\t\t\t\tUIText.FetchResultTable_statusUnexpected, result));\n+\t\t\t\t}\n+\t\t\t}\n+\t\t});\n+\t}\n+\n+\tprivate TableViewerColumn createColumn(\n+\t\t\tfinal TableColumnLayout columnLayout, final String text,\n+\t\t\tfinal int weight, final int style) {\n+\t\tfinal TableViewerColumn viewerColumn = new TableViewerColumn(\n+\t\t\t\ttableViewer, style);\n+\t\tfinal TableColumn column = viewerColumn.getColumn();\n+\t\tcolumn.setText(text);\n+\t\tcolumnLayout.setColumnData(column, new ColumnWeightData(weight));\n+\t\treturn viewerColumn;\n+\t}\n+}\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/fetch/FetchWizard.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/fetch/FetchWizard.java\nnew file mode 100644\nindex 0000000..db383cf\n--- /dev/null\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/fetch/FetchWizard.java\n@@ -0,0 +1,189 @@\n+/*******************************************************************************\n+ * Copyright (C) 2008, Marek Zawirski <marek.zawirski@gmail.com>\n+ *\n+ * All rights reserved. This program and the accompanying materials\n+ * are made available under the terms of the Eclipse Public License v1.0\n+ * See LICENSE for the full license text, also available.\n+ *******************************************************************************/\n+package org.spearce.egit.ui.internal.fetch;\n+\n+import java.io.IOException;\n+import java.net.URISyntaxException;\n+import java.util.List;\n+\n+import org.eclipse.core.runtime.IProgressMonitor;\n+import org.eclipse.core.runtime.IStatus;\n+import org.eclipse.core.runtime.NullProgressMonitor;\n+import org.eclipse.core.runtime.Status;\n+import org.eclipse.core.runtime.jobs.Job;\n+import org.eclipse.jface.dialogs.Dialog;\n+import org.eclipse.jface.dialogs.ErrorDialog;\n+import org.eclipse.jface.wizard.IWizardPage;\n+import org.eclipse.jface.wizard.Wizard;\n+import org.eclipse.osgi.util.NLS;\n+import org.eclipse.swt.widgets.Shell;\n+import org.eclipse.ui.PlatformUI;\n+import org.spearce.egit.core.EclipseGitProgressTransformer;\n+import org.spearce.egit.ui.Activator;\n+import org.spearce.egit.ui.UIIcons;\n+import org.spearce.egit.ui.UIText;\n+import org.spearce.egit.ui.internal.components.RefSpecPage;\n+import org.spearce.egit.ui.internal.components.RepositorySelection;\n+import org.spearce.egit.ui.internal.components.RepositorySelectionPage;\n+import org.spearce.jgit.errors.NotSupportedException;\n+import org.spearce.jgit.errors.TransportException;\n+import org.spearce.jgit.lib.Repository;\n+import org.spearce.jgit.lib.RepositoryConfig;\n+import org.spearce.jgit.transport.FetchResult;\n+import org.spearce.jgit.transport.RefSpec;\n+import org.spearce.jgit.transport.RemoteConfig;\n+import org.spearce.jgit.transport.Transport;\n+\n+/**\n+ * Wizard allowing user to specify all needed data to fetch from another\n+ * repository - including selection of remote repository, ref specifications,\n+ * annotated tags fetching strategy.\n+ * <p>\n+ * Fetch operation is performed upon successful completion of this wizard.\n+ */\n+public class FetchWizard extends Wizard {\n+\tprivate final Repository localDb;\n+\n+\tprivate final RepositorySelectionPage repoPage;\n+\n+\tprivate final RefSpecPage refSpecPage;\n+\n+\t/**\n+\t * Create wizard for provided local repository.\n+\t * \n+\t * @param localDb\n+\t *            local repository to fetch to.\n+\t * @throws URISyntaxException\n+\t *             when configuration of this repository contains illegal URIs.\n+\t */\n+\tpublic FetchWizard(final Repository localDb) throws URISyntaxException {\n+\t\tthis.localDb = localDb;\n+\t\tfinal List<RemoteConfig> remotes = RemoteConfig\n+\t\t\t\t.getAllRemoteConfigs(localDb.getConfig());\n+\t\trepoPage = new RepositorySelectionPage(true, remotes);\n+\t\trefSpecPage = new RefSpecPage(localDb, false, repoPage);\n+\t\t// TODO use/create another cool icon\n+\t\tsetDefaultPageImageDescriptor(UIIcons.WIZBAN_IMPORT_REPO);\n+\t\tsetNeedsProgressMonitor(true);\n+\t}\n+\n+\t@Override\n+\tpublic void addPages() {\n+\t\taddPage(repoPage);\n+\t\taddPage(refSpecPage);\n+\t}\n+\n+\t@Override\n+\tpublic boolean performFinish() {\n+\t\tif (repoPage.getSelection().isConfigSelected()\n+\t\t\t\t&& refSpecPage.isSaveRequested())\n+\t\t\tsaveConfig();\n+\n+\t\tfinal Transport transport;\n+\t\tfinal RepositorySelection repoSelection = repoPage.getSelection();\n+\t\ttry {\n+\t\t\tif (repoSelection.isConfigSelected())\n+\t\t\t\ttransport = Transport.open(localDb, repoSelection.getConfig());\n+\t\t\telse\n+\t\t\t\ttransport = Transport.open(localDb, repoSelection.getURI());\n+\t\t} catch (final NotSupportedException e) {\n+\t\t\tErrorDialog.openError(getShell(),\n+\t\t\t\t\tUIText.FetchWizard_transportNotSupportedTitle,\n+\t\t\t\t\tUIText.FetchWizard_transportNotSupportedMessage,\n+\t\t\t\t\tnew Status(IStatus.ERROR, org.spearce.egit.ui.Activator\n+\t\t\t\t\t\t\t.getPluginId(), e.getMessage(), e));\n+\t\t\treturn false;\n+\t\t}\n+\t\ttransport.setTagOpt(refSpecPage.getTagOpt());\n+\n+\t\tfinal Job fetchJob = new FetchJob(transport, refSpecPage.getRefSpecs(),\n+\t\t\t\tgetSourceString());\n+\t\tfetchJob.setUser(true);\n+\t\tfetchJob.schedule();\n+\t\treturn true;\n+\t}\n+\n+\t@Override\n+\tpublic String getWindowTitle() {\n+\t\tfinal IWizardPage currentPage = getContainer().getCurrentPage();\n+\t\tif (currentPage == repoPage || currentPage == null)\n+\t\t\treturn UIText.FetchWizard_windowTitleDefault;\n+\t\treturn NLS.bind(UIText.FetchWizard_windowTitleWithSource,\n+\t\t\t\tgetSourceString());\n+\t}\n+\n+\tprivate void saveConfig() {\n+\t\tfinal RemoteConfig rc = repoPage.getSelection().getConfig();\n+\t\trc.setFetchRefSpecs(refSpecPage.getRefSpecs());\n+\t\trc.setTagOpt(refSpecPage.getTagOpt());\n+\t\tfinal RepositoryConfig config = localDb.getConfig();\n+\t\trc.update(config);\n+\t\ttry {\n+\t\t\tconfig.save();\n+\t\t} catch (final IOException e) {\n+\t\t\tErrorDialog.openError(getShell(), UIText.FetchWizard_cantSaveTitle,\n+\t\t\t\t\tUIText.FetchWizard_cantSaveMessage, new Status(\n+\t\t\t\t\t\t\tIStatus.WARNING, Activator.getPluginId(), e\n+\t\t\t\t\t\t\t\t\t.getMessage(), e));\n+\t\t\t// Continue, it's not critical.\n+\t\t}\n+\t}\n+\n+\tprivate String getSourceString() {\n+\t\tfinal RepositorySelection repoSelection = repoPage.getSelection();\n+\t\tif (repoSelection.isConfigSelected())\n+\t\t\treturn repoSelection.getConfigName();\n+\t\treturn repoSelection.getURI().toString();\n+\t}\n+\n+\tprivate class FetchJob extends Job {\n+\t\tprivate final Transport transport;\n+\n+\t\tprivate final List<RefSpec> refSpecs;\n+\n+\t\tprivate final String sourceString;\n+\n+\t\tpublic FetchJob(final Transport transport,\n+\t\t\t\tfinal List<RefSpec> refSpecs, final String sourceString) {\n+\t\t\tsuper(NLS.bind(UIText.FetchWizard_jobName, sourceString));\n+\t\t\tthis.transport = transport;\n+\t\t\tthis.refSpecs = refSpecs;\n+\t\t\tthis.sourceString = sourceString;\n+\t\t}\n+\n+\t\t@Override\n+\t\tprotected IStatus run(IProgressMonitor monitor) {\n+\t\t\tif (monitor == null)\n+\t\t\t\tmonitor = new NullProgressMonitor();\n+\t\t\tfinal FetchResult result;\n+\t\t\ttry {\n+\t\t\t\tresult = transport.fetch(new EclipseGitProgressTransformer(\n+\t\t\t\t\t\tmonitor), refSpecs);\n+\t\t\t} catch (final NotSupportedException e) {\n+\t\t\t\treturn new Status(IStatus.ERROR, Activator.getPluginId(),\n+\t\t\t\t\t\tUIText.FetchWizard_fetchNotSupported, e);\n+\t\t\t} catch (final TransportException e) {\n+\t\t\t\tif (monitor.isCanceled())\n+\t\t\t\t\treturn Status.CANCEL_STATUS;\n+\t\t\t\treturn new Status(IStatus.ERROR, Activator.getPluginId(),\n+\t\t\t\t\t\tUIText.FetchWizard_transportError, e);\n+\t\t\t}\n+\n+\t\t\tPlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {\n+\t\t\t\tpublic void run() {\n+\t\t\t\t\tfinal Shell shell = PlatformUI.getWorkbench()\n+\t\t\t\t\t\t\t.getActiveWorkbenchWindow().getShell();\n+\t\t\t\t\tfinal Dialog dialog = new FetchResultDialog(shell, localDb,\n+\t\t\t\t\t\t\tresult, sourceString);\n+\t\t\t\t\tdialog.open();\n+\t\t\t\t}\n+\t\t\t});\n+\t\t\treturn Status.OK_STATUS;\n+\t\t}\n+\t}\n+}\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/fetch/TrackingRefUpdateContentProvider.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/fetch/TrackingRefUpdateContentProvider.java\nnew file mode 100644\nindex 0000000..35d37d0\n--- /dev/null\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/fetch/TrackingRefUpdateContentProvider.java\n@@ -0,0 +1,41 @@\n+/*******************************************************************************\n+ * Copyright (C) 2008, Marek Zawirski <marek.zawirski@gmail.com>\n+ *\n+ * All rights reserved. This program and the accompanying materials\n+ * are made available under the terms of the Eclipse Public License v1.0\n+ * See LICENSE for the full license text, also available.\n+ *******************************************************************************/\n+package org.spearce.egit.ui.internal.fetch;\n+\n+import org.eclipse.jface.viewers.IStructuredContentProvider;\n+import org.eclipse.jface.viewers.Viewer;\n+import org.spearce.jgit.transport.FetchResult;\n+import org.spearce.jgit.transport.TrackingRefUpdate;\n+\n+/**\n+ * Content provided for fetch result table viewer.\n+ * <p>\n+ * Input of this provided must be {@link FetchResult} instance, while returned\n+ * elements are instances of {@link TrackingRefUpdate}. Input may be null (no\n+ * elements).\n+ * \n+ * @see FetchResult\n+ * @see TrackingRefUpdate\n+ */\n+class TrackingRefUpdateContentProvider implements IStructuredContentProvider {\n+\tpublic Object[] getElements(final Object inputElement) {\n+\t\tif (inputElement == null)\n+\t\t\treturn new TrackingRefUpdate[0];\n+\n+\t\tfinal FetchResult result = (FetchResult) inputElement;\n+\t\treturn result.getTrackingRefUpdates().toArray(new TrackingRefUpdate[0]);\n+\t}\n+\n+\tpublic void dispose() {\n+\t\t// nothing to do\n+\t}\n+\n+\tpublic void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\n+\t\t// nothing to do\n+\t}\n+}\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/uitext.properties b/org.spearce.egit.ui/src/org/spearce/egit/ui/uitext.properties\nindex 2349334..0590e30 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/uitext.properties\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/uitext.properties\n@@ -234,6 +234,39 @@ PushResultTable_statusOkNewTag=[new tag]\n ResultDialog_title=Push Results: {0}\n ResultDialog_label=Pushed to {0}.\n \n+FetchAction_wrongURITitle=Corrupted Configuration\n+FetchAction_wrongURIMessage=Remote repositories URIs configuration is corrupted.\n+\n+FetchResultDialog_labelEmptyResult=No ref to fetch from {0} - everything up to date.\n+FetchResultDialog_labelNonEmptyResult=Fetched from {0}.\n+FetchResultDialog_title=Fetch Results: {0}\n+\n+FetchResultTable_columnDst=Destination Ref\n+FetchResultTable_columnSrc=Source Ref\n+FetchResultTable_columnStatus=Status\n+FetchResultTable_statusDetailCouldntLock=couldn't lock local tracking ref for update\n+FetchResultTable_statusDetailFastForward=fast forward\n+FetchResultTable_statusDetailIOError=I/O error occurred during local tracking ref update\n+FetchResultTable_statusDetailNonFastForward=non-fast forward\n+FetchResultTable_statusIOError=[i/o error]\n+FetchResultTable_statusLockFailure=[lock fail]\n+FetchResultTable_statusNew=[new]\n+FetchResultTable_statusNewBranch=[new branch]\n+FetchResultTable_statusNewTag=[new tag]\n+FetchResultTable_statusRejected=[rejected]\n+FetchResultTable_statusUnexpected=Unexpected update status: {0}\n+FetchResultTable_statusUpToDate=[up to date]\n+\n+FetchWizard_cantSaveMessage=Couldn't save specified specifications in configuration file.\n+FetchWizard_cantSaveTitle=Configuration Storage Warning\n+FetchWizard_fetchNotSupported=Fetch operation is not supported by this transport.\n+FetchWizard_jobName=Fetching from: {0}\n+FetchWizard_transportError=Transport error occured during fetch operation.\n+FetchWizard_transportNotSupportedMessage=Selected URI is not supported by any transport implementation.\n+FetchWizard_transportNotSupportedTitle=Transport Not Supported\n+FetchWizard_windowTitleDefault=Fetch From Another Repository\n+FetchWizard_windowTitleWithSource=Fetch From: {0}\n+\n WindowCachePreferencePage_title=Git Window Cache\n WindowCachePreferencePage_packedGitWindowSize=Window size:\n WindowCachePreferencePage_packedGitLimit=Window cache limit:\n-- \n1.5.6.3\n"},{"id":"88765","messageId":"200808272148.02345.robin.rosenberg.lists@dewire.com","threadId":"15223","inReplyTo":"1219862506-11075-1-git-send-email-marek.zawirski@gmail.com","subject":"Re: [EGIT PATCH 0/6] Fetch UI, minor improvements/fixes","fromName":"Robin Rosenberg","fromEmail":"robin.rosenberg.lists@dewire.com","sentAt":"2008-08-27T19:48:02Z","receivedAt":"2008-08-27T19:48:02Z","isPatch":true,"sender":{"key":"robin.rosenberg@dewire.com","avatar":"https://avatars.githubusercontent.com/u/46357?v=4"},"body":"onsdagen den 27 augusti 2008 20.41.40 skrev Marek Zawirski:\n> Simple fetch UI - made smiliar as push UI: no surprise, the same\n> components are used, code is analogous.\n> \n> We can later decide to switch to some more complex result displaying\n> component, like common Transport View as suggested by Shawn. Anyway,\n> now we have working UI for push and fetch, and other signifficant\n> changes were introduced in both jgit and egit in the mean \n> isn't that right time to release next version?\n\nIndeed, this is the missing piece for a coherent version.  I'll have yet to\nreview the stuff, but I have great confidence in your work.\n> \n> OT(?): The only strange thing I observe now is how \"refresh\" resources\n> works in egit (master), but maybe I'll open new issues for that.\n\nWe might have bugs there.... Or actually, I *know* we have bugs including\nlockups. But I can consider bumping the version anyway by next weekend, since\nautomatic refresh can be disabled. That'll leave us some time for things to cook.\n\n-- robin\n"},{"id":"88770","messageId":"48B5B47D.2000004@gmail.com","threadId":"15223","inReplyTo":"200808272148.02345.robin.rosenberg.lists@dewire.com","subject":"Re: [EGIT PATCH 0/6] Fetch UI, minor improvements/fixes","fromName":"Marek Zawirski","fromEmail":"marek.zawirski@gmail.com","sentAt":"2008-08-27T20:09:33Z","receivedAt":"2008-08-27T20:09:33Z","isPatch":true,"sender":{"key":"marek.zawirski@gmail.com","avatar":null},"body":"Robin Rosenberg wrote:\n> onsdagen den 27 augusti 2008 20.41.40 skrev Marek Zawirski:\n(...)\n>> isn't that right time to release next version?\n> \n> Indeed, this is the missing piece for a coherent version.  I'll have yet to\n> review the stuff, but I have great confidence in your work.\n\nSure, I even wouldn't like to have my code accepted without your review:)\n\n>> OT(?): The only strange thing I observe now is how \"refresh\" resources\n>> works in egit (master), but maybe I'll open new issues for that.\n> \n> We might have bugs there.... Or actually, I *know* we have bugs including\n> lockups. But I can consider bumping the version anyway by next weekend, since\n> automatic refresh can be disabled. That'll leave us some time for things to cook.\n\nI also encountered issues with locking workspace one day, but I actually \nmeant something different.\nSee http://code.google.com/p/egit/issues/detail?id=14\n\nBTW, is it possible at code gooogle to receive e-mail notifications \nabout new issues?\n-- \nMarek Zawirski [zawir]\nmarek.zawirski@gmail.com\n"},{"id":"88793","messageId":"20080827215110.GO26523@spearce.org","threadId":"15223","inReplyTo":"48B5B47D.2000004@gmail.com","subject":"Re: [EGIT PATCH 0/6] Fetch UI, minor improvements/fixes","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-08-27T21:51:10Z","receivedAt":"2008-08-27T21:51:10Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Marek Zawirski <marek.zawirski@gmail.com> wrote:\n> BTW, is it possible at code gooogle to receive e-mail notifications  \n> about new issues?\n\nIt send updates out to the owner of the issue.  It also sends them\nif you CC people.  Otherwise it doesn't send stuff out.  E.g. I\ndid not get email for issue 15 \"Allow user to fetch from/push to\npreconfigured remote from menu\" or issue 16 \"Push to read-only\nrepository produce cryptic error message\".\n\n-- \nShawn.\n"}]}