Attempt to make this work

This commit is contained in:
Mark Wylde
2025-05-30 21:12:47 +01:00
parent f2f966c77e
commit 01602be052
3 changed files with 216 additions and 102 deletions

View File

@@ -107,39 +107,18 @@ async function run() {
const containsPRUrl = currentBody.match(prUrlPattern); const containsPRUrl = currentBody.match(prUrlPattern);
if (!containsPRUrl) { if (!containsPRUrl) {
// Check if there are changes to the branch compared to the default branch // Check if we're in a Gitea environment
try { const isGitea =
const { data: comparison } = process.env.GITHUB_API_URL &&
await octokit.rest.repos.compareCommitsWithBasehead({ !process.env.GITHUB_API_URL.includes("api.github.com");
owner,
repo,
basehead: `${baseBranch}...${claudeBranch}`,
});
// If there are changes (commits or file changes), add the PR URL if (isGitea) {
if ( // Gitea doesn't support the /compare endpoint, use direct SHA comparison
comparison.total_commits > 0 || console.log(
(comparison.files && comparison.files.length > 0) "Detected Gitea environment, using SHA comparison for PR link check",
) { );
const entityType = context.isPR ? "PR" : "Issue";
const prTitle = encodeURIComponent(
`${entityType} #${context.entityNumber}: Changes from Claude`,
);
const prBody = encodeURIComponent(
`This PR addresses ${entityType.toLowerCase()} #${context.entityNumber}\n\nGenerated with [Claude Code](https://claude.ai/code)`,
);
const prUrl = `${serverUrl}/${owner}/${repo}/compare/${baseBranch}...${claudeBranch}?quick_pull=1&title=${prTitle}&body=${prBody}`;
prLink = `\n[Create a PR](${prUrl})`;
}
} catch (error) {
console.error("Error checking for changes in branch:", error);
// For Gitea compatibility, try alternative approach
try { try {
console.log(
"Trying alternative branch comparison for Gitea compatibility...",
);
// Get the branch info to see if it exists and has commits // Get the branch info to see if it exists and has commits
const branchResponse = await octokit.rest.repos.getBranch({ const branchResponse = await octokit.rest.repos.getBranch({
owner, owner,
@@ -176,15 +155,10 @@ async function run() {
`Branch ${claudeBranch} has same SHA as base, no PR link needed`, `Branch ${claudeBranch} has same SHA as base, no PR link needed`,
); );
} }
} catch (fallbackError) { } catch (error) {
console.error( console.error("Error checking branch in Gitea:", error);
"Fallback branch comparison also failed:", // If we can't check in Gitea, add PR link to be safe
fallbackError, console.log("Adding PR link as fallback for Gitea");
);
// If all checks fail, still add PR link to be safe
console.log(
"Adding PR link as fallback since we can't determine branch status",
);
const entityType = context.isPR ? "PR" : "Issue"; const entityType = context.isPR ? "PR" : "Issue";
const prTitle = encodeURIComponent( const prTitle = encodeURIComponent(
`${entityType} #${context.entityNumber}: Changes from Claude`, `${entityType} #${context.entityNumber}: Changes from Claude`,
@@ -195,6 +169,85 @@ async function run() {
const prUrl = `${serverUrl}/${owner}/${repo}/compare/${baseBranch}...${claudeBranch}?quick_pull=1&title=${prTitle}&body=${prBody}`; const prUrl = `${serverUrl}/${owner}/${repo}/compare/${baseBranch}...${claudeBranch}?quick_pull=1&title=${prTitle}&body=${prBody}`;
prLink = `\n[Create a PR](${prUrl})`; prLink = `\n[Create a PR](${prUrl})`;
} }
} else {
// GitHub environment - use the comparison API
try {
const { data: comparison } =
await octokit.rest.repos.compareCommitsWithBasehead({
owner,
repo,
basehead: `${baseBranch}...${claudeBranch}`,
});
// If there are changes (commits or file changes), add the PR URL
if (
comparison.total_commits > 0 ||
(comparison.files && comparison.files.length > 0)
) {
const entityType = context.isPR ? "PR" : "Issue";
const prTitle = encodeURIComponent(
`${entityType} #${context.entityNumber}: Changes from Claude`,
);
const prBody = encodeURIComponent(
`This PR addresses ${entityType.toLowerCase()} #${context.entityNumber}\n\nGenerated with [Claude Code](https://claude.ai/code)`,
);
const prUrl = `${serverUrl}/${owner}/${repo}/compare/${baseBranch}...${claudeBranch}?quick_pull=1&title=${prTitle}&body=${prBody}`;
prLink = `\n[Create a PR](${prUrl})`;
}
} catch (error) {
console.error("Error checking for changes in branch:", error);
// Fallback to SHA comparison even on GitHub if API fails
try {
console.log(
"GitHub comparison API failed, falling back to SHA comparison",
);
const branchResponse = await octokit.rest.repos.getBranch({
owner,
repo,
branch: claudeBranch,
});
const baseResponse = await octokit.rest.repos.getBranch({
owner,
repo,
branch: baseBranch,
});
const branchSha = branchResponse.data.commit.sha;
const baseSha = baseResponse.data.commit.sha;
// If SHAs are different, assume there are changes and add PR link
if (branchSha !== baseSha) {
const entityType = context.isPR ? "PR" : "Issue";
const prTitle = encodeURIComponent(
`${entityType} #${context.entityNumber}: Changes from Claude`,
);
const prBody = encodeURIComponent(
`This PR addresses ${entityType.toLowerCase()} #${context.entityNumber}\n\nGenerated with [Claude Code](https://claude.ai/code)`,
);
const prUrl = `${serverUrl}/${owner}/${repo}/compare/${baseBranch}...${claudeBranch}?quick_pull=1&title=${prTitle}&body=${prBody}`;
prLink = `\n[Create a PR](${prUrl})`;
}
} catch (fallbackError) {
console.error(
"Fallback branch comparison also failed:",
fallbackError,
);
// If all checks fail, still add PR link to be safe
console.log("Adding PR link as final fallback");
const entityType = context.isPR ? "PR" : "Issue";
const prTitle = encodeURIComponent(
`${entityType} #${context.entityNumber}: Changes from Claude`,
);
const prBody = encodeURIComponent(
`This PR addresses ${entityType.toLowerCase()} #${context.entityNumber}\n\nGenerated with [Claude Code](https://claude.ai/code)`,
);
const prUrl = `${serverUrl}/${owner}/${repo}/compare/${baseBranch}...${claudeBranch}?quick_pull=1&title=${prTitle}&body=${prBody}`;
prLink = `\n[Create a PR](${prUrl})`;
}
}
} }
} }
} }

View File

@@ -12,35 +12,18 @@ export async function checkAndDeleteEmptyBranch(
let shouldDeleteBranch = false; let shouldDeleteBranch = false;
if (claudeBranch) { if (claudeBranch) {
// Check if Claude made any commits to the branch // Check if we're in a Gitea environment
try { const isGitea =
const { data: comparison } = process.env.GITHUB_API_URL &&
await octokit.rest.repos.compareCommitsWithBasehead({ !process.env.GITHUB_API_URL.includes("api.github.com");
owner,
repo,
basehead: `${baseBranch}...${claudeBranch}`,
});
// If there are no commits, mark branch for deletion if (isGitea) {
if (comparison.total_commits === 0) { // Gitea doesn't support the /compare endpoint, use direct SHA comparison
console.log( console.log(
`Branch ${claudeBranch} has no commits from Claude, will delete it`, "Detected Gitea environment, using SHA comparison for branch check",
); );
shouldDeleteBranch = true;
} else {
// Only add branch link if there are commits
const branchUrl = `${GITHUB_SERVER_URL}/${owner}/${repo}/tree/${claudeBranch}`;
branchLink = `\n[View branch](${branchUrl})`;
}
} catch (error) {
console.error("Error checking for commits on Claude branch:", error);
// For Gitea compatibility, try alternative approach using branches endpoint
try { try {
console.log(
"Trying alternative branch comparison for Gitea compatibility...",
);
// Get the branch info to see if it exists and has commits // Get the branch info to see if it exists and has commits
const branchResponse = await octokit.rest.repos.getBranch({ const branchResponse = await octokit.rest.repos.getBranch({
owner, owner,
@@ -71,36 +54,101 @@ export async function checkAndDeleteEmptyBranch(
); );
shouldDeleteBranch = true; shouldDeleteBranch = true;
} }
} catch (fallbackError) { } catch (error) {
console.error("Fallback branch comparison also failed:", fallbackError); console.error("Error checking branch in Gitea:", error);
// If all checks fail, assume the branch has commits to be safe // If we can't check, assume the branch has commits to be safe
const branchUrl = `${GITHUB_SERVER_URL}/${owner}/${repo}/tree/${claudeBranch}`; const branchUrl = `${GITHUB_SERVER_URL}/${owner}/${repo}/tree/${claudeBranch}`;
branchLink = `\n[View branch](${branchUrl})`; branchLink = `\n[View branch](${branchUrl})`;
} }
} else {
// GitHub environment - use the comparison API
try {
const { data: comparison } =
await octokit.rest.repos.compareCommitsWithBasehead({
owner,
repo,
basehead: `${baseBranch}...${claudeBranch}`,
});
// If there are no commits, mark branch for deletion
if (comparison.total_commits === 0) {
console.log(
`Branch ${claudeBranch} has no commits from Claude, will delete it`,
);
shouldDeleteBranch = true;
} else {
// Only add branch link if there are commits
const branchUrl = `${GITHUB_SERVER_URL}/${owner}/${repo}/tree/${claudeBranch}`;
branchLink = `\n[View branch](${branchUrl})`;
}
} catch (error) {
console.error("Error checking for commits on Claude branch:", error);
// Fallback to SHA comparison even on GitHub if API fails
try {
console.log(
"GitHub comparison API failed, falling back to SHA comparison",
);
const branchResponse = await octokit.rest.repos.getBranch({
owner,
repo,
branch: claudeBranch,
});
const baseResponse = await octokit.rest.repos.getBranch({
owner,
repo,
branch: baseBranch,
});
const branchSha = branchResponse.data.commit.sha;
const baseSha = baseResponse.data.commit.sha;
if (branchSha !== baseSha) {
const branchUrl = `${GITHUB_SERVER_URL}/${owner}/${repo}/tree/${claudeBranch}`;
branchLink = `\n[View branch](${branchUrl})`;
} else {
shouldDeleteBranch = true;
}
} catch (fallbackError) {
console.error(
"Fallback branch comparison also failed:",
fallbackError,
);
// If all checks fail, assume the branch has commits to be safe
const branchUrl = `${GITHUB_SERVER_URL}/${owner}/${repo}/tree/${claudeBranch}`;
branchLink = `\n[View branch](${branchUrl})`;
}
}
} }
} }
// Delete the branch if it has no commits // Delete the branch if it has no commits
if (shouldDeleteBranch && claudeBranch) { if (shouldDeleteBranch && claudeBranch) {
try { // Check if we're in a Gitea environment for deletion too
await octokit.rest.git.deleteRef({ const isGitea =
owner, process.env.GITHUB_API_URL &&
repo, !process.env.GITHUB_API_URL.includes("api.github.com");
ref: `heads/${claudeBranch}`,
});
console.log(`✅ Deleted empty branch: ${claudeBranch}`);
} catch (deleteError: any) {
console.error(`Failed to delete branch ${claudeBranch}:`, deleteError);
console.log(`Delete error status: ${deleteError.status}`);
// For Gitea, branch deletion might not be supported via API if (isGitea) {
if (deleteError.status === 405 || deleteError.status === 404) { console.log(
console.log( `Skipping branch deletion for Gitea - not reliably supported: ${claudeBranch}`,
"Branch deletion not supported or branch doesn't exist remotely - this is expected for Gitea", );
); // Don't attempt deletion in Gitea as it's not reliably supported
} else {
try {
await octokit.rest.git.deleteRef({
owner,
repo,
ref: `heads/${claudeBranch}`,
});
console.log(`✅ Deleted empty branch: ${claudeBranch}`);
} catch (deleteError: any) {
console.error(`Failed to delete branch ${claudeBranch}:`, deleteError);
console.log(`Delete error status: ${deleteError.status}`);
// Continue even if deletion fails - this is not critical
} }
// Continue even if deletion fails - this is not critical
} }
} }

View File

@@ -121,27 +121,40 @@ export async function setupBranch(
console.log(`Current SHA: ${currentSHA}`); console.log(`Current SHA: ${currentSHA}`);
// Create branch - try GitHub API first // Check if we're in a Gitea environment
try { const isGitea =
await octokits.rest.git.createRef({ process.env.GITHUB_API_URL &&
owner, !process.env.GITHUB_API_URL.includes("api.github.com");
repo,
ref: `refs/heads/${newBranch}`,
sha: currentSHA,
});
console.log(`Successfully created branch via API: ${newBranch}`); if (isGitea) {
} catch (createRefError: any) { // Gitea doesn't reliably support git.createRef, skip it
// If git/refs creation fails (like in Gitea), that's expected
// Log the error details but continue - the branch will be created when we push files
console.log( console.log(
`git createRef failed (expected for Gitea): ${createRefError.message}`, `Detected Gitea environment, skipping git.createRef for branch: ${newBranch}`,
); );
console.log(`Error status: ${createRefError.status}`); console.log(
console.log(`Branch ${newBranch} will be created when files are pushed`); `Branch ${newBranch} will be created when files are pushed via MCP server`,
);
} else {
// GitHub environment - try to create branch via API
try {
await octokits.rest.git.createRef({
owner,
repo,
ref: `refs/heads/${newBranch}`,
sha: currentSHA,
});
// For Gitea, we can still proceed since the MCP server will create the branch on first push console.log(`Successfully created branch via API: ${newBranch}`);
// This is actually the preferred method for Gitea } catch (createRefError: any) {
// If creation fails on GitHub, log but continue
console.log(
`git createRef failed on GitHub: ${createRefError.message}`,
);
console.log(`Error status: ${createRefError.status}`);
console.log(
`Branch ${newBranch} will be created when files are pushed`,
);
}
} }
console.log(`Branch setup completed for: ${newBranch}`); console.log(`Branch setup completed for: ${newBranch}`);