Skip to content

Commit 6c3a15e

Browse files
fix: ensure the virtual environment is .venv for uv
1 parent b1bceba commit 6c3a15e

File tree

1 file changed

+28
-20
lines changed
  • lua/mason-core/installer/managers

1 file changed

+28
-20
lines changed

lua/mason-core/installer/managers/pypi.lua

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,28 +15,34 @@ local spawn = require "mason-core.spawn"
1515
local M = {}
1616

1717
local use_uv = settings.current.pip.use_uv
18-
local VENV_DIR = "venv"
18+
local VENV_DIR
19+
if use_uv then
20+
VENV_DIR = ".venv"
21+
else
22+
VENV_DIR = "venv"
23+
end
1924

2025
---@async
2126
---@param candidates string[]
2227
local function resolve_python3(candidates)
2328
local is_executable = _.compose(_.equals(1), vim.fn.executable)
2429
a.scheduler()
25-
if use_uv then
26-
candidates = { "uv" }
27-
end
2830
local available_candidates = _.filter(is_executable, candidates)
2931
for __, candidate in ipairs(available_candidates) do
30-
---@type string
31-
local version_output = spawn[candidate]({ "--version" }):map(_.prop "stdout"):get_or_else ""
32-
local ok, version
33-
if use_uv then
34-
ok, version = pcall(semver.new, version_output:match "uv (%d+.%d+.%d+)")
35-
else
36-
ok, version = pcall(semver.new, version_output:match "Python (3%.%d+.%d+)")
37-
end
38-
if ok then
39-
return { executable = candidate, version = version }
32+
if use_uv and candidate == "uv" then
33+
---@type string
34+
local version_output = spawn[candidate]({ "--version" }):map(_.prop "stdout"):get_or_else ""
35+
local ok, version = pcall(semver.new, version_output:match "uv (%d+.%d+.%d+).*")
36+
if ok then
37+
return { executable = candidate, version = version }
38+
end
39+
elseif not use_uv then
40+
---@type string
41+
local version_output = spawn[candidate]({ "--version" }):map(_.prop "stdout"):get_or_else ""
42+
local ok, version = pcall(semver.new, version_output:match "Python (3%.%d+.%d+)")
43+
if ok then
44+
return { executable = candidate, version = version }
45+
end
4046
end
4147
end
4248
return nil
@@ -86,14 +92,14 @@ local function create_venv(pkg)
8692
local supported_python_versions = providers.pypi.get_supported_python_versions(pkg.name, pkg.version):get_or_nil()
8793

8894
-- 1. Resolve stock python3 installation.
89-
local stock_candidates = platform.is.win and { "python", "python3" } or { "python3", "python" }
95+
local stock_candidates = platform.is.win and { "python", "python3", "uv" } or { "python3", "python", "uv" }
9096
local stock_target = resolve_python3(stock_candidates)
9197
if stock_target then
9298
log.fmt_debug("Resolved stock python3 installation version %s", stock_target.version)
9399
end
94100

95101
-- 2. Resolve suitable versioned python3 installation (python3.12, python3.11, etc.).
96-
local versioned_candidates = {}
102+
local versioned_candidates = { "uv" }
97103
if supported_python_versions ~= nil then
98104
if stock_target and not pep440_check_version(tostring(stock_target.version), supported_python_versions) then
99105
log.fmt_debug("Finding versioned candidates for %s", supported_python_versions)
@@ -113,7 +119,8 @@ local function create_venv(pkg)
113119
-- 3. If a versioned python3 installation was not found, warn the user if the stock python3 installation is outside
114120
-- the supported version range.
115121
if
116-
target == stock_target
122+
use_uv == false
123+
and target == stock_target
117124
and supported_python_versions ~= nil
118125
and not pep440_check_version(tostring(target.version), supported_python_versions)
119126
then
@@ -135,9 +142,7 @@ local function create_venv(pkg)
135142
end
136143
end
137144

138-
log.fmt_debug("Found python3 installation version=%s, executable=%s", target.version, target.executable)
139145
ctx.stdio_sink.stdout "Creating virtual environment…\n"
140-
141146
if use_uv then
142147
log.fmt_debug("Found uv installation version=%s, executable=%s", target.version, target.executable)
143148
return ctx.spawn[target.executable] { "venv", VENV_DIR }
@@ -170,6 +175,9 @@ end
170175
---@param args SpawnArgs
171176
local function venv_python(args)
172177
local ctx = installer.context()
178+
if use_uv then
179+
return ctx.spawn[{ "uv", "venv" }](args)
180+
end
173181
return find_venv_executable(ctx, "python"):and_then(function(python_path)
174182
return ctx.spawn[path.concat { ctx.cwd:get(), python_path }](args)
175183
end)
@@ -181,14 +189,14 @@ end
181189
local function pip_install(pkgs, extra_args)
182190
if use_uv then
183191
local ctx = installer.context()
192+
184193
local task = ctx.spawn["uv"] {
185194
"pip",
186195
"install",
187196
"-U",
188197
extra_args or vim.NIL,
189198
pkgs,
190199
}
191-
-- vim.api.nvim_set_current_dir(curdir)
192200
return task
193201
else
194202
return venv_python {

0 commit comments

Comments
 (0)