Skip to content

Commit c5d5e82

Browse files
authored
fix: Audit 02/26 (#1845)
* Fix template git. * Fix port issue. * Fix graph servers.
1 parent 6953395 commit c5d5e82

6 files changed

Lines changed: 71 additions & 45 deletions

File tree

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
# Changelog
22

3+
## Unreleased
4+
5+
#### 🚀 Updates
6+
7+
- Updated `moon task-graph`, `moon-project-graph`, and `moon action-graph` to request a port
8+
dynamically, instead of defaulting to 8000.
9+
10+
#### 🐞 Fixes
11+
12+
- Fixed an issue where `moon *-graph` commands could not be CTRL+C'd.
13+
- Fixed an issue where Git based template locations would fail if the initial `git clone` failed.
14+
315
## 1.32.6
416

517
#### 🐞 Fixes

crates/app/src/commands/graph/action.rs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
use crate::commands::graph::utils::{action_graph_repr, respond_to_request, setup_server};
1+
use crate::commands::graph::utils::{action_graph_repr, run_server};
22
use crate::session::CliSession;
33
use clap::Args;
44
use moon_action_graph::RunRequirements;
55
use moon_task::Target;
66
use starbase::AppResult;
7-
use starbase_styles::color;
87
use starbase_utils::json;
98
use tracing::instrument;
109

@@ -38,9 +37,9 @@ pub async fn action_graph(session: CliSession, args: ActionGraphArgs) -> AppResu
3837
for target in targets {
3938
action_graph_builder.run_task_by_target(target, &requirements)?;
4039
}
41-
42-
// Show all targets and actions
43-
} else {
40+
}
41+
// Show all targets and actions
42+
else {
4443
for project in workspace_graph.get_projects()? {
4544
for task in workspace_graph.get_tasks_from_project(&project.id)? {
4645
action_graph_builder.run_task(&project, &task, &requirements)?;
@@ -64,15 +63,7 @@ pub async fn action_graph(session: CliSession, args: ActionGraphArgs) -> AppResu
6463
return Ok(None);
6564
}
6665

67-
let (server, mut tera) = setup_server().await?;
68-
let url = format!("http://{}", server.server_addr());
69-
let _ = open::that(&url);
70-
71-
println!("Started server on {}", color::url(url));
72-
73-
for req in server.incoming_requests() {
74-
respond_to_request(req, &mut tera, &graph_info, "Action graph".to_owned())?;
75-
}
66+
run_server("Action graph", graph_info).await?;
7667

7768
Ok(None)
7869
}

crates/app/src/commands/graph/project.rs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
use super::utils::{project_graph_repr, respond_to_request, setup_server};
1+
use super::utils::{project_graph_repr, run_server};
22
use crate::session::CliSession;
33
use clap::Args;
44
use moon_common::Id;
55
use moon_project_graph::{GraphToDot, GraphToJson};
66
use starbase::AppResult;
7-
use starbase_styles::color;
87
use std::sync::Arc;
98
use tracing::instrument;
109

@@ -46,16 +45,7 @@ pub async fn project_graph(session: CliSession, args: ProjectGraphArgs) -> AppRe
4645
return Ok(None);
4746
}
4847

49-
let graph_info = project_graph_repr(&project_graph).await;
50-
let (server, mut tera) = setup_server().await?;
51-
let url = format!("http://{}", server.server_addr());
52-
let _ = open::that(&url);
53-
54-
println!("Started server on {}", color::url(url));
55-
56-
for req in server.incoming_requests() {
57-
respond_to_request(req, &mut tera, &graph_info, "Project graph".to_owned())?;
58-
}
48+
run_server("Project graph", project_graph_repr(&project_graph).await).await?;
5949

6050
Ok(None)
6151
}

crates/app/src/commands/graph/task.rs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
use super::utils::{respond_to_request, setup_server, task_graph_repr};
1+
use super::utils::{run_server, task_graph_repr};
22
use crate::session::CliSession;
33
use clap::Args;
44
use moon_task::Target;
55
use moon_task_graph::{GraphToDot, GraphToJson};
66
use starbase::AppResult;
7-
use starbase_styles::color;
87
use std::sync::Arc;
98
use tracing::instrument;
109

@@ -46,16 +45,7 @@ pub async fn task_graph(session: CliSession, args: TaskGraphArgs) -> AppResult {
4645
return Ok(None);
4746
}
4847

49-
let graph_info = task_graph_repr(&task_graph).await;
50-
let (server, mut tera) = setup_server().await?;
51-
let url = format!("http://{}", server.server_addr());
52-
let _ = open::that(&url);
53-
54-
println!("Started server on {}", color::url(url));
55-
56-
for req in server.incoming_requests() {
57-
respond_to_request(req, &mut tera, &graph_info, "Task graph".to_owned())?;
58-
}
48+
run_server("Task graph", task_graph_repr(&task_graph).await).await?;
5949

6050
Ok(None)
6151
}

crates/app/src/commands/graph/utils.rs

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
use super::dto::{GraphEdgeDto, GraphInfoDto, GraphNodeDto};
22
use miette::IntoDiagnostic;
33
use moon_action_graph::ActionGraph;
4+
use moon_common::color;
5+
use moon_process::ProcessRegistry;
46
use moon_project_graph::{GraphConversions, ProjectGraph};
57
use moon_task_graph::TaskGraph;
68
use petgraph::{graph::NodeIndex, Graph};
79
use rustc_hash::FxHashMap;
810
use serde::Serialize;
9-
use starbase::AppResult;
1011
use starbase_utils::json;
1112
use std::env;
1213
use std::fmt::Display;
14+
use std::sync::Arc;
1315
use tera::{Context, Tera};
1416
use tiny_http::{Header, Request, Response, Server};
17+
use tokio::task::{spawn, JoinHandle};
1518

1619
const INDEX_HTML: &str = include_str!("graph.html.tera");
1720

@@ -22,10 +25,10 @@ pub struct RenderContext {
2225
pub js_url: String,
2326
}
2427

25-
pub async fn setup_server() -> miette::Result<(Server, Tera)> {
28+
pub async fn setup_server() -> miette::Result<(Arc<Server>, Tera)> {
2629
let port = match env::var("MOON_PORT") {
2730
Ok(p) => p.parse::<u16>().unwrap(),
28-
Err(..) => 8000,
31+
Err(..) => 0, // Uses an available port
2932
};
3033
let host = match env::var("MOON_HOST") {
3134
Ok(h) => h,
@@ -35,7 +38,7 @@ pub async fn setup_server() -> miette::Result<(Server, Tera)> {
3538
let server = Server::http(address).unwrap();
3639
let tera = Tera::default();
3740

38-
Ok((server, tera))
41+
Ok((Arc::new(server), tera))
3942
}
4043

4144
pub fn extract_nodes_and_edges_from_graph<T: Display>(
@@ -100,7 +103,7 @@ pub fn respond_to_request(
100103
tera: &mut Tera,
101104
graph: &GraphInfoDto,
102105
page_title: String,
103-
) -> AppResult {
106+
) -> miette::Result<()> {
104107
let response = match req.url() {
105108
"/graph-data" => {
106109
let mut response = Response::from_data(json::format(graph, false)?);
@@ -132,7 +135,7 @@ pub fn respond_to_request(
132135

133136
req.respond(response).unwrap_or_default();
134137

135-
Ok(None)
138+
Ok(())
136139
}
137140

138141
// Use the local version of the JS file when in development mode otherwise the CDN URL.
@@ -145,3 +148,43 @@ pub fn get_js_url() -> String {
145148
},
146149
}
147150
}
151+
152+
pub async fn run_server(title: &str, graph_info: GraphInfoDto) -> miette::Result<()> {
153+
let (server, mut tera) = setup_server().await?;
154+
let url = format!("http://{}", server.server_addr());
155+
let _ = open::that(&url);
156+
157+
println!("Started server on {}", color::url(url));
158+
159+
let server_clone = server.clone();
160+
let handle1: JoinHandle<miette::Result<()>> = spawn(async move {
161+
let mut listener = ProcessRegistry::instance().receive_signal();
162+
163+
if listener.recv().await.is_ok() {
164+
server_clone.unblock();
165+
}
166+
167+
Ok(())
168+
});
169+
170+
let title = title.to_owned();
171+
let handle2: JoinHandle<miette::Result<()>> = spawn(async move {
172+
for req in server.incoming_requests() {
173+
respond_to_request(req, &mut tera, &graph_info, title.clone())?;
174+
}
175+
176+
Ok(())
177+
});
178+
179+
tokio::try_join!(flatten(handle1), flatten(handle2))?;
180+
181+
Ok(())
182+
}
183+
184+
async fn flatten(handle: JoinHandle<miette::Result<()>>) -> miette::Result<()> {
185+
match handle.await {
186+
Ok(Ok(result)) => Ok(result),
187+
Ok(Err(err)) => Err(err),
188+
Err(err) => Err(miette::miette!("{err}")),
189+
}
190+
}

crates/codegen/src/codegen.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ async fn clone_and_checkout_git_repository(
281281
}
282282

283283
// Clone or fetch the repository
284-
if template_location.exists() {
284+
if template_location.join(".git").exists() {
285285
debug!(
286286
location = ?template_location,
287287
"Repository already exists, fetching latest",

0 commit comments

Comments
 (0)