All files / lib/generator local.js

100% Statements 58/58
100% Branches 8/8
100% Functions 4/4
100% Lines 58/58

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 591x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 5x 5x 1x 1x 1x 1x 1x 1x 1x 1x 1x 3x 3x 3x 3x 3x 6x 6x 6x 6x 2x 6x 2x 2x 3x 3x 3x 3x 1x 1x 2x 2x 2x 2x 2x 1x 1x 2x 2x 2x 2x 2x 1x 1x 1x  
const fs = require('fs');
const ini = require('ini');
const p = require('path');
const svnInfo = require('svn-info');
 
/**
 * Configuration generator for local repositories.
 *
 * @param {String} dir directory where the local repositories are located
 * @class
 */
class Local {
  constructor(dir) {
    this.dir = dir;
  }
 
  /**
   * Generate Repoman configuration from local repositories.
   * Only supports vanilla git clone (using git config),
   * and subversion checkouts (using svn info).
   *
   * @param {Function} cb standard cb(err, result) callback
   */
  generate(cb) {
    const self = this;
    const config = {};
    const repos = fs.readdirSync(this.dir);
 
    repos.forEach(repo => {
      const gitConfig = p.join(repo, '.git', 'config');
      const svnEntries = p.join(repo, '.svn', 'entries');
 
      if (fs.existsSync(gitConfig)) {
        self._git(gitConfig, repo, config);
      } else if (fs.existsSync(svnEntries)) {
        self._svn(svnEntries, repo, config);
      }
    });
 
    cb(null, config);
  }
 
  _git(gitConfig, repo, config) {
    const info = ini.parse(fs.readFileSync(gitConfig, 'utf-8'));
 
    if (info['remote "origin"'])
      config[repo] = { type: 'git', url: info['remote "origin"'].url };
  }
 
  _svn(svnEntries, repo, config) {
    const info = svnInfo.sync(repo);
    const url = info.repositoryRoot;
 
    config[repo] = { type: 'svn', url };
  }
}
 
module.exports = Local;