Looks nice, especially with all the cleanup. I can't comment much on the actual capabilities since grabbing kernels with git isn't actually something I do very much, so I don't actually have much expertise to offer.
I do note that this code uses lstrip with '* ', which I do worry about a little. 99% of the cases where I see someone using a multi-character string with strip it doesn't do what they expect. I'm not sure it's actually wrong is this case, but if the intention is only to strip off a leading '* ' and not all leading '*' and ' ' then lstrip probably isn't the way to do it. -- John On Sun, Sep 12, 2010 at 1:57 PM, Lucas Meneghel Rodrigues <[email protected]>wrote: > I need to checkout kernel revisions by branch, commit id, or tag before > building and testing them. > > Here is my patch to extend server/git.py and server/git_kernel.py > > I'm very open for any kind of suggestions. > > The following new methods exist in GitKernel() > * checkout - Check out a certain branch, tag or revision. Optional > a local branch name can be given for -b > * show_branch - print the current local branch > * show_branches - print the local and/or remote branches > * show_revision - print the current tip commit id (checked out revision) > * extended install - optional a commit id / revision that is checked out > * before patching, configure, and build > > Therefore the following methods were added to Git() > * get_revision() - To print the current tip commit id (aka revision). > * checkout() - Check out a certain branch, tag or revision. > * get_branch() - return the branches depending on options > > Risk: Low (Just extends functionality, doesn't change existing one.) > Visibility: Users who build Linux kernels may profit. > > Signed-off-by: Frank Becker <[email protected]> > --- > server/git.py | 69 > ++++++++++++++++++++++++++++++++++++++++++++++++++ > server/git_kernel.py | 66 > ++++++++++++++++++++++++++++++++++++++++++------ > 2 files changed, 127 insertions(+), 8 deletions(-) > > diff --git a/server/git.py b/server/git.py > index 93833ec..b35b79c 100644 > --- a/server/git.py > +++ b/server/git.py > @@ -183,3 +183,72 @@ class GitRepo(installable_object.InstallableObject): > return True > > return False > + > + > + def get_revision(self): > + """ > + Return current HEAD commit id > + """ > + > + if not self.is_repo_initialized(): > + self.get() > + > + cmd = 'rev-parse --verify HEAD' > + gitlog = self.gitcmd(cmd, True) > + if gitlog.exit_status != 0: > + print gitlog.stderr > + raise error.CmdError('Failed to find git sha1 revision', > gitlog) > + else: > + return gitlog.stdout.strip('\n') > + > + > + 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. > + > + Note, for git checkout tag git version >= 1.5.0 is required > + """ > + if not self.is_repo_initialized(): > + self.get() > + > + assert(isinstance(remote, basestring)) > + if local: > + cmd = 'checkout -b %s %s' % (local, remote) > + else: > + cmd = 'checkout %s' % (remote) > + gitlog = self.gitcmd(cmd, True) > + if gitlog.exit_status != 0: > + print gitlog.stderr > + raise error.CmdError('Failed to checkout git branch', gitlog) > + else: > + print gitlog.stdout > + > + > + def get_branch(self, all=False, remote_tracking=False): > + """ > + Show the branches. > + > + all - list both remote-tracking branches and local branches. > + remote_tracking - lists the remote-tracking branches. > + """ > + if not self.is_repo_initialized(): > + self.get() > + > + cmd = 'branch --no-color' > + if all: > + cmd = " ".join([cmd, "-a"]) > + if remote_tracking: > + cmd = " ".join([cmd, "-r"]) > + > + gitlog = self.gitcmd(cmd, True) > + if gitlog.exit_status != 0: > + print gitlog.stderr > + raise error.CmdError('Failed to get git branch', gitlog) > + elif all or remote_tracking: > + return gitlog.stdout.strip('\n') > + else: > + branch = [b.lstrip('* ') for b in gitlog.stdout.split('\n') \ > + if b.startswith('*')][0] > + return branch > diff --git a/server/git_kernel.py b/server/git_kernel.py > index 1f4273c..a23881e 100644 > --- a/server/git_kernel.py > +++ b/server/git_kernel.py > @@ -22,13 +22,14 @@ class GitKernel(git.GitRepo): > > It is used to pull down a local copy of a git repo, check if the local > repo > is up-to-date, if not update and then build the kernel from the git > repo. > - > """ > def __init__(self, repodir, giturl, weburl): > git.GitRepo.__init__(self, repodir, giturl, weburl) > self.__patches = [] > self.__config = None > self.__build = None > + self.__branch = None > + self.__revision = None > > > def configure(self, config): > @@ -39,20 +40,69 @@ class GitKernel(git.GitRepo): > self.__patches.append(patch) > > > - def install(self, host, build=True, builddir=None): > - # use tmpdir if no builddir specified > - # NB: pass a builddir to install() method if you > - # need to ensure the build remains after the completion > - # of a job > + def checkout(self, revision, local=None): > + """ > + Checkout the commit id, branch, or tag > + > + revision:str - name of the git remote branch, revision or tag > + local:str - name of the local branch, implies -b > + """ > + print 'checking out %s' % revision > + super(GitKernel, self).checkout(revision) > + self.__revision = super(GitKernel, self).get_revision() > + self.__branch = super(GitKernel, self).get_branch() > + print 'checked out %s on branch %s' % (self.__revision, > self.__branch) > + > + def show_branch(self): > + """ > + Print the current local branch name > + """ > + self.__branch = super(GitKernel, self).get_branch() > + print self.__branch > + > + > + def show_branches(self, all=True): > + """ > + Print the local and remote branches > + """ > + self.__branch = super(GitKernel, self).get_branch() > + print super(GitKernel, self).get_branch(all=all) > + > + > + def show_revision(self): > + """ > + Show the current git revision > + """ > + self.__revision = super(GitKernel, self).get_revision() > + print self.__revision > + > + > + def install(self, host, build=True, builddir=None, revision=None): > + """ > + Install the git tree in a host. > + > + @param host: Host object > + @param build: Whether to build the source tree > + @param builddir: Specify a build dir. If no build dir is > specified, > + the job temporary directory will be used, so the build > won't > + be persistent. > + @param revision: Desired commit hash. If ommited, will build from > HEAD > + of the branch. > + """ > + if revision: > + self.checkout(revision) > + self.__revision = super(GitKernel, self).get_revision() > + print 'checked out revision: %s' %(self.__revision) > + > if not builddir: > self.__build = os.path.join(host.get_tmp_dir(),"build") > print 'warning: builddir %s is not persistent' %(self.__build) > > # push source to host for install > - print 'pushing %s to host' %(self.source_material) > + print 'pushing %s to host' % self.source_material > host.send_file(self.source_material, self.__build) > remote_source_material= os.path.join(self.__build, > - os.path.basename(self.source_material)) > + > os.path.basename(self.source_material)) > > # use a source_kernel to configure, patch, build and install. > sk = source_kernel.SourceKernel(remote_source_material) > -- > 1.7.2.2 > >
_______________________________________________ Autotest mailing list [email protected] http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
