Skip to content

Commit 10979bb

Browse files
author
Grant Wuerker
committed
simpler dep graph
1 parent edaf178 commit 10979bb

File tree

7 files changed

+41
-111
lines changed

7 files changed

+41
-111
lines changed

crates/common/src/dependencies/graph.rs

Lines changed: 18 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,11 @@ use crate::InputDb;
1212

1313
type EdgeWeight = (DependencyAlias, DependencyArguments);
1414

15-
#[allow(clippy::too_many_arguments)] // salsa input constructor currently needs all fields
1615
#[salsa::input]
1716
#[derive(Debug)]
1817
pub struct DependencyGraph {
19-
local_graph: DiGraph<Url, EdgeWeight>,
20-
local_node_map: HashMap<Url, NodeIndex>,
21-
remote_graph: DiGraph<Url, EdgeWeight>,
22-
remote_node_map: HashMap<Url, NodeIndex>,
23-
remote_sets: HashMap<Url, Vec<Url>>,
18+
graph: DiGraph<Url, EdgeWeight>,
19+
node_map: HashMap<Url, NodeIndex>,
2420
git_locations: HashMap<Url, RemoteFiles>,
2521
reverse_git_map: HashMap<RemoteFiles, Url>,
2622
}
@@ -32,9 +28,6 @@ impl DependencyGraph {
3228
db,
3329
DiGraph::new(),
3430
HashMap::new(),
35-
DiGraph::new(),
36-
HashMap::new(),
37-
HashMap::new(),
3831
HashMap::new(),
3932
HashMap::new(),
4033
)
@@ -54,70 +47,42 @@ impl DependencyGraph {
5447
}
5548
}
5649

57-
pub fn ensure_local_node(&self, db: &mut dyn InputDb, url: &Url) {
58-
if self.local_node_map(db).contains_key(url) {
50+
pub fn ensure_node(&self, db: &mut dyn InputDb, url: &Url) {
51+
if self.node_map(db).contains_key(url) {
5952
return;
6053
}
61-
let mut graph = self.local_graph(db);
62-
let mut node_map = self.local_node_map(db);
54+
let mut graph = self.graph(db);
55+
let mut node_map = self.node_map(db);
6356
Self::allocate_node(&mut graph, &mut node_map, url);
64-
self.set_local_graph(db).to(graph);
65-
self.set_local_node_map(db).to(node_map);
57+
self.set_graph(db).to(graph);
58+
self.set_node_map(db).to(node_map);
6659
}
6760

68-
pub fn contains_local_url(&self, db: &dyn InputDb, url: &Url) -> bool {
69-
self.local_node_map(db).contains_key(url)
70-
}
71-
72-
pub fn add_local_dependency(
73-
&self,
74-
db: &mut dyn InputDb,
75-
source: &Url,
76-
target: &Url,
77-
alias: DependencyAlias,
78-
arguments: DependencyArguments,
79-
) {
80-
let mut graph = self.local_graph(db);
81-
let mut node_map = self.local_node_map(db);
82-
let source_idx = Self::allocate_node(&mut graph, &mut node_map, source);
83-
let target_idx = Self::allocate_node(&mut graph, &mut node_map, target);
84-
graph.add_edge(source_idx, target_idx, (alias, arguments));
85-
self.set_local_graph(db).to(graph);
86-
self.set_local_node_map(db).to(node_map);
61+
pub fn contains_url(&self, db: &dyn InputDb, url: &Url) -> bool {
62+
self.node_map(db).contains_key(url)
8763
}
8864

89-
pub fn add_remote_dependency(
65+
pub fn add_dependency(
9066
&self,
9167
db: &mut dyn InputDb,
9268
source: &Url,
9369
target: &Url,
9470
alias: DependencyAlias,
9571
arguments: DependencyArguments,
9672
) {
97-
let mut graph = self.remote_graph(db);
98-
let mut node_map = self.remote_node_map(db);
73+
let mut graph = self.graph(db);
74+
let mut node_map = self.node_map(db);
9975
let source_idx = Self::allocate_node(&mut graph, &mut node_map, source);
10076
let target_idx = Self::allocate_node(&mut graph, &mut node_map, target);
10177
graph.add_edge(source_idx, target_idx, (alias, arguments));
102-
self.set_remote_graph(db).to(graph);
103-
self.set_remote_node_map(db).to(node_map);
104-
}
105-
106-
pub fn ensure_remote_node(&self, db: &mut dyn InputDb, url: &Url) {
107-
if self.remote_node_map(db).contains_key(url) {
108-
return;
109-
}
110-
let mut graph = self.remote_graph(db);
111-
let mut node_map = self.remote_node_map(db);
112-
Self::allocate_node(&mut graph, &mut node_map, url);
113-
self.set_remote_graph(db).to(graph);
114-
self.set_remote_node_map(db).to(node_map);
78+
self.set_graph(db).to(graph);
79+
self.set_node_map(db).to(node_map);
11580
}
11681

11782
pub fn cyclic_subgraph(&self, db: &dyn InputDb) -> DiGraph<Url, EdgeWeight> {
11883
use petgraph::algo::tarjan_scc;
11984

120-
let graph = self.local_graph(db);
85+
let graph = self.graph(db);
12186
let sccs = tarjan_scc(&graph);
12287

12388
let mut cyclic_nodes = HashSet::new();
@@ -171,8 +136,8 @@ impl DependencyGraph {
171136
}
172137

173138
pub fn dependency_urls(&self, db: &dyn InputDb, url: &Url) -> Vec<Url> {
174-
let node_map = self.local_node_map(db);
175-
let graph = self.local_graph(db);
139+
let node_map = self.node_map(db);
140+
let graph = self.graph(db);
176141

177142
if let Some(&root) = node_map.get(url) {
178143
let mut dfs = Dfs::new(&graph, root);
@@ -188,20 +153,6 @@ impl DependencyGraph {
188153
}
189154
}
190155

191-
pub fn add_remote_set(&self, db: &mut dyn InputDb, local_url: &Url, remote_root: Url) {
192-
self.ensure_remote_node(db, &remote_root);
193-
let mut sets = self.remote_sets(db);
194-
sets.entry(local_url.clone()).or_default().push(remote_root);
195-
self.set_remote_sets(db).to(sets);
196-
}
197-
198-
pub fn remote_sets_for(&self, db: &dyn InputDb, local_url: &Url) -> Vec<Url> {
199-
self.remote_sets(db)
200-
.get(local_url)
201-
.cloned()
202-
.unwrap_or_default()
203-
}
204-
205156
pub fn register_remote_checkout(
206157
&self,
207158
db: &mut dyn InputDb,

crates/driver/src/handlers/local.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -93,20 +93,14 @@ impl<'a> ResolutionHandler<FilesResolver> for LocalIngotHandler<'a> {
9393
});
9494
}
9595

96-
self.db
97-
.dependency_graph()
98-
.ensure_local_node(self.db, ingot_url);
96+
self.db.dependency_graph().ensure_node(self.db, ingot_url);
9997

10098
let mut pending = Vec::new();
10199
for dependency in config.dependencies(ingot_url) {
102100
match dependency.location {
103101
DependencyLocation::Local(local) => {
104-
if self
105-
.db
106-
.dependency_graph()
107-
.contains_local_url(self.db, &local.url)
108-
{
109-
self.db.dependency_graph().add_local_dependency(
102+
if self.db.dependency_graph().contains_url(self.db, &local.url) {
103+
self.db.dependency_graph().add_dependency(
110104
self.db,
111105
ingot_url,
112106
&local.url,
@@ -150,7 +144,7 @@ impl<'a> GraphResolutionHandler<Url, DiGraph<Url, (DependencyAlias, DependencyAr
150144
let from_url = &graph[edge.source()];
151145
let to_url = &graph[edge.target()];
152146
let (alias, arguments) = edge.weight();
153-
dependency_graph.add_local_dependency(
147+
dependency_graph.add_dependency(
154148
self.db,
155149
from_url,
156150
to_url,

crates/driver/src/handlers/remote.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,7 @@ impl<'a> RemoteIngotHandler<'a> {
122122
}
123123

124124
impl<'a> ResolutionHandler<GitResolver> for RemoteIngotHandler<'a> {
125-
type Item = Vec<(
126-
GitDescription,
127-
(DependencyAlias, DependencyArguments),
128-
)>;
125+
type Item = Vec<(GitDescription, (DependencyAlias, DependencyArguments))>;
129126

130127
fn handle_resolution(
131128
&mut self,
@@ -181,10 +178,7 @@ impl<'a> ResolutionHandler<GitResolver> for RemoteIngotHandler<'a> {
181178
}
182179

183180
impl<'a> ResolutionHandler<FilesResolver> for RemoteIngotHandler<'a> {
184-
type Item = Vec<(
185-
GitDescription,
186-
(DependencyAlias, DependencyArguments),
187-
)>;
181+
type Item = Vec<(GitDescription, (DependencyAlias, DependencyArguments))>;
188182

189183
fn handle_resolution(&mut self, ingot_url: &Url, resource: FilesResource) -> Self::Item {
190184
let context = self
@@ -271,6 +265,7 @@ impl<'a>
271265
if let Some(url) = self.ingot_urls.get(&graph[node_idx]) {
272266
let new_idx = converted.add_node(url.clone());
273267
node_map.insert(node_idx, new_idx);
268+
self.db.dependency_graph().ensure_node(self.db, url);
274269
}
275270
}
276271

@@ -282,7 +277,7 @@ impl<'a>
282277
let from_url = converted[from_idx].clone();
283278
let to_url = converted[to_idx].clone();
284279
converted.add_edge(from_idx, to_idx, weight.clone());
285-
self.db.dependency_graph().add_remote_dependency(
280+
self.db.dependency_graph().add_dependency(
286281
self.db,
287282
&from_url,
288283
&to_url,

crates/driver/src/lib.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,6 @@ fn resolve_remote_dependencies(
283283
(SmolStr, DependencyArguments),
284284
> = GraphResolverImpl::new(git_resolver);
285285
let mut handler = RemoteIngotHandler::new(db);
286-
let mut resolved_sets = Vec::new();
287286
let mut diagnostics = Vec::new();
288287
let multi = MultiProgress::new();
289288
let spinner_style = ProgressStyle::with_template("{spinner} {msg}")
@@ -303,8 +302,14 @@ fn resolve_remote_dependencies(
303302
match graph_resolver.graph_resolve(&mut handler, &description) {
304303
Ok(_graph) => {
305304
if let Some(root_url) = handler.ingot_url(&description) {
305+
db.dependency_graph().add_dependency(
306+
db,
307+
&request.parent,
308+
root_url,
309+
request.alias.clone(),
310+
request.arguments.clone(),
311+
);
306312
spinner.finish_with_message(format!("✅ Resolved {root_url}"));
307-
resolved_sets.push((request.parent.clone(), root_url.clone()));
308313
} else {
309314
spinner.finish_and_clear();
310315
}
@@ -345,11 +350,6 @@ fn resolve_remote_dependencies(
345350

346351
drop(handler);
347352

348-
for (parent, remote_root) in resolved_sets {
349-
db.dependency_graph()
350-
.add_remote_set(db, &parent, remote_root);
351-
}
352-
353353
diagnostics
354354
}
355355

crates/fe/src/tree.rs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -606,10 +606,8 @@ impl ResolutionHandler<GitResolver> for TreeRemoteHandler {
606606
let config_content = match std::fs::read_to_string(&config_path) {
607607
Ok(content) => content,
608608
Err(error) => {
609-
self.diagnostics.push(format!(
610-
"Remote file error at {}: {error}",
611-
ingot_url
612-
));
609+
self.diagnostics
610+
.push(format!("Remote file error at {}: {error}", ingot_url));
613611
return vec![];
614612
}
615613
};
@@ -634,10 +632,8 @@ impl ResolutionHandler<GitResolver> for TreeRemoteHandler {
634632
}
635633
}
636634

637-
self.metadata.insert(
638-
ingot_url.clone(),
639-
NodeMetadata::from_config(&config),
640-
);
635+
self.metadata
636+
.insert(ingot_url.clone(), NodeMetadata::from_config(&config));
641637

642638
let mut dependencies = Vec::new();
643639
for dependency in config.dependencies(&ingot_url) {
@@ -666,10 +662,8 @@ impl ResolutionHandler<GitResolver> for TreeRemoteHandler {
666662
}
667663
},
668664
DependencyLocation::Remote(remote) => {
669-
let mut next_description = GitDescription::new(
670-
remote.source.clone(),
671-
remote.rev.to_string(),
672-
);
665+
let mut next_description =
666+
GitDescription::new(remote.source.clone(), remote.rev.to_string());
673667
if let Some(path) = remote.path.clone() {
674668
next_description = next_description.with_path(path);
675669
}

crates/resolver/src/files.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,9 +174,7 @@ impl Resolver for FilesResolver {
174174

175175
// Check if the directory exists
176176
if !ingot_path.exists() || !ingot_path.is_dir() {
177-
return Err(FilesResolutionError::DirectoryDoesNotExist(
178-
url.clone(),
179-
));
177+
return Err(FilesResolutionError::DirectoryDoesNotExist(url.clone()));
180178
}
181179

182180
// Check for required directories first

crates/resolver/src/git.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,7 @@ impl GitResolver {
151151
Ok(())
152152
}
153153

154-
fn source_for_clone(
155-
description: &GitDescription,
156-
) -> Result<String, GitResolutionError> {
154+
fn source_for_clone(description: &GitDescription) -> Result<String, GitResolutionError> {
157155
if description.source.scheme() == "file" {
158156
let path = description.source.to_file_path().map_err(|_| {
159157
GitResolutionError::SourcePathConversion {

0 commit comments

Comments
 (0)