[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/elfscript/nodegit/emscripten/lib/commit.js [Back]  [Original]

var git = require('../'),
    Commit = git.Commit,
    events = require('events');

/**
 * Retrieve the SHA.
 * @return {String}
 */
Commit.prototype.sha = function() {
  return this.oid().sha();
};

/**
 * Retrieve the commit time as a unix timestamp.
 * @return {Number}
 */
Commit.prototype.timeMs = function() {
  return this.time() * 1000;
};

/**
 * Retrieve the commit time as a Date object.
 * @return {Date}
 */
Commit.prototype.date = function() {
  return new Date(this.timeMs());
};

/**
 * Get the tree associated with this commit.
 * @return {Tree}
 */
Commit.prototype.getTree = function(callback) {
  this.repo.getTree(this.treeId(), callback);
};

/**
 * Retrieve the entry represented by path for this commit.
 * Path must be relative to repository root.
 *
 * @param {String} path
 * @param {Function} callback
 * @return {TreeEntry}
 */
Commit.prototype.getEntry = function(path, callback) {
  this.getTree(function(error, tree) {
    if (error) return callback(error);

    tree.getEntry(path, callback);
  });
};

/**
 * Walk the history from this commit backwards.
 * An EventEmitter is returned that will emit a 'commit' event for each 
 * commit in the history, and one 'end' event when the walk is completed.
 * Don't forget to call `start()` on the returned event.
 *
 * @fires Commit#commit
 * @fires Commit#end
 *
 * @return {EventEmitter}
 */
Commit.prototype.history = function() {
  var event = new events.EventEmitter();

  var oid = this.oid();
  var revwalk = this.repo.createRevWalk();
  revwalk.sorting.apply(revwalk, arguments);

  var commits = [];
  event.start = function() {
    revwalk.walk(oid, function commitRevWalk(error, commit) {
      if (error) return event.emit('error', error);

      if (!commit) {
        event.emit('end', commits);
        return;
      }
      event.emit('commit', commit);
      commits.push(commit);
    });
  };
  return event;
};

/**
 * Retrieve the commit's parents -- as commit objects.
 *
 * @param {Function} callback
 * @return {[Commit]} array of commits
 */
Commit.prototype.getParents = function(callback) {
  var self = this;
  function processParents(commit, n, acc, callback) {
    if (n < 0) return callback(null, acc);

    self.repo.getCommit(self.parentId(n), function nextParent(error, parent) {
      if (error) return callback(error);
      processParents(parent, n-1, acc.concat([parent]), callback);
    });
  }

  processParents(this, this.parentCount() - 1, [], callback);
};

/**
 * Retrieve the commit's parent shas.
 *
 * @param {Function} callback
 * @return {[Oid]} array of oids
 */
Commit.prototype.parents = function() {
  var result = [];
  for (var i = 0; i < this.parentCount(); i++) {
    result.push(this.parentId(i));
  }
  return result;
}

/**
 * Generate an array of diff trees showing changes between this commit 
 * and its parent(s).
 *
 * @param {Function} callback
 * @return {[DiffList]} an array of difflists
 */
Commit.prototype.getDiff = function(callback) {
  var self = this;
  self.getParents(function commitParents(error, parents) {
    if (error) return callback(error);

    var parentDiffLists = [];
    parents.forEach(function commitEachParent(parent) {
      parent.getTree(function(error, parentTree) {
        if (error) return callback(error);

        self.getTree(function(error, thisTree) {
          if (error) return callback(error);

          parentTree.diff(thisTree, function walkDiffList(error, diffList) {
            if (error) return callback(error);

            parentDiffLists.push(diffList);
            if (parentDiffLists.length === parents.length) {
              callback(null, parentDiffLists);
            }
          });
        });
      });
    });
  });
};

/**
 * The sha of this commit
 * @return {String}
 */
Commit.prototype.toString = function() {
  return this.sha();
};

Web Proxy Viewer  |  New URL  |  Original Page