[cctbxbb] [git/cctbx] master: New command: libtbx.install (914c74bf1)

Pavel Afonine pafonine at lbl.gov
Tue Mar 13 04:04:57 PDT 2018


Just out of curiosity: what's your definition of "real world"?
Pavel

On 3/13/18 03:49, CCTBX commit wrote:
> Repository : ssh://g18-sc-serv-04.diamond.ac.uk/cctbx
> On branch  : master
>
> ------------------------------------------------------------------------
>
>
> commit 914c74bf195b5e5d4fa2c4145da3e5f89c7e5872
> Author: Markus Gerstel <markus.gerstel at diamond.ac.uk>
> Date:   Tue Mar 13 10:43:22 2018 +0000
>
>     New command: libtbx.install
>
>     This downloads and configures from a select list of cctbx/libtbxish
>     modules in a similar manner to pip in the real world. This will not
>     update or install any libraries in the base build, but assuming
>     those libraries are present libtbx.install should work.
>
>
> ------------------------------------------------------------------------
>
>
> 914c74bf195b5e5d4fa2c4145da3e5f89c7e5872
> libtbx/command_line/install.py | 118 
> +++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 118 insertions(+)
>
> diff --git a/libtbx/command_line/install.py 
> b/libtbx/command_line/install.py
> new file mode 100644
> index 000000000..47ad94eb5
> --- /dev/null
> +++ b/libtbx/command_line/install.py
> @@ -0,0 +1,118 @@
> +from __future__ import absolute_import, division, print_function
> +
> +import collections
> +import os
> +import sys
> +from optparse import SUPPRESS_HELP, OptionParser
> +
> +import procrunner
> +
> +import libtbx.load_env
> +from libtbx.auto_build.bootstrap import Toolbox
> +
> +# Basically 'pip' for selected libtbx/cctbx modules.
> +
> +
> +def is_source_repository(path):
> +  return (path / '.git').isdir() or (path / '.svn').isdir()
> +
> +def run(args):
> +  parser = OptionParser(usage="libtbx.install [package]",
> +                        description="Installs an additional cctbx 
> package")
> +  parser.add_option("-?", action="help", help=SUPPRESS_HELP)
> +  options, args = parser.parse_args(args)
> +
> +  modules_directory = list(filter(lambda dir: not 
> is_source_repository(dir), libtbx.env.repository_paths))
> +  if not modules_directory:
> +    sys.exit("No repository path candidate found. Can't install 
> modules without an installation root.")
> +  if len(modules_directory) > 1:
> +    print("More than one repository path candidate found.")
> +  installation_root = modules_directory[0]
> +  print("Using %s as installation root" % abs(installation_root))
> +
> +  packages_to_configure = set()
> +
> +  errors = False
> +  for package in args:
> +    if (installation_root / package).isdir():
> +      print("Skipping package %s: Directory already exists in 
> installation root" % package)
> +      errors = True
> +      continue
> +    if package not in warehouse:
> +      print("Skipping package %s: Never heard of this before" % package)
> +      errors = True
> +      continue
> +
> +    downloaded = False
> +    for mech, call in mechanisms.items():
> +      if mech in warehouse[package]:
> +        print("Attempting to obtain %s using %s..." % (package, 
> mech), end='')
> +        sys.stdout.flush()
> +        if call(abs(installation_root / package), 
> warehouse[package][mech]):
> +          assert (installation_root / package).isdir(), "Installation 
> failed"
> +          downloaded = True
> +          print("success")
> +          break
> +        else:
> +          assert not (installation_root / package).isdir(), "Install 
> mechanism %s did not fail cleanly" % mech
> +          print("failed")
> +    if not downloaded:
> +      print("Skipping package %s: Could not install" % package)
> +      errors = True
> +      continue
> +
> +    packages_to_configure.add(package)
> +
> +  if packages_to_configure:
> +    packages_to_configure = sorted(packages_to_configure)
> +    print("Configuring packages %s" % ", ".join(packages_to_configure))
> +    os.chdir(abs(libtbx.env.build_path))
> +    result = procrunner.run_process(['libtbx.configure'] + 
> packages_to_configure)
> +    if result['exitcode']: errors = True
> +
> +  if errors:
> +    sys.exit(1)
> +
> +def install_git(location, source):
> +  try:
> +    result = procrunner.run_process(['git', 'clone', '--recursive', 
> source, location], print_stdout=False, print_stderr=False)
> +    if result['exitcode']:
> +      return False
> +    Toolbox.set_git_repository_config_to_rebase(os.path.join(location, 
> '.git', 'config'))
> +    return True
> +  except OSError:
> +    return False # git may not be installed
> +
> +def install_zip(location, source):
> +  os.mkdir(location)
> +  tempfile = os.path.join(location, '.tmp.zip')
> +  etagfile = os.path.join(location, '..tmp.zip.etag')
> +  def cleanup():
> +    try: os.remove(tempfile)
> +    except OSError: pass
> +    try: os.remove(etagfile)
> +    except OSError: pass
> +  if Toolbox.download_to_file(source['url'], tempfile) <= 0:
> +    cleanup()
> +    os.rmdir(location)
> +    return False
> +  Toolbox.unzip(tempfile, location, trim_directory=source.get('trim', 0))
> +  cleanup()
> +  return True
> +
> +mechanisms = collections.OrderedDict((
> +  ('git-auth', install_git),
> +  ('git-anon', install_git),
> +  ('http-zip', install_zip),
> +))
> +
> +warehouse = {
> +  'i19': {
> +    'git-auth': 'git at github.com:/xia2/i19',
> +    'git-anon': 'https://github.com/xia2/i19.git',
> +    'http-zip': { 'url': 
> 'https://github.com/xia2/i19/archive/master.zip', 'trim': 1 },
> +  },
> +}
> +
> +if __name__ == '__main__':
> +  run(sys.argv[1:])

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://phenix-online.org/pipermail/cctbxbb/attachments/20180313/05f6272e/attachment.htm>


More information about the cctbxbb mailing list