예제 #1
0
def _main(argv, MainClass):
    """
    Python hook for starting rbuild from the command line.
    @param argv: standard argument vector
    """
    if argv is None:
        argv = sys.argv
    #pylint: disable-msg=E0701
    # pylint complains about except clauses here because we sometimes
    # redefine debuggerException
    debuggerException = Exception
    try:
        argv = list(argv)
        debugAll = '--debug-all' in argv
        if debugAll:
            argv.remove('--debug-all')
        else:
            debuggerException = errors.RbuildInternalError
        sys.excepthook = errors.genExcepthook(debug=debugAll,
                                              debugCtrlC=debugAll)
        rc = MainClass().main(argv, debuggerException=debuggerException)
        if rc is None:
            return 0
        return rc
    except debuggerException, err:
        raise
예제 #2
0
    def testExceptHook(self):
        _genExcepthook = util.genExcepthook
        cwd = os.getcwd()
        try:
            # Create a non-"checkout" dir
            checkoutDir = tempfile.mkdtemp()
            os.chdir(checkoutDir)

            def assertUsesRoot(error, prefix, *args, **kwargs):
                self.failUnlessEqual(prefix, 'rbuild-error-')
                return lambda a, b, c: None

            # Expect that /tmp is used
            self.mock(os, 'getenv', mock.MockObject())
            os.getenv._mock.setReturn(None, 'HOME')
            util.genExcepthook = assertUsesRoot
            errors.genExcepthook()(None, None, None)

            # Expect that $HOME is used
            homeDir = tempfile.mkdtemp()
            os.mkdir(homeDir + '/.rbuild')
            def assertUsesHome(error, prefix, *args, **kwargs):
                self.failUnlessEqual(prefix, homeDir + '/.rbuild/tracebacks/rbuild-error-')
                return lambda a, b, c: None

            os.getenv._mock.setReturn(homeDir, 'HOME')
            util.genExcepthook = assertUsesHome
            errors.genExcepthook()(None, None, None)
            self.unmock()

            # Turn the non-"checkout" dir into a "checkout", but not writable
            os.mkdir(checkoutDir + '/.rbuild')
            os.chmod(checkoutDir + '/.rbuild', 0555)

            # Expect that /tmp is used
            util.genExcepthook = assertUsesRoot
            errors.genExcepthook()(None, None, None)

            # Make the checkout writable
            os.chmod(checkoutDir + '/.rbuild', 0755)

            def assertUsesCheckout(error, prefix, *args, **kwargs):
                self.failUnlessEqual(prefix, checkoutDir + '/.rbuild/tracebacks/rbuild-error-')
                return lambda a, b, c: None

            # Expect that checkout is used
            util.genExcepthook = assertUsesCheckout
            errors.genExcepthook()(None, None, None)


            # Make the tracebacks dir unwritable
            os.chmod(checkoutDir + '/.rbuild/tracebacks', 0555)

            # Expect that /tmp is used
            util.genExcepthook = assertUsesRoot
            errors.genExcepthook()(None, None, None)

            os.chmod(checkoutDir + '/.rbuild/tracebacks', 0755)
        finally:
            util.genExcepthook = _genExcepthook
            util.rmtree(checkoutDir)
            util.rmtree(homeDir)
            os.chdir(cwd)