Home | History | Annotate | Download | only in server
      1 """
      2 This module defines the GitKernel class
      3 
      4 @author: Ryan Harper (ryanh (at] us.ibm.com)
      5 @copyright: IBM 2007
      6 """
      7 
      8 import os, logging
      9 import git, source_kernel
     10 
     11 
     12 class GitKernel(git.InstallableGitRepo):
     13     """
     14     This class represents an installable git kernel repo.
     15 
     16     It is used to pull down a local copy of a git repo, check if the local repo
     17     is up-to-date, if not update and then build the kernel from the git repo.
     18     """
     19     def __init__(self, repodir, giturl, weburl=None):
     20         super(GitKernel, self).__init__(repodir, giturl, weburl)
     21         self._patches = []
     22         self._config = None
     23         self._build = None
     24         self._branch = None
     25         self._revision = None
     26 
     27 
     28     def configure(self, config):
     29         self._config = config
     30 
     31 
     32     def patch(self, patch):
     33         self._patches.append(patch)
     34 
     35 
     36     def checkout(self, revision, local=None):
     37         """
     38         Checkout the commit id, branch, or tag.
     39 
     40         @param revision: Name of the git remote branch, revision or tag
     41         @param local: Name of the local branch, implies -b
     42         """
     43         logging.info('Checking out %s', revision)
     44         super(GitKernel, self).checkout(revision)
     45         self._revision = super(GitKernel, self).get_revision()
     46         self._branch = super(GitKernel, self).get_branch()
     47         logging.info('Checked out %s on branch %s', self._revision,
     48                      self._branch)
     49 
     50 
     51     def show_branch(self):
     52         """
     53         Print the current local branch name.
     54         """
     55         self._branch = super(GitKernel, self).get_branch()
     56         logging.info(self._branch)
     57 
     58 
     59     def show_branches(self, all=True):
     60         """
     61         Print the local and remote branches.
     62 
     63         @param all: Whether to show all branches (True) or only local branches
     64                 (False).
     65         """
     66         self._branch = super(GitKernel, self).get_branch()
     67         logging.info(super(GitKernel, self).get_branch(all=all))
     68 
     69 
     70     def show_revision(self):
     71         """
     72         Show the current git revision.
     73         """
     74         self._revision = super(GitKernel, self).get_revision()
     75         logging.info(self._revision)
     76 
     77 
     78     def install(self, host, build=True, builddir=None, revision=None):
     79         """
     80         Install the git tree in a host.
     81 
     82         @param host: Host object
     83         @param build: Whether to build the source tree
     84         @param builddir: Specify a build dir. If no build dir is specified,
     85                 the job temporary directory will be used, so the build won't
     86                 be persistent.
     87         @param revision: Desired commit hash. If ommited, will build from HEAD
     88                 of the branch.
     89         """
     90         if revision:
     91             self.checkout(revision)
     92             self._revision = super(GitKernel, self).get_revision()
     93             logging.info('Checked out revision: %s', self._revision)
     94 
     95         if not builddir:
     96             self._build = os.path.join(host.get_tmp_dir(), "build")
     97             logging.warning('Builddir %s is not persistent (it will be erased '
     98                             'in future jobs)', self._build)
     99         else:
    100             self._build = builddir
    101 
    102         # push source to host for install
    103         logging.info('Pushing %s to host', self.source_material)
    104         host.send_file(self.source_material, self._build)
    105         remote_source_material= os.path.join(self._build,
    106                                         os.path.basename(self.source_material))
    107 
    108         # use a source_kernel to configure, patch, build and install.
    109         sk = source_kernel.SourceKernel(remote_source_material)
    110 
    111         if build:
    112             # apply patches
    113             for p in self._patches:
    114                 sk.patch(p)
    115 
    116             # configure
    117             sk.configure(self._config)
    118 
    119             # build
    120             sk.build(host)
    121 
    122         # install
    123         sk.install(host)
    124