You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

119 lines
3.7 KiB

import { finalizeEvent } from 'nostr-tools';
import { decode } from 'nostr-tools/nip19';
import { publishEventCommon, addClientTag } from './index.js';
/**
* Publish pull request update
*/
export async function publishPRUpdate(args, relays, privateKeyBytes, pubkey, json) {
const [ownerNpub, repoName, prEventId, commitId] = args;
if (!ownerNpub || !repoName || !prEventId || !commitId) {
console.error('Error: owner npub, repo name, PR event ID, and commit ID required');
console.error('Use: publish pr-update <owner-npub> <repo> <pr-event-id> <commit-id> [options]');
process.exit(1);
}
let ownerPubkey;
try {
ownerPubkey = ownerNpub.startsWith('npub') ? decode(ownerNpub).data : ownerNpub;
if (ownerPubkey instanceof Uint8Array) {
ownerPubkey = Array.from(ownerPubkey).map(b => b.toString(16).padStart(2, '0')).join('');
}
} catch (err) {
throw new Error(`Invalid npub format: ${err.message}`);
}
// Get PR author pubkey (needed for NIP-22 tags)
let prAuthorPubkey = null;
const cloneUrls = [];
let mergeBase = null;
let earliestCommit = null;
const mentions = [];
for (let i = 4; i < args.length; i++) {
if (args[i] === '--pr-author' && args[i + 1]) {
let authorNpub = args[++i];
try {
prAuthorPubkey = authorNpub.startsWith('npub') ? decode(authorNpub).data : authorNpub;
if (prAuthorPubkey instanceof Uint8Array) {
prAuthorPubkey = Array.from(prAuthorPubkey).map(b => b.toString(16).padStart(2, '0')).join('');
}
} catch (err) {
throw new Error(`Invalid pr-author npub format: ${err.message}`);
}
} else if (args[i] === '--clone-url' && args[i + 1]) {
cloneUrls.push(args[++i]);
} else if (args[i] === '--merge-base' && args[i + 1]) {
mergeBase = args[++i];
} else if (args[i] === '--earliest-commit' && args[i + 1]) {
earliestCommit = args[++i];
} else if (args[i] === '--mention' && args[i + 1]) {
mentions.push(args[++i]);
}
}
const repoAddress = `30617:${ownerPubkey}:${repoName}`;
const tags = [
['a', repoAddress],
['p', ownerPubkey],
['E', prEventId], // NIP-22 root event reference
['c', commitId]
];
// Add earliest commit if provided
if (earliestCommit) {
tags.push(['r', earliestCommit, 'euc']);
}
// Add mentions
for (const mention of mentions) {
let mentionPubkey = mention;
try {
if (mention.startsWith('npub')) {
mentionPubkey = decode(mention).data;
if (mentionPubkey instanceof Uint8Array) {
mentionPubkey = Array.from(mentionPubkey).map(b => b.toString(16).padStart(2, '0')).join('');
}
}
} catch {
// Keep original if decode fails
}
tags.push(['p', mentionPubkey]);
}
// Add PR author if provided (NIP-22 root pubkey reference)
if (prAuthorPubkey) {
tags.push(['P', prAuthorPubkey]);
}
// Add clone URLs (required)
if (cloneUrls.length === 0) {
console.error('Error: At least one --clone-url is required');
process.exit(1);
}
for (const url of cloneUrls) {
tags.push(['clone', url]);
}
// Add merge base if provided
if (mergeBase) {
tags.push(['merge-base', mergeBase]);
}
// Add client tag unless --no-client-tag is specified
addClientTag(tags, args);
const event = finalizeEvent({
kind: 1619, // PULL_REQUEST_UPDATE
created_at: Math.floor(Date.now() / 1000),
tags,
content: ''
}, privateKeyBytes);
await publishEventCommon(event, relays, privateKeyBytes, pubkey, json, 'Pull request update');
if (!json) {
console.log(`Repository: ${ownerNpub}/${repoName}`);
console.log(`PR Event ID: ${prEventId}`);
console.log(`New commit: ${commitId}`);
}
}