angular-cn/tools/gulp-tasks/format.js

135 lines
4.0 KiB
JavaScript
Raw Normal View History

/**
* @license
* Copyright Google Inc. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
const {I18N_FOLDER, I18N_DATA_FOLDER} = require('./cldr/extract');
// clang-format entry points
const srcsToFmt = [
'packages/**/*.{js,ts}',
'modules/benchmarks/**/*.{js,ts}',
'modules/e2e_util/**/*.{js,ts}',
'modules/playground/**/*.{js,ts}',
'tools/**/*.{js,ts}',
'!tools/public_api_guard/**/*.d.ts',
'./*.{js,ts}',
'!**/node_modules/**',
'!**/dist/**',
'!**/built/**',
'!shims_for_IE.js',
`!${I18N_DATA_FOLDER}/**/*.{js,ts}`,
`!${I18N_FOLDER}/available_locales.ts`,
`!${I18N_FOLDER}/currencies.ts`,
`!${I18N_FOLDER}/locale_en.ts`,
'!tools/gulp-tasks/cldr/extract.js',
'!tools/ts-api-guardian/test/fixtures/**',
];
/**
* Gulp stream that wraps the gulp-git status task
* and converts the stdout into a stream of files
*/
function gulpStatus() {
const Vinyl = require('vinyl');
const path = require('path');
const gulpGit = require('gulp-git');
const through = require('through2');
const srcStream = through.obj();
const opt = {cwd: process.cwd()};
// https://git-scm.com/docs/git-status#_short_format
const RE_STATUS = /^((\s\w)|(\w+)|\?{0,2})\s([\w\+\-\/\\\.]+)(\s->\s)?([\w\+\-\/\\\.]+)*\n/gm;
gulpGit.status({args: '--porcelain', quiet: true}, function(err, stdout) {
if (err) return srcStream.emit('error', err);
const data = stdout.toString();
let currentMatch;
while ((currentMatch = RE_STATUS.exec(data)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (currentMatch.index === RE_STATUS.lastIndex) {
RE_STATUS.lastIndex++;
}
// status
const status = currentMatch[1].trim().toLowerCase();
// File has been deleted
if (status.includes('d')) {
continue;
}
// file path
const currentFilePath = currentMatch[4];
// new file path in case its been moved
const newFilePath = currentMatch[6];
const filePath = newFilePath || currentFilePath;
srcStream.write(new Vinyl({
path: path.resolve(opt.cwd, filePath),
cwd: opt.cwd,
}));
}
srcStream.end();
});
return srcStream;
}
module.exports = {
// Check source code for formatting errors (clang-format)
enforce: (gulp) => () => {
const format = require('gulp-clang-format');
const clangFormat = require('clang-format');
return gulp.src(srcsToFmt).pipe(
format.checkFormat('file', clangFormat, {verbose: true, fail: true}));
},
// Format the source code with clang-format (see .clang-format)
format: (gulp) => () => {
const format = require('gulp-clang-format');
const clangFormat = require('clang-format');
return gulp.src(srcsToFmt, {base: '.'})
.pipe(format.format('file', clangFormat))
.pipe(gulp.dest('.'));
},
// Format only the changed source code files with clang-format (see .clang-format)
'format-changes': (gulp) => () => {
const format = require('gulp-clang-format');
const clangFormat = require('clang-format');
const gulpFilter = require('gulp-filter');
return gulpStatus()
.pipe(gulpFilter(srcsToFmt))
.pipe(format.format('file', clangFormat))
.pipe(gulp.dest('.'));
},
// Format only the changed source code files diffed from the provided branch with clang-format
// (see .clang-format)
'format-diff': (gulp) => () => {
const format = require('gulp-clang-format');
const clangFormat = require('clang-format');
const gulpFilter = require('gulp-filter');
const minimist = require('minimist');
const gulpGit = require('gulp-git');
const args = minimist(process.argv.slice(2));
const branch = args.branch || 'master';
return gulpGit.diff(branch, {log: false})
.pipe(gulpFilter(srcsToFmt))
.pipe(format.format('file', clangFormat))
.pipe(gulp.dest('.'));
}
};