mirror of
https://github.com/markwylde/claude-code-gitea-action.git
synced 2026-02-20 02:22:49 +08:00
Attempt to make this work
This commit is contained in:
@@ -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})`;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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}`);
|
||||||
|
|||||||
Reference in New Issue
Block a user