示例#1
0
文件: run.py 项目: tpasternak/pants
def run(console: Console, workspace: Workspace, runner: InteractiveRunner,
        bfa: BuildFileAddress) -> Run:
    target = bfa.to_address()
    binary = yield Get(CreatedBinary, Address, target)

    with temporary_dir(cleanup=True) as tmpdir:
        dirs_to_materialize = (DirectoryToMaterialize(
            path=str(tmpdir), directory_digest=binary.digest), )
        workspace.materialize_directories(dirs_to_materialize)

        console.write_stdout(f"Running target: {target}\n")
        full_path = str(Path(tmpdir, binary.binary_name))
        run_request = InteractiveProcessRequest(
            argv=[full_path],
            run_in_workspace=True,
        )

        try:
            result = runner.run_local_interactive_process(run_request)
            exit_code = result.process_exit_code
            if result.process_exit_code == 0:
                console.write_stdout(f"{target} ran successfully.\n")
            else:
                console.write_stderr(
                    f"{target} failed with code {result.process_exit_code}!\n")

        except Exception as e:
            console.write_stderr(
                f"Exception when attempting to run {target} : {e}\n")
            exit_code = -1

    yield Run(exit_code)
示例#2
0
    def test_workspace_materialize_directories_result(self):
        #TODO(#8336): at some point, this test should require that Workspace only be invoked from a console_role
        workspace = Workspace(self.scheduler)

        input_files_content = InputFilesContent((
            FileContent(path='a.txt', content=b'hello', is_executable=False),
            FileContent(path='subdir/b.txt',
                        content=b'goodbye',
                        is_executable=False),
        ))

        digest, = self.scheduler.product_request(Digest, [input_files_content])

        with temporary_dir() as tmp_dir:
            path1 = Path(tmp_dir, 'a.txt')
            path2 = Path(tmp_dir, 'subdir', 'b.txt')

            self.assertFalse(path1.is_file())
            self.assertFalse(path2.is_file())

            output = workspace.materialize_directories(
                (DirectoryToMaterialize(path=tmp_dir,
                                        directory_digest=digest), ))

            self.assertEqual(type(output), MaterializeDirectoriesResult)
            materialize_result = output.dependencies[0]
            self.assertEqual(type(materialize_result),
                             MaterializeDirectoryResult)
            self.assertEqual(materialize_result.output_paths, (
                str(Path(tmp_dir, 'a.txt')),
                str(Path(tmp_dir, 'subdir/b.txt')),
            ))
示例#3
0
文件: fs_test.py 项目: OniOni/pants
    def test_workspace_materialize_directories_result(self):
        #TODO(#8336): at some point, this test should require that Workspace only be invoked from a console_role
        workspace = Workspace(self.scheduler)

        input_files_content = InputFilesContent((
            FileContent(path='a.txt', content=b'hello'),
            FileContent(path='subdir/b.txt', content=b'goodbye'),
        ))

        digest = self.request_single_product(Digest, input_files_content)

        path1 = Path('a.txt')
        path2 = Path('subdir/b.txt')

        assert not path1.is_file()
        assert not path2.is_file()

        output = workspace.materialize_directories(
            (DirectoryToMaterialize(digest), ))

        assert type(output) == MaterializeDirectoriesResult
        materialize_result = output.dependencies[0]
        assert type(materialize_result) == MaterializeDirectoryResult
        assert materialize_result.output_paths == tuple(
            str(Path(self.build_root, p)) for p in [path1, path2])
示例#4
0
def workspace_console_rule(console: Console, workspace: Workspace,
                           msg: MessageToConsoleRule) -> MockWorkspaceGoal:
    digest = yield Get(Digest, InputFilesContent, msg.input_files_content)
    output = workspace.materialize_directories(
        (DirectoryToMaterialize(path=msg.tmp_dir, directory_digest=digest), ))
    output_path = output.dependencies[0].output_paths[0]
    console.print_stdout(str(Path(msg.tmp_dir, output_path)), end='')
    yield MockWorkspaceGoal(exit_code=0)
示例#5
0
def create_binary(addresses: BuildFileAddresses, console: Console,
                  workspace: Workspace, options: Binary.Options) -> Binary:
    with Binary.line_oriented(options, console) as print_stdout:
        print_stdout("Generating binaries in `dist/`")
        binaries = yield [
            Get(CreatedBinary, Address, address.to_address())
            for address in addresses
        ]
        dirs_to_materialize = tuple(
            DirectoryToMaterialize(path='dist/',
                                   directory_digest=binary.digest)
            for binary in binaries)
        results = workspace.materialize_directories(dirs_to_materialize)
        for result in results.dependencies:
            for path in result.output_paths:
                print_stdout(f"Wrote {path}")
    yield Binary(exit_code=0)