diff --git a/constructor/header.sh b/constructor/header.sh index d35bab72b..eb76cc6b8 100644 --- a/constructor/header.sh +++ b/constructor/header.sh @@ -349,6 +349,15 @@ if ! mkdir -p "$PREFIX"; then exit 1 fi +total_installation_size_kb="__TOTAL_INSTALLATION_SIZE_KB__" +free_disk_space_bytes="$(df -Pk "$PREFIX" | tail -n 1 | awk '{print $4}')" +free_disk_space_kb="$((free_disk_space_bytes / 1024))" +free_disk_space_kb_with_buffer="$((free_disk_space_bytes - 100 * 1024))" # add 100MB of buffer +if [ "$free_disk_space_kb_with_buffer" -lt "$total_installation_size_kb" ]; then + printf "ERROR: Not enough free disk space: %s < %s\\n" "$free_disk_space_kb_with_buffer" "$total_installation_size_kb" >&2 + exit 1 +fi + # pwd does not convert two leading slashes to one # https://github.com/conda/constructor/issues/284 PREFIX=$(cd "$PREFIX"; pwd | sed 's@//@/@') diff --git a/constructor/shar.py b/constructor/shar.py index 299f3ab9f..9f2d90425 100644 --- a/constructor/shar.py +++ b/constructor/shar.py @@ -18,6 +18,7 @@ from .preconda import write_files as preconda_write_files from .utils import ( add_condarc, + approx_size_kb, filename_dist, fill_template, get_final_channels, @@ -90,6 +91,7 @@ def get_header(conda_exec, tarball, info): 'pycache': '__pycache__', 'SHORTCUTS': shortcuts_flags(info), 'REGISTER_ENVS': str(info.get("register_envs", True)).lower(), + 'TOTAL_INSTALLATION_SIZE_KB': str(approx_size_kb(info, "total")), } if has_license: replace['LICENSE'] = read_ascii_only(info['license_file']) diff --git a/news/751-disk-usage-sh b/news/751-disk-usage-sh new file mode 100644 index 000000000..19cc24775 --- /dev/null +++ b/news/751-disk-usage-sh @@ -0,0 +1,19 @@ +### Enhancements + +* In SH installers, error early if available disk space for chosen installation path is insufficient. (#749 via #751) + +### Bug fixes + +* + +### Deprecations + +* + +### Docs + +* + +### Other + +*