-
Notifications
You must be signed in to change notification settings - Fork 0
/
reportCommits.js
127 lines (119 loc) · 3.59 KB
/
reportCommits.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
const readlineSync = require("readline-sync");
const getRepositorios = require("./getRepositorios");
const salvaObjToCSV = require("./salvaObjToCSV");
const getCommits = require("./getCommits");
const getUltimaSegunda = require("./getUltimaSegunda");
const formataData = require("./formataData");
module.exports = async function reportCommits(
gitlabUrl,
token,
filtroGrupo,
commiterEmailFilter
) {
const dados = await report(gitlabUrl, token, filtroGrupo);
//console.table(dados);
salvaObjToCSV(dados, "reportCommitsRepos.csv", true);
};
async function report(gitlabUrl, token, filtroGrupo) {
const retorno = {};
let since = readlineSync.question(`Since YYYY-MM-DD: `);
const commiterEmailFilter = readlineSync.question(
`Filtro por e-mail do commiter (deixe em branco para não filtrar): `
);
const repos = await getRepositorios(
gitlabUrl,
token,
filtroGrupo,
commiterEmailFilter
);
await Promise.all(
repos.map(async (r) => {
await pushRepoInfo(
retorno,
r,
gitlabUrl,
token,
since,
commiterEmailFilter
);
})
);
return retorno;
}
/**
* Com base nos dados do repositório {r} e informações sobre ele que serão solicitadas
* à API Gitlab, inclui no objeto {retorno} informações sumarizadas de commits no repositório
*
* @param {*} retorno Objeto onde será inserida dados do repositório
* @param {*} r Objeto repositório retornado pela API Gitlab
*/
async function pushRepoInfo(
retorno,
r,
gitlabUrl,
token,
since,
commiterEmailFilter
) {
const commits = (await getCommits(gitlabUrl, token, r.id, since)).filter(
(x) =>
!commiterEmailFilter ||
x.committer_email.indexOf(commiterEmailFilter) > -1
);
if (!retorno[r.path_with_namespace]) {
retorno[r.path_with_namespace] = {};
retorno[r.path_with_namespace].id = r.id;
retorno[r.path_with_namespace].total = 0;
}
retorno[r.path_with_namespace].total = commits.length;
//varrendo os commits para agrupar semanalmente
for (let x of commits) {
const data = new Date(x.created_at);
Intl.DateTimeFormat();
const semanaAno = formataData(getUltimaSegunda(data));
if (!retorno[r.path_with_namespace][semanaAno]) {
retorno[r.path_with_namespace][semanaAno] = 0;
}
console.log(semanaAno, x.created_at, data, x.stats.total);
//retorno[r.path_with_namespace][semanaAno]++;
retorno[r.path_with_namespace][semanaAno] =
retorno[r.path_with_namespace][semanaAno] + x.stats.total;
//console.log(mes, retorno[r.path_with_namespace].commits[mes]);
/*console.log(
r.path_with_namespace,
x.created_at,
x.committer_email,
);*/
}
//varrendo as semanas para identificar as que não tiveram nenhuma atividade
const dateSince = new Date(since);
const hoje = new Date();
let ano = dateSince.getUTCFullYear();
do {
let segunda = getPrimeiraSegundaAno(ano);
let numSemana = 0;
while (
segunda.getUTCFullYear() == ano ||
(numSemana == 0 && segunda.getUTCFullYear() == ano - 1)
) {
const inicioSemana = formataData(segunda);
if (
!Object.keys(retorno[r.path_with_namespace]).find((semanaAno) => {
return semanaAno == inicioSemana;
})
) {
retorno[r.path_with_namespace][inicioSemana] = 0;
}
segunda.setDate(segunda.getDate() + 7);
numSemana++;
}
ano++;
} while (ano <= hoje.getUTCFullYear());
}
function getPrimeiraSegundaAno(ano) {
const jan1 = new Date(ano, 0, 1);
while (jan1.getDay() != 1) {
jan1.setDate(jan1.getDate() - 1);
}
return jan1;
}