|  | @@ -0,0 +1,98 @@
 | 
	
		
			
				|  |  | +#!/usr/bin/env python
 | 
	
		
			
				|  |  | +# https://github.com/ahelal/travis-in-box
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import yaml
 | 
	
		
			
				|  |  | +import subprocess
 | 
	
		
			
				|  |  | +import sys
 | 
	
		
			
				|  |  | +import os.path
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class TravisExec(object):
 | 
	
		
			
				|  |  | +    def __init__(self, filename="travis.yml"):
 | 
	
		
			
				|  |  | +        self.fail = False
 | 
	
		
			
				|  |  | +        stream = open(filename, 'r')
 | 
	
		
			
				|  |  | +        yaml_file = yaml.load(stream)
 | 
	
		
			
				|  |  | +        # language
 | 
	
		
			
				|  |  | +        self.language = yaml_file.get("language", None)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        # Section
 | 
	
		
			
				|  |  | +        self.section_before_install = yaml_file.get("before_install", None)
 | 
	
		
			
				|  |  | +        self.section_install = yaml_file.get("install", None)
 | 
	
		
			
				|  |  | +        self.section_before_script = yaml_file.get("before_script", None)
 | 
	
		
			
				|  |  | +        self.section_script = yaml_file.get("script", None)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        #self.section_after_script = yaml_file.get("after_script", None)
 | 
	
		
			
				|  |  | +        self.section_after_failure = yaml_file.get("after_failure", None)
 | 
	
		
			
				|  |  | +        self.section_after_success = yaml_file.get("after_success", None)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def _setup(self):
 | 
	
		
			
				|  |  | +        if self.language == "python":
 | 
	
		
			
				|  |  | +            print "********** Setup Python  **********"
 | 
	
		
			
				|  |  | +            print ""
 | 
	
		
			
				|  |  | +            # Since we are not using container we have to install various lang our self
 | 
	
		
			
				|  |  | +            # So this is probably not the best way to do it
 | 
	
		
			
				|  |  | +            self._execute_command(["sudo apt-get install python-setuptools python-pip -y"])
 | 
	
		
			
				|  |  | +        else:
 | 
	
		
			
				|  |  | +            print "Errors unsupported language {}".format(self.language)
 | 
	
		
			
				|  |  | +            exit(1)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def life_cycle(self):
 | 
	
		
			
				|  |  | +        # See http://docs.travis-ci.com/user/build-configuration/
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            # 1. setup language
 | 
	
		
			
				|  |  | +            self._setup()
 | 
	
		
			
				|  |  | +            # 4. Run before_install commands
 | 
	
		
			
				|  |  | +            self.run_command("before_install", self.section_before_install, self.section_after_failure)
 | 
	
		
			
				|  |  | +            # 5. Run install commands
 | 
	
		
			
				|  |  | +            self.run_command("install", self.section_install, self.section_after_failure)
 | 
	
		
			
				|  |  | +            # 6. Run before_script commands
 | 
	
		
			
				|  |  | +            self.run_command("before_script", self.section_before_script, self.section_after_failure)
 | 
	
		
			
				|  |  | +            # 7. Run test script commands
 | 
	
		
			
				|  |  | +            self.run_command("script", self.section_script, self.section_after_failure)
 | 
	
		
			
				|  |  | +            # 8 . if we reach this point we made it run after_success
 | 
	
		
			
				|  |  | +            self.run_command("after_success", self.section_after_success, None)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @staticmethod
 | 
	
		
			
				|  |  | +    def _execute_command(command):
 | 
	
		
			
				|  |  | +        new_command = ["echo '> " + item.rstrip('\n') + "' && { " + item.rstrip('\n') + " ; }" for item in command]
 | 
	
		
			
				|  |  | +        new_command = " && ".join(new_command)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        p = subprocess.Popen(new_command, shell=True, stderr=subprocess.PIPE)
 | 
	
		
			
				|  |  | +        while True:
 | 
	
		
			
				|  |  | +            out = p.stderr.read(1)
 | 
	
		
			
				|  |  | +            if out == '' and p.poll() is not None:
 | 
	
		
			
				|  |  | +                break
 | 
	
		
			
				|  |  | +            if out != '':
 | 
	
		
			
				|  |  | +                sys.stdout.write(out)
 | 
	
		
			
				|  |  | +                sys.stdout.flush()
 | 
	
		
			
				|  |  | +        print ""
 | 
	
		
			
				|  |  | +        return p.returncode
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def run_command(self, section_name=None, command=None, execute_on_failure=None):
 | 
	
		
			
				|  |  | +        if command:
 | 
	
		
			
				|  |  | +            print ""
 | 
	
		
			
				|  |  | +            print "********** Running '{}' **********".format(section_name)
 | 
	
		
			
				|  |  | +            return_code = self._execute_command(command)
 | 
	
		
			
				|  |  | +            if return_code != 0:
 | 
	
		
			
				|  |  | +                print ""
 | 
	
		
			
				|  |  | +                print "********** Failed in '{}' **********".format(section_name)
 | 
	
		
			
				|  |  | +                if execute_on_failure:
 | 
	
		
			
				|  |  | +                    print ""
 | 
	
		
			
				|  |  | +                    print "********** Running after_failure  **********".format(section_name)
 | 
	
		
			
				|  |  | +                    self._execute_command(execute_on_failure)
 | 
	
		
			
				|  |  | +                    exit(1)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +filename = None
 | 
	
		
			
				|  |  | +if len(sys.argv) == 1:
 | 
	
		
			
				|  |  | +    filename = ".travis.yml"
 | 
	
		
			
				|  |  | +elif len(sys.argv) == 2:
 | 
	
		
			
				|  |  | +    filename = sys.argv[1]
 | 
	
		
			
				|  |  | +else:
 | 
	
		
			
				|  |  | +    print "Invalid number of arguments"
 | 
	
		
			
				|  |  | +    exit(1)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +if os.path.exists(filename):
 | 
	
		
			
				|  |  | +    TravisExec(filename).life_cycle()
 | 
	
		
			
				|  |  | +else:
 | 
	
		
			
				|  |  | +    print "Could not file travis file '{}'".format(filename)
 | 
	
		
			
				|  |  | +    exit(1)
 |