org.eclipse.egit.ui.internal.pull.PullWizard.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.egit.ui.internal.pull.PullWizard.java

Source

/*******************************************************************************
 * Copyright (c) 2016 Red Hat Inc. 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
 * http://www.eclipse.org/legal/epl-v10.html
 *******************************************************************************/
package org.eclipse.egit.ui.internal.pull;

import java.io.IOException;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.eclipse.egit.core.op.PullOperation.PullReferenceConfig;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.internal.SecureStoreUtils;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.push.AddRemotePage;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jgit.lib.BranchConfig.BranchRebaseMode;
import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.lib.Constants;
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.jgit.transport.URIish;

/**
 * A wizard to allow to specify a pull operation with options
 */
public class PullWizard extends Wizard {

    private final Repository repository;

    private PullWizardPage page;
    private AddRemotePage addRemotePage;

    /**
     * @param repo
     *            the repository
     */
    public PullWizard(final Repository repo) {
        this.repository = repo;
        setWindowTitle(UIText.PullWizardPage_PageTitle);
        setNeedsProgressMonitor(true);
    }

    @Override
    public void addPages() {
        Set<String> remoteNames = repository.getConfig().getSubsections(ConfigConstants.CONFIG_REMOTE_SECTION);
        if (remoteNames.isEmpty()) {
            this.addRemotePage = new AddRemotePage(repository);
            addPage(this.addRemotePage);
        }
        this.page = new PullWizardPage(this.repository);
        addPage(this.page);
    }

    @Override
    public boolean performFinish() {
        try {
            if (this.addRemotePage != null) {
                storeCredentials(this.addRemotePage);
                URIish uri = this.addRemotePage.getSelection().getURI();
                configureNewRemote(uri);
            }
            if (this.page.overrideUpstreamConfiguration()) {
                configureUpstream();
            }
            startPull();
            return true;
        } catch (IOException e) {
            Activator.logError(e.getMessage(), e);
            return false;
        } catch (URISyntaxException e) {
            Activator.logError(e.getMessage(), e);
            return false;
        }
    }

    private void storeCredentials(AddRemotePage remotePage) {
        if (remotePage.getStoreInSecureStore()) {
            URIish uri = remotePage.getSelection().getURI();
            if (uri != null) {
                SecureStoreUtils.storeCredentials(remotePage.getCredentials(), uri);
            }
        }
    }

    private void configureNewRemote(URIish uri) throws URISyntaxException, IOException {
        StoredConfig config = repository.getConfig();
        String remoteName = this.page.getRemoteConfig().getName();
        RemoteConfig remoteConfig = new RemoteConfig(config, remoteName);
        remoteConfig.addURI(uri);
        RefSpec defaultFetchSpec = new RefSpec().setForceUpdate(true).setSourceDestination(Constants.R_HEADS + "*", //$NON-NLS-1$
                Constants.R_REMOTES + remoteName + "/*"); //$NON-NLS-1$
        remoteConfig.addFetchRefSpec(defaultFetchSpec);
        remoteConfig.update(config);
        config.save();
    }

    private void configureUpstream() throws IOException {
        String fullBranch = this.repository.getFullBranch();
        if (fullBranch == null || !fullBranch.startsWith(Constants.R_HEADS)) {
            // Don't configure upstream for detached HEAD
            return;
        }
        String remoteName = this.page.getRemoteConfig().getName();
        String fullRemoteBranchName = this.page.getFullRemoteReference();

        String localBranchName = this.repository.getBranch();
        StoredConfig config = repository.getConfig();
        config.setString(ConfigConstants.CONFIG_BRANCH_SECTION, localBranchName, ConfigConstants.CONFIG_KEY_REMOTE,
                remoteName);
        config.setString(ConfigConstants.CONFIG_BRANCH_SECTION, localBranchName, ConfigConstants.CONFIG_KEY_MERGE,
                fullRemoteBranchName);
        BranchRebaseMode rebaseMode = this.page.getUpstreamConfig();
        if (rebaseMode != null) {
            config.setEnum(ConfigConstants.CONFIG_BRANCH_SECTION, localBranchName,
                    ConfigConstants.CONFIG_KEY_REBASE, rebaseMode);
        }

        config.save();
    }

    private void startPull() {
        Map<Repository, PullReferenceConfig> repos = new HashMap<>(1);
        PullReferenceConfig config = new PullReferenceConfig(this.page.getRemoteConfig().getName(),
                this.page.getFullRemoteReference(), this.page.getUpstreamConfig());
        repos.put(this.repository, config);
        PullOperationUI pullOperationUI = new PullOperationUI(repos);
        pullOperationUI.start();
    }

}