com.rimerosolutions.ant.git.AbstractGitRepoAwareTask.java Source code

Java tutorial

Introduction

Here is the source code for com.rimerosolutions.ant.git.AbstractGitRepoAwareTask.java

Source

/*
 * Copyright 2013 Rimero Solutions
 *
 * 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 com.rimerosolutions.ant.git;

import java.io.File;
import java.io.IOException;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryBuilder;

/**
 * Base Ant Task with a managed reference to the Git repository.
 *
 * @author Yves Zoundi
 */
public abstract class AbstractGitRepoAwareTask extends AbstractGitTask {

    protected Git git;
    private boolean failOnError = true;

    /**
     * Whether or not an exception should be thrown if the task fails.
     *
     * @antdoc.notrequired
     * @param failOnError Build fails on error?
     */
    public void setFailOnError(boolean failOnError) {
        this.failOnError = failOnError;
    }

    /**
     * Whether or not an exception should be thrown if the task fails.
     *
     * @return True if the build should fail when an exception is thrown
     */
    public boolean isFailOnError() {
        return failOnError;
    }

    protected abstract void doExecute() throws BuildException;

    @Override
    public final void execute() {
        try {
            try {
                Repository repository = new RepositoryBuilder().readEnvironment().findGitDir(getDirectory())
                        .build();
                git = new Git(repository);
            } catch (IOException ioe) {
                String errorMsg = "Specified path (%s) doesn't seem to be a git repository.";

                throw new BuildException(String.format(errorMsg, getDirectory().getAbsolutePath()), ioe);
            }

            doExecute();

        } catch (GitBuildException e) {
            log(e, Project.MSG_ERR);

            if (failOnError) {
                throw new BuildException(e);
            }
        } finally {
            if (git != null) {
                git.getRepository().close();
            }
        }
    }

    /**
     * return either a "." if file and prefix have the same value,
     * or the right part of file - length of prefix plus one removed
     * @param file file on which a git operation needs to be done
     * @param prefix folder of the git sandbox
     * @return path relative to git sandbox folder
     * @throws IOException the method uses File#getCanonicalPath which can throw IOException
     */
    protected String translateFilePathUsingPrefix(String file, String prefix) throws IOException {
        if (file.equals(prefix)) {
            return ".";
        }
        String result = new File(file).getCanonicalPath().substring(prefix.length() + 1);
        if (File.separatorChar != '/') {
            result = result.replace(File.separatorChar, '/');
        }
        return result;
    }

}