Ejemplo n.º 1
0
    .then(function(data) {
      options = data.options;
      context = data.context;
      gitRawCommitsOpts = data.gitRawCommitsOpts;
      parserOpts = data.parserOpts;
      writerOpts = data.writerOpts;

      gitRawCommits(gitRawCommitsOpts)
        .on('error', function(err) {
          err.message = 'Error in git-raw-commits: ' + err.message;
          setImmediate(readable.emit.bind(readable), 'error', err);
        })
        .pipe(conventionalCommitsParser(parserOpts))
        .on('error', function(err) {
          err.message = 'Error in conventional-commits-parser: ' + err.message;
          setImmediate(readable.emit.bind(readable), 'error', err);
        })
        // it would be better if `gitRawCommits` could spit out better formatted data
        // so we don't need to transform here
        .pipe(through.obj(function(chunk, enc, cb) {
          try {
            options.transform.call(this, chunk, cb);
          } catch (err) {
            cb(err);
          }
        }))
        .on('error', function(err) {
          err.message = 'Error in options.transform: ' + err.message;
          setImmediate(readable.emit.bind(readable), 'error', err);
        })
        .pipe(conventionalChangelogWriter(context, writerOpts))
        .on('error', function(err) {
          err.message = 'Error in conventional-changelog-writer: ' + err.message;
          setImmediate(readable.emit.bind(readable), 'error', err);
        })
        .pipe(through({
          objectMode: writerOpts.includeDetails
        }, function(chunk, enc, cb) {
          try {
            readable.push(chunk);
          } catch (err) {
            setImmediate(function() {
              throw err;
            });
          }

          cb();
        }, function(cb) {
          readable.push(null);

          cb();
        }));
    })
Ejemplo n.º 2
0
    .spread(function(presetObj, pkgObj, tagsObj) {
      var preset;
      var pkg;
      var tag;
      var repo;

      var hostOpts;

      if (loadPreset) {
        if (presetObj.state === 'fulfilled') {
          preset = presetObj.value;
        } else {
          options.warn('Internal error in preset: "' + options.preset + '"');
          preset = {};
        }
      } else {
        preset = {};
      }

      if (options.pkg) {
        if (pkgObj.state === 'fulfilled') {
          if (options.pkg.path) {
            pkg = pkgObj.value;
          } else {
            pkg = pkgObj.value.pkg || {};
          }

          pkg = options.pkg.transform(pkg);
          context.version = context.version || pkg.version;
          context.packageData = pkg;

          try {
            repo = getPkgRepo(pkg);
          } catch (err) {
            repo = {};
          }

          if (repo.browse) {
            var browse = repo.browse();
            var parsedBrowse = url.parse(browse);
            context.host = context.host || (repo.domain ? (parsedBrowse.protocol + (parsedBrowse.slashes ? '//' : '') + repo.domain) : null);
            context.owner = context.owner || repo.user || '';
            context.repository = context.repository || repo.project || browse;
          }
        } else if (options.pkg.path) {
          options.warn(pkgObj.reason.toString());
        }
      }

      var gitSemverTags = context.gitSemverTags = tagsObj.value;
      if (tagsObj.state === 'fulfilled') {
        tag = tagsObj.value[options.releaseCount - 1];
      }

      if (context.host && (!context.issue || !context.commit || !parserOpts || !parserOpts.referenceActions)) {
        var type;

        if (context.host) {
          var match = context.host.match(rhosts);
          if (match) {
            type = match[0];
          }
        } else if (repo && repo.type) {
          type = repo.type;
        }

        if (type) {
          hostOpts = require('./hosts/' + type);

          context = _.assign({
            issue: hostOpts.issue,
            commit: hostOpts.commit
          }, context);
        } else {
          options.warn('Host: "' + context.host + '" does not exist');
          hostOpts = {};
        }
      } else {
        hostOpts = {};
      }

      gitRawCommitsOpts = _.assign({
          format: '%B%n-hash-%n%H%n-gitTags-%n%d%n-committerDate-%n%ci',
          from: tag
        },
        preset.gitRawCommitsOpts,
        gitRawCommitsOpts
      );

      if (options.append) {
        gitRawCommitsOpts.reverse = gitRawCommitsOpts.reverse || true;
      }

      parserOpts = _.assign(
        {}, preset.parserOpts, {
          warn: options.warn
        },
        parserOpts);

      if (hostOpts.referenceActions && parserOpts) {
        parserOpts.referenceActions = hostOpts.referenceActions;
      }

      if (hostOpts.issuePrefixes && parserOpts) {
        parserOpts.issuePrefixes = hostOpts.issuePrefixes;
      }

      writerOpts = _.assign({
          finalizeContext: function(context, writerOpts, commits, keyCommit) {
            if ((!context.currentTag || !context.previousTag) && keyCommit) {
              var match = /tag:\s*(.+?)[,\)]/gi.exec(keyCommit.gitTags);
              var currentTag = context.currentTag = context.currentTag || match ? match[1] : null;
              var index = gitSemverTags.indexOf(currentTag);
              var previousTag = context.previousTag = gitSemverTags[index + 1];

              if (!previousTag) {
                if (options.append) {
                  context.previousTag = context.previousTag || commits[0] ? commits[0].hash : null;
                } else {
                  context.previousTag = context.previousTag || commits[commits.length - 1] ? commits[commits.length - 1].hash : null;
                }
              }
            } else {
              context.previousTag = context.previousTag || gitSemverTags[0];
              context.currentTag = context.currentTag || 'v' + context.version;
            }

            if (typeof context.linkCompare !== 'boolean' && context.previousTag && context.currentTag) {
              context.linkCompare = true;
            }

            return context;
          }
        },
        preset.writerOpts, {
          reverse: options.append
        },
        writerOpts
      );

      gitRawCommits(gitRawCommitsOpts)
        .on('error', function(err) {
          err.message = 'Error in git-raw-commits: ' + err.message;
          readable.emit('error', err);
        })
        .pipe(conventionalCommitsParser(parserOpts))
        .on('error', function(err) {
          err.message = 'Error in conventional-commits-parser: ' + err.message;
          readable.emit('error', err);
        })
        // it would be better to if `gitRawCommits` could spit out better formatted data
        // so we don't need to transform here
        .pipe(through.obj(function(chunk, enc, cb) {
          try {
            options.transform.call(this, chunk, cb);
          } catch (err) {
            cb(err);
          }
        }))
        .on('error', function(err) {
          err.message = 'Error in options.transform: ' + err.message;
          readable.emit('error', err);
        })
        .pipe(conventionalChangelogWriter(context, writerOpts))
        .on('error', function(err) {
          err.message = 'Error in conventional-changelog-writer: ' + err.message;
          readable.emit('error', err);
        })
        .pipe(through({
          objectMode: writerOpts.includeDetails
        }, function(chunk, enc, cb) {
          readable.push(chunk);

          cb();
        }, function(cb) {
          readable.push(null);

          cb();
        }));
    })