Compare commits

..

No commits in common. "95194149291fd138cc0fe14001bb4d068de73cde" and "96bb2540ba1c7c95014a8e5c34b1a0c09759fa40" have entirely different histories.

5 changed files with 17 additions and 64 deletions

View file

@ -964,7 +964,6 @@ dependencies = [
"hashbrown", "hashbrown",
"indexmap", "indexmap",
"serde", "serde",
"serde_derive",
] ]
[[package]] [[package]]

View file

@ -13,7 +13,7 @@ chrono = "0.4.41"
env_logger = { version = "0.11.8", default-features = false, features = ["auto-color", "color", "humantime"] } env_logger = { version = "0.11.8", default-features = false, features = ["auto-color", "color", "humantime"] }
forgejo-api = { git = "https://git.fa-fo.de/rahix/forgejo-api.git", rev = "a3f6452cfe774898a89ac66be393e5205f5e12b7" } forgejo-api = { git = "https://git.fa-fo.de/rahix/forgejo-api.git", rev = "a3f6452cfe774898a89ac66be393e5205f5e12b7" }
log = "0.4.27" log = "0.4.27"
petgraph = { version = "0.8.1", features = ["serde-1"] } petgraph = "0.8.1"
serde = { version = "1.0.219", features = ["derive"] } serde = { version = "1.0.219", features = ["derive"] }
serde_json = "1.0.140" serde_json = "1.0.140"
sha256 = "1.6.0" sha256 = "1.6.0"

View file

@ -20,7 +20,7 @@ pub struct Context {
/// URL of the repository page /// URL of the repository page
pub repo_url: url::Url, pub repo_url: url::Url,
/// URL of the repository with authentication information attached /// URL of the repository with authentication information attached
pub repo_auth_url: Option<url::Url>, pub repo_auth_url: url::Url,
/// Human readable timestamp of this manager run /// Human readable timestamp of this manager run
pub timestamp: String, pub timestamp: String,
} }
@ -30,9 +30,7 @@ async fn run() -> anyhow::Result<()> {
log::warn!("Fake tree!"); log::warn!("Fake tree!");
event_meta::fake() event_meta::fake()
} else { } else {
event_meta::get_issue_event_meta_from_env() event_meta::get_issue_event_meta_from_env().context("Failed reading issue event data")?
.context("Maybe you want to run with TECHTREE_FAKE=1?")
.context("Failed reading issue event data")?
}; };
log::info!( log::info!(
@ -44,15 +42,13 @@ async fn run() -> anyhow::Result<()> {
let timestamp = chrono::Local::now().format("%Y-%m-%d %H:%M:%S").to_string(); let timestamp = chrono::Local::now().format("%Y-%m-%d %H:%M:%S").to_string();
log::info!("Timestamp of this run is {timestamp}"); log::info!("Timestamp of this run is {timestamp}");
let token = std::env::var("GITHUB_TOKEN").ok(); let token =
if token.is_none() { std::env::var("GITHUB_TOKEN").context("Failed accessing GITHUB_TOKEN auth token")?;
log::warn!("No GITHUB_TOKEN, only performing read-only operations!");
}
let server_url = url::Url::parse(&std::env::var("GITHUB_SERVER_URL").unwrap_or_else(|_e| { let server_url = url::Url::parse(
log::warn!("Using FAFO URL as a default GITHUB_SERVER_URL!"); &std::env::var("GITHUB_SERVER_URL")
"https://git.fa-fo.de".to_string() .context("Failed reading GITHUB_SERVER_URL server url")?,
})) )
.context("Failed parsing GITHUB_SERVER_URL as a url")?; .context("Failed parsing GITHUB_SERVER_URL as a url")?;
let repo_url = server_url let repo_url = server_url
@ -61,19 +57,11 @@ async fn run() -> anyhow::Result<()> {
meta.issue.repository.owner, meta.issue.repository.name meta.issue.repository.owner, meta.issue.repository.name
)) ))
.unwrap(); .unwrap();
let mut repo_auth_url = repo_url.clone();
repo_auth_url.set_username("forgejo-actions").unwrap();
repo_auth_url.set_password(Some(&token)).unwrap();
let repo_auth_url = token.as_ref().map(|token| { let auth = forgejo_api::Auth::Token(&token);
let mut repo_auth_url = repo_url.clone();
repo_auth_url.set_username("forgejo-actions").unwrap();
repo_auth_url.set_password(Some(&token)).unwrap();
repo_auth_url
});
let auth = if let Some(token) = token.as_ref() {
forgejo_api::Auth::Token(token)
} else {
forgejo_api::Auth::None
};
let forgejo = let forgejo =
Forgejo::new(auth, server_url).context("Could not create Forgejo API access object")?; Forgejo::new(auth, server_url).context("Could not create Forgejo API access object")?;
@ -115,14 +103,9 @@ async fn run() -> anyhow::Result<()> {
let rendered_tree = render::render(&ctx, &tree) let rendered_tree = render::render(&ctx, &tree)
.await .await
.context("Failed to render the techtree")?; .context("Failed to render the techtree")?;
render::publish(&ctx, &rendered_tree)
if token.is_some() { .await
render::publish(&ctx, &rendered_tree) .context("Failed to publish rendered tree to git")?;
.await
.context("Failed to publish rendered tree to git")?;
} else {
log::warn!("Skipped publishing the rendered tree.");
}
// Wiki is disabled because the tree is too big for mermaid to handle // Wiki is disabled because the tree is too big for mermaid to handle
if false { if false {
@ -132,11 +115,6 @@ async fn run() -> anyhow::Result<()> {
.context("Failed to update the techtree wiki page")?; .context("Failed to update the techtree wiki page")?;
} }
if token.is_none() {
log::warn!("Not running issue updates without token.");
return Ok(());
}
'issues: for issue in tree.iter_issues() { 'issues: for issue in tree.iter_issues() {
let subtree = tree.subtree_for_issue(issue).unwrap(); let subtree = tree.subtree_for_issue(issue).unwrap();
let hash = subtree.stable_hash(); let hash = subtree.stable_hash();

View file

@ -103,12 +103,7 @@ pub async fn publish(ctx: &crate::Context, rendered: &RenderedTree) -> anyhow::R
.arg("push") .arg("push")
.arg("--force") .arg("--force")
.arg("--quiet") .arg("--quiet")
.arg( .arg(ctx.repo_auth_url.to_string())
ctx.repo_auth_url
.as_ref()
.expect("cannot publish without authentication token")
.to_string(),
)
.arg("HEAD:refs/heads/render") .arg("HEAD:refs/heads/render")
.status() .status()
.context("Failed to push rendered graph to forgejo repository")?; .context("Failed to push rendered graph to forgejo repository")?;

View file

@ -113,10 +113,8 @@ impl std::fmt::Display for ElementStatus {
pub type ElementIndex = petgraph::graph::NodeIndex; pub type ElementIndex = petgraph::graph::NodeIndex;
#[derive(serde::Serialize)]
pub struct Tree { pub struct Tree {
graph: petgraph::Graph<Element, ()>, graph: petgraph::Graph<Element, ()>,
#[serde(skip)]
issue_map: BTreeMap<u64, ElementIndex>, issue_map: BTreeMap<u64, ElementIndex>,
} }
@ -160,16 +158,6 @@ impl Tree {
Subtree::new_for_element(self, element) Subtree::new_for_element(self, element)
} }
pub fn iter_ultimate_elements<'a>(&'a self) -> impl Iterator<Item = ElementIndex> + 'a {
self.graph.node_indices().filter(|index| {
// If there are no incoming edges, then this is an ultimate element!
self.graph
.neighbors_directed(*index, petgraph::Direction::Incoming)
.next()
.is_none()
})
}
pub fn to_dot(&self) -> String { pub fn to_dot(&self) -> String {
let dot = petgraph::dot::Dot::with_attr_getters( let dot = petgraph::dot::Dot::with_attr_getters(
&self.graph, &self.graph,
@ -183,16 +171,9 @@ impl Tree {
&|_g, (_, element)| element.to_dot_node_attributes(None), &|_g, (_, element)| element.to_dot_node_attributes(None),
); );
let ultimate_elements: Vec<_> = self
.iter_ultimate_elements()
.map(|idx| idx.index().to_string())
.collect();
let ultimate_element_list = ultimate_elements.join("; ");
format!( format!(
r#"digraph {{ r#"digraph {{
ranksep=1.2 ranksep=1.2
{{ rank=same; {ultimate_element_list}; }}
{:?} {:?}
}} }}
"#, "#,