Remove System.out.println from RevWalkFilterTest
[jgit.git] / org.spearce.egit.ui / src / org / spearce / egit / ui / internal / push / ConfirmationPage.java
blob6e925a741d3133ced3048dad464ba3511e070169
1 /*******************************************************************************
2 * Copyright (C) 2008, Marek Zawirski <marek.zawirski@gmail.com>
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * See LICENSE for the full license text, also available.
7 *******************************************************************************/
8 package org.spearce.egit.ui.internal.push;
10 import java.io.IOException;
11 import java.lang.reflect.InvocationTargetException;
12 import java.util.ArrayList;
13 import java.util.Collection;
14 import java.util.List;
16 import org.eclipse.core.runtime.IStatus;
17 import org.eclipse.core.runtime.Status;
18 import org.eclipse.jface.dialogs.ErrorDialog;
19 import org.eclipse.jface.wizard.WizardPage;
20 import org.eclipse.osgi.util.NLS;
21 import org.eclipse.swt.SWT;
22 import org.eclipse.swt.layout.GridData;
23 import org.eclipse.swt.layout.GridLayout;
24 import org.eclipse.swt.widgets.Button;
25 import org.eclipse.swt.widgets.Composite;
26 import org.eclipse.swt.widgets.Control;
27 import org.spearce.egit.core.op.PushOperation;
28 import org.spearce.egit.core.op.PushOperationResult;
29 import org.spearce.egit.core.op.PushOperationSpecification;
30 import org.spearce.egit.ui.Activator;
31 import org.spearce.egit.ui.UIText;
32 import org.spearce.egit.ui.internal.components.RefSpecPage;
33 import org.spearce.egit.ui.internal.components.RepositorySelection;
34 import org.spearce.egit.ui.internal.components.RepositorySelectionPage;
35 import org.spearce.egit.ui.internal.components.SelectionChangeListener;
36 import org.spearce.jgit.lib.Repository;
37 import org.spearce.jgit.transport.RefSpec;
38 import org.spearce.jgit.transport.RemoteRefUpdate;
39 import org.spearce.jgit.transport.Transport;
40 import org.spearce.jgit.transport.URIish;
42 class ConfirmationPage extends WizardPage {
43 static Collection<RemoteRefUpdate> copyUpdates(
44 final Collection<RemoteRefUpdate> refUpdates) throws IOException {
45 final Collection<RemoteRefUpdate> copy = new ArrayList<RemoteRefUpdate>(
46 refUpdates.size());
47 for (final RemoteRefUpdate rru : refUpdates)
48 copy.add(new RemoteRefUpdate(rru, null));
49 return copy;
52 private final Repository local;
54 private final RepositorySelectionPage repoPage;
56 private final RefSpecPage refSpecPage;
58 private RepositorySelection displayedRepoSelection;
60 private List<RefSpec> displayedRefSpecs;
62 private PushOperationResult confirmedResult;
64 private PushResultTable resultPanel;
66 private Button requireUnchangedButton;
68 private Button showOnlyIfChanged;
70 public ConfirmationPage(final Repository local,
71 final RepositorySelectionPage repoPage,
72 final RefSpecPage refSpecPage) {
73 super(ConfirmationPage.class.getName());
74 this.local = local;
75 this.repoPage = repoPage;
76 this.refSpecPage = refSpecPage;
78 setTitle(UIText.ConfirmationPage_title);
79 setDescription(UIText.ConfirmationPage_description);
81 final SelectionChangeListener listener = new SelectionChangeListener() {
82 public void selectionChanged() {
83 checkPreviousPagesSelections();
86 repoPage.addSelectionListener(listener);
87 refSpecPage.addSelectionListener(listener);
90 public void createControl(final Composite parent) {
91 final Composite panel = new Composite(parent, SWT.NONE);
92 panel.setLayout(new GridLayout());
94 resultPanel = new PushResultTable(panel);
95 final Control tableControl = resultPanel.getControl();
96 tableControl
97 .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
99 requireUnchangedButton = new Button(panel, SWT.CHECK);
100 requireUnchangedButton
101 .setText(UIText.ConfirmationPage_requireUnchangedButton);
103 showOnlyIfChanged = new Button(panel, SWT.CHECK);
104 showOnlyIfChanged.setText(UIText.ConfirmationPage_showOnlyIfChanged);
106 setControl(panel);
109 @Override
110 public void setVisible(final boolean visible) {
111 if (visible)
112 revalidate();
113 super.setVisible(visible);
116 boolean isConfirmed() {
117 return confirmedResult != null;
120 PushOperationResult getConfirmedResult() {
121 return confirmedResult;
124 boolean isRequireUnchangedSelected() {
125 return requireUnchangedButton.getSelection();
128 boolean isShowOnlyIfChangedSelected() {
129 return showOnlyIfChanged.getSelection();
132 private void checkPreviousPagesSelections() {
133 if (!repoPage.selectionEquals(displayedRepoSelection)
134 || !refSpecPage.specsSelectionEquals(displayedRefSpecs)) {
135 // Allow user to finish by skipping confirmation...
136 setPageComplete(true);
137 } else {
138 // ... but if user doesn't skip confirmation, allow only when no
139 // critical errors occurred
140 setPageComplete(confirmedResult != null);
144 private void revalidate() {
145 // always update this page
146 resultPanel.setData(local, null);
147 confirmedResult = null;
148 displayedRepoSelection = repoPage.getSelection();
149 displayedRefSpecs = refSpecPage.getRefSpecs();
150 setErrorMessage(null);
151 setPageComplete(false);
152 getControl().getDisplay().asyncExec(new Runnable() {
153 public void run() {
154 revalidateImpl();
159 private void revalidateImpl() {
160 if (getControl().isDisposed() || !isCurrentPage())
161 return;
163 final List<RefSpec> fetchSpecs;
164 if (displayedRepoSelection.isConfigSelected())
165 fetchSpecs = displayedRepoSelection.getConfig().getFetchRefSpecs();
166 else
167 fetchSpecs = null;
169 final PushOperation operation;
170 try {
171 final Collection<RemoteRefUpdate> updates = Transport
172 .findRemoteRefUpdatesFor(local, displayedRefSpecs,
173 fetchSpecs);
174 if (updates.isEmpty()) {
175 // It can happen only when local refs changed in the mean time.
176 setErrorMessage(UIText.ConfirmationPage_errorRefsChangedNoMatch);
177 setPageComplete(false);
178 return;
181 final PushOperationSpecification spec = new PushOperationSpecification();
182 for (final URIish uri : displayedRepoSelection.getAllURIs())
183 spec.addURIRefUpdates(uri, copyUpdates(updates));
185 operation = new PushOperation(local, spec, true,
186 displayedRepoSelection.getConfig());
187 getContainer().run(true, true, operation);
188 } catch (final IOException e) {
189 setErrorMessage(NLS.bind(
190 UIText.ConfirmationPage_errorCantResolveSpecs, e
191 .getMessage()));
192 return;
193 } catch (final InvocationTargetException e) {
194 setErrorMessage(NLS.bind(UIText.ConfirmationPage_errorUnexpected, e
195 .getCause().getMessage()));
196 return;
197 } catch (final InterruptedException e) {
198 setErrorMessage(UIText.ConfirmationPage_errorInterrupted);
199 setPageComplete(true);
200 displayedRefSpecs = null;
201 displayedRepoSelection = null;
202 return;
205 final PushOperationResult result = operation.getOperationResult();
206 resultPanel.setData(local, result);
207 if (result.isSuccessfulConnectionForAnyURI()) {
208 setPageComplete(true);
209 confirmedResult = result;
210 } else {
211 final String message = NLS.bind(
212 UIText.ConfirmationPage_cantConnectToAny, result
213 .getErrorStringForAllURis());
214 setErrorMessage(message);
215 ErrorDialog
216 .openError(getShell(),
217 UIText.ConfirmationPage_cantConnectToAnyTitle,
218 null,
219 new Status(IStatus.ERROR, Activator.getPluginId(),
220 message));