fix: resolve PR number from event payload for Gitea Actions
Gitea Actions mirrors GitHub Actions env vars and does not expose a flat GITEA_EVENT_PULL_REQUEST_NUMBER. Parse the PR number out of $GITHUB_EVENT_PATH, key platform detection on $GITEA_ACTIONS, and use the correct Accept header for GitHub's diff endpoint. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
+45
-46
@@ -78,20 +78,39 @@ echo "Generate diff"
|
|||||||
# Instead, we get the diff directly from the Gitea/GitHub API using the token
|
# Instead, we get the diff directly from the Gitea/GitHub API using the token
|
||||||
# we already have for posting comments.
|
# we already have for posting comments.
|
||||||
|
|
||||||
# Detect platform and resolve PR info
|
# Gitea Actions mirrors GitHub Actions env vars ($GITHUB_*) and exposes the
|
||||||
if [ -n "${GITEA_SERVER_URL:-}" ]; then
|
# event payload at $GITHUB_EVENT_PATH. There is no flat $GITEA_EVENT_*
|
||||||
API_BASE="${GITEA_SERVER_URL}/api/v1"
|
# variable for the PR number, so we parse it out of the event JSON.
|
||||||
PR_NUMBER="${GITEA_EVENT_PULL_REQUEST_NUMBER:-}"
|
|
||||||
REPO="${GITEA_REPOSITORY:-}"
|
REPO="${GITHUB_REPOSITORY:-${GITEA_REPOSITORY:-}}"
|
||||||
echo "Platform: Gitea (${GITEA_SERVER_URL})"
|
|
||||||
|
# Detect Gitea vs GitHub. Gitea sets $GITHUB_SERVER_URL too, so the only
|
||||||
|
# reliable signal is $GITEA_ACTIONS (or a non-github.com server URL).
|
||||||
|
SERVER_URL="${GITHUB_SERVER_URL:-${GITEA_SERVER_URL:-}}"
|
||||||
|
if [ -n "${GITEA_ACTIONS:-}" ] || { [ -n "$SERVER_URL" ] && [ "${SERVER_URL#*github.com}" = "$SERVER_URL" ]; }; then
|
||||||
|
API_BASE="${SERVER_URL}/api/v1"
|
||||||
|
PLATFORM="gitea"
|
||||||
|
echo "Platform: Gitea (${SERVER_URL})"
|
||||||
else
|
else
|
||||||
API_BASE="${GITHUB_API_URL:-https://api.github.com}"
|
API_BASE="${GITHUB_API_URL:-https://api.github.com}"
|
||||||
PR_NUMBER="${GITHUB_EVENT_PULL_REQUEST_NUMBER:-}"
|
PLATFORM="github"
|
||||||
REPO="${GITHUB_REPOSITORY:-}"
|
|
||||||
echo "Platform: GitHub"
|
echo "Platform: GitHub"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Resolve PR number from the event payload.
|
||||||
|
PR_NUMBER=""
|
||||||
|
if [ -n "${GITHUB_EVENT_PATH:-}" ] && [ -f "${GITHUB_EVENT_PATH}" ]; then
|
||||||
|
PR_NUMBER=$(node -e "
|
||||||
|
try {
|
||||||
|
const e = require(process.env.GITHUB_EVENT_PATH);
|
||||||
|
const n = (e.pull_request && e.pull_request.number) || e.number || '';
|
||||||
|
process.stdout.write(String(n || ''));
|
||||||
|
} catch { process.stdout.write(''); }
|
||||||
|
")
|
||||||
|
fi
|
||||||
|
|
||||||
echo "Repo: ${REPO}, PR: ${PR_NUMBER}"
|
echo "Repo: ${REPO}, PR: ${PR_NUMBER}"
|
||||||
|
echo "DEBUG: PLATFORM=${PLATFORM} API_BASE=${API_BASE} EVENT=${GITHUB_EVENT_PATH:-}"
|
||||||
|
|
||||||
if [ -z "$PR_NUMBER" ]; then
|
if [ -z "$PR_NUMBER" ]; then
|
||||||
echo "Not a pull request event. Skipping review."
|
echo "Not a pull request event. Skipping review."
|
||||||
@@ -109,55 +128,45 @@ const apiBase = '${API_BASE}';
|
|||||||
const repo = '${REPO}';
|
const repo = '${REPO}';
|
||||||
const prNumber = '${PR_NUMBER}';
|
const prNumber = '${PR_NUMBER}';
|
||||||
const token = '${PI_TOKEN}';
|
const token = '${PI_TOKEN}';
|
||||||
|
const platform = '${PLATFORM}';
|
||||||
const maxBytes = ${PI_MAX_DIFF:-80000};
|
const maxBytes = ${PI_MAX_DIFF:-80000};
|
||||||
|
|
||||||
function fetchDiff() {
|
function fetchDiff() {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
// Try Gitea diff endpoint first
|
// Gitea: GET {api}/repos/{owner}/{repo}/pulls/{n}.diff
|
||||||
const giteaPath = '/repos/' + repo + '/pulls/' + prNumber + '.diff';
|
// GitHub: GET {api}/repos/{owner}/{repo}/pulls/{n} with Accept: application/vnd.github.v3.diff
|
||||||
const githubPath = '/repos/' + repo + '/pulls/' + prNumber;
|
const path = platform === 'gitea'
|
||||||
|
? '/repos/' + repo + '/pulls/' + prNumber + '.diff'
|
||||||
|
: '/repos/' + repo + '/pulls/' + prNumber;
|
||||||
|
|
||||||
const url = new URL(apiBase + giteaPath);
|
const url = new URL(apiBase + path);
|
||||||
const transport = url.protocol === 'http:' ? http : https;
|
const transport = url.protocol === 'http:' ? http : https;
|
||||||
|
|
||||||
|
const headers = {
|
||||||
|
'Authorization': 'token ' + token,
|
||||||
|
'User-Agent': 'pi-code-review',
|
||||||
|
'Accept': platform === 'gitea' ? 'text/plain' : 'application/vnd.github.v3.diff',
|
||||||
|
};
|
||||||
|
|
||||||
const options = {
|
const options = {
|
||||||
hostname: url.hostname,
|
hostname: url.hostname,
|
||||||
port: url.port || (url.protocol === 'http:' ? 80 : 443),
|
port: url.port || (url.protocol === 'http:' ? 80 : 443),
|
||||||
path: url.pathname,
|
path: url.pathname,
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
headers: {
|
headers,
|
||||||
'Authorization': 'token ' + token,
|
|
||||||
'Accept': 'text/plain',
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const req = transport.request(options, (res) => {
|
const req = transport.request(options, (res) => {
|
||||||
if (res.statusCode === 404 && apiBase.indexOf('github.com') !== -1) {
|
|
||||||
// Fallback to GitHub diff format
|
|
||||||
reject(new Error('GitHub fallback not implemented'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (res.statusCode < 200 || res.statusCode >= 300) {
|
if (res.statusCode < 200 || res.statusCode >= 300) {
|
||||||
let body = '';
|
let body = '';
|
||||||
res.on('data', (c) => { body += c; });
|
res.on('data', (c) => { body += c; });
|
||||||
res.on('end', () => { reject(new Error('API ' + res.statusCode + ': ' + body.slice(0, 200))); });
|
res.on('end', () => { reject(new Error('API ' + res.statusCode + ' for ' + url.href + ': ' + body.slice(0, 200))); });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let data = '';
|
let data = '';
|
||||||
let bytes = 0;
|
res.on('data', (chunk) => { data += chunk; });
|
||||||
res.on('data', (chunk) => {
|
res.on('end', () => { resolve(data); });
|
||||||
bytes += chunk.length;
|
|
||||||
if (maxBytes > 0 && bytes <= maxBytes) {
|
|
||||||
data += chunk;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
res.on('end', () => {
|
|
||||||
if (maxBytes > 0 && data.length >= maxBytes) {
|
|
||||||
data = data.slice(0, maxBytes) + '\\n... (truncated at ' + maxBytes + ' bytes)';
|
|
||||||
}
|
|
||||||
resolve(data);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
req.on('error', (e) => { reject(e); });
|
req.on('error', (e) => { reject(e); });
|
||||||
req.end();
|
req.end();
|
||||||
@@ -302,17 +311,7 @@ echo "::endgroup::"
|
|||||||
# ─── Phase 4: Post comment ────────────────────────────────────────────────────
|
# ─── Phase 4: Post comment ────────────────────────────────────────────────────
|
||||||
echo "::group::Post review comment"
|
echo "::group::Post review comment"
|
||||||
|
|
||||||
# Detect Gitea vs GitHub
|
# API_BASE / REPO / PR_NUMBER were resolved in Phase 2.
|
||||||
if [ -n "${GITEA_SERVER_URL:-}" ]; then
|
|
||||||
API_BASE="${GITEA_SERVER_URL}/api/v1"
|
|
||||||
PR_NUMBER="${GITEA_EVENT_PULL_REQUEST_NUMBER:-}"
|
|
||||||
REPO="${GITEA_REPOSITORY:-}"
|
|
||||||
else
|
|
||||||
API_BASE="${GITHUB_API_URL:-https://api.github.com}"
|
|
||||||
PR_NUMBER="${GITHUB_EVENT_PULL_REQUEST_NUMBER:-}"
|
|
||||||
REPO="${GITHUB_REPOSITORY:-}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$PR_NUMBER" ]; then
|
if [ -z "$PR_NUMBER" ]; then
|
||||||
echo "Not a pull request event. Review written to /tmp/pi-review.md only."
|
echo "Not a pull request event. Review written to /tmp/pi-review.md only."
|
||||||
echo "::endgroup::"
|
echo "::endgroup::"
|
||||||
|
|||||||
Reference in New Issue
Block a user