Я создаю сценарий Node JS, который должен получить все теги Git из репозитория, а также сообщение и дату создания тега, а затем сохранить их как записи в файле JSON. Например:
[{
"tag": "v1.1.0",
"message": "Add navigation",
"date": "Tue Oct 4 10:19:12 2018 +0100"
}, {
"tag": "v1.1.1",
"message": "Fix issue with spacing in the navigation",
"date": "Tue Oct 9 12:13:16 2018 +0100"
}]
Я выяснил, как это сделать, используя несколько модулей Node для доступа к тегам, а затем выполняя некоторые команды Git, чтобы получить всю необходимую мне информацию из каждого тега. Это делается с помощью shelljs .
У меня проблема в том, что это очень медленно. Запуск gitTag.all((tags) = {})
(с использованием git-tag ) выполняется быстро, потому что он просто извлекает имена тегов. Однако, чтобы получить сообщение и дату, я запускаю две отдельные команды для каждого тега в цикле:
let msg = shell.exec(`git for-each-ref refs/tags/${tag} --format='%(subject)'`, {silent:true}).stdout;
let date = shell.exec(`git for-each-ref refs/tags/${tag} --format='%(authordate)'`, {silent:true}).stdout;
Обе эти команды все равно немного медленные, но выполнение их каждый раз для каждого имени тега занимает много времени.
Есть ли для меня более быстрый способ сделать это?
Пожалуйста, помните, что я запускаю это синхронно, потому что другой скрипт Node будет читать этот JSON-файл, и это может привести к гонке. Однако любые асинхронные идеи приветствуются, если они также могут решать эту проблему.
Пожалуйста, смотрите мой полный код ниже :
const gitTag = require('git-tag')({
localOnly: true,
dir: '.git'
});
const fs = require('fs-extra');
const shell = require('shelljs');
let tagsAllData = [];
let formatString = (string) => {
return string.replace(/^'/, '').replace(/'\n+$/, '');
}
// Fetch all git tags
gitTag.all((tags) => {
tags.forEach(tag => {
// Collect the tag message and date values
let msg = shell.exec(`git for-each-ref refs/tags/${tag} --format='%(subject)'`, {silent:true}).stdout;
let date = shell.exec(`git for-each-ref refs/tags/${tag} --format='%(authordate)'`, {silent:true}).stdout;
// Create array of tag objects
tagsAllData.push({
'tag': tag,
'message': formatString(msg),
'date': formatString(date)
});
});
// Write the tag data as a JSON file
let tagsJSON = JSON.parse(JSON.stringify(tagsAllData));
fs.writeJSONSync('src/data/tags.json', tagsJSON);
});