Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ Version [unreleased]
`--source` that is what lets a repeated `--force` build reuse the
downloaded source tree
`#205 <https://github.com/ekalinin/nodeenv/issues/205>`_
- Documented that `--mirror` takes a `file://` URL, so a local directory can
serve as the download source
`#193 <https://github.com/ekalinin/nodeenv/issues/193>`_

Version 1.3.1
-------------
Expand Down
9 changes: 8 additions & 1 deletion README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,12 @@ Install node.js from a mirror::

$ nodeenv --node=10.19.0 --mirror=https://npm.taobao.org/mirrors/node

A local directory works as a mirror too, if it repeats the layout of
nodejs.org: packages in ``v<version>/`` and, to resolve ``latest``, ``lts``
or a version range, an ``index.json`` next to them::

$ nodeenv --node=22.14.0 --mirror=file:///srv/node-mirror env-22

Install the highest node.js release matching a version range::

$ nodeenv --node=22 env-22
Expand Down Expand Up @@ -307,7 +313,8 @@ Installation options
Install node.js from the source (Unix only).

``--mirror=URL``
Set mirror server of nodejs.org to download from.
Set mirror server of nodejs.org to download from. A ``file://`` URL
points nodeenv at a local directory instead of a server.

``-c, --clean-src``
Remove "src" directory after installation. This is the default.
Expand Down
15 changes: 15 additions & 0 deletions tests/nodeenv_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from shlex import quote as _quote
import io
import os.path
import pathlib
import subprocess
import sys
import sysconfig
Expand Down Expand Up @@ -309,6 +310,20 @@ def rewind(_):
mock_logger.assert_called()


def test_mirror_option_local_directory(tmpdir):
"""A local directory is a valid mirror, see #193"""
tmpdir.join('index.json').write(
'[{"version": "v99.0.0", "date": "2026-01-01", "lts": false,'
' "files": ["linux-x64", "linux-x64-musl", "linux-riscv64"]}]')
mirror = pathlib.Path(str(tmpdir)).as_uri()
argv = [__file__, '--list', '--mirror=' + mirror]
with mock.patch.object(sys, 'argv', argv), \
mock.patch.object(nodeenv.logger, 'info') as mock_logger:
nodeenv.src_base_url = None
nodeenv.main()
mock_logger.assert_called_with('99.0.0')


@pytest.mark.usefixtures('mock_index_json', 'mock_host_platform')
def test_get_latest_node_version():
assert nodeenv.get_last_stable_node_version() == '13.5.0'
Expand Down
Loading