""" This module defines a class for handling building from git repos @author: Ryan Harper (ryanh@us.ibm.com) @copyright: IBM 2007 """ import os, warnings, logging from autotest_lib.client.common_lib import error, revision_control from autotest_lib.client.bin import os_dep from autotest_lib.server import utils, installable_object class InstallableGitRepo(installable_object.InstallableObject): """ This class helps to pick a git repo and install it in a host. """ def __init__(self, repodir, giturl, weburl=None): self.repodir = repodir self.giturl = giturl self.weburl = weburl self.git_repo = revision_control.GitRepo(self.repodir, self.giturl, self.weburl) # default to same remote path as local self._build = os.path.dirname(self.repodir) # base install method def install(self, host, builddir=None): """ Install a git repo in a host. It works by pushing the downloaded source code to the host. @param host: Host object. @param builddir: Directory on the host filesystem that will host the source code. """ # allow override of target remote dir if builddir: self._build = builddir # push source to host for install logging.info('Pushing code dir %s to host %s', self.source_material, self._build) host.send_file(self.source_material, self._build) def gitcmd(self, cmd, ignore_status=False): """ Wrapper for a git command. @param cmd: Git subcommand (ex 'clone'). @param ignore_status: Whether we should supress error.CmdError exceptions if the command did return exit code !=0 (True), or not supress them (False). """ return self.git_repo.gitcmd(cmd, ignore_status) def get(self, **kwargs): """ This method overrides baseclass get so we can do proper git clone/pulls, and check for updated versions. The result of this method will leave an up-to-date version of git repo at 'giturl' in 'repodir' directory to be used by build/install methods. @param **kwargs: Dictionary of parameters to the method get. """ self.source_material = self.repodir return self.git_repo.get(**kwargs) def get_local_head(self): """ Get the top commit hash of the current local git branch. @return: Top commit hash of local git branch """ return self.git_repo.get_local_head() def get_remote_head(self): """ Get the top commit hash of the current remote git branch. @return: Top commit hash of remote git branch """ return self.git_repo.get_remote_head() def is_out_of_date(self): """ Return whether this branch is out of date with regards to remote branch. @return: False, if the branch is outdated, True if it is current. """ return self.git_repo.is_out_of_date() def is_repo_initialized(self): """ Return whether the git repo was already initialized (has a top commit). @return: False, if the repo was initialized, True if it was not. """ return self.git_repo.is_repo_initialized() def get_revision(self): """ Return current HEAD commit id """ return self.git_repo.get_revision() def checkout(self, remote, local=None): """ Check out the git commit id, branch, or tag given by remote. Optional give the local branch name as local. @param remote: Remote commit hash @param local: Local commit hash @note: For git checkout tag git version >= 1.5.0 is required """ return self.git_repo.checkout(remote, local) def get_branch(self, all=False, remote_tracking=False): """ Show the branches. @param all: List both remote-tracking branches and local branches (True) or only the local ones (False). @param remote_tracking: Lists the remote-tracking branches. """ return self.git_repo.get_branch(all, remote_tracking)