-
Notifications
You must be signed in to change notification settings - Fork 384
/
Copy pathwikimedia-sync.js
executable file
·137 lines (119 loc) · 4.84 KB
/
wikimedia-sync.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/usr/bin/env node
/**
* Copyright (c) Moodle Pty Ltd.
*
* Moodle is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Moodle is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Moodle. If not, see <http://www.gnu.org/licenses/>.
*/
const { program } = require('commander');
const { readFile, writeFile } = require('fs/promises');
const {
getGetPagesTranscluding,
getLogger,
getLogIn,
getClient,
getObsoletePagePath,
getUpdateMigratedPages,
getUpdateMigratedPagesProtection,
} = require('./utils');
const remoteHost = 'docs.moodle.org/dev';
program
.name('wikimedia-sync')
.description('CLI tool to sync data with https://docs.moodle.org/dev/')
.version('1.0.0');
const logger = getLogger();
const client = getClient(remoteHost);
const getPagesTranscluding = getGetPagesTranscluding(logger)(client);
const logIn = getLogIn(logger)(client);
program
.command('push-migrated')
.description('Update the list of migrated pages on the remote WikiMedia site')
.option('-d, --debug', 'Add debugging logging')
.option('-f, --force', 'Force an update')
.action(async (options) => {
if (options.debug || process.env.DEBUG) {
logger.level = 'debug';
}
const updateMigratedPages = getUpdateMigratedPages(logger)(client);
const updateMigratedPagesProtection = getUpdateMigratedPagesProtection(logger)(client);
logger.info('Logging in');
try {
await logIn();
} catch (err) {
logger.error(err.message);
logger.debug(err);
process.exit(1);
}
logger.info('Starting update of migrated pages in remote site');
await updateMigratedPages(options.force);
await updateMigratedPagesProtection();
logger.info('Run completed');
});
program
.command('fetch-obsolete')
.description('Fetch the list of obsolete pages from Wikimedia')
.option('-d, --debug', 'Add debugging logging')
.action(async (options) => {
if (options.debug || process.env.DEBUG) {
logger.level = 'debug';
}
const fetchObsoletePageData = async () => {
logger.info('Reading list of current obsolete files');
const obsoletePagePath = getObsoletePagePath();
const currentPageTitlesJSON = await readFile(obsoletePagePath, { encoding: 'utf8' });
const currentPageTitles = JSON.parse(currentPageTitlesJSON);
logger.info(`=> Found ${currentPageTitles.length} entries`);
logger.info('Fetching list of obsolete pages');
const updatesPageTitles = (await getPagesTranscluding('Template:obsolete')).sort();
logger.info(`=> Found ${updatesPageTitles.length} entries`);
const updatesPageTitlesJSON = JSON.stringify(updatesPageTitles, null, ' ');
if (JSON.stringify(updatesPageTitlesJSON) === JSON.stringify(currentPageTitlesJSON)) {
logger.info('==> No changes detected.');
} else {
logger.info('==> Changes detected. Updating stored copy.');
writeFile(obsoletePagePath, updatesPageTitlesJSON);
}
};
logger.info('Fetching the list of obsolete pages');
await fetchObsoletePageData();
logger.info('Run completed');
});
program
.command('fetch-todo')
.description('Fetch a list of pages which are not marked as obsolete or migrated')
.action(async () => {
const getAllPages = () => new Promise((resolve, reject) => {
logger.info('Fetching all pages');
client.getAllPages((err, data) => {
if (err) {
reject(new Error(err));
}
resolve(data.map((pageData) => pageData.title));
});
});
const allPages = await getAllPages();
const migratedPages = await getPagesTranscluding('Template:Migrated');
const obsoletePages = await getPagesTranscluding('Template:obsolete');
const todo = allPages.filter((pageName) => {
if (migratedPages.includes(pageName)) {
return false;
}
if (obsoletePages.includes(pageName)) {
return false;
}
return true;
});
todo.every((pageName) => logger.info(`=> ${pageName}`));
logger.info(`== ${todo.length} pages to migrate ==`);
});
program.parse();