diff --git a/pkgs/tools/misc/esphome/default.nix b/pkgs/tools/misc/esphome/default.nix index c9de8abea95d..aa4e36253ab2 100644 --- a/pkgs/tools/misc/esphome/default.nix +++ b/pkgs/tools/misc/esphome/default.nix @@ -21,6 +21,11 @@ python3.pkgs.buildPythonApplication rec { sha256 = "0bz6gkrvn7mwmjsqrazgpy9r64m5jj462v0izgvdymkx8bjd8mpi"; }; + patches = [ + # fix missing write permissions on src files before modifing them + ./fix-src-permissions.patch + ]; + postPatch = '' # remove all version pinning (E.g tornado==5.1.1 -> tornado) sed -i -e "s/==[0-9.]*//" requirements.txt diff --git a/pkgs/tools/misc/esphome/fix-src-permissions.patch b/pkgs/tools/misc/esphome/fix-src-permissions.patch new file mode 100644 index 000000000000..5e92350105dd --- /dev/null +++ b/pkgs/tools/misc/esphome/fix-src-permissions.patch @@ -0,0 +1,46 @@ +From f72c5035944065941daaa236b60664657c777726 Mon Sep 17 00:00:00 2001 +From: Martin Weinelt +Date: Wed, 23 Jun 2021 04:50:35 +0200 +Subject: [PATCH] Set u+w for copied src files before trying to overwrite them +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +We store esphome in the nix store, which results in its file permissions +being 0444. Esphome, when compiling a firmware image, will copy these +files from the nix store to a working directory. When updating between +versions it will notice these files changed and try to copy the new +version over, which would break, because the user had no write +permissions on the files. + +❯ esphome compile 01e4ac.yml +INFO Reading configuration 01e4ac.yml... +INFO Detected timezone 'CET' with UTC offset 1 and daylight saving time from 27 March 02:00:00 to 30 October 03:00:00 +INFO Generating C++ source... +ERROR Error copying file /nix/store/lmzrgl1arqfd98jcss4rsmmy6dbffddn-esphome-1.19.2/lib/python3.8/site-packages/esphome/components/api/api_connection.cpp to 01e4ac/src/esphome/components/api/api_connection.cpp: [Errno 13] Permission denied: '01e4ac/src/esphome/components/api/api_connection.cpp' + +To fix this we modify chmod to 0644 just before esphome tries a copy +operation, which will fix permissions on existing working directories +just in time. +--- + esphome/helpers.py | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/esphome/helpers.py b/esphome/helpers.py +index ad7b8272..c456f4ff 100644 +--- a/esphome/helpers.py ++++ b/esphome/helpers.py +@@ -228,6 +228,10 @@ def copy_file_if_changed(src: os.PathLike, dst: os.PathLike) -> None: + if file_compare(src, dst): + return + mkdir_p(os.path.dirname(dst)) ++ try: ++ os.chmod(dst, 0o644) ++ except OSError: ++ pass + try: + shutil.copy(src, dst) + except OSError as err: +-- +2.31.1 +