Tâche gulp pour mettre à jour la version et créer un commit Git - partie 2

Cet article est la suite de celui-ci: http://julienroche.blogspot.fr/2015/10/tache-gulp-pour-mettre-jour-la-version.html

Ici, je vais étendre ma petite tâche Gulp afin de proposer de gérer le status "snapshot". Pour ce faire, spécifions un peu le workflow:

  • Si je vois que la version courante contient le status
    • Je propose de l'enlever
      • Si oui, je créé un commit Git avec les fichiers mis à jours, sans ce status
      • Sinon, j'arrête le workflow
  • Sinon
    • Je demande vers quoi je souhaite évoluer la version
    • Je demande si je souhaite ajouter le statut
    • Enfin, je créé un commit Git avec les fichiers mis à jours


Voici le contenu de la tâche Gulp (comme vous pouvez le constater, il y a un peu plus de code que la dernière fois):


/*eslint-env node */
'use strict';

// Imports
var
    gutil = require('gulp-util'),
    gulp = require('gulp'),
    gulpOptions = require('../gulp-options'),
    bump = require('gulp-bump'),
    git = require('gulp-git'),
    inquirer = require('inquirer'),
    runSequence = require('run-sequence'),
    semver = require('semver');

// Constants
var
    FILES_TO_UPDATE = ['package.json', 'bower.json', 'npm-shrinkwrap.json'],
    SNAPSHOT_FLAG = 'SNAPSHOT',
    FLAG_DELIMITER = '-';

// Private functions
function _getCurrentVersion() {
    delete require.cache[require.resolve('../package.json')]; // To load always the current version, not from cache
    return require('../package.json').version;
}

function _getVersionDetails(version) {
    var parts = version.split(FLAG_DELIMITER);

    return {
        'version': parts[0].trim(),
        'isSnapshot': !!(parts[1] && parts[1].trim().toUpperCase() === SNAPSHOT_FLAG)
    };
}

function _gulpCommit(nextVersion, callback) {
    gutil.log('Future Version: ', nextVersion);

    gulp.src(FILES_TO_UPDATE, {'cwd': gulpOptions.currentProject})
        .pipe(bump({'version': nextVersion, 'key': 'version'}))
        .pipe(gulp.dest(gulpOptions.currentProject))
        .on('end', callback);
}

function _promptBump(currentVersion, callback) {
    inquirer.prompt(
        [
            {
                'type': 'list',
                'name': 'bump',
                'message': 'What type of bump would you like to do?',
                'choices': ['major', 'minor', 'patch']
            }
        ],
        function (responses) {
            var nextVersion = semver.inc(currentVersion, responses.bump);

            inquirer.prompt(
                [
                    {
                        'type': 'confirm',
                        'name': 'addSnapshot',
                        'message': 'Do you want to add the snapshot flag ?',
                        'default': false                    }
                ],
                function (responses) {
                    if (responses.addSnapshot) {
                        _gulpCommit(nextVersion + FLAG_DELIMITER + SNAPSHOT_FLAG, callback);

                    } else {
                        _gulpCommit(nextVersion, callback);
                    }
                }
            );
        }
    );
}

// Tasks
gulp.task('bump:interactive', function (callback) {
    var currentVersion = _getCurrentVersion(),
        versionDetails = _getVersionDetails(currentVersion);

    gutil.log('Current Version: ', currentVersion);

    if (versionDetails.isSnapshot) {
        inquirer.prompt(
            [
                {
                    'type': 'confirm',
                    'name': 'removeSnapshot',
                    'message': 'Do you want to remove the snapshot flag ?',
                    'default': true                }
            ],
            function (responses) {
                if (responses.removeSnapshot) {
                    _gulpCommit(versionDetails.version, callback);

                } else {
                    callback(new Error('We stop the bump process.'));
                }
            }
        );

    } else {
        _promptBump(currentVersion, callback);
    }
});

gulp.task('bump:git', function () {
    var currentVersion = _getCurrentVersion();

    gulp.src(FILES_TO_UPDATE, {'cwd': gulpOptions.currentProject})
        .pipe(git.commit('Version ' + currentVersion));
});

module.exports = function (callback) {
    return runSequence(
        'bump:interactive',
        'bump:git',
        callback
    );
};



Pour faire suite au précédent article, où ma version était en 0.1.0, je décide de créer une 0.2.0 avec le flag "snapshot". Cela va donc donner ceci dans la console:



J'enchaîne ensuite sur le fait de l'enlever, ce qui nous donne:



Et comme vous pouvez le constater:



Bref, une petite tâche Gulp toujours utile pour nos projets :)

Commentaires