aboutsummaryrefslogtreecommitdiff
path: root/ips
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunk@stsci.edu>2013-04-22 11:17:44 -0400
committerJoseph Hunkeler <jhunk@stsci.edu>2013-04-22 11:19:34 -0400
commitf2288e48380a5557a49151fc95ee121baff65b56 (patch)
tree0592592bcb1f90ccc713c1c8ecf8d25ed93f1d15 /ips
parent2027d81c8662e616f5255a83242dc62cae1cc50a (diff)
downloadipsutils-f2288e48380a5557a49151fc95ee121baff65b56.tar.gz
Rename ips to ipsutils
Diffstat (limited to 'ips')
-rw-r--r--ips/__init__.py7
-rw-r--r--ips/build.py156
-rw-r--r--ips/config.py72
-rw-r--r--ips/env.py73
-rw-r--r--ips/task.py44
-rw-r--r--ips/test.py0
-rw-r--r--ips/tpl/__init__.py20
-rw-r--r--ips/tpl/metadata.tpl7
8 files changed, 0 insertions, 379 deletions
diff --git a/ips/__init__.py b/ips/__init__.py
deleted file mode 100644
index 0ca8f44..0000000
--- a/ips/__init__.py
+++ /dev/null
@@ -1,7 +0,0 @@
-from . import env
-from . import config
-from . import build
-from . import task
-
-if __name__ == '__main__':
- pass \ No newline at end of file
diff --git a/ips/build.py b/ips/build.py
deleted file mode 100644
index f402019..0000000
--- a/ips/build.py
+++ /dev/null
@@ -1,156 +0,0 @@
-# This file is part of ipsutils.
-
-# ipsutils is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# ipsutils is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with ipsutils. If not, see <http://www.gnu.org/licenses/>.
-
-from . import env, task
-from pprint import pprint
-import os
-import shutil
-import subprocess
-import string
-from . import tpl
-
-
-class Build(env.Environment):
- def __init__(self, ipsfile):
- # Parent Config parses configuration data in .ips file
- # Inherited members are used to populate package information
- # as well as build tasks
- super(Build, self).__init__(ipsfile)
-
- os.chdir(self.env['IPSBUILD'])
- # Create list of build tasks
- ordered_tasks = ['prep', 'build', 'install']
- self.controller = task.TaskController()
-
- # Assign built-in IPS tasks
- self.controller.task(task.NamedTask('Extract source', self.source_unpack))
- self.controller.task(task.NamedTask('Create buildroot', self.create_buildroot))
- self.controller.task(task.NamedTask('Create metadata', self.create_metadata))
-
- # Assign user defined .ips tasks in build order
- for user_task in ordered_tasks:
- self.controller.task(task.NamedTask(user_task, self.exec_scripted_process, self.script_dict[user_task]))
-
- def exec_scripted_process(self, *p):
- """Execute script in .ips
- This function needs to be rewritten BAD
-
- p: tuple of function arguments
- """
- # All execution occurs from within the build directory.
- # This includes all installation-like tasks
- os.chdir(self.env_pkg['BUILD'])
- for t in map(list, p):
- for i in t:
- if not i:
- continue
- for e in i:
- # Variable expansion occurs here. Unfortunately, env_pkg is NOT available
- # from within the configuration class
- t = string.Template(string.join(e))
- e = t.safe_substitute(self.env_pkg)
- print("+ {0:s}".format(e))
- # Using "shell" is dangerous, but we're in the business of danger... right?
- output = subprocess.check_output(e, shell=True)
- if output:
- print("+ {0:s}".format(output).rstrip('\n'))
- os.chdir(self.env['IPSBUILD'])
- return True
-
- def source_unpack(self, *p):
- path = os.path.relpath(self.env_pkg['SOURCES'], self.env['IPSBUILD'])
- if not os.path.exists(path):
- print("{0:s}: does not exist".format(path))
- return False
-
- ext = {
- '.tar': '{0:s} xf {1:s} -C {2:s}'.format(self.tool['tar'], path, self.env['BUILD']),
- '.tar.gz': '{0:s} xfz {1:s} -C {2:s}'.format(self.tool['tar'], path, self.env['BUILD']),
- '.tar.bz2': '{0:s} xfj {1:s} -C {2:s}'.format(self.tool['tar'], path, self.env['BUILD']),
- '.tar.xz': '{0:s} xfJ {1:s} -C {2:s}'.format(self.tool['tar'], path, self.env['BUILD']),
- '.gz': self.tool['gunzip'],
- '.bz2': self.tool['bunzip'],
- '.zip': self.tool['unzip']
- }
- cmd = []
- for k, v in ext.items():
- if k in path:
- cmd = v.split()
- print(string.join(cmd))
- subprocess.check_output(cmd)
- break
- return True
-
- def create_buildroot(self, *p):
- """Destroy/Create BUILDROOT per execution to keep the envrionment stable
-
- p: tuple of function arguments
- """
- path = self.env_pkg['BUILDROOT']
- if os.path.exists(path):
- shutil.rmtree(path)
- os.mkdir(path)
- return True
-
- def create_metadata(self, *p):
- output = []
- meta_map = {
- 'pkg.fmri': self.key_dict['name'],
- 'pkg.description': self.key_dict['description'],
- 'pkg.summary': self.key_dict['summary'],
- 'variant.arch': self.key_dict['arch'],
- 'info.upstream_url': self.key_dict['upstream_url'],
- 'info.source_url': self.key_dict['source_url'],
- 'info.classification': self.key_dict['classification']
- }
-
- # Perform manifest template mapping and expansion
- template = file(tpl.metadata, 'r')
- for line in template.readlines():
- for k, v in meta_map.items():
- if k in line:
- # pkg.fmri requires special attention to build the proper
- # package name IPS wants
- if k == 'pkg.fmri':
- output.append(line.replace('{}',
- self.key_dict['group'] +
- "/" +
- self.key_dict['name'] +
- "@" +
- self.key_dict['version'] +
- "," +
- self.key_dict['release']
- ))
- continue
- # The rest of the value replacements are rather simple
- output.append(line.replace('{}', v))
- template.close()
-
- # Generate intial IPS manifest file in buildroot
- manifest = file(os.path.join(self.env_pkg['BUILDROOT'], self.complete_name + '.p5m.1'), 'w+')
- for line in output:
- manifest.writelines(line)
- print(manifest.name)
- manifest.close()
- return True
-
- def create_package_list(self, *p):
- pass
-
-
- def show_summary(self):
- print("Summary of {0:s}".format(self.key_dict['name']))
- for k, v in sorted(self.key_dict.items()):
- print("+ {0:s}: {1:s}".format(k, v))
diff --git a/ips/config.py b/ips/config.py
deleted file mode 100644
index fe9adca..0000000
--- a/ips/config.py
+++ /dev/null
@@ -1,72 +0,0 @@
-# This file is part of ipsutils.
-
-# ipsutils is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# ipsutils is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with ipsutils. If not, see <http://www.gnu.org/licenses/>.
-import shlex
-import string
-
-class Config(object):
- def __init__(self, ipsfile):
- super(Config, self).__init__()
- key_dict = {
- 'name': '',
- 'version': '',
- 'release': '',
- 'maintainer': '',
- 'group': '',
- 'upstream_url': '',
- 'source_url': '',
- 'description': '',
- 'summary': '',
- 'classification': '',
- 'arch': '',
- 'license': ''
- }
-
- script_dict = {
- 'build': [],
- 'prep': [],
- 'install': [],
- 'files': []
- }
-
- expandable = []
- for line in file(ipsfile).readlines():
- parts = shlex.split(line)
- t = string.Template(parts)
- expandable.append(t)
-
- for key in key_dict:
- for line in file(ipsfile).readlines():
- parts = shlex.split(line)
- if key + ":" in parts:
- key_dict[key] = parts[1]
-
- found_data = False
- code_section = ['%build', '%prep', '%install']
-
- for section in code_section:
- for line in file(ipsfile).readlines():
- if line.startswith('#'):
- continue
- parts = shlex.split(line)
- if '%end' in parts:
- found_data = False
- if section in parts:
- found_data = True
- continue
- if found_data:
- script_dict[section.strip('%')].append(parts)
-
- self.key_dict = key_dict
- self.script_dict = script_dict
diff --git a/ips/env.py b/ips/env.py
deleted file mode 100644
index cd5695d..0000000
--- a/ips/env.py
+++ /dev/null
@@ -1,73 +0,0 @@
-# This file is part of ipsutils.
-
-# ipsutils is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# ipsutils is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with ipsutils. If not, see <http://www.gnu.org/licenses/>.
-
-import os
-import sys
-from . import config
-
-
-class Environment(config.Config):
- def __init__(self, ipsfile):
- super(Environment, self).__init__(ipsfile)
-
- # Platform specific ipsbuild directory assignment
- if sys.platform == 'linux2' \
- or sys.platform == 'sunos5':
- self.__basepath = os.path.join(os.environ['HOME'], 'ipsbuild')
- else:
- self.__basepath = os.path.join(os.environ['USERPROFILE'], 'ipsbuild')
-
- # Dictionary of top-level directories
- self.env = {
- 'IPSBUILD': self.pathgen(''),
- 'BUILDROOT': self.pathgen('BUILDROOT'),
- 'BUILD': self.pathgen('BUILD'),
- 'SPECS': self.pathgen('SPECS'),
- 'SOURCES': self.pathgen('SOURCES'),
- 'PKGS': self.pathgen('PKGS'),
- 'SPKGS': self.pathgen('SPKGS')
- }
- # complete_name is required to build proper path names.
- # The use of "self" in this case may be deprecated in the future.
- self.complete_name = self.key_dict['name'] + '-' + self.key_dict['version']
- # Dictionary of package-leve directories
- self.env_pkg = {
- 'BUILDROOT': os.path.join(self.env['BUILDROOT'], self.complete_name),
- 'BUILD': os.path.join(self.env['BUILD'], self.complete_name),
- 'SOURCES': os.path.join(self.env['SOURCES'], os.path.basename(self.key_dict['source_url'])),
- 'PKGS': os.path.join(self.env['PKGS'], self.complete_name),
- 'SPKGS': os.path.join(self.env['SPKGS'], self.complete_name)
- }
-
- # Generic utility mapping for platform specific configuration.
- # Note: This is mainly to test script functionality on different platforms
- # even though this library is VERY VERY Solaris 11 specific
- self.tool = {
- 'tar': 'tar',
- 'unzip': 'unzip',
- 'gunzip': 'gunzip',
- 'bunzip': 'bunzip'
- }
-
- # Oracle tar is ancient. GNU tar is preferrred.
- if sys.platform == 'sunos5':
- self.tool['tar'] = 'gtar'
-
- def pathgen(self, path):
- """Simplify path generation based on "ipsbuild" base path
-
- path: directory leaf of 'ipsbuild' directory (in $HOME)
- """
- return os.path.join(self.__basepath, path)
diff --git a/ips/task.py b/ips/task.py
deleted file mode 100644
index 1d8faeb..0000000
--- a/ips/task.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# This file is part of ipsutils.
-
-# ipsutils is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# ipsutils is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with ipsutils. If not, see <http://www.gnu.org/licenses/>.
-
-class TaskController(object):
- def __init__(self):
- self.stack = []
-
- def task(self, t):
- """
- t: Task object
- """
- self.stack.append(t)
-
- def do_tasks(self):
- """ FILO execution of tasks
- """
- for stack_entry in self.stack:
- stack_entry.run()
-
-class NamedTask(object):
- def __init__(self, name, func, *args):
- self.name = name
- self.task = func
- self.task_args = args
-
- def run(self):
- print("Running task: {0:s}".format(self.name))
- status = self.task(self.task_args)
- return status
-
-class InternalTask(NamedTask):
- pass
diff --git a/ips/test.py b/ips/test.py
deleted file mode 100644
index e69de29..0000000
--- a/ips/test.py
+++ /dev/null
diff --git a/ips/tpl/__init__.py b/ips/tpl/__init__.py
deleted file mode 100644
index ea5bd8e..0000000
--- a/ips/tpl/__init__.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# This file is part of ipsutils.
-
-# ipsutils is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# ipsutils is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with ipsutils. If not, see <http://www.gnu.org/licenses/>.
-
-# I am not sure if this is proper, but needs to happen for metadata templating
-# to function properly
-import os
-metadata = os.path.normpath(os.path.join(os.path.dirname(__file__), 'metadata.tpl'))
-del os
diff --git a/ips/tpl/metadata.tpl b/ips/tpl/metadata.tpl
deleted file mode 100644
index 573fee3..0000000
--- a/ips/tpl/metadata.tpl
+++ /dev/null
@@ -1,7 +0,0 @@
-set name=pkg.fmri value={}
-set name=pkg.description value="{}"
-set name=pkg.summary value="{}"
-set name=variant.arch value={}
-set name=info.upstream_url value="{}"
-set name=info.source-url value="{}"
-set name=info.classification value="{}"