Fork me on GitHub
nodegit by tbranyen & faceleg
var git = require('../'),
    events = require('events');

var GitDiffList = function(rawRepo, rawDiffList) {
  var self = {
    repo: rawRepo,
    diffList: rawDiffList || new git.raw.DiffList()
  };

  self.walk = function() {
    var event = new events.EventEmitter(),
        allFileDeltas = [];

    process.nextTick(function() {
      self.diffList.walk(function fileCallback(error, fileDeltas) {
        if (error) {
          event.emit('end', error, null);
        }
        fileDeltas.forEach(function(fileDelta) {
          event.emit('file', null, fileDelta);
          allFileDeltas.push(fileDelta);
        });
      }, function hunkCallback(error, diffHunk) {
        // @todo implement?
      }, function lineCallback(error, diffLine) {
        // @todo implement?
      }, function endCallback(error) {
        event.emit('end', error, allFileDeltas);
      });
    });

    return event;
  };

  self.treeToTree = function(oldSha, newSha, callback) {
    self.diffList.treeToTree(self.repo, oldSha, newSha, function(error, rawDifflist) {
      if (error) {
        callback(error, null);
        return;
      }
      self.diffList = rawDifflist;
      callback(null, self);
    });
  };

  /**
   * Add libgit2 delta types to git.diffList object.
   *
   * Refer to vendor/libgit2/include/git2/diff.h for definitions.
   */
  for (var deltaType in git.raw.DiffList.deltaTypes) {
    self[deltaType] = git.raw.DiffList.deltaTypes[deltaType];
  }

  /**
   * Add libgit2 line origin types to git.diffList object.
   *
   * Refer to vendor/libgit2/include/git2/diff.h for definitions.
   */
  for (var lineOriginType in git.raw.DiffList.lineOriginTypes) {
    self[lineOriginType] = git.raw.DiffList.lineOriginTypes[lineOriginType];
  }

  return self;
};

exports.diffList = GitDiffList;