1

I have the following gulp-git tasks which are almost a copy of the task examples provided here https://www.npmjs.com/package/gulp-git

/**
 * Checkout production build branch.
 */
gulp.task('checkout-dist', function(){
  git.checkout('dist', function (err) {
    if (err) throw err;
  });
});

/**
 * Checkout pre production build branch.
 */
gulp.task('checkout-stage', function(){
  git.checkout('stage', function (err) {
    if (err) throw err;
  });
});

/**
 * Push production build branch.
 */
gulp.task('push-dist', ['checkout-dist'], function(){
  git.push('origin', 'dist', {args: " -f"}, function (err) {
    if (err) throw err;
  });
});

/**
 * Push pre production build branch.
 */
gulp.task('push-stage', ['checkout-stage'], function(){
  git.push('origin', 'stage', {args: " -f"}, function (err) {
    if (err) throw err;
  });
});

/**
 * Push production and pre production branches.
 */
gulp.task('deploy-remote', ['push-stage', 'push-dist'], function(){
  git.checkout('master', function(err) {
    if (err) throw err;
  });
});

The logic is simple, checkout a branch and push it to origin remote.

When I run the tasks separately with gulp push-stage or gulp push-dist they are working fine.

But I want to push stage and dist at the same time so I created a new task called deploy-remote. That task works, it push the commits to the origin repo but it crashes at the end with:

[17:18:56] Starting 'checkout-stage'...
[17:18:56] Finished 'checkout-stage' after 12 ms
[17:18:56] Starting 'push-stage'...
[17:18:56] Finished 'push-stage' after 9.41 ms
[17:18:56] Starting 'checkout-dist'...
[17:18:56] Finished 'checkout-dist' after 14 ms
[17:18:56] Starting 'push-dist'...
[17:18:56] Finished 'push-dist' after 14 ms
[17:18:56] Starting 'deploy-remote'...
[17:18:56] Finished 'deploy-remote' after 12 ms

gulpfile.js:483
    if (err) throw err;
                   ^
Error: Command failed: fatal: Unable to create '.git/index.lock': The file already exists.

If no other git process is currently running, this probably means a
git process crashed in this repository earlier. Make sure no other git
process is running and remove the file manually to continue.

    at ChildProcess.exithandler (child_process.js:658:15)
    at ChildProcess.emit (events.js:98:17)
    at maybeClose (child_process.js:766:16)
    at Socket.<anonymous> (child_process.js:979:11)
    at Socket.emit (events.js:95:17)
    at Pipe.close (net.js:466:12)

How should this be achieved?

lapinkoira
  • 8,320
  • 9
  • 51
  • 94

1 Answers1

3

First off those git operations are all asynchronous. That means you have to tell gulp when they're finished by invoking a callback function cb. For example:

gulp.task('push-dist', ['checkout-dist'], function(cb) {
  git.push('origin', 'dist', {args: " -f"}, function (err) {
    cb(err);
  });
});

Second you can't run two git processes on the same repo at the same time, which is what you're doing. Each git process creates a .git/index.lock file that prevents other git processes from accessing the same repository.

You have to run one operation after the other using run-sequence:

var runSequence = require('run-sequence');

gulp.task('checkout-master', function(cb) {
  git.checkout('master', function(err) {
    cb(err);
  });
});

gulp.task('deploy-remote',, function(cb) {
  runSequence('push-stage', 'push-dist', 'checkout-master', cb);
});
Sven Schoenung
  • 30,224
  • 8
  • 65
  • 70