github-sync-labels-milestones
Version:
Sync Labels and Milestones across Multiple repositories
155 lines (135 loc) • 3.92 kB
JavaScript
// @ts-nocheck
;
var Q = require('q');
var _ = require('lodash');
var getExisting = require('./getExisting');
var CONSTANTS = require('./constants');
module.exports = function (options) {
var github = options.github;
var labels = options.labels;
var user = options.user;
var repo = options.repo;
function withAssignment(args) {
args.owner = user;
args.repo = repo;
return args;
}
function getAllLabels(page, prevLabels) {
if (!page) {
page = 1;
}
if (!prevLabels) {
prevLabels = [];
}
return github.rest.issues
.listLabelsForRepo(
withAssignment({
page: page,
per_page: CONSTANTS.LABELS_PER_PAGE,
}),
)
.then(function (res) {
var labels = res.data;
var allLabels = prevLabels.concat(labels);
if (labels.length === CONSTANTS.LABELS_PER_PAGE) {
return getAllLabels(page + 1, allLabels);
} else {
return allLabels;
}
});
}
function log(state, title) {
options.log({
state: state,
title: title,
type: CONSTANTS.TYPE_LABEL,
repo: repo,
user: user,
});
}
log.verbose = function () {
if (_.isFunction(options.log.verbose)) {
options.log.verbose.apply(options.log.verbose, arguments);
}
};
return getAllLabels().then(function (existingLabels) {
var queue = [];
labels.forEach(function (label) {
var possibleNames = [].concat(label.name, label.previousNames);
var existingLabel = getExisting(existingLabels, possibleNames, 'name');
if (existingLabel.length > 1) {
throw new Error(
'multiple labels found for ' +
possibleNames +
' in ' +
user +
'/' +
repo +
' can not rename',
);
} else {
existingLabel = existingLabel[0];
}
if (label.state === 'absent') {
if (existingLabel) {
queue.push(
github.rest.issues
.deleteLabel(withAssignment({ name: label.name }))
.then(function () {
log(CONSTANTS.LOG_TYPE_DELETE, label.name);
}),
);
} else {
log(CONSTANTS.LOG_TYPE_OK, label.name);
}
} else {
var promise = Q.when();
if (existingLabel) {
var update =
existingLabel.name != label.name ||
existingLabel.color != (label.color || 'ededed') ||
existingLabel.description != label.description;
if (update) {
promise = promise.then(function () {
return github.rest.issues
.updateLabel(
withAssignment({
name: existingLabel.name,
new_name: label.name,
color: label.color,
description: label.description,
}),
)
.then(function (res) {
log(CONSTANTS.LOG_TYPE_UPDATE, label.name);
return label.data;
});
});
} else {
log(CONSTANTS.LOG_TYPE_OK, label.name);
promise = promise.then(function () {
return existingLabel;
});
}
} else {
promise = promise.then(function () {
return github.rest.issues
.createLabel(
withAssignment({
name: label.name,
color: label.color,
description: label.description,
}),
)
.then(function (res) {
log(CONSTANTS.LOG_TYPE_CREATE, label.name);
return label;
});
});
}
queue.push(promise);
}
});
return Q.all(queue);
});
};