diff options
-rw-r--r-- | cbc/__init__.py | 3 | ||||
-rw-r--r-- | cbc/exceptions.py | 3 | ||||
-rw-r--r-- | cbc/meta.py | 2 | ||||
-rw-r--r-- | cbc/server.py | 31 | ||||
-rw-r--r-- | cbcbuild.py | 41 |
5 files changed, 49 insertions, 31 deletions
diff --git a/cbc/__init__.py b/cbc/__init__.py index 4dbca99..150b0f4 100644 --- a/cbc/__init__.py +++ b/cbc/__init__.py @@ -1,3 +1,4 @@ from . import environment
from . import meta
-from . import server
\ No newline at end of file +from . import server
+from . import utils
\ No newline at end of file diff --git a/cbc/exceptions.py b/cbc/exceptions.py index 7acf55f..dc6128f 100644 --- a/cbc/exceptions.py +++ b/cbc/exceptions.py @@ -2,4 +2,7 @@ class IncompleteEnv(Exception): pass
class MetaDataError(Exception):
+ pass
+
+class CondaBuildError(Exception):
pass
\ No newline at end of file diff --git a/cbc/meta.py b/cbc/meta.py index f7065c8..ed1baaa 100644 --- a/cbc/meta.py +++ b/cbc/meta.py @@ -5,7 +5,7 @@ And yeah, conda supports Jinja2, but ugh... No. import os
import conda_build.metadata
import yaml
-from configparser import SafeConfigParser, ExtendedInterpolation, ConfigParser
+from configparser import SafeConfigParser, ExtendedInterpolation
from collections import OrderedDict
from .environment import Environment
from .exceptions import MetaDataError
diff --git a/cbc/server.py b/cbc/server.py index 37355ed..1598302 100644 --- a/cbc/server.py +++ b/cbc/server.py @@ -1,3 +1,4 @@ +import argparse import os import http.server import socketserver @@ -24,17 +25,31 @@ class FileServer(object): if run: self.run() - def run(self): + def run(self, forever=False): os.chdir(self.root) socketserver.TCPServer.allow_reuse_address = True self.httpd = Server(('localhost', self.port), self.handler, True) - #self.httpd.allow_reuse_address = True - #self.httpd.server_bind() - #self.httpd.server_activate() print('{0} active on port {1} ({2})'.format(self.__class__.__name__, self.port, self.root)) - - th = Thread(target=self.httpd.handle_request, args=(), daemon=True) - th.start() + if not forever: + self.httpd.handle_request() + else: + self.httpd.serve_forever() + self.close() def close(self): - self.httpd.server_close()
\ No newline at end of file + self.httpd.server_close() + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('-r', '--root', default=os.path.abspath(os.curdir), help='Path to files') + parser.add_argument('-p', '--port', type=int, default=8888, help='TCP port') + parser.add_argument('-s', '--single', action='store_false') + args = parser.parse_args() + + fileserver = FileServer(args.port, args.root) + fileserver.run(forever=args.single) + + + + +
\ No newline at end of file diff --git a/cbcbuild.py b/cbcbuild.py index fbdf017..35453e5 100644 --- a/cbcbuild.py +++ b/cbcbuild.py @@ -6,43 +6,42 @@ import conda_build.metadata import conda_build.build import argparse import time -from subprocess import check_output, CalledProcessError +from cbc.exceptions import CondaBuildError parser = argparse.ArgumentParser() parser.add_argument('cbcfile', action='store', nargs='*', help='Build configuration file') - -input_test = ['tests/data/astropy-helpers.ini', 'tests/data/astropy.ini'] -#input_test = ['tests/data/d2to1.ini'] -args = parser.parse_args(input_test) +args = parser.parse_args() os.environ['CBC_HOME'] = 'tests/data/build' env = cbc.environment.Environment() +# Convert cbcfile paths to absolute paths +args.cbcfile = [ os.path.abspath(x) for x in args.cbcfile ] +# Verify we have a file that exists +for cbcfile in args.cbcfile: + if not os.path.exists(cbcfile): + print('{} does not exist.'.format(cbcfile)) + exit(1) + elif not os.path.isfile(cbcfile): + print('{} is not a file.'.format(cbcfile)) + exit(1) + +# Perform build(s) for cbcfile in args.cbcfile: - # Ensure the working directory remains stable per build. + # Ensure the working directory remains the same throughout. os.chdir(env.pwd) metadata = cbc.meta.MetaData(cbcfile, env) - metadata.env.mkpkgdir(metadata.local['package']['name']) + metadata.env.mkpkgdir(metadata.local['package']['name']) metadata.render_scripts() conda_metadata = conda_build.metadata.MetaData(env.pkgdir) - if 'cbc_cgi' in metadata.local_metadata: - if metadata.local_metadata['cbc_cgi']['local_server']: - fileserver = cbc.server.FileServer(metadata.local_metadata['cbc_cgi']['local_port'], - metadata.local_metadata['cbc_cgi']['local_sources'], - run=True) + if cbc.utils.conda_search(conda_metadata.name()) == conda_metadata.dist(): + print('{0} metadata matches an installed package; increment the build number to rebuild.'.format(conda_metadata.dist())) + continue conda_build.build.build(conda_metadata, get_src=True, verbose=True) - - # Until I can figure out a good way to build with the conda API - # we'll use the CLI: - command = 'conda install --use-local --yes {0}'.format(conda_metadata.name()).split() - try: - for line in (check_output(command).decode('utf-8').splitlines()): - print(line) - except CalledProcessError as cpe: - print('{0} exit={1}'.format(cpe.cmd, cpe.returncode)) + cbc.utils.conda_install(conda_metadata.name())
\ No newline at end of file |