Javier Jardón pushed to branch jjardon/ci_show_timings at BuildStream / buildstream
Commits:
- 
e1ed09aa
by Jim MacArthur at 2018-08-24T09:51:27Z
- 
01fe504b
by James Ennis at 2018-08-24T09:51:27Z
- 
a3755c9a
by James Ennis at 2018-08-24T09:51:27Z
- 
1bfcca1a
by James Ennis at 2018-08-24T10:31:41Z
- 
744925f3
by James Ennis at 2018-08-24T10:34:57Z
- 
dfee6d75
by James Ennis at 2018-08-24T11:15:45Z
- 
923bfaec
by Chandan Singh at 2018-08-24T11:22:33Z
- 
2c3a6ab8
by Chandan Singh at 2018-08-24T12:01:56Z
- 
f4745600
by Josh Smith at 2018-08-24T12:20:05Z
7 changed files:
- HACKING.rst
- buildstream/element.py
- doc/source/install_linux_distro.rst
- setup.cfg
- tests/sources/tar.py
- + tests/sources/tar/read-only/content/a.tar.gz
- + tests/sources/tar/read-only/target.bst
Changes:
| ... | ... | @@ -465,12 +465,12 @@ If you want to run a specific test or a group of tests, you | 
| 465 | 465 |  can specify a prefix to match. E.g. if you want to run all of
 | 
| 466 | 466 |  the frontend tests you can do::
 | 
| 467 | 467 |  | 
| 468 | -  ./setup.py test --addopts '-k tests/frontend/'
 | |
| 468 | +  ./setup.py test --addopts 'tests/frontend/'
 | |
| 469 | 469 |  | 
| 470 | 470 |  Specific tests can be chosen by using the :: delimeter after the test module.
 | 
| 471 | 471 |  If you wanted to run the test_build_track test within frontend/buildtrack.py you could do::
 | 
| 472 | 472 |  | 
| 473 | -  ./setup.py test --adopts '-k tests/frontend/buildtrack.py::test_build_track'
 | |
| 473 | +  ./setup.py test --addopts 'tests/frontend/buildtrack.py::test_build_track'
 | |
| 474 | 474 |  | 
| 475 | 475 |  We also have a set of slow integration tests that are disabled by
 | 
| 476 | 476 |  default - you will notice most of them marked with SKIP in the pytest
 | 
| ... | ... | @@ -1361,8 +1361,12 @@ class Element(Plugin): | 
| 1361 | 1361 |              if not vdirectory.is_empty():
 | 
| 1362 | 1362 |                  raise ElementError("Staging directory '{}' is not empty".format(vdirectory))
 | 
| 1363 | 1363 |  | 
| 1364 | -            with tempfile.TemporaryDirectory() as temp_staging_directory:
 | |
| 1364 | +            # While mkdtemp is advertised as using the TMP environment variable, it
 | |
| 1365 | +            # doesn't, so this explicit extraction is necesasry.
 | |
| 1366 | +            tmp_prefix = os.environ.get("TMP", None)
 | |
| 1367 | +            temp_staging_directory = tempfile.mkdtemp(prefix=tmp_prefix)
 | |
| 1365 | 1368 |  | 
| 1369 | +            try:
 | |
| 1366 | 1370 |                  workspace = self._get_workspace()
 | 
| 1367 | 1371 |                  if workspace:
 | 
| 1368 | 1372 |                      # If mount_workspaces is set and we're doing incremental builds,
 | 
| ... | ... | @@ -1377,6 +1381,19 @@ class Element(Plugin): | 
| 1377 | 1381 |                          source._stage(temp_staging_directory)
 | 
| 1378 | 1382 |  | 
| 1379 | 1383 |                  vdirectory.import_files(temp_staging_directory)
 | 
| 1384 | + | |
| 1385 | +            finally:
 | |
| 1386 | +                # Staging may produce directories with less than 'rwx' permissions
 | |
| 1387 | +                # for the owner, which will break tempfile, so we need to use chmod
 | |
| 1388 | +                # occasionally.
 | |
| 1389 | +                def make_dir_writable(fn, path, excinfo):
 | |
| 1390 | +                    os.chmod(os.path.dirname(path), 0o777)
 | |
| 1391 | +                    if os.path.isdir(path):
 | |
| 1392 | +                        os.rmdir(path)
 | |
| 1393 | +                    else:
 | |
| 1394 | +                        os.remove(path)
 | |
| 1395 | +                shutil.rmtree(temp_staging_directory, onerror=make_dir_writable)
 | |
| 1396 | + | |
| 1380 | 1397 |          # Ensure deterministic mtime of sources at build time
 | 
| 1381 | 1398 |          vdirectory.set_deterministic_mtime()
 | 
| 1382 | 1399 |          # Ensure deterministic owners of sources at build time
 | 
| ... | ... | @@ -152,8 +152,29 @@ for advice on this. | 
| 152 | 152 |  | 
| 153 | 153 |  Installing
 | 
| 154 | 154 |  ~~~~~~~~~~
 | 
| 155 | -Once you have the base system dependencies, you can clone the BuildStream
 | |
| 156 | -git repository and install it as a regular user::
 | |
| 155 | +Once you have the base system dependencies, you can install the BuildStream
 | |
| 156 | +python package as a regular user.
 | |
| 157 | + | |
| 158 | +Via PyPI (recommended)
 | |
| 159 | +++++++++++++++++++++++
 | |
| 160 | +::
 | |
| 161 | + | |
| 162 | +  pip3 install --user BuildStream
 | |
| 163 | + | |
| 164 | +This will install latest stable version of BuildStream and its pure python
 | |
| 165 | +dependencies into your user's homedir in ``~/.local``.
 | |
| 166 | + | |
| 167 | +Keep following the instructions below to ensure that the ``bst``
 | |
| 168 | +command is in your ``PATH`` and to enable bash completions for it.
 | |
| 169 | + | |
| 170 | +.. note::
 | |
| 171 | + | |
| 172 | +  If you want a specific version of BuildStream, you can install it using
 | |
| 173 | +  ``pip install --user BuildStream==<version-number>``
 | |
| 174 | + | |
| 175 | +Via Git checkout
 | |
| 176 | +++++++++++++++++
 | |
| 177 | +::
 | |
| 157 | 178 |  | 
| 158 | 179 |    git clone https://gitlab.com/BuildStream/buildstream.git
 | 
| 159 | 180 |    cd buildstream
 | 
| ... | ... | @@ -206,9 +227,19 @@ to your ``~/.bash_completion``: | 
| 206 | 227 |  | 
| 207 | 228 |  Upgrading BuildStream
 | 
| 208 | 229 |  ~~~~~~~~~~~~~~~~~~~~~
 | 
| 209 | -Assuming you have followed the default instructions above, all
 | |
| 210 | -you need to do to upgrade BuildStream is to update your local git
 | |
| 211 | -checkout::
 | |
| 230 | + | |
| 231 | +Via PyPI
 | |
| 232 | +++++++++
 | |
| 233 | + | |
| 234 | +If you installed BuildStream from PyPI, you can update it like so::
 | |
| 235 | + | |
| 236 | +  pip install --user --upgrade BuildStream
 | |
| 237 | + | |
| 238 | +Via Git checkout
 | |
| 239 | +++++++++++++++++
 | |
| 240 | + | |
| 241 | +If you installed BuildStream from a local git checkout using ``-e`` option, all
 | |
| 242 | +you need to do to upgrade BuildStream is to update your local git checkout::
 | |
| 212 | 243 |  | 
| 213 | 244 |    cd /path/to/buildstream
 | 
| 214 | 245 |    git pull --rebase
 | 
| ... | ... | @@ -11,7 +11,7 @@ parentdir_prefix = BuildStream- | 
| 11 | 11 |  test=pytest
 | 
| 12 | 12 |  | 
| 13 | 13 |  [tool:pytest]
 | 
| 14 | -addopts = --verbose --basetemp ./tmp --pep8 --pylint --pylint-rcfile=.pylintrc --cov=buildstream --cov-config .coveragerc
 | |
| 14 | +addopts = --verbose --basetemp ./tmp --pep8 --pylint --pylint-rcfile=.pylintrc --cov=buildstream --cov-config .coveragerc --durations=20
 | |
| 15 | 15 |  norecursedirs = tests/integration/project integration-cache tmp __pycache__ .eggs
 | 
| 16 | 16 |  python_files = tests/*/*.py
 | 
| 17 | 17 |  pep8maxlinelength = 119
 | 
| ... | ... | @@ -3,6 +3,7 @@ import pytest | 
| 3 | 3 |  import tarfile
 | 
| 4 | 4 |  import tempfile
 | 
| 5 | 5 |  import subprocess
 | 
| 6 | +from shutil import copyfile, rmtree
 | |
| 6 | 7 |  | 
| 7 | 8 |  from buildstream._exceptions import ErrorDomain
 | 
| 8 | 9 |  from buildstream import _yaml
 | 
| ... | ... | @@ -257,3 +258,47 @@ def test_stage_default_basedir_lzip(cli, tmpdir, datafiles, srcdir): | 
| 257 | 258 |      original_contents = list_dir_contents(original_dir)
 | 
| 258 | 259 |      checkout_contents = list_dir_contents(checkoutdir)
 | 
| 259 | 260 |      assert(checkout_contents == original_contents)
 | 
| 261 | + | |
| 262 | + | |
| 263 | +# Test that a tarball that contains a read only dir works
 | |
| 264 | +@pytest.mark.datafiles(os.path.join(DATA_DIR, 'read-only'))
 | |
| 265 | +def test_read_only_dir(cli, tmpdir, datafiles):
 | |
| 266 | +    try:
 | |
| 267 | +        project = os.path.join(datafiles.dirname, datafiles.basename)
 | |
| 268 | +        generate_project(project, tmpdir)
 | |
| 269 | + | |
| 270 | +        # Get the tarball in tests/sources/tar/read-only/content
 | |
| 271 | +        #
 | |
| 272 | +        # NOTE that we need to do this because tarfile.open and tar.add()
 | |
| 273 | +        # are packing the tar up with writeable files and dirs
 | |
| 274 | +        tarball = os.path.join(str(datafiles), 'content', 'a.tar.gz')
 | |
| 275 | +        if not os.path.exists(tarball):
 | |
| 276 | +            raise FileNotFoundError('{} does not exist'.format(tarball))
 | |
| 277 | +        copyfile(tarball, os.path.join(str(tmpdir), 'a.tar.gz'))
 | |
| 278 | + | |
| 279 | +        # Because this test can potentially leave directories behind
 | |
| 280 | +        # which are difficult to remove, ask buildstream to use
 | |
| 281 | +        # our temp directory, so we can clean up.
 | |
| 282 | +        tmpdir_str = str(tmpdir)
 | |
| 283 | +        if not tmpdir_str.endswith(os.path.sep):
 | |
| 284 | +            tmpdir_str += os.path.sep
 | |
| 285 | +        env = {"TMP": tmpdir_str}
 | |
| 286 | + | |
| 287 | +        # Track, fetch, build, checkout
 | |
| 288 | +        result = cli.run(project=project, args=['track', 'target.bst'], env=env)
 | |
| 289 | +        result.assert_success()
 | |
| 290 | +        result = cli.run(project=project, args=['fetch', 'target.bst'], env=env)
 | |
| 291 | +        result.assert_success()
 | |
| 292 | +        result = cli.run(project=project, args=['build', 'target.bst'], env=env)
 | |
| 293 | +        result.assert_success()
 | |
| 294 | + | |
| 295 | +    finally:
 | |
| 296 | + | |
| 297 | +        # Make tmpdir deletable no matter what happens
 | |
| 298 | +        def make_dir_writable(fn, path, excinfo):
 | |
| 299 | +            os.chmod(os.path.dirname(path), 0o777)
 | |
| 300 | +            if os.path.isdir(path):
 | |
| 301 | +                os.rmdir(path)
 | |
| 302 | +            else:
 | |
| 303 | +                os.remove(path)
 | |
| 304 | +        rmtree(str(tmpdir), onerror=make_dir_writable) | 
No preview for this file type
| 1 | +kind: import
 | |
| 2 | +description: The kind of this element is irrelevant.
 | |
| 3 | +sources:
 | |
| 4 | +- kind: tar
 | |
| 5 | +  url: tmpdir:/a.tar.gz
 | |
| 6 | +  ref: foo | 
