138 lines
4.2 KiB
Python
138 lines
4.2 KiB
Python
"""
|
|
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)
|