diff --git a/rake_tasks/python.rake b/rake_tasks/python.rake index 214ddb39f4363..a0cd89ef18745 100644 --- a/rake_tasks/python.rake +++ b/rake_tasks/python.rake @@ -67,46 +67,48 @@ end desc 'Copy known generated files for local development (use `./go py:local_dev all` to copy everything)' task :local_dev, [:all] do |_task, arguments| - Bazel.execute('build', [], '//py:selenium') + Bazel.execute('build', [], '//py:selenium-wheel') bazel_bin = 'bazel-bin/py/selenium/webdriver' lib_path = 'py/selenium/webdriver' - copy_all = arguments[:all] == 'all' - if copy_all - FileUtils.rm_rf("#{lib_path}/common/devtools") - FileUtils.cp_r("#{bazel_bin}/.", lib_path, remove_destination: true) + if arguments[:all] == 'all' + dirs = Dir.children(bazel_bin) + files = [] else - bidi_src = "#{bazel_bin}/common/bidi" - bidi_dest = "#{lib_path}/common/bidi" - if Dir.exist?(bidi_src) - FileUtils.mkdir_p(bidi_dest) - Dir.children(bidi_src).sort.each do |entry| - src = File.join(bidi_src, entry) - dest = File.join(bidi_dest, entry) - next unless File.file?(src) || File.symlink?(src) - - resolved_src = File.symlink?(src) ? File.realpath(src) : src - FileUtils.rm_f(dest) - FileUtils.cp(resolved_src, dest) - end - end + dirs = %w[common/bidi common/devtools] + files = %w[ + remote/getAttribute.js remote/isDisplayed.js remote/findElements.js + common/mutation-listener.js common/bidi-mutation-listener.js + common/linux/selenium-manager common/macos/selenium-manager common/windows/selenium-manager.exe + firefox/webdriver_prefs.json + ] + end - %w[common/devtools common/linux common/macos common/windows].each do |dir| - src = "#{bazel_bin}/#{dir}" - dest = "#{lib_path}/#{dir}" - next unless Dir.exist?(src) + dirs.each do |dir| + src_dir = "#{bazel_bin}/#{dir}" + dest_dir = "#{lib_path}/#{dir}" - FileUtils.rm_rf(dest) - FileUtils.cp_r(src, dest) - end + FileUtils.rm_rf(dest_dir) + # Restore any git tracked files in the directory we just deleted + SeleniumRake.git.checkout_file('HEAD', dest_dir) unless SeleniumRake.git.ls_files(dest_dir).empty? - %w[getAttribute.js isDisplayed.js findElements.js].each do |atom| - dest = "#{lib_path}/remote/#{atom}" - FileUtils.rm_f(dest) - FileUtils.cp("#{bazel_bin}/remote/#{atom}", dest) + # Copy each file individually to resolve Bazel's cache symlinks + Dir.glob(File.join(src_dir, '**', '*')).each do |src| + next unless File.file?(src) + + dest = File.join(dest_dir, src.delete_prefix("#{src_dir}/")) + FileUtils.mkdir_p(File.dirname(dest)) + FileUtils.cp(File.realpath(src), dest) end end + + files.each do |file| + dest = "#{lib_path}/#{file}" + FileUtils.mkdir_p(File.dirname(dest)) + FileUtils.rm_f(dest) + FileUtils.cp(File.realpath("#{bazel_bin}/#{file}"), dest) + end end desc 'Generate and stage Python documentation'