Skip to content

Commit

Permalink
[take 2 - fix PackageManager instead]
Browse files Browse the repository at this point in the history
  • Loading branch information
kinke committed Nov 2, 2024
1 parent cef47ae commit 624f2af
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 17 deletions.
45 changes: 35 additions & 10 deletions source/dub/packagemanager.d
Original file line number Diff line number Diff line change
Expand Up @@ -510,23 +510,26 @@ class PackageManager {

// Before doing a git clone, let's see if the package exists locally
if (this.fs.existsDirectory(destination)) {
bool isMatch(Package p) {
return p.name == name.toString() && p.basePackage.path == destination;
}

// It exists, check if we already loaded it.
// Either we loaded it on refresh and it's in PlacementLocation.user,
// or we just added it and it's in m_internal.
foreach (p; this.m_internal.fromPath)
if (p.path == destination)
if (isMatch(p))
return p;
if (this.m_repositories.length)
foreach (p; this.m_repositories[PlacementLocation.user].fromPath)
if (p.path == destination)
if (isMatch(p))
return p;
} else if (!this.gitClone(repo.remote, gitReference, destination))
return null;

Package result = this.load(destination);
if (result !is null)
this.addPackages(this.m_internal.fromPath, result);
return result;
Package p = this.load(destination);
if (p is null) return null;
return this.addPackagesAndResolveSubPackage(this.m_internal.fromPath, p, name);
}

/**
Expand Down Expand Up @@ -1293,7 +1296,7 @@ symlink_exit:
return serialized;
}

/// Adds the package and scans for sub-packages.
/// Adds the package and its sub-packages.
protected void addPackages(ref Package[] dst_repos, Package pack)
{
// Add the main package.
Expand Down Expand Up @@ -1323,6 +1326,29 @@ symlink_exit:
}
}
}

/// Adds the package and its sub-packages, and returns the added package matching
/// the specified name (of the package itself or a sub-package).
/// Returns null if the sub-package doesn't exist.
private Package addPackagesAndResolveSubPackage(ref Package[] dst_repos, Package pack,
in PackageName nameToResolve)
in(pack.name == nameToResolve.main.toString(),
"nameToResolve must be the added package or one of its sub-packages")
{
this.addPackages(dst_repos, pack);

if (nameToResolve.sub.empty)
return pack;

// available sub-packages have been appended
foreach_reverse (sp; dst_repos) {
if (sp.parentPackage is pack && sp.name == nameToResolve.toString())
return sp;
}

logDiagnostic("Sub-package %s not found in parent package", nameToResolve);
return null;
}
}

deprecated(OverrideDepMsg)
Expand Down Expand Up @@ -1742,9 +1768,8 @@ package struct Location {
enforce(
p.version_ == vers,
format("Package %s located in %s has a different version than its path: Got %s, expected %s",
name, path, p.version_, vers));
mgr.addPackages(this.fromPath, p);
return p;
name.main, path, p.version_, vers));
return mgr.addPackagesAndResolveSubPackage(this.fromPath, p, name);
}

/**
Expand Down
11 changes: 4 additions & 7 deletions source/dub/project.d
Original file line number Diff line number Diff line change
Expand Up @@ -557,14 +557,12 @@ class Project {
return resolveSubPackage(tmp, subname, true);
},
(Repository repo) {
auto tmp = m_packageManager.loadSCMPackage(basename, repo);
return resolveSubPackage(tmp, subname, true);
return m_packageManager.loadSCMPackage(dep.name, repo);
},
(VersionRange range) {
// See `dub.recipe.selection : SelectedDependency.fromYAML`
assert(range.isExactVersion());
auto tmp = m_packageManager.getPackage(basename, vspec.version_);
return resolveSubPackage(tmp, subname, true);
return m_packageManager.getPackage(dep.name, vspec.version_);
},
);
} else if (m_dependencies.canFind!(d => PackageName(d.name).main == basename)) {
Expand All @@ -581,11 +579,10 @@ class Project {
if (p is null)
{
if (!vspec.repository.empty) {
p = m_packageManager.loadSCMPackage(basename, vspec.repository);
p = m_packageManager.loadSCMPackage(dep.name, vspec.repository);
enforce(p !is null,
"Unable to fetch '%s@%s' using git - does the repository and version exist?".format(
basename, vspec.repository));
p = resolveSubPackage(p, subname, false);
dep.name, vspec.repository));
} else if (!vspec.path.empty && is_desired) {
NativePath path = vspec.path;
if (!path.absolute) path = pack.path ~ path;
Expand Down

0 comments on commit 624f2af

Please sign in to comment.