From 7446c32197e01407a7df703e28efbdeda282a03d Mon Sep 17 00:00:00 2001
From: Ian Wienand <iwienand@redhat.com>
Date: Wed, 20 Jul 2016 01:48:32 +0000
Subject: [PATCH] Move diskimage-image-create to an entry point

It has always been a weird thing that dib is a python package, but
is totally driven by the disk-image-create script.  It creates this
strange division that is hard to explain.

This moves disk-image-create to a regular python entry-point

Currently, this simply exec()s the original disk-image-create script.

However, we now have a (private) interface between disk-image-create
written in python and the driver shell script.  Here's some things we
could do, for example:

* Argument parsing is generally nicer in Python, and then end result
  is mostly just setting environment variables to flag different things
  in the shell script.  I could see us moving the argument-parsing into
  diskimage_builder.disk_image_create:main() and just setting things in
  os.environ before the exec()).

* I7092e1845942f249175933d67ab121188f3511fd sets IMAGE_ELEMENT_YAML in
  disk-image-create by calling-back to element-info.  We can just call
  element_dependencies.find_all_elements() in here an export is to
  os.environ before disk-image-create starts.

* remove need for ramdisk-image-create symlink by just exporting
  IS_RAMDISK based on sys.argv[1] value

* you could even unit test some of this :)

Change-Id: I69ca3d26fede0506a6353c077c69f735c8d84d28
---
 MANIFEST.in                                   |  4 --
 bin/diskimage_builder                         |  1 -
 diskimage_builder/disk_image_create.py        | 46 +++++++++++++++++++
 .../lib}/disk-image-create                    |  9 ++--
 .../lib}/ramdisk-image-create                 |  0
 diskimage_builder/paths.py                    | 12 +++--
 setup.cfg                                     |  4 +-
 tests/run_functests.sh                        |  5 +-
 8 files changed, 63 insertions(+), 18 deletions(-)
 delete mode 120000 bin/diskimage_builder
 create mode 100644 diskimage_builder/disk_image_create.py
 rename {bin => diskimage_builder/lib}/disk-image-create (99%)
 rename {bin => diskimage_builder/lib}/ramdisk-image-create (100%)

diff --git a/MANIFEST.in b/MANIFEST.in
index 858ab9d5e..9561fb106 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,5 +1 @@
-include bin/disk-image-create
-include bin/ramdisk-image-create
-graft lib
-graft elements
 include README.rst
diff --git a/bin/diskimage_builder b/bin/diskimage_builder
deleted file mode 120000
index ac949dc60..000000000
--- a/bin/diskimage_builder
+++ /dev/null
@@ -1 +0,0 @@
-../diskimage_builder
\ No newline at end of file
diff --git a/diskimage_builder/disk_image_create.py b/diskimage_builder/disk_image_create.py
new file mode 100644
index 000000000..1727c8c43
--- /dev/null
+++ b/diskimage_builder/disk_image_create.py
@@ -0,0 +1,46 @@
+# Copyright 2016 Ian Wienand (iwienand@redhat.com)
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+# Python Logging Configuration for DIB
+# Usage:
+# In the main (application) file, do an
+#   import logging_config
+#   ...
+#   logging_config.setup()
+# It is then possible to use the normal python logging interface, like
+#   logger = logging.getLogger(__name__)
+#   logger.info("Info Message")
+
+import os
+import os.path
+import sys
+
+import diskimage_builder.paths
+
+
+def main():
+    environ = os.environ
+
+    # pre-seed some paths for the shell script
+    environ['_LIB'] = diskimage_builder.paths.get_path('lib')
+
+    # we have to handle being called as "disk-image-create" or
+    # "ramdisk-image-create".  ramdisk-iamge-create is just a symlink
+    # to disk-image-create
+    # XXX: we could simplify things by removing the symlink, and
+    # just setting IS_RAMDISK in environ here depending on sys.argv[1]
+    script = "%s/%s" % (diskimage_builder.paths.get_path('lib'),
+                        os.path.basename(sys.argv[0]))
+
+    os.execve("/bin/bash", ['bash', script] + sys.argv[1:], environ)
diff --git a/bin/disk-image-create b/diskimage_builder/lib/disk-image-create
similarity index 99%
rename from bin/disk-image-create
rename to diskimage_builder/lib/disk-image-create
index 086c04242..816858b3f 100755
--- a/bin/disk-image-create
+++ b/diskimage_builder/lib/disk-image-create
@@ -26,13 +26,14 @@ export DIB_ENV=$(export | grep ' DIB_.*=')
 
 SCRIPTNAME=$(basename $0)
 
-export _LIB=$(python -c '
-import diskimage_builder.paths
-diskimage_builder.paths.get_path("lib")')
+if [ -z "$_LIB" ]; then
+    echo "_LIB not set!"
+    exit 1
+fi
 
 _BASE_ELEMENT_DIR=$(python -c '
 import diskimage_builder.paths
-diskimage_builder.paths.get_path("elements")')
+diskimage_builder.paths.show_path("elements")')
 
 source $_LIB/die
 
diff --git a/bin/ramdisk-image-create b/diskimage_builder/lib/ramdisk-image-create
similarity index 100%
rename from bin/ramdisk-image-create
rename to diskimage_builder/lib/ramdisk-image-create
diff --git a/diskimage_builder/paths.py b/diskimage_builder/paths.py
index 18f2028ea..857bad400 100644
--- a/diskimage_builder/paths.py
+++ b/diskimage_builder/paths.py
@@ -21,11 +21,15 @@ import sys
 
 def get_path(var):
     if var == "lib":
-        print(os.path.abspath(
-            pkg_resources.resource_filename(__name__, "lib")))
+        return os.path.abspath(
+            pkg_resources.resource_filename(__name__, "lib"))
     elif var == "elements":
-        print(os.path.abspath(
-            pkg_resources.resource_filename(__name__, "elements")))
+        return os.path.abspath(
+            pkg_resources.resource_filename(__name__, "elements"))
     else:
         print("Unknown path request!")
         sys.exit(1)
+
+
+def show_path(var):
+    print(get_path(var))
diff --git a/setup.cfg b/setup.cfg
index 2fdb2b220..4c5e9357f 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -27,8 +27,6 @@ packages =
 # real file on install; see lp bug #1212482
 scripts =
     bin/dib-lint
-    bin/disk-image-create
-    bin/ramdisk-image-create
 data_files =
     share/diskimage-builder/scripts = scripts/*
 
@@ -56,3 +54,5 @@ universal = 1
 console_scripts =
     element-info = diskimage_builder.element_dependencies:main
     dib-block-device = diskimage_builder.block_device:main
+    disk-image-create = diskimage_builder.disk_image_create:main
+    ramdisk-image-create = diskimage_builder.disk_image_create:main
diff --git a/tests/run_functests.sh b/tests/run_functests.sh
index 75093c54e..c04d551ef 100755
--- a/tests/run_functests.sh
+++ b/tests/run_functests.sh
@@ -4,11 +4,10 @@ set -eu
 set -o pipefail
 
 BASE_DIR=$(cd $(dirname "$0")/.. && pwd)
-export DIB_CMD=$BASE_DIR/bin/disk-image-create
+export DIB_CMD=disk-image-create
 export DIB_ELEMENTS=$(python -c '
 import diskimage_builder.paths
-diskimage_builder.paths.get_path("elements")')
-
+diskimage_builder.paths.show_path("elements")')
 
 #
 # Default skip tests