feat(scripts): add script to port discussions

This commit is contained in:
Elian Doran 2025-06-24 23:14:52 +03:00
parent f0f79b65e2
commit 1ff7228ca5
No known key found for this signature in database
2 changed files with 301 additions and 0 deletions

191
port-discussions.log Normal file
View file

@ -0,0 +1,191 @@
Transferred discussion 2089 to https://github.com/orgs/TriliumNext/discussions/5889
Transferred discussion 2096 to https://github.com/orgs/TriliumNext/discussions/5890
Transferred discussion 2109 to https://github.com/orgs/TriliumNext/discussions/5891
Transferred discussion 2091 to https://github.com/orgs/TriliumNext/discussions/5892
Transferred discussion 2087 to https://github.com/orgs/TriliumNext/discussions/5893
Transferred discussion 2074 to https://github.com/orgs/TriliumNext/discussions/5894
Transferred discussion 2062 to https://github.com/orgs/TriliumNext/discussions/5895
Transferred discussion 2071 to https://github.com/orgs/TriliumNext/discussions/5896
Transferred discussion 2063 to https://github.com/orgs/TriliumNext/discussions/5897
Transferred discussion 2054 to https://github.com/orgs/TriliumNext/discussions/5898
Transferred discussion 8 to https://github.com/orgs/TriliumNext/discussions/5899
Transferred discussion 2028 to https://github.com/orgs/TriliumNext/discussions/5900
Transferred discussion 1793 to https://github.com/orgs/TriliumNext/discussions/5901
Transferred discussion 2022 to https://github.com/orgs/TriliumNext/discussions/5902
Transferred discussion 1731 to https://github.com/orgs/TriliumNext/discussions/5903
Transferred discussion 1981 to https://github.com/orgs/TriliumNext/discussions/5904
Transferred discussion 2015 to https://github.com/orgs/TriliumNext/discussions/5905
Transferred discussion 1972 to https://github.com/orgs/TriliumNext/discussions/5906
Transferred discussion 24 to https://github.com/orgs/TriliumNext/discussions/5907
Transferred discussion 1967 to https://github.com/orgs/TriliumNext/discussions/5908
Transferred discussion 1947 to https://github.com/orgs/TriliumNext/discussions/5909
Transferred discussion 444 to https://github.com/orgs/TriliumNext/discussions/5910
Transferred discussion 1904 to https://github.com/orgs/TriliumNext/discussions/5911
Transferred discussion 1907 to https://github.com/orgs/TriliumNext/discussions/5912
Transferred discussion 1860 to https://github.com/orgs/TriliumNext/discussions/5913
Transferred discussion 1859 to https://github.com/orgs/TriliumNext/discussions/5914
Transferred discussion 1814 to https://github.com/orgs/TriliumNext/discussions/5915
Transferred discussion 1823 to https://github.com/orgs/TriliumNext/discussions/5916
Transferred discussion 1699 to https://github.com/orgs/TriliumNext/discussions/5917
Transferred discussion 1760 to https://github.com/orgs/TriliumNext/discussions/5918
Transferred discussion 1807 to https://github.com/orgs/TriliumNext/discussions/5919
Transferred discussion 1806 to https://github.com/orgs/TriliumNext/discussions/5920
Transferred discussion 1800 to https://github.com/orgs/TriliumNext/discussions/5921
Transferred discussion 1797 to https://github.com/orgs/TriliumNext/discussions/5922
Transferred discussion 1791 to https://github.com/orgs/TriliumNext/discussions/5923
Transferred discussion 1774 to https://github.com/orgs/TriliumNext/discussions/5924
Transferred discussion 1771 to https://github.com/orgs/TriliumNext/discussions/5925
Transferred discussion 1696 to https://github.com/orgs/TriliumNext/discussions/5926
Transferred discussion 1736 to https://github.com/orgs/TriliumNext/discussions/5927
Transferred discussion 1733 to https://github.com/orgs/TriliumNext/discussions/5928
Transferred discussion 1682 to https://github.com/orgs/TriliumNext/discussions/5929
Transferred discussion 867 to https://github.com/orgs/TriliumNext/discussions/5930
Transferred discussion 1593 to https://github.com/orgs/TriliumNext/discussions/5931
Transferred discussion 1671 to https://github.com/orgs/TriliumNext/discussions/5932
Transferred discussion 1669 to https://github.com/orgs/TriliumNext/discussions/5933
Transferred discussion 1654 to https://github.com/orgs/TriliumNext/discussions/5934
Transferred discussion 1653 to https://github.com/orgs/TriliumNext/discussions/5935
Transferred discussion 1642 to https://github.com/orgs/TriliumNext/discussions/5936
Transferred discussion 1638 to https://github.com/orgs/TriliumNext/discussions/5937
Transferred discussion 1629 to https://github.com/orgs/TriliumNext/discussions/5938
Transferred discussion 1621 to https://github.com/orgs/TriliumNext/discussions/5939
Transferred discussion 1565 to https://github.com/orgs/TriliumNext/discussions/5940
Transferred discussion 1573 to https://github.com/orgs/TriliumNext/discussions/5941
Transferred discussion 1387 to https://github.com/orgs/TriliumNext/discussions/5942
Transferred discussion 1548 to https://github.com/orgs/TriliumNext/discussions/5943
Transferred discussion 1576 to https://github.com/orgs/TriliumNext/discussions/5944
Transferred discussion 1568 to https://github.com/orgs/TriliumNext/discussions/5945
Transferred discussion 904 to https://github.com/orgs/TriliumNext/discussions/5946
Transferred discussion 1386 to https://github.com/orgs/TriliumNext/discussions/5947
Transferred discussion 1526 to https://github.com/orgs/TriliumNext/discussions/5948
Transferred discussion 1443 to https://github.com/orgs/TriliumNext/discussions/5949
Transferred discussion 1529 to https://github.com/orgs/TriliumNext/discussions/5950
Transferred discussion 1461 to https://github.com/orgs/TriliumNext/discussions/5951
Transferred discussion 1490 to https://github.com/orgs/TriliumNext/discussions/5952
Transferred discussion 1497 to https://github.com/orgs/TriliumNext/discussions/5953
Transferred discussion 1444 to https://github.com/orgs/TriliumNext/discussions/5954
Transferred discussion 1522 to https://github.com/orgs/TriliumNext/discussions/5955
Transferred discussion 1385 to https://github.com/orgs/TriliumNext/discussions/5956
Transferred discussion 1504 to https://github.com/orgs/TriliumNext/discussions/5957
Transferred discussion 1448 to https://github.com/orgs/TriliumNext/discussions/5958
Transferred discussion 1491 to https://github.com/orgs/TriliumNext/discussions/5959
Transferred discussion 1463 to https://github.com/orgs/TriliumNext/discussions/5960
Transferred discussion 1460 to https://github.com/orgs/TriliumNext/discussions/5961
Transferred discussion 1449 to https://github.com/orgs/TriliumNext/discussions/5962
Transferred discussion 1441 to https://github.com/orgs/TriliumNext/discussions/5963
Transferred discussion 1403 to https://github.com/orgs/TriliumNext/discussions/5964
Transferred discussion 1426 to https://github.com/orgs/TriliumNext/discussions/5965
Transferred discussion 1420 to https://github.com/orgs/TriliumNext/discussions/5966
Transferred discussion 1414 to https://github.com/orgs/TriliumNext/discussions/5967
Transferred discussion 1417 to https://github.com/orgs/TriliumNext/discussions/5968
Transferred discussion 1416 to https://github.com/orgs/TriliumNext/discussions/5969
Transferred discussion 1442 to https://github.com/orgs/TriliumNext/discussions/5970
Transferred discussion 1334 to https://github.com/orgs/TriliumNext/discussions/5971
Transferred discussion 1052 to https://github.com/orgs/TriliumNext/discussions/5972
Transferred discussion 1265 to https://github.com/orgs/TriliumNext/discussions/5973
Transferred discussion 1318 to https://github.com/orgs/TriliumNext/discussions/5974
Transferred discussion 1346 to https://github.com/orgs/TriliumNext/discussions/5975
Transferred discussion 793 to https://github.com/orgs/TriliumNext/discussions/5976
Transferred discussion 1356 to https://github.com/orgs/TriliumNext/discussions/5977
Transferred discussion 1290 to https://github.com/orgs/TriliumNext/discussions/5978
Transferred discussion 1111 to https://github.com/orgs/TriliumNext/discussions/5979
Transferred discussion 1311 to https://github.com/orgs/TriliumNext/discussions/5980
Transferred discussion 1317 to https://github.com/orgs/TriliumNext/discussions/5981
Transferred discussion 1287 to https://github.com/orgs/TriliumNext/discussions/5982
Transferred discussion 1282 to https://github.com/orgs/TriliumNext/discussions/5983
Transferred discussion 1279 to https://github.com/orgs/TriliumNext/discussions/5984
Transferred discussion 1271 to https://github.com/orgs/TriliumNext/discussions/5985
Transferred discussion 356 to https://github.com/orgs/TriliumNext/discussions/5986
Transferred discussion 1255 to https://github.com/orgs/TriliumNext/discussions/5987
Transferred discussion 1210 to https://github.com/orgs/TriliumNext/discussions/5988
Transferred discussion 1249 to https://github.com/orgs/TriliumNext/discussions/5989
Transferred discussion 1203 to https://github.com/orgs/TriliumNext/discussions/5990
Transferred discussion 1116 to https://github.com/orgs/TriliumNext/discussions/5991
Transferred discussion 827 to https://github.com/orgs/TriliumNext/discussions/5992
Transferred discussion 1176 to https://github.com/orgs/TriliumNext/discussions/5993
Transferred discussion 1166 to https://github.com/orgs/TriliumNext/discussions/5994
Transferred discussion 1079 to https://github.com/orgs/TriliumNext/discussions/5995
Transferred discussion 1082 to https://github.com/orgs/TriliumNext/discussions/5996
Transferred discussion 1060 to https://github.com/orgs/TriliumNext/discussions/5997
Transferred discussion 1085 to https://github.com/orgs/TriliumNext/discussions/5998
Transferred discussion 360 to https://github.com/orgs/TriliumNext/discussions/5999
Transferred discussion 442 to https://github.com/orgs/TriliumNext/discussions/6000
Transferred discussion 981 to https://github.com/orgs/TriliumNext/discussions/6001
Transferred discussion 975 to https://github.com/orgs/TriliumNext/discussions/6002
Transferred discussion 1007 to https://github.com/orgs/TriliumNext/discussions/6003
Transferred discussion 968 to https://github.com/orgs/TriliumNext/discussions/6004
Transferred discussion 957 to https://github.com/orgs/TriliumNext/discussions/6005
Transferred discussion 939 to https://github.com/orgs/TriliumNext/discussions/6006
Transferred discussion 775 to https://github.com/orgs/TriliumNext/discussions/6007
Transferred discussion 944 to https://github.com/orgs/TriliumNext/discussions/6008
Transferred discussion 934 to https://github.com/orgs/TriliumNext/discussions/6009
Transferred discussion 907 to https://github.com/orgs/TriliumNext/discussions/6010
Transferred discussion 898 to https://github.com/orgs/TriliumNext/discussions/6011
Transferred discussion 846 to https://github.com/orgs/TriliumNext/discussions/6012
Transferred discussion 851 to https://github.com/orgs/TriliumNext/discussions/6013
Transferred discussion 836 to https://github.com/orgs/TriliumNext/discussions/6014
Transferred discussion 833 to https://github.com/orgs/TriliumNext/discussions/6015
Transferred discussion 828 to https://github.com/orgs/TriliumNext/discussions/6016
Transferred discussion 527 to https://github.com/orgs/TriliumNext/discussions/6017
Transferred discussion 824 to https://github.com/orgs/TriliumNext/discussions/6018
Transferred discussion 770 to https://github.com/orgs/TriliumNext/discussions/6019
Transferred discussion 774 to https://github.com/orgs/TriliumNext/discussions/6020
Transferred discussion 716 to https://github.com/orgs/TriliumNext/discussions/6021
Transferred discussion 731 to https://github.com/orgs/TriliumNext/discussions/6022
Transferred discussion 519 to https://github.com/orgs/TriliumNext/discussions/6023
Transferred discussion 704 to https://github.com/orgs/TriliumNext/discussions/6024
Transferred discussion 665 to https://github.com/orgs/TriliumNext/discussions/6025
Transferred discussion 610 to https://github.com/orgs/TriliumNext/discussions/6026
Transferred discussion 662 to https://github.com/orgs/TriliumNext/discussions/6027
Transferred discussion 596 to https://github.com/orgs/TriliumNext/discussions/6028
Transferred discussion 621 to https://github.com/orgs/TriliumNext/discussions/6029
Transferred discussion 611 to https://github.com/orgs/TriliumNext/discussions/6030
Transferred discussion 566 to https://github.com/orgs/TriliumNext/discussions/6031
Transferred discussion 591 to https://github.com/orgs/TriliumNext/discussions/6032
Transferred discussion 590 to https://github.com/orgs/TriliumNext/discussions/6033
Transferred discussion 578 to https://github.com/orgs/TriliumNext/discussions/6034
Transferred discussion 575 to https://github.com/orgs/TriliumNext/discussions/6035
Transferred discussion 564 to https://github.com/orgs/TriliumNext/discussions/6036
Transferred discussion 563 to https://github.com/orgs/TriliumNext/discussions/6037
Transferred discussion 557 to https://github.com/orgs/TriliumNext/discussions/6038
Transferred discussion 551 to https://github.com/orgs/TriliumNext/discussions/6039
Transferred discussion 540 to https://github.com/orgs/TriliumNext/discussions/6040
Transferred discussion 523 to https://github.com/orgs/TriliumNext/discussions/6041
Transferred discussion 512 to https://github.com/orgs/TriliumNext/discussions/6042
Transferred discussion 515 to https://github.com/orgs/TriliumNext/discussions/6043
Transferred discussion 510 to https://github.com/orgs/TriliumNext/discussions/6044
Transferred discussion 509 to https://github.com/orgs/TriliumNext/discussions/6045
Transferred discussion 482 to https://github.com/orgs/TriliumNext/discussions/6046
Transferred discussion 494 to https://github.com/orgs/TriliumNext/discussions/6047
Transferred discussion 478 to https://github.com/orgs/TriliumNext/discussions/6048
Transferred discussion 461 to https://github.com/orgs/TriliumNext/discussions/6049
Transferred discussion 476 to https://github.com/orgs/TriliumNext/discussions/6050
Transferred discussion 471 to https://github.com/orgs/TriliumNext/discussions/6051
Transferred discussion 445 to https://github.com/orgs/TriliumNext/discussions/6052
Transferred discussion 393 to https://github.com/orgs/TriliumNext/discussions/6053
Transferred discussion 435 to https://github.com/orgs/TriliumNext/discussions/6054
Transferred discussion 440 to https://github.com/orgs/TriliumNext/discussions/6055
Transferred discussion 369 to https://github.com/orgs/TriliumNext/discussions/6056
Transferred discussion 398 to https://github.com/orgs/TriliumNext/discussions/6057
Transferred discussion 370 to https://github.com/orgs/TriliumNext/discussions/6058
Transferred discussion 367 to https://github.com/orgs/TriliumNext/discussions/6059
Transferred discussion 169 to https://github.com/orgs/TriliumNext/discussions/6060
Transferred discussion 260 to https://github.com/orgs/TriliumNext/discussions/6061
Transferred discussion 235 to https://github.com/orgs/TriliumNext/discussions/6062
Transferred discussion 26 to https://github.com/orgs/TriliumNext/discussions/6063
Transferred discussion 188 to https://github.com/orgs/TriliumNext/discussions/6064
Transferred discussion 189 to https://github.com/orgs/TriliumNext/discussions/6065
Transferred discussion 2 to https://github.com/orgs/TriliumNext/discussions/6066
Transferred discussion 182 to https://github.com/orgs/TriliumNext/discussions/6067
Transferred discussion 172 to https://github.com/orgs/TriliumNext/discussions/6068
Transferred discussion 178 to https://github.com/orgs/TriliumNext/discussions/6069
Transferred discussion 168 to https://github.com/orgs/TriliumNext/discussions/6070
Transferred discussion 164 to https://github.com/orgs/TriliumNext/discussions/6071
Transferred discussion 158 to https://github.com/orgs/TriliumNext/discussions/6072
Transferred discussion 53 to https://github.com/orgs/TriliumNext/discussions/6073
Transferred discussion 10 to https://github.com/orgs/TriliumNext/discussions/6074
Transferred discussion 5 to https://github.com/orgs/TriliumNext/discussions/6075
Transferred discussion 30 to https://github.com/orgs/TriliumNext/discussions/6076
Transferred discussion 11 to https://github.com/orgs/TriliumNext/discussions/6077
Transferred discussion 29 to https://github.com/orgs/TriliumNext/discussions/6078
Transferred discussion 31 to https://github.com/orgs/TriliumNext/discussions/6079

110
scripts/port-discussions.ts Normal file
View file

@ -0,0 +1,110 @@
/**
* @module
*
* Goes through all discussions in the source repository and transfers them to the target repository.
*
* Limitations:
* - Upon encountering a locked discussion, the script will fail. Make sure to unlock discussions before running the script.
*/
import { type BrowserContext, chromium } from 'playwright';
import { createWriteStream, existsSync, readFileSync, writeFileSync } from 'fs';
const SOURCE_URL = "https://github.com/TriliumNext/Notes";
const TARGET_REPOSITORY_ID = 92111509;
const fsLog = createWriteStream('port-discussions.log', { flags: 'a' });
async function login(context: BrowserContext) {
const page = await context.newPage();
await page.goto('https://github.com/login');
console.log("👤 Please log in manually in the opened browser...");
await page.waitForNavigation({ url: 'https://github.com/' }); // Wait for login
// Save storage state (cookies, localStorage, etc.)
const storage = await context.storageState();
writeFileSync('auth.json', JSON.stringify(storage))
await page.close();
}
async function portIssue(issue: string, context: BrowserContext) {
const page = await context.newPage();
await page.goto(`${SOURCE_URL}/discussions/${issue}`);
const button = page.locator("#dialog-show-discussion-transfer-conversation");
await button.click();
const modal = page.locator("#discussion-transfer-conversation");
const modalContent = page.locator("#transfer-candidate-repos");
await modalContent.waitFor({ state: 'visible' });
modalContent.locator(`#transfer_repository_${TARGET_REPOSITORY_ID}`).click();
const navigationPromise = page.waitForNavigation({
waitUntil: "domcontentloaded"
});
const submitButton = modal.locator(`button[type="submit"]`);
await submitButton.waitFor({ state: 'attached' });
await submitButton.click();
await navigationPromise;
console.log(`✅ Discussion ${issue} has been transferred to the target repository.`);
fsLog.write(`Transferred discussion ${issue} to ${page.url()}\n`);
await page.waitForTimeout(2000); // Wait for a second to ensure the transfer is complete
await page.close();
}
async function getFirstPageResults(context: BrowserContext) {
const page = await context.newPage();
await page.goto(SOURCE_URL + "/discussions");
// Wait for the discussions to load
const allDiscussionLinks = (await (page.locator(`a[data-hovercard-type="discussion"]`).all()));
let ids: string[] = [];
for (const link of allDiscussionLinks) {
const url = await link.getAttribute('href');
const number = url?.match(/\/discussions\/(\d+)/)?.[1];
ids.push(number);
}
console.log(`Found ${ids.length} discussions.`);
await page.close();
return ids;
}
(async () => {
const browser = await chromium.launch({ headless: false }); // show browser
let storageState = undefined;
if (existsSync('auth.json')) {
console.log("🔑 Using existing authentication state...");
storageState = JSON.parse(readFileSync('auth.json', 'utf-8'));
}
const context = await browser.newContext({ storageState });
if (!storageState) {
await login(context);
}
const travelledIds: string[] = [];
let ids = await getFirstPageResults(context);
while (ids.length > 0) {
for (const id of ids) {
try {
if (travelledIds.includes(id)) {
console.log(`Discussion ${id} has already been transferred.`);
process.exit(2);
}
await portIssue(id, context);
travelledIds.push(id);
} catch (error) {
console.error(`❌ Error transferring discussion ${id}:`, error);
process.exit(1);
}
}
ids = await getFirstPageResults(context);
}
await browser.close();
})();