Add more ruff checks

This caught as few bugs form the f-string conversion.
diff --git a/bazel/emscripten_toolchain/link_wrapper.py b/bazel/emscripten_toolchain/link_wrapper.py
index 75cd3fa..470ea27 100644
--- a/bazel/emscripten_toolchain/link_wrapper.py
+++ b/bazel/emscripten_toolchain/link_wrapper.py
@@ -38,7 +38,7 @@
   sys.argv[1] = '@' + new_param_filename
 
 emcc_py = os.path.join(os.environ['EMSCRIPTEN'], 'emcc.py')
-rtn = subprocess.call([sys.executable, emcc_py] + sys.argv[1:])
+rtn = subprocess.call([sys.executable, emcc_py, *sys.argv[1:]])
 if rtn != 0:
   sys.exit(1)
 
@@ -157,7 +157,7 @@
   sys.exit(1)
 
 # cc_binary must output exactly one file; put all the output files in a tarball.
-cmd = ['tar', 'cf', base_name + '.tar'] + files
+cmd = ['tar', 'cf', base_name + '.tar', *files]
 subprocess.check_call(cmd, cwd=outdir)
 os.replace(os.path.join(outdir, base_name + '.tar'), output_file)
 
diff --git a/emsdk.py b/emsdk.py
index 4e05b7d..06f9864 100644
--- a/emsdk.py
+++ b/emsdk.py
@@ -745,7 +745,7 @@
   gits = ['git/1.9.4/bin/git.exe', shutil.which('git')]
   for git in gits:
     try:
-      ret, stdout, stderr = run_get_output([git, '--version'])
+      ret, _stdout, _stderr = run_get_output([git, '--version'])
       if ret == 0:
         cached_git_executable = git
         return git
@@ -766,7 +766,7 @@
 
 
 def git_repo_version(repo_path):
-  returncode, stdout, stderr = run_get_output([GIT(), 'log', '-n', '1', '--pretty="%aD %H"'], cwd=repo_path)
+  returncode, stdout, _stderr = run_get_output([GIT(), 'log', '-n', '1', '--pretty="%aD %H"'], cwd=repo_path)
   if returncode == 0:
     return stdout.strip()
   else:
@@ -774,7 +774,7 @@
 
 
 def git_recent_commits(repo_path, n=20):
-  returncode, stdout, stderr = run_get_output([GIT(), 'log', '-n', str(n), '--pretty="%H"'], cwd=repo_path)
+  returncode, stdout, _stderr = run_get_output([GIT(), 'log', '-n', str(n), '--pretty="%H"'], cwd=repo_path)
   if returncode == 0:
     return stdout.strip().replace('\r', '').replace('"', '').split('\n')
   else:
@@ -805,7 +805,7 @@
   if GIT_CLONE_SHALLOW:
     git_clone_args += ['--depth', '1']
   print(f'Cloning from {url}...')
-  return run([GIT(), 'clone', '-o', remote_name] + git_clone_args + [url, dstpath]) == 0
+  return run([GIT(), 'clone', '-o', remote_name, *git_clone_args, url, dstpath]) == 0
 
 
 def git_pull(repo_path, branch_or_tag, remote_name='origin'):
@@ -986,7 +986,7 @@
     print('Running build: ' + str(make))
     ret = subprocess.check_call(make, cwd=build_root, env=build_env())
     if ret != 0:
-      errlog('Build failed with exit code {ret}!')
+      errlog(f'Build failed with exit code {ret}!')
       errlog('Working directory: ' + build_root)
       return False
   except Exception as e:
@@ -1011,9 +1011,9 @@
     # Target macOS 11.0 Big Sur at minimum, to support older Mac devices.
     # See https://en.wikipedia.org/wiki/MacOS#Hardware_compatibility for min-spec details.
     cmdline += ['-DCMAKE_OSX_DEPLOYMENT_TARGET=11.0']
-    cmdline += extra_cmake_args + [src_root]
+    cmdline += [*extra_cmake_args, src_root]
 
-    print('Running CMake: ' + str(cmdline))
+    print(f'Running CMake: {cmdline}')
 
     # Specify the deployment target also as an env. var, since some Xcode versions
     # read this instead of the CMake field.
@@ -1030,8 +1030,8 @@
     open(os.path.join(build_root, 'recmake.' + ('bat' if WINDOWS else 'sh')), 'w').write(' '.join(map(quote_parens, cmdline)))
     ret = subprocess.check_call(cmdline, cwd=build_root, env=build_env())
     if ret != 0:
-      errlog('CMake invocation failed with exit code {ret}!')
-      errlog('Working directory: ' + build_root)
+      errlog(f'CMake invocation failed with exit code {ret}')
+      errlog(f'Working directory: {build_root}')
       return False
   except OSError as e:
     if e.errno == errno.ENOENT:
@@ -1046,8 +1046,8 @@
       return False
     raise
   except Exception as e:
-    errlog('CMake invocation failed due to exception!')
-    errlog('Working directory: ' + build_root)
+    errlog('CMake invocation failed due to exception')
+    errlog(f'Working directory: {build_root}')
     errlog(str(e))
     return False
 
@@ -1528,7 +1528,7 @@
 
 
 def download_and_extract(archive, dest_dir, filename_prefix='', clobber=True):
-  debug_print('download_and_extract(archive={archive}, dest_dir={dest_dir})')
+  debug_print(f'download_and_extract(archive={archive}, dest_dir={dest_dir})')
 
   url = urljoin(emsdk_packages_url, archive)
 
@@ -2902,7 +2902,7 @@
   return name
 
 
-def main(args):  # noqa: C901, PLR0911, PLR0912, PLR0915
+def main(args):  # noqa: C901, PLR0911, PLR0912
   if not args:
     errlog("Missing command; Type 'emsdk help' to get a list of commands.")
     return 1
@@ -3087,7 +3087,7 @@
     tool_name, url_and_refspec = forked_url.split('@')
     t = find_tool(tool_name)
     if not t:
-      errlog('Failed to find tool {tool_name}!')
+      errlog(f'Failed to find tool {tool_name}')
       return False
     else:
       t.url, t.git_branch, t.remote_name = parse_github_url_and_refspec(url_and_refspec)
diff --git a/pyproject.toml b/pyproject.toml
index 383d526..94cfdcb 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,4 +1,5 @@
 [project]
+name = 'emsdk'
 requires-python = ">=3.2"
 
 [tool.ruff]
@@ -24,6 +25,7 @@
   "PL",
   "UP",
   "W",
+  "RUF",
   "YTT",
 ]
 lint.external = [ "D" ]
@@ -53,6 +55,7 @@
   "PLW1510",
   "PLW1514",
   "PLW2901",
+  "RUF039", # https://docs.astral.sh/ruff/rules/unraw-re-pattern/
   "UP030", # TODO
   "UP031", # TODO
   "UP032", # TODO
diff --git a/scripts/create_release.py b/scripts/create_release.py
index 425f7d7..64eccaf 100755
--- a/scripts/create_release.py
+++ b/scripts/create_release.py
@@ -12,7 +12,7 @@
 root_dir = os.path.dirname(script_dir)
 sys.path.append(root_dir)
 
-import emsdk  # noqa
+import emsdk
 
 
 def version_key(version_string):
diff --git a/scripts/update_node.py b/scripts/update_node.py
index 257bb74..d3babd1 100755
--- a/scripts/update_node.py
+++ b/scripts/update_node.py
@@ -44,13 +44,13 @@
     urllib.request.urlretrieve(download_url, filename)
 
     if '-win-' in suffix:
-      subprocess.check_call(unzip_cmd() + [filename])
+      subprocess.check_call([*unzip_cmd(), filename])
       dirname = os.path.splitext(os.path.basename(filename))[0]
       shutil.move(dirname, 'bin')
       os.mkdir(dirname)
       shutil.move('bin', dirname)
       os.remove(filename)
-      subprocess.check_call(zip_cmd() + [filename, dirname])
+      subprocess.check_call([*zip_cmd(), filename, dirname])
       shutil.rmtree(dirname)
 
     if '--upload' in sys.argv:
diff --git a/scripts/update_python.py b/scripts/update_python.py
index a9d9d60..7aa6cfe 100755
--- a/scripts/update_python.py
+++ b/scripts/update_python.py
@@ -68,7 +68,7 @@
         urllib.request.urlretrieve(download_url, filename)
 
     os.mkdir('python-nuget')
-    check_call(unzip_cmd() + [os.path.abspath(filename)], cwd='python-nuget')
+    check_call([*unzip_cmd(), os.path.abspath(filename)], cwd='python-nuget')
     os.remove(filename)
 
     src_dir = os.path.join('python-nuget', 'tools')
@@ -77,7 +77,7 @@
     check_call([python_exe, '-m', 'pip', 'install', 'pywin32==310', '--no-warn-script-location'])
     check_call([python_exe, '-m', 'pip', 'install', PSUTIL])
 
-    check_call(zip_cmd() + [os.path.join('..', '..', out_filename), '.'], cwd=src_dir)
+    check_call([*zip_cmd(), os.path.join('..', '..', out_filename), '.'], cwd=src_dir)
     print('Created: %s' % out_filename)
 
     # cleanup if everything went fine
@@ -137,7 +137,7 @@
       configure_args = ['CFLAGS=' + build_flags, 'CXXFLAGS=' + build_flags, 'LDFLAGS=' + min_macos_version_line]
     else:
       configure_args = []
-    check_call(['./configure'] + configure_args, cwd=src_dir, env=env)
+    check_call(['./configure', *configure_args], cwd=src_dir, env=env)
     check_call(['make', '-j', str(multiprocessing.cpu_count())], cwd=src_dir, env=env)
     check_call(['make', 'install', 'DESTDIR=install'], cwd=src_dir, env=env)
 
diff --git a/test/test.py b/test/test.py
index 330fde1..f8b96d5 100755
--- a/test/test.py
+++ b/test/test.py
@@ -133,7 +133,7 @@
 def run_emsdk(cmd):
   if type(cmd) is not list:
     cmd = cmd.split()
-  check_call([emsdk] + cmd)
+  check_call([emsdk, *cmd])
 
 
 class Emsdk(unittest.TestCase):