org.sourcepit.b2.its.util.GitSCM.java Source code

Java tutorial

Introduction

Here is the source code for org.sourcepit.b2.its.util.GitSCM.java

Source

/*
 * Copyright 2014 Bernd Vogt and others.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.sourcepit.b2.its.util;

import java.io.File;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;

import org.apache.maven.model.Scm;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.ResetCommand.ResetType;
import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.NoFilepatternException;
import org.eclipse.jgit.api.errors.NoHeadException;
import org.eclipse.jgit.api.errors.NoMessageException;
import org.eclipse.jgit.api.errors.UnmergedPathsException;
import org.eclipse.jgit.api.errors.WrongRepositoryStateException;
import org.sourcepit.common.utils.lang.Exceptions;

public class GitSCM implements SCM {
    private final File repoDir;

    private final Collection<File> submoduleDirs;

    private Git git;

    public GitSCM(File repoDir, File... submoduleDirs) {
        this(repoDir, submoduleDirs == null ? null : Arrays.asList(submoduleDirs));
    }

    @SuppressWarnings("unchecked")
    public GitSCM(File repoDir, Collection<File> submoduleDirs) {
        this.repoDir = repoDir;
        this.submoduleDirs = submoduleDirs == null ? Collections.EMPTY_LIST : submoduleDirs;
    }

    public void create() {
        try {
            git = create(repoDir);
            for (File submoduleDir : submoduleDirs) {
                create(submoduleDir);
                git.submoduleAdd().setPath(submoduleDir.getName())
                        .setURI("file:///" + submoduleDir.getAbsolutePath()).call();
            }

            if (!submoduleDirs.isEmpty()) {
                git.add().addFilepattern(".gitmodules").call();
                git.commit().setMessage("Added sumodules").call();
                git.submoduleInit().call();
                git.submoduleUpdate().call();
            }
        } catch (GitAPIException e) {
            throw Exceptions.pipe(e);
        }
    }

    private static Git create(File repoDir)
            throws GitAPIException, NoFilepatternException, NoHeadException, NoMessageException,
            UnmergedPathsException, ConcurrentRefUpdateException, WrongRepositoryStateException {
        final Git git = Git.init().setDirectory(repoDir).call();
        git.add().addFilepattern(".").call();
        git.commit().setAll(true).setMessage("Initial commit").call();
        return git;
    }

    public Scm createMavenScmModel(File projectDir, String version) {
        if (!projectDir.equals(repoDir)) {
            return null;
        }
        final Scm scm = new Scm();
        scm.setConnection("scm:git:file:///" + projectDir.getAbsolutePath().replace('\\', '/'));
        final boolean isSnapshot = version == null || version.endsWith("-SNAPSHOT");
        if (!isSnapshot) {
            scm.setTag(projectDir.getName() + "-" + version);
        }
        return scm;
    }

    public void switchVersion(String version) {
        final boolean isSnapshot = version == null || version.endsWith("-SNAPSHOT");
        try {
            git.checkout().setName(isSnapshot ? "master" : repoDir.getName() + "-" + version).call();
            git.reset().setMode(ResetType.HARD).call();
            git.clean().setIgnore(false).setCleanDirectories(true).call();
        } catch (Exception e) {
            throw Exceptions.pipe(e);
        }
    }

}