]> git.ipfire.org Git - ipfire-3.x.git/commitdiff
naoki: Re-add shell function.
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 6 Sep 2010 21:05:51 +0000 (23:05 +0200)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 6 Sep 2010 21:05:51 +0000 (23:05 +0200)
naoki/__init__.py
naoki/build.py
naoki/constants.py
naoki/deps.py
naoki/environ.py
naoki/paks.py
naoki/terminal.py
pkgs/Targets
tools/chroot-shell

index 4a87ce88f830442f6cbfbf1da7a126398f7f7720..fbaaaa2932088e8a585105c79d7dd1d3480fc484 100644 (file)
@@ -10,6 +10,7 @@ import time
 import backend
 import build
 import chroot
+import environ
 import logger
 import repo
 import terminal
@@ -225,32 +226,13 @@ Release       : %(release)s
                        os.remove(os.path.join(TARBALLDIR, file))
 
        def call_shell(self, args):
-               environ = chroot.ShellEnvironment(naoki=self)
+               p = repo.find_source_package(args.package)
+               if not p:
+                       raise Exception, "Could not find package: %s" % args.package
 
-               actionmap = {
-                       "clean" : self.call_shell_clean,
-                       "extract" : self.call_shell_extract,
-                       "enter" : self.call_shell_enter,
-               }
-
-               if args.action.name in ("enter", "execute"):
-                       environ.init(clean=False)
-
-               return actionmap[args.action.name](environ, args.action)
-
-       def call_shell_clean(self, environ, args):
-               return environ.clean()
-
-       def call_shell_extract(self, environ, args):
-               if args.packages == ["all"]:
-                       args.packages = backend.get_package_names()
-
-               packages = backend.parse_package(args.packages, naoki=self)
-               for package in backend.depsolve(packages, recursive=True):
-                       package.getPackage(self).extract(environ.chrootPath())
+               build_set = build.BuildSet(p)
 
-       def call_shell_enter(self, environ, args):
-               return environ.shell()
+               return build_set.shell()
 
        def call_repository(self, args):
                actionmap = {
index 1a36bd0859d8a24010b38d544146a77f3a6e97f1..5489db8f85f560c707ca04a5d2505052d194a5f9 100644 (file)
@@ -5,6 +5,7 @@ import logging
 import deps
 import environ
 
+from constants import *
 from exception import *
 
 class BuildSet(object):
@@ -18,6 +19,15 @@ class BuildSet(object):
        def __repr__(self):
                return "<%s %s>" % (self.__class__.__name__, self.package.name)
 
+       def _resolve(self, ignore_errors=False):
+               try:
+                       self.dependency_set.resolve()
+               except DependencyResolutionError, e:
+                       if ignore_errors:
+                               logging.warning("Ignoring dependency errors: %s" % e)
+                       else:
+                               raise
+
        @property
        def arch(self):
                return self.package.arch
@@ -27,21 +37,32 @@ class BuildSet(object):
                logging.info("    %s" % self.package.summary)
                logging.info("")
 
-       def run(self, ignore_dependency_errors=False):
+       def build(self, ignore_dependency_errors=False):
                logging.debug("Running build process for %s" % self)
                self.print_info()
 
-               try:
-                       self.dependency_set.resolve()
-               except DependencyResolutionError, e:
-                       if ignore_dependency_errors:
-                               logging.warning("Ignoring dependency errors: %s" % e)
-                       else:
-                               raise
+               self._resolve(ignore_errors=ignore_dependency_errors)
 
                env = environ.Environment(self)
                env.build()
 
+       run = build
+
+       def shell(self):
+               logging.debug("Running shell for %s" % self)
+               self.print_info()
+
+               # Add some packages that are kind of nice in a shell
+               # like an editor and less...
+               for dependency in [deps.Dependency(d) for d in config["shell_packages"]]:
+                       logging.debug("Adding shell dependency: %s" % dependency)
+                       self.dependency_set.add_dependency(dependency)
+
+               self._resolve()
+
+               env = environ.Shell(self)
+               env.shell()
+
 
 class Builder(object):
        def __init__(self):
@@ -66,3 +87,4 @@ class Builder(object):
 
                        # Run the actual build
                        i.run(*args, **kwargs)
+
index 878f02d75a6e37a7c82f2715e0ef07817224ee2e..86e625c745892892f300c2cbe52b5e1ef95bd983 100644 (file)
@@ -65,6 +65,11 @@ class Config(object):
                        "tar",
                        "xz",
                ],
+               "shell_packages" : [
+                       "/bin/bash",
+                       "less",
+                       "vim",
+               ],
                "nice_level" : 0,
                "parallelism" : calc_parallelism(),
                #
index ebae22cf04b684976e64e8b8be227901b1bbb8e9..cbe8332801621dade27e78a3618d698eef0d8633 100644 (file)
@@ -110,7 +110,7 @@ class DependencySet(object):
        def resolve(self):
                logging.debug("Resolving %s" % self)
 
-               self.reset()
+               #self.reset()
 
                # Always add the default packages
                _dependencies = [Dependency(i) for i in config["mandatory_packages"]]
index d8e3cd187401d24e9127fd1134b03af989b22a6c..d3de724e514378d52c1c4d620a339369bf90a3af 100644 (file)
@@ -301,3 +301,34 @@ class Environment(object):
                        "mount -n -t tmpfs naoki_chroot_shmfs %s" % self.chrootPath("dev", "shm")])
 
                return ret
+
+
+class Shell(Environment):
+       def shell(self, args=[]):
+               self.extract()
+
+               # Preparing source...
+               self.make("prepare")
+
+               command = "chroot %s /usr/src/tools/chroot-shell %s" % \
+                       (self.chrootPath(), " ".join(args))
+
+               for key, val in self.environ.items():
+                       command = "%s=\"%s\" " % (key, val) + command
+
+               if self.package.source_dir:
+                       command = "SOURCE_DIR=%s %s" % (self.package.source_dir, command)
+
+               logging.debug("Shell command: %s" % command)
+
+               try:
+                       self._mountall()
+
+                       shell = os.system(command)
+                       return os.WEXITSTATUS(shell)
+
+               finally:
+                       self._umountall()
+
+                       # Clean up the environment
+                       self.clean()
index 3a6d875698b7486613cfe53966666fceb751d179..26795420c0b9a291467abe80eba5935aa8235873 100644 (file)
@@ -87,6 +87,10 @@ class SourcePackage(Package):
        def summary(self):
                return self._info["PKG_SUMMARY"]
 
+       @property
+       def source_dir(self):
+               return self._info.get("SOURCE_DIR", "")
+
 
 class BinaryPackage(Package):
        def __init__(self, filename):
index bdf6b2a51fbd955b221339cf206433b276df6b2c..ca794fff99286c467bebba24e5cafce53ade11ff 100644 (file)
@@ -349,14 +349,8 @@ class Commandline(object):
                                # Shell
                                Parser("shell",
                                        help="Shell environment",
-                                       parsers=[
-                                               Parser("clean", help="Cleanup the environment"),
-                                               Parser("extract",
-                                                       help="Extract packages",
-                                                       arguments=[
-                                                               List("packages", help="Give a list of packages")
-                                                       ]),
-                                               Parser("enter", help="Enter into environment"),
+                                       arguments=[
+                                               Argument("package", help="Package to process."),
                                        ]),
 
                                # Repository
index dbb0d2d5818b2e54bc86c92dd77b1e4c73263fe3..0ee051c8aecc6e96307c77453e0cf30cbe477c68 100644 (file)
@@ -22,6 +22,7 @@ info:
        @echo "PKG_REL=\"$(PKG_REL)\""
        @echo "PKG_SUMMARY=\"$(strip $(PKG_SUMMARY))\""
        @echo "PKG_URL=\"$(PKG_URL)\""
+       @echo "SOURCE_DIR=\"$(DIR_APP)\""
 
 $(OBJECTS):
        @echo "Object file \"$@\" is required." >&2
index e9ab9e05280e70506ab2930691707ad4fd2859fe..48833ef323fd4e18f2d38ba3b6530e078d6266c8 100755 (executable)
@@ -16,6 +16,9 @@ EOF
 export PS1="naoki-chroot \w> "
 
 # Change to directory the user will most likely work in
-cd /usr/src
+if [ -z "${SOURCE_DIR}" ]; then
+       SOURCE_DIR="/usr/src"
+fi
+cd "${SOURCE_DIR}"
 
 exec /bin/bash --login