Commit e209beb0 authored by Chandan Singh's avatar Chandan Singh Committed by Chandan Singh
Browse files

_stream.py: Ensure source-bundle's source directory exists

Currently, `source-bundle` command is entirely broken as it tries to stage the
sources in a directory that doesn't exist. Fix it by ensuring that we create
the necessary directories before calling any methods that try to use those
directories.

This fix comes with a regression test to ensure that the basic use-case
of `source-bundle` continues to work in future.

Fixes #651.
parent 55c93a82
Loading
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -703,6 +703,7 @@ class Stream():

        # Create a temporary directory to build the source tree in
        builddir = self._context.builddir
        os.makedirs(builddir, exist_ok=True)
        prefix = "{}-".format(target.normal_name)

        with TemporaryDirectory(prefix=prefix, dir=builddir) as tempdir:
@@ -1085,6 +1086,7 @@ class Stream():
        for element in elements:
            source_dir = os.path.join(directory, "source")
            element_source_dir = os.path.join(source_dir, element.normal_name)
            os.makedirs(element_source_dir)

            element._stage_sources_at(element_source_dir)

+6 −0
Original line number Diff line number Diff line
kind: import
description: the kind of this element must implement generate_script() method

sources:
- kind: local
  path: files/source-bundle
+1 −0
Original line number Diff line number Diff line
llamas
+48 −0
Original line number Diff line number Diff line
#
#  Copyright (C) 2018 Bloomberg Finance LP
#
#  This program is free software; you can redistribute it and/or
#  modify it under the terms of the GNU Lesser General Public
#  License as published by the Free Software Foundation; either
#  version 2 of the License, or (at your option) any later version.
#
#  This library is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#  Lesser General Public License for more details.
#
#  You should have received a copy of the GNU Lesser General Public
#  License along with this library. If not, see <http://www.gnu.org/licenses/>.
#
#  Authors: Chandan Singh <csingh43@bloomberg.net>
#

import os
import tarfile

import pytest

from tests.testutils import cli

# Project directory
DATA_DIR = os.path.join(
    os.path.dirname(os.path.realpath(__file__)),
    "project",
)


@pytest.mark.datafiles(DATA_DIR)
def test_source_bundle(cli, tmpdir, datafiles):
    project_path = os.path.join(datafiles.dirname, datafiles.basename)
    element_name = 'source-bundle/source-bundle-hello.bst'
    normal_name = 'source-bundle-source-bundle-hello'

    # Verify that we can correctly produce a source-bundle
    args = ['source-bundle', element_name, '--directory', str(tmpdir)]
    result = cli.run(project=project_path, args=args)
    result.assert_success()

    # Verify that the source-bundle contains our sources and a build script
    with tarfile.open(os.path.join(str(tmpdir), '{}.tar.gz'.format(normal_name))) as bundle:
        assert os.path.join(normal_name, 'source', normal_name, 'llamas.txt') in bundle.getnames()
        assert os.path.join(normal_name, 'build.sh') in bundle.getnames()