rules_python icon indicating copy to clipboard operation
rules_python copied to clipboard

requirements.update doesn't work on windows when requirements.in in a subpackage

Open carpenterjc opened this issue 1 year ago • 1 comments

Affected Rule

The issue is caused by the rule: compile_pip_requirements

Is this a regression?

Yes this regressed between: https://github.com/bazelbuild/rules_python/compare/0.18.0...0.19.0

Description

If you have a rule in a sub package (so it contains a directory separator) then on windows you will get an issue where it cannot find file path for requirements.txt.

Note: the slashes are the wrong direction for windows.

🔬 Minimal Reproduction

In 0.25.0 branch of rules_python


cd .\examples\pip_parse\
REM This works
bazel run requirements.update

mkdir bad
copy .\BUILD.bazel bad
copy .\requirements.in bad
copy .\requirements_lock.txt bad

REM This fails with Error: Could not open file 'bad/requirements_lock.txt': No such file or directory
bazel run //bad:requirements.update

🔥 Exception or Error



INFO: Running command line: bazel-bin/tools/thirdparty/requirements.update.exe tools/thirdparty/requirements.in tools/thirdparty/requirements.txt None None None //tools/thirdparty:requirements.update --allow-unsafe --no-reuse-hashes
Updating tools/thirdparty/requirements.txt
Traceback (most recent call last):
  File "C:\Users\JAMESC~1\AppData\Local\Temp\Bazel.runfiles_gwh6jf4s\runfiles\rules_python\python\pip_install\tools\dependency_resolver\dependency_resolver.py", line 139, in 
    if not os.path.samefile(requirements_txt, requirements_txt_tree):
  File "C:\Users\JAMESC~1\AppData\Local\Temp\Bazel.runfiles_gwh6jf4s\runfiles\python3_10_x86_64-pc-windows-msvc\lib\genericpath.py", line 100, in samefile
    s1 = os.stat(f1)
FileNotFoundError: [WinError 3] The system cannot find the path specified: 'tools/thirdparty/requirements.txt'

🌍 Your Environment

Operating System:

  
windows 
  

Output of bazel version:

  
Build label: 6.2.0
Build target: bazel-out/x64_windows-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Tue May 9 18:34:17 2023 (1683657257)
Build timestamp: 1683657257
Build timestamp as int: 1683657257
  

Rules_python version:

  
0.25.0
  

Anything else relevant? Same code works fine on macos and WSL.

carpenterjc avatar Sep 26 '23 08:09 carpenterjc

I just experienced this bug as well.

I moved a project written on from Ubuntu Linux 22.04 to a Windows 10 machine. I wanted to test if calling "bazel run requirements.update" without the requirements_lock.txt file existing will result in Error in read: java.io.FileNotFoundException. It does. When I tried to re-create the file and run the command again, I got the following error:

Starting local Bazel server and connecting to it...
INFO: Invocation ID: 346f2cac-30e8-46be-a367-3b4e5ad0e2f5
INFO: Analyzed target //:requirements.update (61 packages loaded, 4166 targets configured).
INFO: Found 1 target...
Target //:requirements.update up-to-date:
  bazel-bin/requirements.update.zip
  bazel-bin/requirements.update.exe
INFO: Elapsed time: 164.462s, Critical Path: 10.80s
INFO: 7 processes: 5 internal, 2 local.
INFO: Build completed successfully, 7 total actions
INFO: Running command line: bazel-bin/requirements.update.exe pip_example/pypi/requirements.in pip_example/pypi/requirements_lock.txt //:requirements.update '--resolver=backtracking' --allow-unsafe --generate-hashes
Updating pypi/requirements_lock.txt
WARNING: --strip-extras is becoming the default in version 8.0.0. To silence this warning, either use --strip-extras to opt into the new default or use --no-strip-extras to retain the existing behavior.
Error: Could not open file 'pypi/requirements_lock.txt': No such file or directory

I thought it was an encoding/character set issue, but even copying the original code from the folder and trying to run it does not work.

In my project, the "requirements.in" and "requirements_lock.txt" files were both in a subfolder of the root directory. When I moved them to the root directory, it worked without any errors.

I am using Bazel version 7.1.1 and rules_python version 0.31.0 on both machines.

pat-jpnk avatar May 06 '24 12:05 pat-jpnk