File helpers.py of Package obs-git

from __future__ import print_function

import datetime
import os
import logging
import subprocess

# python3 renaming of StringIO
try:
    import StringIO
except:
    from io import StringIO


class Helpers():
    def run_cmd(self, cmd, cwd, interactive=False, raisesysexit=False):
        """
        Execute the command cmd in the working directory cwd and check return
        value. If the command returns non-zero and raisesysexit is True raise a
        SystemExit exception otherwise return a tuple of return code and
        command output.
        """
        logging.debug("COMMAND: %s" % cmd)

        proc = subprocess.Popen(cmd,
                                shell=False,
                                stdout=subprocess.PIPE,
                                stderr=subprocess.STDOUT,
                                cwd=cwd)
        output = ''
        if interactive:
            stdout_lines = []
            while proc.poll() is None:
                for line in proc.stdout:
                    line_str = line.rstrip().decode('UTF-8')
                    print(line_str)
                    stdout_lines.append(line_str)
            output = '\n'.join(stdout_lines)
            output = output
        else:
            output = proc.communicate()[0]
            if isinstance(output, bytes):
                output = output.decode('UTF-8')

        if proc.returncode and raisesysexit:
            logging.info("ERROR(%d): %s", proc.returncode, repr(output))
            raise SystemExit(
                "Command %s failed(%d): '%s'" % (cmd, proc.returncode, output)
            )
        else:
            logging.debug("RESULT(%d): %s", proc.returncode, repr(output))

        return (proc.returncode, output)

    def safe_run(self, cmd, cwd, interactive=False):
        """Execute the command cmd in the working directory cwd and check return
        value. If the command returns non-zero raise a SystemExit exception.
        """
        result = self.run_cmd(cmd, cwd, interactive, raisesysexit=True)
        return result

    def get_timestamp(self, scm_object, args, clone_dir):
        """Returns the commit timestamp for checked-out repository."""

        timestamp = scm_object.get_timestamp()
        logging.debug("COMMIT TIMESTAMP: %s (%s)", timestamp,
                      datetime.datetime.fromtimestamp(timestamp).strftime(
                          '%Y-%m-%d %H:%M:%S'))
        return timestamp
openSUSE Build Service is sponsored by