de.unihalle.informatik.Alida.version.ALDVersionProviderGit.java Source code

Java tutorial

Introduction

Here is the source code for de.unihalle.informatik.Alida.version.ALDVersionProviderGit.java

Source

/*
 * This file is part of MiToBo, the Microscope Image Analysis Toolbox.
 *
 * Copyright (C) 2010 - @YEAR@
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Fore more information on MiToBo, visit
 *
 *    http://www.informatik.uni-halle.de/mitobo/
 *
 */

package de.unihalle.informatik.Alida.version;

import java.io.*;

import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;

import de.unihalle.informatik.Alida.version.ALDVersionProvider;

/**
 * Version provider to extract version information from local Git repository.
 * <p>
 * Note that the environment variable GIT_DIR has to be set to the Git
 * repository location, i.e. the .git repository which should be accessed.
 * Please set the variable exactly to the .git directory and not just to the
 * parent directory of the .git directory.
 *
 * @author moeller
 */
public class ALDVersionProviderGit extends ALDVersionProvider {

    /**
     * Version info string.
     */
    private static String localVersion = null;

    /**
     * Name of revision file.
     */
    private static final String revFile = "revision.txt";

    @Override
    public String getVersion() {

        // extract version only once
        if (ALDVersionProviderGit.localVersion != null) {
            return ALDVersionProviderGit.localVersion;
        }
        return ALDVersionProviderGit.getRepositoryInfo();
    }

    /**
     * Returns information about current commit.
     * <p>
     * If no git repository is found, the method checks for a file 
     * "revision.txt" as it is present in Alida jar files. 
     * If the file does not exist or is empty, a dummy string is returned.
     * 
     * @return    Info string.
     */
    private static String getRepositoryInfo() {

        ALDVersionProviderGit.localVersion = "Unknown";
        FileRepositoryBuilder builder = new FileRepositoryBuilder();
        try {
            Repository repo = null;
            try {
                repo = builder.readEnvironment().build();
            } catch (IllegalArgumentException e) {
                // problem accessing environment... fall back to default
                if (repo != null)
                    repo.close();
                return ALDVersionProviderGit.localVersion;
            }

            // check if GIT_DIR is set
            if (!builder.getGitDir().isDirectory()) {
                if (repo != null)
                    repo.close();
                return ALDVersionProviderGit.localVersion;
            }

            // extract the active branch
            String activeBranch = repo.getBranch();

            // extract last commit 
            Ref HEAD = repo.findRef(activeBranch);

            // safety check if everything is alright with repository
            if (HEAD == null) {
                repo.close();
                throw new IOException();
            }

            // extract state of repository
            String state = repo.getRepositoryState().toString();

            ALDVersionProviderGit.localVersion = activeBranch + " : " + HEAD.toString() + " ( " + state + " ) ";

            // clean-up
            repo.close();
        } catch (IOException e) {
            // accessing the Git repository failed, search for file
            InputStream is = null;
            BufferedReader br = null;
            String vLine = null;

            // initialize file reader and extract version information
            try {
                System.out.print("Searching for local revision file...");
                is = ALDVersionProviderGit.class.getResourceAsStream("/" + ALDVersionProviderGit.revFile);
                br = new BufferedReader(new InputStreamReader(is));
                vLine = br.readLine();
                if (vLine == null) {
                    System.err.println("ALDVersionProviderGit: " + "revision file is empty...!?");
                    br.close();
                    is.close();
                    return ALDVersionProviderGit.localVersion;
                }
                ALDVersionProviderGit.localVersion = vLine;
                br.close();
                is.close();
                return vLine;
            } catch (Exception ex) {
                try {
                    if (br != null)
                        br.close();
                    if (is != null)
                        is.close();
                } catch (IOException eo) {
                    // nothing to do here
                }
                return ALDVersionProviderGit.localVersion;
            }
        }
        return ALDVersionProviderGit.localVersion;
    }
}