Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.
4 changes: 1 addition & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "gitlab-time-tracker",
"version": "1.7.39",
"version": "1.7.40",
"description": "A command line interface for GitLabs time tracking feature.",
"bugs": {
"url": "https://github.com/kriskbx/gitlab-time-tracker/issues"
Expand Down Expand Up @@ -53,8 +53,6 @@
"progress": "^2.0.0",
"prompt": "^1.0.0",
"read-yaml": "^1.1.0",
"request": "^2.87.0",
"request-promise-native": "^1.0.4",
"shelljs": "^0.8.3",
"tempfile": "^2.0.0",
"throttled-queue": "^1.0.7",
Expand Down
42 changes: 23 additions & 19 deletions src/models/base.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
const request = require('request-promise-native');
const url = require('url');
const async = require('async');
const crypto = require('crypto');
const throttle = require('throttled-queue')(10, 1000);
Expand Down Expand Up @@ -36,10 +34,11 @@ class base {

data.private_token = this.token;

return new Promise((resolve, reject) => throttle(() => {
request.post(`${this.url}${path}`, {
return new Promise((resolve, reject) => {
fetch(`${this.url}${path}`, {
method: 'POST',
json: true,
body: data,
body: JSON.stringify(data),
insecure: this._insecure,
proxy: this._proxy,
resolveWithFullResponse: true,
Expand Down Expand Up @@ -67,8 +66,8 @@ class base {
path += (path.includes('?') ? '&' : '?') + `private_token=${this.token}`;
path += `&page=${page}&per_page=${perPage}`;

return new Promise((resolve, reject) => throttle(() => {
request(`${this.url}${path}`, {
return new Promise((resolve, reject) => {
fetch(`${this.url}${path}`, {
json: true,
insecure: this._insecure,
proxy: this._proxy,
Expand Down Expand Up @@ -96,15 +95,18 @@ class base {
let collect = [];

this.get(path, 1, perPage).then(response => {
response.body.forEach(item => collect.push(item));
let pages = parseInt(response.headers['x-total-pages']);

if (pages === 1) return resolve(collect);

let tasks = base.createGetTasks(path, pages, 2, perPage);
this.getParallel(tasks, collect, runners).then(() => {
resolve(collect);
}).catch(error => reject(error));
response.json().then(data => {
data.forEach(item => collect.push(item));

let pages = response.headers.get('x-total-pages')

if (pages === 1) return resolve(collect);

let tasks = base.createGetTasks(path, pages, 2, perPage);
this.getParallel(tasks, collect, runners).then(() => {
resolve(collect);
}).catch(error => reject(error));
})
}).catch(err => reject(err));
});
}
Expand Down Expand Up @@ -135,8 +137,10 @@ class base {
*/
getParallel(tasks, collect = [], runners = this._parallel) {
return this.parallel(tasks, (task, done) => {
this.get(task.path, task.page, task.perPage).then((response) => {
response.body.forEach(item => collect.push(item));
this.get(task.path, task.page, task.perPage)
.then(response => response.json())
.then(items => {
items.forEach(item => collect.push(item));
done();
}).catch(error => done(error));
}, runners);
Expand All @@ -149,7 +153,7 @@ class base {
*/
setDump(response, key) {
this.config.setDump(key, {
headers: response.headers,
headers: Object.fromEntries(response.headers.entries()),
body: response.body
});
}
Expand Down
4 changes: 2 additions & 2 deletions src/models/issue.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ class issue extends hasTimes {
promise = this.get(`projects/${encodeURIComponent(project)}/issues/${id}`);
}

promise.then(issue => {
this.data = issue.body;
promise.then(response => response.json()).then(issue => {
this.data = issue;
return promise;
});

Expand Down
4 changes: 2 additions & 2 deletions src/models/mergeRequest.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ class mergeRequest extends hasTimes {
promise = this.get(`projects/${encodeURIComponent(project)}/merge_requests/${id}`);
}

promise.then(issue => {
this.data = issue.body;
promise.then(response => response.json()).then(issue => {
this.data = issue;
return promise;
});

Expand Down
14 changes: 8 additions & 6 deletions src/models/owner.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,10 @@ class owner extends Base {
getGroup() {
return new Promise((resolve, reject) => {
this.get(`groups`)
.then(response => response.json())
.then(groups => {
if (groups.body.length === 0) return reject('Group not found');
groups = groups.body;
if (groups.length === 0) return reject('Group not found');
groups = groups;

let filtered = groups.filter(group => group.full_path === this.config.get('project'));
if (filtered.length === 0) return reject('Group not found');
Expand All @@ -57,10 +58,11 @@ class owner extends Base {
getSubGroups() {
return new Promise((resolve, reject) => {
this.get(`groups`)
.then(response => response.json())
.then(groups => {
if (groups.body.length === 0) return resolve();
if (groups.length === 0) return resolve();

let filtered = this._filterGroupsByParents(groups.body, this.groups.map(g => g.id));
let filtered = this._filterGroupsByParents(groups, this.groups.map(g => g.id));
if (filtered.length === 0) return resolve();

this.groups = this.groups.concat(filtered);
Expand Down Expand Up @@ -121,9 +123,9 @@ class owner extends Base {
*/
getProjectsByGroup() {
return this.parallel(this.groups, (group, done) => {
this.get(`groups/${group.id}/projects`)
this.all(`groups/${group.id}/projects`)
.then(projects => {
this.projects = this.projects.concat(projects.body);
this.projects = this.projects.concat(projects);
done();
})
.catch(e => done(e));
Expand Down
8 changes: 5 additions & 3 deletions src/models/project.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class project extends Base {
*/
make(name) {
let promise = this.get(`projects/${encodeURIComponent(name)}`);
promise.then(project => this.data = project.body);
promise.then(response => response.json()).then(project => this.data = project);

return promise;
}
Expand All @@ -33,16 +33,18 @@ class project extends Base {
members() {
return new Promise((resolve, reject) => {
this.get(`projects/${this.id}/members`)
.then(response => response.json())
.then(response => {
this.projectMembers = this.projectMembers.concat(response.body);
this.projectMembers = this.projectMembers.concat(response);
return new Promise(r => r());
})
.then(() => {
if (!this.data.namespace || !this.data.namespace.kind || this.data.namespace.kind !== "group") return resolve();

this.get(`groups/${this.data.namespace.id}/members`)
.then(response => response.json())
.then(response => {
this.projectMembers = this.projectMembers.concat(response.body);
this.projectMembers = this.projectMembers.concat(response);
resolve();
})
.catch(e => reject(e));
Expand Down
43 changes: 42 additions & 1 deletion src/models/report.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ class report extends Base {
*/
getProject() {
let promise = this.get(`projects/${encodeURIComponent(this.config.get('project'))}`);
promise.then(project => this.setProject(project.body));
promise.then(response => response.json()).then(project => this.setProject(project));

return promise;
}
Expand Down Expand Up @@ -143,6 +143,38 @@ class report extends Base {
return promise;
}

/**
* process all notes the given input
* @param input
* @param model
* @param advance
* @returns {*|Promise}
*/
processNote(input, model, advance = false) {
let collect = [];

let promise = this.parallel(this[input], (data, done) => {

let item = new model(this.config, data);
item.project_namespace = this.projects[item.project_id];

item.getNotes()
.then(() => {
collect.push(item);

if (advance) advance();
return done();
});


// collect items, query times & stats
collect.push();
});

promise.then(() => this[input] = collect);
return promise;
}

/**
* merge another report into this report
* @param report
Expand All @@ -164,6 +196,15 @@ class report extends Base {
return this.process('issues', Issue, advance);
}

/**
* process notes
* @param advance
* @returns {Promise}
*/
processNotes(advance = false) {
return this.processNote('issues', Issue, advance);
}

/**
* process merge requests
* @param advance
Expand Down