blob: 0322274baba0d037ec510e329f179802e0af3923 [file] [log] [blame]
/*******************************************************************************
* Copyright (C) 2012, 2016 Mathias Kinzler <mathias.kinzler@sap.com> and others
* and other copyright owners as documented in the project's IP log.
*
* 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
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Mathias Kinzler - Initial implementation
* Thomas Wolf <thomas.wolf@paranor.ch> - Bug 499482
*******************************************************************************/
package org.eclipse.egit.ui.internal.dialogs;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Collection;
import java.util.List;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.components.BranchRebaseModeCombo;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jgit.api.PullCommand;
import org.eclipse.jgit.lib.BranchConfig.BranchRebaseMode;
import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.transport.RefSpec;
import org.eclipse.jgit.transport.RemoteConfig;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
/**
* Allows to configure the upstream configuration of a Branch
*/
public class BranchConfigurationDialog extends TitleAreaDialog {
private final String myBranchName;
private final Repository myRepository;
private final StoredConfig myConfig;
private final String myTitle;
private Combo remoteText;
private Combo branchText;
private BranchRebaseModeCombo rebase;
/**
* @param shell
* @param branchName
* @param repository
*/
public BranchConfigurationDialog(Shell shell, String branchName,
Repository repository) {
super(shell);
myBranchName = branchName;
myRepository = repository;
myConfig = myRepository.getConfig();
setShellStyle(getShellStyle() | SWT.SHELL_TRIM);
myTitle = UIText.BranchConfigurationDialog_BranchConfigurationTitle;
setHelpAvailable(false);
}
@Override
protected Control createDialogArea(Composite parent) {
Composite main = new Composite(parent, SWT.NONE);
main.setLayout(new GridLayout(2, false));
GridDataFactory.fillDefaults().grab(true, true).applyTo(main);
Label remoteLabel = new Label(main, SWT.NONE);
remoteLabel.setText(UIText.BranchConfigurationDialog_RemoteLabel);
remoteText = new Combo(main, SWT.BORDER);
GridDataFactory.fillDefaults().grab(true, false).applyTo(remoteText);
Label branchLabel = new Label(main, SWT.NONE);
branchLabel.setText(UIText.BranchConfigurationDialog_UpstreamBranchLabel);
branchText = new Combo(main, SWT.BORDER);
GridDataFactory.fillDefaults().grab(true, false).applyTo(branchText);
// TODO do we have a constant somewhere?
remoteText.add("."); //$NON-NLS-1$
for (String remote : myConfig
.getSubsections(ConfigConstants.CONFIG_REMOTE_SECTION))
remoteText.add(remote);
remoteText.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateBranchItems();
}
});
rebase = new BranchRebaseModeCombo(main);
BranchRebaseMode rebaseMode = PullCommand.getRebaseMode(myBranchName,
myConfig);
rebase.setRebaseMode(rebaseMode);
GridDataFactory.fillDefaults().grab(true, false)
.align(SWT.BEGINNING, SWT.CENTER)
.applyTo(rebase.getViewer().getCombo());
String branch = myConfig.getString(
ConfigConstants.CONFIG_BRANCH_SECTION, myBranchName,
ConfigConstants.CONFIG_KEY_MERGE);
if (branch == null)
branch = ""; //$NON-NLS-1$
branchText.setText(branch);
String remote = myConfig.getString(
ConfigConstants.CONFIG_BRANCH_SECTION, myBranchName,
ConfigConstants.CONFIG_KEY_REMOTE);
if (remote == null)
remote = ""; //$NON-NLS-1$
remoteText.setText(remote);
updateBranchItems();
applyDialogFont(main);
return main;
}
private void updateBranchItems() {
String branchTextBefore = branchText.getText();
branchText.removeAll();
addBranchItems();
branchText.setText(branchTextBefore);
}
private void addBranchItems() {
String remote = remoteText.getText();
try {
if (remote.equals(".") || remote.length() == 0) //$NON-NLS-1$
// Add local branches only. Fetching from "." and then merging a
// remote ref does not make much sense, so don't offer it. If
// the user wants that, it can be entered manually.
addBranchItemsForLocal();
else
addBranchItemsForRemote(remote);
} catch (IOException e) {
Activator.logError(
UIText.BranchConfigurationDialog_ExceptionGettingRefs, e);
} catch (URISyntaxException e) {
Activator.logError(
UIText.BranchConfigurationDialog_ExceptionGettingRefs, e);
}
}
private void addBranchItemsForLocal() throws IOException {
Collection<Ref> localRefs = myRepository.getRefDatabase()
.getRefs(Constants.R_HEADS).values();
for (Ref ref : localRefs)
branchText.add(ref.getName());
}
private void addBranchItemsForRemote(String remote) throws IOException,
URISyntaxException {
RemoteConfig remoteConfig = new RemoteConfig(myConfig, remote);
List<RefSpec> fetchSpecs = remoteConfig.getFetchRefSpecs();
if (fetchSpecs.isEmpty()) {
return;
}
Collection<Ref> allRefs = myRepository.getRefDatabase()
.getRefs(Constants.R_REFS).values();
for (Ref ref : allRefs) {
for (RefSpec fetchSpec : fetchSpecs) {
// Fetch specs map remote ref names (source) to local ref names
// (destination). We want to get remote ref names, so expand
// destination to source.
if (fetchSpec.matchDestination(ref)) {
RefSpec source = fetchSpec.expandFromDestination(ref);
String refNameOnRemote = source.getSource();
branchText.add(refNameOnRemote);
}
}
}
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(UIText.BranchConfigurationDialog_BranchConfigurationTitle);
}
@Override
public void create() {
super.create();
setTitle(myTitle);
setMessage(NLS.bind(
UIText.BranchConfigurationDialog_EditBranchConfigMessage, myBranchName));
}
@Override
protected void okPressed() {
try {
String merge = branchText.getText();
if (merge.length() > 0) {
myConfig.setString(ConfigConstants.CONFIG_BRANCH_SECTION,
myBranchName, ConfigConstants.CONFIG_KEY_MERGE, merge);
} else {
myConfig.unset(ConfigConstants.CONFIG_BRANCH_SECTION,
myBranchName, ConfigConstants.CONFIG_KEY_MERGE);
}
String remote = remoteText.getText();
if (remote.length() > 0) {
myConfig.setString(ConfigConstants.CONFIG_BRANCH_SECTION,
myBranchName, ConfigConstants.CONFIG_KEY_REMOTE,
remote);
} else {
myConfig.unset(ConfigConstants.CONFIG_BRANCH_SECTION,
myBranchName, ConfigConstants.CONFIG_KEY_REMOTE);
}
BranchRebaseMode rebaseMode = rebase.getRebaseMode();
if (rebaseMode == null) {
myConfig.unset(ConfigConstants.CONFIG_BRANCH_SECTION,
myBranchName, ConfigConstants.CONFIG_KEY_REBASE);
} else {
myConfig.setEnum(ConfigConstants.CONFIG_BRANCH_SECTION,
myBranchName, ConfigConstants.CONFIG_KEY_REBASE,
rebaseMode);
}
try {
myConfig.save();
super.okPressed();
} catch (IOException e) {
Activator.handleError(
UIText.BranchConfigurationDialog_SaveBranchConfigFailed, e, true);
}
} catch (RuntimeException e) {
Activator.handleError(e.getMessage(), e, true);
}
}
}