Bauke/tildes-issue-log
Bauke
/
tildes-issue-log
Archived
1
Fork 0
This repository has been archived on 2022-10-04. You can view files and clone it, but cannot push or open issues or pull requests.
tildes-issue-log/source/scripts/download.ts

119 lines
3.6 KiB
TypeScript
Raw Permalink Normal View History

import fs, {promises as fsp} from 'fs';
import {join} from 'path';
import fecha from 'fecha';
import gitlab, {Gitlab} from 'gitlab';
type GitLab = InstanceType<typeof Gitlab>;
interface Config {
gitlabToken: string;
}
async function entry(): Promise<void> {
await Promise.all([getCommits(), getIssues(), getMergeRequests()]);
}
async function setupGitLabAPI(): Promise<GitLab> {
const config: Config = await getConfig();
const api: GitLab = new Gitlab({token: config.gitlabToken});
return api;
}
async function setupTemporaryDirectory(): Promise<string> {
const temporaryDirectory: string = join(__dirname, '../../temp/');
await fsp.mkdir(temporaryDirectory + 'data/', {recursive: true});
return temporaryDirectory;
}
async function getConfig(): Promise<Config> {
const config: Config = JSON.parse(
await fsp.readFile(join(__dirname, '../../config.json'), 'utf8')
);
return config;
}
export async function getCommits(): Promise<any[]> {
const temporaryDirectory: string = await setupTemporaryDirectory();
const api: GitLab = await setupGitLabAPI();
const project: gitlab.ProjectSchema = await api.Projects.show(
'tildes/tildes'
);
const commitsPath: string = join(
temporaryDirectory,
`data/commits (${fecha.format(new Date(), 'YYYY-MM-DD')}).json`
);
let commits: any[];
if (fs.existsSync(commitsPath)) {
console.log('Commits JSON file available for today, using local file.');
commits = JSON.parse(await fsp.readFile(commitsPath, 'utf8'));
} else {
console.log('Downloading all commits from GitLab.');
commits = (await api.Commits.all(project.id, {
ref_name: 'master',
with_stats: true
})) as any[];
await fsp.writeFile(commitsPath, JSON.stringify(commits, null, 2));
}
return commits;
}
export async function getIssues(): Promise<any[]> {
const temporaryDirectory: string = await setupTemporaryDirectory();
const api: GitLab = await setupGitLabAPI();
const project: gitlab.ProjectSchema = await api.Projects.show(
'tildes/tildes'
);
const issuesPath: string = join(
temporaryDirectory,
`data/issues (${fecha.format(new Date(), 'YYYY-MM-DD')}).json`
);
let issues: any[];
if (fs.existsSync(issuesPath)) {
console.log('Issues JSON file available for today, using local file.');
issues = JSON.parse(await fsp.readFile(issuesPath, 'utf8'));
} else {
console.log('Downloading all issues from GitLab.');
issues = (await api.Issues.all({projectId: project.id})) as any[];
await fsp.writeFile(issuesPath, JSON.stringify(issues, null, 2));
}
issues.sort((a, b) => a.iid - b.iid);
return issues;
}
export async function getMergeRequests(): Promise<any[]> {
const temporaryDirectory: string = await setupTemporaryDirectory();
const api: GitLab = await setupGitLabAPI();
const project: gitlab.ProjectSchema = await api.Projects.show(
'tildes/tildes'
);
const mergeRequestsPath: string = join(
temporaryDirectory,
`data/merge requests (${fecha.format(new Date(), 'YYYY-MM-DD')}).json`
);
let mergeRequests: any[];
if (fs.existsSync(mergeRequestsPath)) {
console.log(
'Merge Requests JSON file available for today, using local file.'
);
mergeRequests = JSON.parse(await fsp.readFile(mergeRequestsPath, 'utf8'));
} else {
console.log('Downloading all merge requests from GitLab.');
mergeRequests = (await api.MergeRequests.all({
projectId: project.id
})) as any[];
await fsp.writeFile(
mergeRequestsPath,
JSON.stringify(mergeRequests, null, 2)
);
}
mergeRequests.sort((a, b) => a.iid - b.iid);
return mergeRequests;
}
if (require.main === module) {
void entry();
}