VCS Service
VCS Service отвечает за работу с системой контроля версий в Diplodoc. Этот сервис позволяет получать информацию об авторах, контрибьюторах и времени изменения файлов, а также интегрироваться с различными VCS-провайдерами.
Основные возможности
- Получение информации об авторах файлов
- Сбор данных о контрибьюторах
- Отслеживание времени изменения файлов
- Интеграция с различными VCS-провайдерами (GitHub, GitLab и др.)
- Управление путями к исходным файлам в VCS
Получение доступа к сервису
export class Extension {
apply(program: Build) {
getBaseHooks(program).BeforeAnyRun.tap('MyExtension', (run) => {
// Получение сервиса из контекста
const {vcs} = run;
// Получение хуков сервиса
const vcsHooks = getVcsHooks(vcs);
});
}
}
Доступные хуки
VcsConnector
Хук для регистрации VCS-коннектора. Вызывается при инициализации сервиса.
vcsHooks.VcsConnector.tapPromise('MyConnector', async (connector) => {
// connector: Текущий VCS-коннектор
// Создаем и инициализируем новый коннектор
const newConnector = new MyVcsConnector(run);
await newConnector.init();
return newConnector;
});
API сервиса
Метод init
Инициализирует сервис, загружая VCS-коннектор.
await vcsService.init();
Метод metadata
Получает метаданные VCS для файла.
Параметры:
path: RelativePath
- путь к файлуmeta: Meta
- метаданные файлаdeps: NormalizedPath[]
- зависимости файла
Возвращает:
Promise<VcsMetadata>
- промис с метаданными VCS
const metadata = await vcsService.metadata('path/to/file.md', meta, deps);
Метод getContributorsByPath
Получает список контрибьюторов файла.
Параметры:
path: RelativePath
- путь к файлуdeps: RelativePath[]
- зависимости файла
Возвращает:
Promise<Contributor[]>
- промис с массивом контрибьюторов
const contributors = await vcsService.getContributorsByPath('path/to/file.md', deps);
Метод getModifiedTimeByPath
Получает время последнего изменения файла.
Параметры:
path: RelativePath
- путь к файлу
Возвращает:
Promise<number | null>
- промис с временем изменения в секундах
const mtime = await vcsService.getModifiedTimeByPath('path/to/file.md');
Метод getAuthorByPath
Получает автора файла.
Параметры:
path: RelativePath
- путь к файлу
Возвращает:
Promise<Contributor | null>
- промис с информацией об авторе
const author = await vcsService.getAuthorByPath('path/to/file.md');
Метод getUserByLogin
Получает информацию о пользователе по его логину.
Параметры:
author: string
- логин пользователя
Возвращает:
Promise<Contributor | null>
- промис с информацией о пользователе
const user = await vcsService.getUserByLogin('username');
Примеры использования
Интеграция с GitHub
export class Extension {
apply(program: Build) {
getBaseHooks(program).BeforeAnyRun.tap('GithubVcsConnector', (run) => {
const vcsHooks = getVcsHooks(run.vcs);
vcsHooks.VcsConnector.tapPromise('GithubVcsConnector', async (_connector) => {
const connector = new GithubVcsConnector(run);
return connector.init();
});
});
}
}
Добавление информации об авторах
export class Extension {
apply(program: Build) {
getBaseHooks(program).BeforeAnyRun.tap('AuthorEnricher', (run) => {
const markdownHooks = getMarkdownHooks(run.markdown);
markdownHooks.Resolved.tapPromise('AuthorEnricher', async (content, meta, path) => {
// Получаем информацию об авторе
const author = await run.vcs.getAuthorByPath(path);
if (author) {
// Добавляем информацию об авторе в метаданные
run.meta.addMetadata(path, {
author: author.name,
authorEmail: author.email
});
}
return content;
});
});
}
}
Отслеживание изменений
export class Extension {
apply(program: Build) {
getBaseHooks(program).BeforeAnyRun.tap('ChangeTracker', (run) => {
const markdownHooks = getMarkdownHooks(run.markdown);
markdownHooks.Resolved.tapPromise('ChangeTracker', async (content, meta, path) => {
// Получаем время последнего изменения
const mtime = await run.vcs.getModifiedTimeByPath(path);
if (mtime) {
// Добавляем информацию о времени изменения
run.meta.addMetadata(path, {
lastModified: new Date(mtime * 1000).toISOString()
});
}
return content;
});
});
}
}
Сбор информации о контрибьюторах
export class Extension {
apply(program: Build) {
getBaseHooks(program).BeforeAnyRun.tap('ContributorsCollector', (run) => {
const markdownHooks = getMarkdownHooks(run.markdown);
markdownHooks.Resolved.tapPromise('ContributorsCollector', async (content, meta, path) => {
// Получаем список контрибьюторов
const contributors = await run.vcs.getContributorsByPath(path);
if (contributors.length) {
// Добавляем информацию о контрибьюторах
run.meta.addMetadata(path, {
contributors: contributors.map(c => c.name).join(', ')
});
}
return content;
});
});
}
}
Была ли статья полезна?
Предыдущая
Следующая