@ -362,14 +362,18 @@ Your commits will all be signed by your Nostr keys and saved to the event files
@@ -362,14 +362,18 @@ Your commits will all be signed by your Nostr keys and saved to the event files
return{success: true};
}
// Repo exists but no announcement - try to fetch from relays
logger.error({operation:'fork',originalRepo:`${npub}/${repo}`,forkRepo:`${userNpub}/${forkRepoName}`,failed: publishResult.failed},'Fork announcement failed after all retries. Cleaning up repository.');
error:'Failed to publish fork announcement to relays after 3 attempts',
details: errorDetails,
eventName:'fork announcement'
},{status: 500});
}
if(publishResult.success.length===0){
// Clean up repo if announcement failed
logger.error({operation:'fork',originalRepo:`${npub}/${repo}`,forkRepo:`${userNpub}/${forkRepoName}`,failed: publishResult.failed},'Fork announcement failed after all retries. Cleaning up repository.');
logger.error({operation:'fork',originalRepo:`${npub}/${repo}`,forkRepo:`${userNpub}/${forkRepoName}`,failed: ownershipPublishResult.failed},'Ownership transfer event failed after all retries. Cleaning up repository and publishing deletion request.');
logger.info({operation:'fork',originalRepo:`${npub}/${repo}`,forkRepo:`${userNpub}/${forkRepoName}`},'Deletion request published successfully');
}else{
logger.error({operation:'fork',originalRepo:`${npub}/${repo}`,forkRepo:`${userNpub}/${forkRepoName}`,failed: deletionResult.failed},'Failed to publish deletion request');
}
if(ownershipPublishResult.success.length===0){
// Clean up repo if ownership proof failed
logger.error({operation:'fork',originalRepo:`${npub}/${repo}`,forkRepo:`${userNpub}/${forkRepoName}`,failed: ownershipPublishResult.failed},'Ownership transfer event failed after all retries. Cleaning up repository and publishing deletion request.');
consterrorDetails=`Fork is invalid without ownership proof. All relays failed: ${ownershipPublishResult.failed.map(f=>`${f.relay}: ${f.error}`).join('; ')}. Deletion request ${deletionResult.success.length>0?'published':'failed to publish'}.`;
returnjson({
success: false,
error:'Failed to publish ownership transfer event to relays after 3 attempts',
details: errorDetails,
eventName:'ownership transfer event'
},{status: 500});
if(deletionResult.success.length>0){
logger.info({operation:'fork',originalRepo:`${npub}/${repo}`,forkRepo:`${userNpub}/${forkRepoName}`},'Deletion request published successfully');
}else{
logger.error({operation:'fork',originalRepo:`${npub}/${repo}`,forkRepo:`${userNpub}/${forkRepoName}`,failed: deletionResult.failed},'Failed to publish deletion request');
}
consterrorDetails=`Fork is invalid without ownership proof. All relays failed: ${ownershipPublishResult.failed.map(f=>`${f.relay}: ${f.error}`).join('; ')}. Deletion request ${deletionResult.success.length>0?'published':'failed to publish'}.`;
returnjson({
success: false,
error:'Failed to publish ownership transfer event to relays after 3 attempts',
details: errorDetails,
eventName:'ownership transfer event'
},{status: 500});
}
}
// Provision the fork repo (this will create verification file and include self-transfer)
?'Local-only fork created successfully! This fork is private and only exists on this server.'
:`Repository forked successfully! Published to ${publishResult?.success.length||0} relay(s) for announcement and ${ownershipPublishResult?.success.length||0} relay(s) for ownership proof.`;
message:`Repository forked successfully! Published to ${publishResult.success.length} relay(s) for announcement and ${ownershipPublishResult.success.length} relay(s) for ownership proof.`
message
});
}catch(err){
returnhandleApiError(err,{operation:'fork',npub,repo},'Failed to fork repository');