org.eclipse.egit.gitflow.GitFlowConfig.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.egit.gitflow.GitFlowConfig.java

Source

/*******************************************************************************
 * Copyright (C) 2015, Max Hohenegger <eclipse@hohenegger.eu>
 *
 * 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.gitflow;

import static org.eclipse.egit.gitflow.GitFlowDefaults.DEVELOP;
import static org.eclipse.egit.gitflow.GitFlowDefaults.FEATURE_PREFIX;
import static org.eclipse.egit.gitflow.GitFlowDefaults.HOTFIX_PREFIX;
import static org.eclipse.egit.gitflow.GitFlowDefaults.RELEASE_PREFIX;
import static org.eclipse.egit.gitflow.GitFlowDefaults.VERSION_TAG;
import static org.eclipse.jgit.lib.Constants.DEFAULT_REMOTE_NAME;
import static org.eclipse.jgit.lib.Constants.R_HEADS;

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

import org.eclipse.core.runtime.Assert;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.transport.RemoteConfig;

/**
 * Wrapper for JGit repository.
 *
 * @since 4.0
 */
public class GitFlowConfig {
    /** Key for .git/config */
    public static final String MASTER_KEY = "master"; //$NON-NLS-1$

    /** Key for .git/config */
    public static final String DEVELOP_KEY = "develop"; //$NON-NLS-1$

    /** Key for .git/config */
    public static final String HOTFIX_KEY = "hotfix"; //$NON-NLS-1$

    /** Key for .git/config */
    public static final String RELEASE_KEY = "release"; //$NON-NLS-1$

    /** Key for .git/config */
    public static final String FEATURE_KEY = "feature"; //$NON-NLS-1$

    /** Key for .git/config */
    public static final String VERSION_TAG_KEY = "versiontag"; //$NON-NLS-1$

    /** Name of .git/config section. */
    public static final String USER_SECTION = "user"; //$NON-NLS-1$

    /** Name of .git/config section. */
    public static final String BRANCH_SECTION = "branch"; //$NON-NLS-1$

    /** Name of .git/config section. */
    public static final String PREFIX_SECTION = "prefix"; //$NON-NLS-1$

    /** Name of .git/config section. */
    public static final String GITFLOW_SECTION = "gitflow"; //$NON-NLS-1$

    /** Key for .git/config */
    public static final String REMOTE_KEY = "remote"; //$NON-NLS-1$

    /** Key for .git/config */
    public static final String MERGE_KEY = "merge"; //$NON-NLS-1$

    private Repository repository;

    /**
     * @param repository
     */
    public GitFlowConfig(Repository repository) {
        Assert.isNotNull(repository);
        this.repository = repository;
    }

    /**
     * @return git init done?
     * @throws IOException
     */
    public boolean isInitialized() throws IOException {
        StoredConfig config = repository.getConfig();
        Set<String> sections = config.getSections();
        return sections.contains(GITFLOW_SECTION);
    }

    /**
     * @return Local user of this repository.
     */
    public String getUser() {
        StoredConfig config = repository.getConfig();
        String userName = config.getString(USER_SECTION, null, "name"); //$NON-NLS-1$
        String email = config.getString(USER_SECTION, null, "email"); //$NON-NLS-1$
        return String.format("%s <%s>", userName, email); //$NON-NLS-1$
    }

    /**
     * @return feature prefix configured for this repository.
     */
    public String getFeaturePrefix() {
        return getPrefix(FEATURE_KEY, FEATURE_PREFIX);
    }

    /**
     * @return release prefix configured for this repository.
     */
    public String getReleasePrefix() {
        return getPrefix(RELEASE_KEY, RELEASE_PREFIX);
    }

    /**
     * @return hotfix prefix configured for this repository.
     */
    public String getHotfixPrefix() {
        return getPrefix(HOTFIX_KEY, HOTFIX_PREFIX);
    }

    /**
     * @return version prefix configured for this repository, that is used in
     *         tags.
     */
    public String getVersionTagPrefix() {
        return getPrefix(VERSION_TAG_KEY, VERSION_TAG);
    }

    /**
     * @return name of develop configured for this repository.
     */
    public String getDevelop() {
        return getBranch(DEVELOP_KEY, DEVELOP);
    }

    /**
     * @return full name of develop configured for this repository.
     */
    public String getDevelopFull() {
        return R_HEADS + getDevelop();
    }

    /**
     * @return name of master configured for this repository.
     */
    public String getMaster() {
        return getBranch(MASTER_KEY, GitFlowDefaults.MASTER);
    }

    /**
     * @param prefixName
     * @param defaultPrefix
     * @return value for key prefixName from .git/config or default
     */
    public String getPrefix(String prefixName, String defaultPrefix) {
        StoredConfig config = repository.getConfig();
        String result = config.getString(GITFLOW_SECTION, PREFIX_SECTION, prefixName);
        return (result == null) ? defaultPrefix : result;
    }

    /**
     * @param branch
     * @param defaultBranch
     * @return value for key branch from .git/config or default
     */
    public String getBranch(String branch, String defaultBranch) {
        StoredConfig config = repository.getConfig();
        String result = config.getString(GITFLOW_SECTION, BRANCH_SECTION, branch);
        return (result == null) ? defaultBranch : result;
    }

    /**
     * Set prefix in .git/config
     *
     * @param prefixName
     * @param value
     */
    public void setPrefix(String prefixName, String value) {
        StoredConfig config = repository.getConfig();
        config.setString(GITFLOW_SECTION, PREFIX_SECTION, prefixName, value);
    }

    /**
     * Set branchName in .git/config
     *
     * @param branchName
     * @param value
     */
    public void setBranch(String branchName, String value) {
        StoredConfig config = repository.getConfig();
        config.setString(GITFLOW_SECTION, BRANCH_SECTION, branchName, value);
    }

    /**
     * @param featureName
     * @return full name of branch featureName
     */
    public String getFullFeatureBranchName(String featureName) {
        return R_HEADS + getFeatureBranchName(featureName);
    }

    /**
     * @param featureName
     * @return name of branch featureName
     */
    public String getFeatureBranchName(String featureName) {
        return getFeaturePrefix() + featureName;
    }

    /**
     * @param hotfixName
     * @return name of branch hotfixName
     */
    public String getHotfixBranchName(String hotfixName) {
        return getHotfixPrefix() + hotfixName;
    }

    /**
     * @param hotfixName
     * @return full name of branch hotfixName
     */
    public String getFullHotfixBranchName(String hotfixName) {
        return R_HEADS + getHotfixBranchName(hotfixName);
    }

    /**
     * @param releaseName
     * @return full name of branch releaseName
     */
    public String getFullReleaseBranchName(String releaseName) {
        return R_HEADS + getReleaseBranchName(releaseName);
    }

    /**
     * @param releaseName
     * @return name of branch releaseName
     */
    public String getReleaseBranchName(String releaseName) {
        return getReleasePrefix() + releaseName;
    }

    /**
     * @return Configured origin.
     */
    public RemoteConfig getDefaultRemoteConfig() {
        StoredConfig rc = repository.getConfig();
        RemoteConfig result;
        try {
            result = new RemoteConfig(rc, DEFAULT_REMOTE_NAME);
        } catch (URISyntaxException e) {
            throw new IllegalStateException(e);
        }
        return result;
    }

    /**
     * @return Whether or not there is a default remote configured.
     */
    public boolean hasDefaultRemote() {
        RemoteConfig config = getDefaultRemoteConfig();
        return !config.getURIs().isEmpty();
    }

    /**
     * @param featureName
     * @param value
     * @throws IOException
     */
    public void setRemote(String featureName, String value) throws IOException {
        setBranchValue(featureName, value, REMOTE_KEY);
    }

    /**
     * @param featureName
     * @param value
     * @throws IOException
     */
    public void setUpstreamBranchName(String featureName, String value) throws IOException {
        setBranchValue(featureName, value, MERGE_KEY);
    }

    /**
     * @param featureName
     * @return Upstream branch name
     */
    public String getUpstreamBranchName(String featureName) {
        StoredConfig config = repository.getConfig();
        return config.getString(BRANCH_SECTION, getFeatureBranchName(featureName), MERGE_KEY);
    }

    private void setBranchValue(String featureName, String value, String mergeKey) throws IOException {
        StoredConfig config = repository.getConfig();
        config.setString(BRANCH_SECTION, featureName, mergeKey, value);
        config.save();
    }

    /**
     * @param featureName
     * @return remote tracking branch
     */
    public String getRemoteName(String featureName) {
        StoredConfig config = repository.getConfig();
        return config.getString(BRANCH_SECTION, getFeatureBranchName(featureName), REMOTE_KEY);
    }
}