diff --git a/common/models/change.js b/common/models/change.js index daac4054..be353a03 100644 --- a/common/models/change.js +++ b/common/models/change.js @@ -175,24 +175,32 @@ module.exports = function(Change) { if (err) throw new Error(err); }; - async.parallel([ - function getCurrentCheckpoint(next) { - change.constructor.getCheckpointModel().current(next); - }, - function getCurrentRevision(next) { - change.currentRevision(next); - } - ], doRectify); - - function doRectify(err, results) { + change.currentRevision(function(err, rev) { if (err) return cb(err); - var checkpoint = results[0]; - var rev = results[1]; + // avoid setting rev and prev to the same value + if (currentRev === rev) { + change.debug('rev and prev are equal (not updating anything)'); + return cb(null, change); + } + + // FIXME(@bajtos) Allo callers to pass in the checkpoint value + // (or even better - a memoized async function to get the cp value) + // That will enable `rectifyAll` to cache the checkpoint value + change.constructor.getCheckpointModel().current( + function(err, checkpoint) { + if (err) return cb(err); + doRectify(checkpoint, rev); + } + ); + }); + + function doRectify(checkpoint, rev) { if (rev) { - // avoid setting rev and prev to the same value if (currentRev === rev) { - change.debug('rev and prev are equal (not updating rev)'); + change.debug('ASSERTION FAILED: Change currentRev==rev ' + + 'should have been already handled'); + return cb(null, change); } else { change.rev = rev; change.debug('updated revision (was ' + currentRev + ')'); diff --git a/test/change.test.js b/test/change.test.js index 02a059df..55d551c7 100644 --- a/test/change.test.js +++ b/test/change.test.js @@ -200,6 +200,23 @@ describe('Change', function() { }); } }); + + it('should not change checkpoint when rev is the same', function(done) { + var test = this; + var originalCheckpoint = change.checkpoint; + var originalRev = change.rev; + + TestModel.checkpoint(function(err, inst) { + if (err) return done(err); + + change.rectify(function(err, c) { + if (err) return done(err); + expect(c.rev, 'rev').to.equal(originalRev); // sanity check + expect(c.checkpoint, 'checkpoint').to.equal(originalCheckpoint); + done(); + }); + }); + }); }); describe('change.currentRevision(callback)', function() {