@@ -71,14 +71,15 @@ function load_direct_deps(env::EnvCache, pkgs::Vector{PackageSpec}=PackageSpec[]
71
71
pkgs = copy (pkgs)
72
72
for (name:: String , uuid:: UUID ) in env. project. deps
73
73
findfirst (pkg -> pkg. uuid == uuid, pkgs) === nothing || continue # do not duplicate packages
74
+ path, repo = get_path_repo (env. project, name)
74
75
entry = manifest_info (env. manifest, uuid)
75
76
push! (pkgs, entry === nothing ?
76
- PackageSpec (;uuid= uuid, name= name) :
77
+ PackageSpec (;uuid= uuid, name= name, path = path, repo = repo ) :
77
78
PackageSpec (;
78
79
uuid = uuid,
79
80
name = name,
80
- path = entry. path,
81
- repo = entry. repo,
81
+ path = path === nothing ? entry. path : path,
82
+ repo = repo == GitRepo () ? entry. repo : repo,
82
83
pinned = entry. pinned,
83
84
tree_hash = entry. tree_hash, # TODO should tree_hash be changed too?
84
85
version = load_version (entry. version, isfixed (entry), preserve),
108
109
function load_all_deps (env:: EnvCache , pkgs:: Vector{PackageSpec} = PackageSpec[];
109
110
preserve:: PreserveLevel = PRESERVE_ALL)
110
111
pkgs = load_manifest_deps (env. manifest, pkgs; preserve= preserve)
112
+ # Sources takes presedence over the manifest...
113
+ for pkg in pkgs
114
+ path, repo = get_path_repo (env. project, pkg. name)
115
+ if path != = nothing
116
+ pkg. path = path
117
+ end
118
+ if repo. source != = nothing
119
+ pkg. repo. source = repo. source
120
+ end
121
+ if repo. rev != = nothing
122
+ pkg. repo. rev = repo. rev
123
+ end
124
+ end
111
125
return load_direct_deps (env, pkgs; preserve= preserve)
112
126
end
113
127
@@ -244,8 +258,9 @@ function collect_project(pkg::PackageSpec, path::String)
244
258
pkgerror (" julia version requirement from Project.toml's compat section not satisfied for package $(err_rep (pkg)) at `$path `" )
245
259
end
246
260
for (name, uuid) in project. deps
261
+ path, repo = get_path_repo (project, name)
247
262
vspec = get_compat (project, name)
248
- push! (deps, PackageSpec (name, uuid, vspec))
263
+ push! (deps, PackageSpec (name= name , uuid= uuid, version = vspec, path = path, repo = repo ))
249
264
end
250
265
for (name, uuid) in project. weakdeps
251
266
vspec = get_compat (project, name)
@@ -302,6 +317,11 @@ function collect_fixed!(env::EnvCache, pkgs::Vector{PackageSpec}, names::Dict{UU
302
317
names[pkg. uuid] = pkg. name
303
318
end
304
319
for pkg in pkgs
320
+ # add repo package if necessary
321
+ if (pkg. repo. rev != = nothing || pkg. repo. source != = nothing ) && pkg. tree_hash === nothing
322
+ # ensure revved package is installed
323
+ Types. handle_repo_add! (Types. Context (env= env), pkg)
324
+ end
305
325
path = project_rel_path (env, source_path (env. manifest_file, pkg))
306
326
if ! isdir (path)
307
327
pkgerror (" expected package $(err_rep (pkg)) to exist at path `$path `" )
@@ -1135,7 +1155,7 @@ function build_versions(ctx::Context, uuids::Set{UUID}; verbose=false)
1135
1155
fancyprint && show_progress (ctx. io, bar)
1136
1156
1137
1157
let log_file= log_file
1138
- sandbox (ctx, pkg, source_path, builddir (source_path), build_project_override; preferences= build_project_preferences) do
1158
+ sandbox (ctx, pkg, builddir (source_path), build_project_override; preferences= build_project_preferences) do
1139
1159
flush (ctx. io)
1140
1160
ok = open (log_file, " w" ) do log
1141
1161
std = verbose ? ctx. io : log
@@ -1226,6 +1246,9 @@ function rm(ctx::Context, pkgs::Vector{PackageSpec}; mode::PackageMode)
1226
1246
filter! (ctx. env. project. compat) do (name, _)
1227
1247
name == " julia" || name in keys (ctx. env. project. deps) || name in keys (ctx. env. project. extras) || name in keys (ctx. env. project. weakdeps)
1228
1248
end
1249
+ filter! (ctx. env. project. sources) do (name, _)
1250
+ name in keys (ctx. env. project. deps) || name in keys (ctx. env. project. extras)
1251
+ end
1229
1252
deps_names = union (keys (ctx. env. project. deps), keys (ctx. env. project. extras))
1230
1253
filter! (ctx. env. project. targets) do (target, deps)
1231
1254
! isempty (filter! (in (deps_names), deps))
@@ -1238,8 +1261,8 @@ function rm(ctx::Context, pkgs::Vector{PackageSpec}; mode::PackageMode)
1238
1261
show_update (ctx. env, ctx. registries; io= ctx. io)
1239
1262
end
1240
1263
1241
- update_package_add (ctx:: Context , pkg:: PackageSpec , :: Nothing , is_dep:: Bool ) = pkg
1242
- function update_package_add (ctx:: Context , pkg:: PackageSpec , entry:: PackageEntry , is_dep:: Bool )
1264
+ update_package_add (ctx:: Context , pkg:: PackageSpec , :: Nothing , source_path, source_repo, is_dep:: Bool ) = pkg
1265
+ function update_package_add (ctx:: Context , pkg:: PackageSpec , entry:: PackageEntry , source_path, source_repo, is_dep:: Bool )
1243
1266
if entry. pinned
1244
1267
if pkg. version == VersionSpec ()
1245
1268
println (ctx. io, " `$(pkg. name) ` is pinned at `v$(entry. version) `: maintaining pinned version" )
@@ -1382,7 +1405,8 @@ function add(ctx::Context, pkgs::Vector{PackageSpec}, new_git=Set{UUID}();
1382
1405
for (i, pkg) in pairs (pkgs)
1383
1406
entry = manifest_info (ctx. env. manifest, pkg. uuid)
1384
1407
is_dep = any (uuid -> uuid == pkg. uuid, [uuid for (name, uuid) in ctx. env. project. deps])
1385
- pkgs[i] = update_package_add (ctx, pkg, entry, is_dep)
1408
+ source_path, source_repo = get_path_repo (ctx. env. project, pkg. name)
1409
+ pkgs[i] = update_package_add (ctx, pkg, entry, source_path, source_repo, is_dep)
1386
1410
end
1387
1411
1388
1412
names = (p. name for p in pkgs)
@@ -1456,21 +1480,27 @@ end
1456
1480
1457
1481
# load version constraint
1458
1482
# if version isa VersionNumber -> set tree_hash too
1459
- up_load_versions! (ctx:: Context , pkg:: PackageSpec , :: Nothing , level:: UpgradeLevel ) = false
1460
- function up_load_versions! (ctx:: Context , pkg:: PackageSpec , entry:: PackageEntry , level:: UpgradeLevel )
1483
+ up_load_versions! (ctx:: Context , pkg:: PackageSpec , :: Nothing , source_path, source_repo, level:: UpgradeLevel ) = false
1484
+ function up_load_versions! (ctx:: Context , pkg:: PackageSpec , entry:: PackageEntry , source_path, source_repo, level:: UpgradeLevel )
1485
+ # With [sources], `pkg` can have a path or repo here
1461
1486
entry. version != = nothing || return false # no version to set
1462
1487
if entry. pinned || level == UPLEVEL_FIXED
1463
1488
pkg. version = entry. version
1464
1489
pkg. tree_hash = entry. tree_hash
1465
- elseif entry. repo. source != = nothing # repo packages have a version but are treated special
1466
- pkg. repo = entry. repo
1490
+ elseif entry. repo. source != = nothing || source_repo. source != = nothing # repo packages have a version but are treated specially
1491
+ if source_repo. source != = nothing
1492
+ pkg. repo = source_repo
1493
+ else
1494
+ pkg. repo = entry. repo
1495
+ end
1467
1496
if level == UPLEVEL_MAJOR
1468
1497
# Updating a repo package is equivalent to adding it
1469
1498
new = Types. handle_repo_add! (ctx, pkg)
1470
1499
pkg. version = entry. version
1471
1500
if pkg. tree_hash != entry. tree_hash
1472
1501
# TODO parse find_installed and set new version
1473
1502
end
1503
+
1474
1504
return new
1475
1505
else
1476
1506
pkg. version = entry. version
@@ -1490,8 +1520,12 @@ end
1490
1520
up_load_manifest_info! (pkg:: PackageSpec , :: Nothing ) = nothing
1491
1521
function up_load_manifest_info! (pkg:: PackageSpec , entry:: PackageEntry )
1492
1522
pkg. name = entry. name # TODO check name is same
1493
- pkg. repo = entry. repo # TODO check that repo is same
1494
- pkg. path = entry. path
1523
+ if pkg. repo == GitRepo ()
1524
+ pkg. repo = entry. repo # TODO check that repo is same
1525
+ end
1526
+ if pkg. path === nothing
1527
+ pkg. path = entry. path
1528
+ end
1495
1529
pkg. pinned = entry. pinned
1496
1530
# `pkg.version` and `pkg.tree_hash` is set by `up_load_versions!`
1497
1531
end
@@ -1559,12 +1593,15 @@ function up(ctx::Context, pkgs::Vector{PackageSpec}, level::UpgradeLevel;
1559
1593
# TODO check all pkg.version == VersionSpec()
1560
1594
# set version constraints according to `level`
1561
1595
for pkg in pkgs
1562
- new = up_load_versions! (ctx, pkg, manifest_info (ctx. env. manifest, pkg. uuid), level)
1596
+ source_path, source_repo = get_path_repo (ctx. env. project, pkg. name)
1597
+ entry = manifest_info (ctx. env. manifest, pkg. uuid)
1598
+ new = up_load_versions! (ctx, pkg, entry, source_path, source_repo, level)
1563
1599
new && push! (new_git, pkg. uuid) # TODO put download + push! in utility function
1564
1600
end
1565
1601
# load rest of manifest data (except for version info)
1566
1602
for pkg in pkgs
1567
- up_load_manifest_info! (pkg, manifest_info (ctx. env. manifest, pkg. uuid))
1603
+ entry = manifest_info (ctx. env. manifest, pkg. uuid)
1604
+ up_load_manifest_info! (pkg, entry)
1568
1605
end
1569
1606
if preserve != = nothing
1570
1607
pkgs, deps_map = targeted_resolve_up (ctx. env, ctx. registries, pkgs, preserve, ctx. julia_version)
@@ -1654,7 +1691,11 @@ end
1654
1691
# TODO : this is two technically different operations with the same name
1655
1692
# split into two subfunctions ...
1656
1693
function free (ctx:: Context , pkgs:: Vector{PackageSpec} ; err_if_free= true )
1657
- foreach (pkg -> update_package_free! (ctx. registries, pkg, manifest_info (ctx. env. manifest, pkg. uuid), err_if_free), pkgs)
1694
+ for pkg in pkgs
1695
+ entry = manifest_info (ctx. env. manifest, pkg. uuid)
1696
+ delete! (ctx. env. project. sources, pkg. name)
1697
+ update_package_free! (ctx. registries, pkg, entry, err_if_free)
1698
+ end
1658
1699
1659
1700
if any (pkg -> pkg. version == VersionSpec (), pkgs)
1660
1701
pkgs = load_direct_deps (ctx. env, pkgs)
@@ -1745,8 +1786,9 @@ function sandbox_preserve(env::EnvCache, target::PackageSpec, test_project::Stri
1745
1786
env. manifest. manifest_format = v " 2.0"
1746
1787
end
1747
1788
# preserve important nodes
1789
+ project = read_project (test_project)
1748
1790
keep = [target. uuid]
1749
- append! (keep, collect (values (read_project (test_project) . deps)))
1791
+ append! (keep, collect (values (project . deps)))
1750
1792
record_project_hash (env)
1751
1793
# prune and return
1752
1794
return prune_manifest (env. manifest, keep)
@@ -1761,8 +1803,17 @@ function abspath!(env::EnvCache, manifest::Manifest)
1761
1803
return manifest
1762
1804
end
1763
1805
1806
+ function abspath! (env:: EnvCache , project:: Project )
1807
+ for (key, entry) in project. sources
1808
+ if haskey (entry, " path" )
1809
+ entry[" path" ] = project_rel_path (env, entry[" path" ])
1810
+ end
1811
+ end
1812
+ return project
1813
+ end
1814
+
1764
1815
# ctx + pkg used to compute parent dep graph
1765
- function sandbox (fn:: Function , ctx:: Context , target:: PackageSpec , target_path :: String ,
1816
+ function sandbox (fn:: Function , ctx:: Context , target:: PackageSpec ,
1766
1817
sandbox_path:: String , sandbox_project_override;
1767
1818
preferences:: Union{Nothing,Dict{String,Any}} = nothing ,
1768
1819
force_latest_compatible_version:: Bool = false ,
@@ -1783,16 +1834,20 @@ function sandbox(fn::Function, ctx::Context, target::PackageSpec, target_path::S
1783
1834
sandbox_project_override = Project ()
1784
1835
end
1785
1836
end
1837
+ abspath! (ctx. env, sandbox_project_override)
1786
1838
Types. write_project (sandbox_project_override, tmp_project)
1787
1839
1788
1840
# create merged manifest
1789
1841
# - copy over active subgraph
1790
1842
# - abspath! to maintain location of all deved nodes
1791
- working_manifest = abspath! (ctx. env, sandbox_preserve (ctx. env, target, tmp_project))
1843
+ working_manifest = sandbox_preserve (ctx. env, target, tmp_project)
1844
+ abspath! (ctx. env, working_manifest)
1845
+
1792
1846
# - copy over fixed subgraphs from test subgraph
1793
1847
# really only need to copy over "special" nodes
1794
1848
sandbox_env = Types. EnvCache (projectfile_path (sandbox_path))
1795
1849
abspath! (sandbox_env, sandbox_env. manifest)
1850
+ abspath! (sandbox_env, sandbox_env. project)
1796
1851
for (uuid, entry) in sandbox_env. manifest. deps
1797
1852
entry_working = get (working_manifest, uuid, nothing )
1798
1853
if entry_working === nothing
@@ -1897,6 +1952,7 @@ function gen_target_project(ctx::Context, pkg::PackageSpec, source_path::String,
1897
1952
source_env = EnvCache (projectfile_path (source_path))
1898
1953
# collect regular dependencies
1899
1954
test_project. deps = source_env. project. deps
1955
+ test_project. sources = source_env. project. sources
1900
1956
# collect test dependencies
1901
1957
for name in get (source_env. project. targets, target, String[])
1902
1958
uuid = nothing
@@ -1976,11 +2032,11 @@ function test(ctx::Context, pkgs::Vector{PackageSpec};
1976
2032
end
1977
2033
# now we sandbox
1978
2034
printpkgstyle (ctx. io, :Testing , pkg. name)
1979
- sandbox (ctx, pkg, source_path, testdir (source_path), test_project_override; preferences= test_project_preferences, force_latest_compatible_version, allow_earlier_backwards_compatible_versions, allow_reresolve) do
2035
+ sandbox (ctx, pkg, testdir (source_path), test_project_override; preferences= test_project_preferences, force_latest_compatible_version, allow_earlier_backwards_compatible_versions, allow_reresolve) do
1980
2036
test_fn != = nothing && test_fn ()
1981
2037
sandbox_ctx = Context (;io= ctx. io)
1982
2038
status (sandbox_ctx. env, sandbox_ctx. registries; mode= PKGMODE_COMBINED, io= sandbox_ctx. io, ignore_indent = false , show_usagetips = false )
1983
- flags = gen_subprocess_flags (source_path; coverage, julia_args)
2039
+ flags = gen_subprocess_flags (source_path; coverage,julia_args)
1984
2040
1985
2041
if should_autoprecompile ()
1986
2042
cacheflags = Base. CacheFlags (parse (UInt8, read (` $(Base. julia_cmd ()) $(flags) --eval 'show(ccall(:jl_cache_flags, UInt8, ()))'` , String)))
0 commit comments