On Fri, 2012-07-06 at 12:05 -0400, Don Zickus wrote: > This adds git as a new fetcher. Git is great for fetching tarballs directly > from > its source tree using git-archive. This method allows us to skip packaging > tests > into tar.bz2 and instead grab them directly from a branch or commit or tag. > > Underneath the command looks like: > > git archive --remote=git://<git-site>/users/dzickus/autotest-tests -o don.tar > master testsuite > > This would download everything under the directory testsuite into don.tar and > autotest would > install it locally for use. > > All the local control file would need to do is add a git repo using > > job.add_repository(git://<git-location>:[<branch>]) > > where <branch> is assumed to be master if not specified. > > Tested by creating a git tree with all the autotest tests in there and using > a local > control file to fetch them.
Ok, looks good, minor comments follow: > Signed-off-by: Don Zickus <dzic...@redhat.com> > --- > client/shared/base_packages.py | 80 > ++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 80 insertions(+), 0 deletions(-) > > diff --git a/client/shared/base_packages.py b/client/shared/base_packages.py > index 12e4df1..478bc77 100644 > --- a/client/shared/base_packages.py > +++ b/client/shared/base_packages.py > @@ -233,6 +233,84 @@ class HttpFetcher(RepositoryFetcher): > > package_url)) > > > +class GitFetcher(RepositoryFetcher): > + #need remote_url, output file, <branch>:<file name> > + git_archive_cmd_pattern = 'git archive --remote=%s -o %s %s' > + > + > + def __init__(self, package_manager, repository_url): > + """ > + @param repository_url: The base URL of the http repository > + """ > + > + #do we have branch info in the repoistory_url? > + branch = "master" > + match = repository_url.split(":") > + if len(match) > 2: > + #we have a branch > + branch = match[2] > + repository_url = re.sub(":" + branch, "", repository_url) > + > + logging.debug('GitFetcher initialized with repo=%s and branch=%s' % > (repository_url, branch)) > + self.run_command = package_manager._run_command > + self.url = repository_url > + self.branch = branch > + self.pkgmgr = package_manager > + > + def install_pkg_setup(self, name, fetch_dir, install): > + if not install: > + return (name, fetch_dir) > + > + pkg_name = "%s.tar" % re.sub("/","_", name) > + fetch_path = os.path.join(fetch_dir, pkg_name) > + return pkg_name, fetch_path > + > + def fetch_pkg_file(self, filename, dest_path): > + """git is an SCM, you can download the test directly. No need to > + fetch a bz2'd tarball file. However 'filename' is > <type>-<name>.tar.bz2 > + break this up and only fetch <name> > + """ > + logging.info('Fetching %s from %s to %s', filename, self.url, > + dest_path) > + > + # try to retrieve the package via http > + package_path = self.branch + " " + filename > + try: > + cmd = self.git_archive_cmd_pattern % (self.url, dest_path, > package_path) > + result = self.run_command(cmd) > + > + file_exists = self.run_command( > + 'ls %s' % dest_path, > + _run_command_dargs={'ignore_status': True}).exit_status == 0 ^ This is more precisely expressed as 'test -f %s' % dest_path > + if not file_exists: > + logging.error('git archive failed: %s', result) > + raise error.CmdError(cmd, result) > + > + logging.debug('Successfully fetched %s from %s', package_path, > + self.url) > + except error.CmdError: > + # remove whatever junk was retrieved when the get failed > + #self.run_command('rm -f %s' % git_dest_path) ^ Let's remember to remove the commented out lines > + > + raise error.PackageFetchError('%s not found in %s' % (filename, > + > package_path)) > + > + > + def install_pkg_post(self, filename, fetch_dir, install_dir, > preserve_install_dir=False): > + # untar the package into install_dir and > + # update the checksum in that directory > + #if not preserve_install_dir: > + # Make sure we clean up the install_dir > + # self.pkgmgr._run_command('rm -rf %s' % install_dir) ^ Same here > + #unlike the normal install path, git populates a path to its test > + #in the tarball it produces, remove that path from the install_dir > + install_path = re.sub(filename, "", install_dir) > + pkg_name = "%s.tar" % re.sub("/","_", filename) > + fetch_path = os.path.join(fetch_dir, pkg_name) > + self.pkgmgr._run_command('tar -xf %s -C %s' % (fetch_path, > install_path)) > + > + > class LocalFilesystemFetcher(RepositoryFetcher): > def __init__(self, package_manager, local_dir): > self.run_command = package_manager._run_command > @@ -331,6 +409,8 @@ class BasePackageManager(object): > def get_fetcher(self, url): > if url.startswith('http://'): > return HttpFetcher(self, url) > + elif url.startswith('git://'): > + return GitFetcher(self, url) > else: > return LocalFilesystemFetcher(self, url) > _______________________________________________ Autotest mailing list Autotest@test.kernel.org http://test.kernel.org/cgi-bin/mailman/listinfo/autotest