diff --git a/port-discussions.log b/port-discussions.log new file mode 100644 index 000000000..b60fc8eb2 --- /dev/null +++ b/port-discussions.log @@ -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 diff --git a/scripts/port-discussions.ts b/scripts/port-discussions.ts new file mode 100644 index 000000000..ab743727a --- /dev/null +++ b/scripts/port-discussions.ts @@ -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(); +})();