view src/main/java/org/icedrobot/ika/runtime/scm/GITRepository.java @ 29:3b0d6002605a

Add patch to output commands names. Contributed by Giulio Franco.
author Mario Torre <neugens.limasoftware@gmail.com>
date Fri, 15 Apr 2011 17:13:03 +0200
parents 17afcf8034a6
children
line wrap: on
line source

/*
 * IKA - IcedRobot Kiosk Application
 * Copyright (C) 2011  IcedRobot team
 *
 * 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/>.
 */

package org.icedrobot.ika.runtime.scm;

import java.io.File;
import java.io.IOException;
import org.icedrobot.ika.plugins.IkaPluginException;
import org.icedrobot.ika.runtime.IkaRuntime;
import org.icedrobot.ika.runtime.RuntimeCommand;

public class GITRepository extends Repository {

    /**
     * Creates a new git Repository with the give name as ID, the
     * base directory as the location where the clone will be performed, the
     * relativePath as the name of the cloned repository, the remotePath as the
     * location of the source repository and branch as the version of the
     * repository to clone.
     */
    public GITRepository(String name, File baseDirectory, String relativePath,
                         String remotePath, String branch) {

        this.name = name;
        this.baseDirectory = baseDirectory;
        this.relativePath = relativePath;
        this.remotePath = remotePath;

        this.branch = branch;

        String canonicalPath;
        try {
             canonicalPath = baseDirectory.getCanonicalPath();
        } catch (IOException ex) {
            throw new IkaPluginException(ex.getMessage(), ex);
        }

        this.fullPath = new File(canonicalPath + File.separator + relativePath);
    }

    /**
     * Clone the git Repository.
     * If the git Repository allready exist then pop local patches and
     * then fetch and merge new changesets from the remotePath.
     */
    @Override
    public void makeClone() {
        File git = new File(fullPath + File.separator + name +
                                       File.separator + ".git" );
        RuntimeCommand command;

        if(!git.exists()) {
            command = new GITCommand(name, "clone", "--progress", "-b",
                                        getBranch(), remotePath );
            IkaRuntime.exec(getFullPath(), command);
        } else {
            File patchQueue = new File(fullPath + File.separator + name +
                                                  File.separator + ".git" +
                                                  File.separator + "patches" );
            if(patchQueue.exists()) {
                command = new GuiltCommand(name, "pop", "--all");
                IkaRuntime.exec(new File(getFullPath() + File.separator + name),
                                command);
            }

            command = new GITCommand(name, "fetch", "--progress");
            IkaRuntime.exec(new File(getFullPath() + File.separator + name),
                            command);

            command = new GITCommand(name, "merge", "HEAD");
            IkaRuntime.exec(new File(getFullPath() + File.separator + name),
                            command);
        }
    }

    /**
     * Create new git and initialize it to the prefered branch.
     * Skipped if the git branch already exist.
     */
    @Override
    public void create() {

        File repoBranch = new File(fullPath + File.separator + ".git" +
                                              File.separator + "refs" +
                                              File.separator + "heads" +
                                              File.separator + getBranch());
        if(!repoBranch.exists()) {

            RuntimeCommand command = new GITCommand(name, "init", ".");
            IkaRuntime.exec(getFullPath(), command);

            command = new GITCommand(name, "add", "--all");
            IkaRuntime.exec(getFullPath(), command);

            command = new GITCommand(name, "commit", "-m", "initial_repository",
                                    "--verbose");
            IkaRuntime.exec(getFullPath(), command);

            command = new GITCommand(name, "branch", getBranch());
            IkaRuntime.exec(getFullPath(), command);

            command = new GITCommand(name, "checkout", getBranch());
            IkaRuntime.exec(getFullPath(), command);

            System.err.println(">>>>>>>> done: " + this + " <<<<<<<<");
        } else {
            System.err.println(">>>>>>>> already done: " + this + " <<<<<<<<");
        }
    }

    /**
     *
     */
    @Override
    public Repository makeSubRepository(String name, String relativePath,
                                        String branch) {

        if (name.equals(".")) {
            name = this.getName();
        }
        Repository subRepository =
            new GITRepository(name, new File(getFullPath() + File.separator +
                                             getName()),
                              relativePath, null, branch);
        subRepository.create();
        return subRepository;
    }

    @Override
    public void applyPatchQueue() {
        GuiltCommand guilt = new GuiltCommand(name, "push", "--all");
        IkaRuntime.exec(getFullPath(), guilt);
    }

    @Override
    public void initPatchQueue() {
        GuiltCommand guilt = new GuiltCommand(name, "init");
        IkaRuntime.exec(getFullPath(), guilt);
    }
}