[Lldb-commits] [lldb] r254341 - Unpack the output on the client, completing the cycle.

Zachary Turner via lldb-commits lldb-commits at lists.llvm.org
Mon Nov 30 14:31:24 PST 2015


Author: zturner
Date: Mon Nov 30 16:31:24 2015
New Revision: 254341

URL: http://llvm.org/viewvc/llvm-project?rev=254341&view=rev
Log:
Unpack the output on the client, completing the cycle.

Modified:
    lldb/trunk/scripts/swig_bot_lib/client.py
    lldb/trunk/scripts/swig_bot_lib/local.py
    lldb/trunk/scripts/swig_bot_lib/remote.py
    lldb/trunk/scripts/swig_bot_lib/server.py

Modified: lldb/trunk/scripts/swig_bot_lib/client.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/swig_bot_lib/client.py?rev=254341&r1=254340&r2=254341&view=diff
==============================================================================
--- lldb/trunk/scripts/swig_bot_lib/client.py (original)
+++ lldb/trunk/scripts/swig_bot_lib/client.py Mon Nov 30 16:31:24 2015
@@ -133,7 +133,7 @@ def establish_remote_connection(ip_port)
     logging.info("Connection established...")
     return s
 
-def transmit_data(connection, packed_input):
+def transmit_request(connection, packed_input):
     logging.info("Sending {} bytes of compressed data."
                  .format(len(packed_input)))
     connection.sendall(struct.pack("!I", len(packed_input)))
@@ -144,6 +144,35 @@ def transmit_data(connection, packed_inp
     response = sockutil.recvall(connection, response_len)
     return response
 
+def handle_response(options, connection, response):
+    logging.debug("Received {} byte response.".format(len(response)))
+    logging.debug("Creating output directory {}"
+                    .format(options.target_dir))
+    os.makedirs(options.target_dir, exist_ok=True)
+
+    logging.info("Unpacking response archive into {}"
+                    .format(options.target_dir))
+    local.unpack_archive(options.target_dir, response)
+    response_file_path = os.path.normpath(
+        os.path.join(options.target_dir, "swig_output.json"))
+    if not os.path.isfile(response_file_path):
+        logging.error("Response file '{}' does not exist."
+                        .format(response_file_path))
+        return
+    try:
+        response = remote.deserialize_response_status(
+            io.open(response_file_path))
+        if response[0] != 0:
+            logging.error("An error occurred during generation.  Status={}"
+                            .format(response[0]))
+            logging.error(response[1])
+        else:
+            logging.info("SWIG generation successful.")
+            if len(response[1]) > 0:
+                logging.info(response[1])
+    finally:
+        os.unlink(response_file_path)
+
 def run(args):
     options = process_args(args)
 
@@ -176,10 +205,9 @@ def run(args):
             logging.info("(null) -> config.json")
             packed_input.writestr("config.json", config)
             packed_input.close()
-
             connection = establish_remote_connection(options.remote)
-            response = transmit_data(connection, zip_data.getvalue())
-            logging.debug("Received {} byte response.".format(len(response)))
+            response = transmit_request(connection, zip_data.getvalue())
+            handle_response(options, connection, response)
         finally:
             if connection is not None:
                 connection.close()
\ No newline at end of file

Modified: lldb/trunk/scripts/swig_bot_lib/local.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/swig_bot_lib/local.py?rev=254341&r1=254340&r2=254341&view=diff
==============================================================================
--- lldb/trunk/scripts/swig_bot_lib/local.py (original)
+++ lldb/trunk/scripts/swig_bot_lib/local.py Mon Nov 30 16:31:24 2015
@@ -44,44 +44,45 @@ def pack_archive(bytes_io, src_root, fil
     except RuntimeError:
         zip_file = zipfile.ZipFile(bytes_io, mode='w',
                                    compression=zipfile.ZIP_STORED)
+    archive_entries = []
+    if filters is not None:
+        def filter_func(t):
+            subfolder = t[0]
+            ext = t[1]
+            full_path = os.path.normpath(os.path.join(src_root, subfolder))
+            candidates = [os.path.normpath(os.path.join(full_path, f))
+                          for f in os.listdir(full_path)]
+            actual = filter(
+                lambda f : os.path.isfile(f) and os.path.splitext(f)[1] == ext,
+                candidates)
+            return (subfolder, map(lambda f : os.path.basename(f), actual))
+        archive_entries = map(filter_func, filters)
+    else:
+        for (root, dirs, files) in os.walk(src_root):
+            logging.debug("Adding files {} from directory {} to output package"
+                          .format(files, root))
+            if len(files) > 0:
+                rel_root = os.path.relpath(root, src_root)
+                archive_entries.append((rel_root, files))
 
-    def filter_func(t):
-        subfolder = t[0]
-        ext = t[1]
-        full_path = os.path.normpath(os.path.join(src_root, subfolder))
-        candidates = [os.path.normpath(os.path.join(full_path, f))
-                      for f in os.listdir(full_path)]
-        actual = filter(
-            lambda f : os.path.isfile(f) and os.path.splitext(f)[1] == ext,
-            candidates)
-        return (subfolder, map(lambda f : os.path.basename(f), actual))
-    archive_entries = map(filter_func, filters)
-
+    archive_entries = list(archive_entries)
     for entry in archive_entries:
         subfolder = entry[0]
-        files = entry[1]
+        files = list(entry[1])
         for file in files:
-            relative_path = os.path.normpath(os.path.join(subfolder, file))
-            full_path = os.path.normpath(
-                os.path.join(src_root, relative_path))
-            logging.info("{} -> {}".format(full_path, relative_path))
-            zip_file.write(full_path, relative_path)
+            rel_path = os.path.normpath(os.path.join(subfolder, file))
+            full_path = os.path.join(src_root, rel_path)
+            logging.info("{} -> {}".format(full_path, rel_path))
+            zip_file.write(full_path, rel_path)
 
     return zip_file
 
-def unpack_archive(subfolder, archive_bytes):
-    tempfolder = os.path.join(tempfile.gettempdir(), subfolder)
-    os.makedirs(tempfolder, exist_ok=True)
-
-    tempfolder = tempfile.mkdtemp(dir=tempfolder)
-    logging.debug("Extracting archive to {}".format(tempfolder))
-
+def unpack_archive(folder, archive_bytes):
     zip_data = io.BytesIO(archive_bytes)
     logging.debug("Opening zip archive...")
     zip_file = zipfile.ZipFile(zip_data, mode='r')
-    zip_file.extractall(tempfolder)
+    zip_file.extractall(folder)
     zip_file.close()
-    return tempfolder
 
 def generate(options):
     include_folder = os.path.join(options.src_root, "include")
@@ -93,7 +94,7 @@ def generate(options):
         out_dir = os.path.join(options.target_dir, lang.title())
         if not os.path.exists(out_dir):
             os.makedirs(out_dir)
-        out_file = os.path.join(out_dir, "LLDBWrap{}".format(lang.title()))
+        out_file = os.path.join(out_dir, "LLDBWrap{}.cpp".format(lang.title()))
         swig_command = [
             options.swig_executable,
             "-c++",
@@ -122,7 +123,9 @@ def generate(options):
             logging.info("swig generation succeeded")
             if swig_output is not None and len(swig_output) > 0:
                 logging.info("swig output: %s", swig_output)
+            return (0, swig_output)
         except subprocess.CalledProcessError as e:
             logging.error("An error occurred executing swig.  returncode={}"
                           .format(e.returncode))
             logging.error(e.output)
+            return (e.returncode, e.output)
\ No newline at end of file

Modified: lldb/trunk/scripts/swig_bot_lib/remote.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/swig_bot_lib/remote.py?rev=254341&r1=254340&r2=254341&view=diff
==============================================================================
--- lldb/trunk/scripts/swig_bot_lib/remote.py (original)
+++ lldb/trunk/scripts/swig_bot_lib/remote.py Mon Nov 30 16:31:24 2015
@@ -28,3 +28,12 @@ def parse_config(json_reader):
     json_data = json_reader.read()
     options_dict = json.loads(json_data)
     return options_dict
+
+def serialize_response_status(status):
+    status = {"retcode": status[0], "output": status[1]}
+    return json.dumps(status)
+
+def deserialize_response_status(json_reader):
+    json_data = json_reader.read()
+    response_dict = json.loads(json_data)
+    return (response_dict["retcode"], response_dict["output"])

Modified: lldb/trunk/scripts/swig_bot_lib/server.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/swig_bot_lib/server.py?rev=254341&r1=254340&r2=254341&view=diff
==============================================================================
--- lldb/trunk/scripts/swig_bot_lib/server.py (original)
+++ lldb/trunk/scripts/swig_bot_lib/server.py Mon Nov 30 16:31:24 2015
@@ -81,7 +81,13 @@ def accept_once(sock, options):
 
         pack_location = None
         try:
-            pack_location = local.unpack_archive("swig-bot", data)
+            tempfolder = os.path.join(tempfile.gettempdir(), "swig-bot")
+            os.makedirs(tempfolder, exist_ok=True)
+
+            pack_location = tempfile.mkdtemp(dir=tempfolder)
+            logging.debug("Extracting archive to {}".format(pack_location))
+
+            local.unpack_archive(pack_location, data)
             logging.debug("Successfully unpacked archive...")
 
             config_file = os.path.normpath(os.path.join(pack_location,
@@ -98,12 +104,16 @@ def accept_once(sock, options):
                 .format(config.languages, config.swig_executable,
                         config.src_root, config.target_dir))
 
-            local.generate(config)
-            logging.debug("Finished running swig.  Packaging up output")
+            status = local.generate(config)
+            logging.debug("Finished running swig.  Packaging up files {}"
+                          .format(os.listdir(config.target_dir)))
             zip_data = io.BytesIO()
-            zip_file = local.pack_archive(zip_data,
-                                          config.target_dir,
-                                          [(".", None)])
+            zip_file = local.pack_archive(zip_data, config.target_dir, None)
+            response_status = remote.serialize_response_status(status)
+            logging.debug("Sending response status {}".format(response_status))
+            logging.info("(swig output) -> swig_output.json")
+            zip_file.writestr("swig_output.json", response_status)
+
             zip_file.close()
             response_data = zip_data.getvalue()
             logging.info("Sending {} byte response".format(len(response_data)))




More information about the lldb-commits mailing list