Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/config/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,8 @@ pub struct AppConfig {
#[env = "DASHBOARD_URL"]
#[default = ""]
pub dashboard_url: String,

#[env = "BASE_BRANCH"]
#[default = "main"]
pub base_branch: String,
}
73 changes: 51 additions & 22 deletions src/queue/runner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,8 @@ async fn run_batch(
};

// Step 1: Get main HEAD
let main_sha = match github.get_ref(&token, &owner, &repo, "heads/main").await {
let base_ref = format!("heads/{}", config.base_branch);
let main_sha = match github.get_ref(&token, &owner, &repo, &base_ref).await {
Ok(sha) => sha,
Err(e) => {
for pr in &batch_prs {
Expand All @@ -105,15 +106,15 @@ async fn run_batch(
github,
&token,
pr,
&format!("Failed to get main HEAD: {e}"),
&format!("Failed to get {} HEAD: {e}", config.base_branch),
)
.await;
}
return Ok(());
}
};

// Step 2: Reset fila/merge to main HEAD
// Step 2: Reset fila/merge to base branch HEAD
let merge_ref = format!("heads/{MERGE_BRANCH}");
if let Err(e) = github
.ensure_ref(&token, &owner, &repo, &merge_ref, &main_sha)
Expand Down Expand Up @@ -162,13 +163,16 @@ async fn run_batch(
merged_prs.push(pr);
}
Ok(MergeResult::AlreadyMerged) => {
tracing::info!(pr = pr.pr_number, "PR already merged into main");
tracing::info!(pr = pr.pr_number, "PR already merged");
service::mark_merged(db, pr).await.ok();
comment(
github,
&token,
pr,
&format!("#{} is already merged into main.", pr.pr_number),
&format!(
"#{} is already merged into {}.",
pr.pr_number, config.base_branch
),
)
.await;
close_pr(github, &token, pr).await;
Expand Down Expand Up @@ -256,16 +260,17 @@ async fn run_batch(
}
}

// Step 5: Fast-forward main to the final merge commit
// Step 5: Fast-forward base branch to the final merge commit
match github
.update_ref(&token, &owner, &repo, "heads/main", &final_sha, false)
.update_ref(&token, &owner, &repo, &base_ref, &final_sha, false)
.await
{
Ok(()) => {
tracing::info!(
prs = ?pr_numbers,
sha = final_sha,
"Main fast-forwarded, batch merged"
branch = config.base_branch,
"Base branch fast-forwarded, batch merged"
);
for pr in &merged_prs {
service::mark_merged(db, pr)
Expand All @@ -278,7 +283,12 @@ async fn run_batch(
github,
&token,
pr,
&format!("#{} merged into main ({})", pr.pr_number, &final_sha[..8]),
&format!(
"#{} merged into {} ({})",
pr.pr_number,
config.base_branch,
&final_sha[..8]
),
)
.await;
close_pr(github, &token, pr).await;
Expand All @@ -297,15 +307,18 @@ async fn run_batch(
pr.id,
0,
"requeued",
Some("Main was updated during CI, retrying"),
Some(&format!(
"{} was updated during CI, retrying",
config.base_branch
)),
)
.await
.ok();
comment(
github,
&token,
pr,
"Main was updated while CI was running. Re-queued — will retry automatically.",
&format!("{} was updated while CI was running. Re-queued — will retry automatically.", config.base_branch),
)
.await;
}
Expand Down Expand Up @@ -350,8 +363,9 @@ async fn run_sequential(
}
};

let base_ref = format!("heads/{}", config.base_branch);
let main_sha = match github
.get_ref(&token, &pr.repo_owner, &pr.repo_name, "heads/main")
.get_ref(&token, &pr.repo_owner, &pr.repo_name, &base_ref)
.await
{
Ok(sha) => sha,
Expand All @@ -361,7 +375,7 @@ async fn run_sequential(
github,
&token,
&pr,
&format!("Failed to get main HEAD: {e}"),
&format!("Failed to get {} HEAD: {e}", config.base_branch),
)
.await;
return Ok(());
Expand Down Expand Up @@ -403,15 +417,18 @@ async fn run_sequential(
sha
}
Ok(MergeResult::AlreadyMerged) => {
tracing::info!(pr = pr.pr_number, "PR already merged into main");
tracing::info!(pr = pr.pr_number, "PR already merged");
service::mark_merged(db, &pr)
.await
.map_err(|e| RunError(e.to_string()))?;
comment(
github,
&token,
&pr,
&format!("#{} is already merged into main.", pr.pr_number),
&format!(
"#{} is already merged into {}.",
pr.pr_number, config.base_branch
),
)
.await;
close_pr(github, &token, &pr).await;
Expand All @@ -424,8 +441,8 @@ async fn run_sequential(
&token,
&pr,
&format!(
"Merge conflict: #{} cannot be cleanly merged into main. Rebase and `@fila ship` again.",
pr.pr_number
"Merge conflict: #{} cannot be cleanly merged into {}. Rebase and `@fila ship` again.",
pr.pr_number, config.base_branch
),
)
.await;
Expand Down Expand Up @@ -500,7 +517,7 @@ async fn run_sequential(
&token,
&pr.repo_owner,
&pr.repo_name,
"heads/main",
&base_ref,
&merge_sha,
false,
)
Expand All @@ -510,7 +527,8 @@ async fn run_sequential(
tracing::info!(
pr = pr.pr_number,
sha = merge_sha,
"Main fast-forwarded, PR merged"
branch = config.base_branch,
"Base branch fast-forwarded, PR merged"
);
service::mark_merged(db, &pr)
.await
Expand All @@ -522,7 +540,12 @@ async fn run_sequential(
github,
&token,
&pr,
&format!("#{} merged into main ({})", pr.pr_number, &merge_sha[..8]),
&format!(
"#{} merged into {} ({})",
pr.pr_number,
config.base_branch,
&merge_sha[..8]
),
)
.await;
close_pr(github, &token, &pr).await;
Expand All @@ -539,15 +562,21 @@ async fn run_sequential(
pr.id,
0,
"requeued",
Some("Main was updated during CI, retrying"),
Some(&format!(
"{} was updated during CI, retrying",
config.base_branch
)),
)
.await
.ok();
comment(
github,
&token,
&pr,
"Main was updated while CI was running. Re-queued — will retry automatically.",
&format!(
"{} was updated while CI was running. Re-queued — will retry automatically.",
config.base_branch
),
)
.await;
}
Expand Down
1 change: 1 addition & 0 deletions tests/integration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ async fn build_test_app(db_path: &str) -> TestClient {
ci_timeout_secs: 1800,
poll_interval_secs: 15,
dashboard_url: "".to_string(),
base_branch: "main".to_string(),
};

let github = Arc::new(GitHubClient::new(
Expand Down