cli.js

#!/usr/bin/env node

Generated by CoffeeScript 1.6.1

This is the CLI interface for using git-server.


var CLI, EventEmitter, GITCLI, GitServer, Table, async, commander, fs, getUserHomeDir, logging, mkdirp, path, repoDB, repoLocation, repoPort, repos, _c, _g,
  _this = this,
  __hasProp = {}.hasOwnProperty,
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

EventEmitter = require('events').EventEmitter;

CLI = require('cli-listener');

GitServer = require('./host.js');

mkdirp = require('mkdirp');

fs = require('fs');

async = require('async');

path = require('path');

Table = require('cli-table');

commander = require('commander');

commander.version('0.0.1').option('-p, --port [value]', 'Port to run Git on', parseInt).option('-d, --directory [value]', 'Directory of the repos').option('-l, --logging', 'Verbose logging on or off').parse(process.argv);

repoPort = commander.port || 7000;

logging = commander.logging || false;

getUserHomeDir = function() {
  var dir;
  if (process.platform === 'win32') {
    dir = 'USERPROFILE';
  } else {
    dir = 'HOME';
  }
  return process.env[dir];
};

repoLocation = commander.directory || path.join(getUserHomeDir(), './git-server/repos');

if (commander.directory !== void 0) {
  repoDB = commander.directory + '.db';
} else {
  repoDB = path.join(getUserHomeDir(), './git-server/repos.db');
}

mkdirp.sync(repoLocation);

if (fs.existsSync(repoDB)) {
  repos = JSON.parse(fs.readFileSync(repoDB));
} else {
  repos = {
    repos: [],
    users: []
  };
}

GITCLI = (function(_super) {

  __extends(GITCLI, _super);


Constructor for the CLI interface

Params
gitServer Object Git-Server object instance
users Array Users we are managing


  function GITCLI(gitServer, users) {
    var availableCalls, welcomeMessage,
      _this = this;
    this.gitServer = gitServer;
    this.users = users != null ? users : [];
    this.saveConfig = function() {
      return GITCLI.prototype.saveConfig.apply(_this, arguments);
    };
    this.listRepos = function(callback) {
      return GITCLI.prototype.listRepos.apply(_this, arguments);
    };
    this.listUsers = function(callback) {
      return GITCLI.prototype.listUsers.apply(_this, arguments);
    };
    this.columnPercentage = function(percentage) {
      return GITCLI.prototype.columnPercentage.apply(_this, arguments);
    };
    this.getUser = function(username) {
      return GITCLI.prototype.getUser.apply(_this, arguments);
    };
    this.addUserToRepo = function(callback) {
      return GITCLI.prototype.addUserToRepo.apply(_this, arguments);
    };
    this.createUser = function(callback) {
      return GITCLI.prototype.createUser.apply(_this, arguments);
    };
    this.createRepo = function(callback) {
      return GITCLI.prototype.createRepo.apply(_this, arguments);
    };
    availableCalls = {
      'create repo': this.createRepo,
      'create user': this.createUser,
      'list repos': this.listRepos,
      'list users': this.listUsers,
      'add user to repo': this.addUserToRepo
    };
    welcomeMessage = "Welcome to Git Server - Powered by NodeJS\n - Repo Location:  " + repoLocation + "\n - Listening Port:  " + repoPort + "\n - Repo Count: " + this.gitServer.repos.length + "\n - User Count: " + this.users.length;
    this.cli = new CLI('git-server', welcomeMessage, availableCalls);
    this.on('changedData', this.saveConfig);
    setTimeout(this.cli.resetInput, 100);
  }

  GITCLI.prototype.createRepo = function(callback) {
    var _this = this;
    return this.cli.ask({
      name: 'Repo Name: ',
      anonRead: 'Anonymous Access? [y,N] :: '
    }, function(err, results) {
      var anon, name;
      if (err) {
        throw err;
      }
      name = results.name.toLowerCase();
      anon = results.anonRead.toLowerCase();
      if (anon === 'y') {
        anon = true;
      } else {
        anon = false;
      }
      _this.gitServer.createRepo({
        name: name,
        anonRead: anon,
        users: []
      });
      _this.emit('changedData');
      return callback();
    });
  };

  GITCLI.prototype.createUser = function(callback) {
    var _this = this;
    return this.cli.ask({
      username: 'Users username: ',
      password: 'Users password: '
    }, function(err, answers) {
      var user, username;
      if (err) {
        throw err;
      }
      username = answers.username.toLowerCase();
      user = _this.getUser(username);
      if (user !== false) {
        console.log('This username already exists');
        return callback();
      } else {
        user = {
          username: username,
          password: answers.password
        };
        _this.users.push(user);
        _this.emit('changedData');
        return callback();
      }
    });
  };

  GITCLI.prototype.addUserToRepo = function(callback) {
    var _this = this;
    return this.cli.ask({
      repoName: 'Repo Name: ',
      username: 'Users username: ',
      permissions: 'Permissions (comma seperated: R,W ): '
    }, function(err, answers) {
      var permissions, repo, repoName, user, username;
      repoName = answers.repoName.toLowerCase();
      username = answers.username.toLowerCase();
      repo = _this.gitServer.getRepo(repoName + '.git');
      user = _this.getUser(username);
      permissions = answers.permissions.split(',');
      if (permissions.length === 0) {
        permissions = ['R'];
      }
      if (repo === false) {
        return console.log('Repo doesnt exist.');
      } else if (user === false) {
        return console.log('User doesnt exist.');
      } else {
        repo.users.push({
          user: user,
          permissions: permissions
        });
        _this.emit('changedData');
        return callback();
      }
    });
  };


Loop through and find this user

Params
username String Username of the user we are looking for


  GITCLI.prototype.getUser = function(username) {
    var user, _i, _len, _ref;
    _ref = this.users;
    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
      user = _ref[_i];
      if (user.username === username) {
        return user;
      }
    }
    return false;
  };


Get the number of columns needed from a % width

Params
percentage Int Percentage of the console width


  GITCLI.prototype.columnPercentage = function(percentage) {
    return Math.floor(process.stdout.columns * (percentage / 100));
  };

  GITCLI.prototype.listUsers = function(callback) {
    var repo, repoUser, table, user, users, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _ref3;
    users = this.users;
    _ref = this.users;
    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
      user = _ref[_i];
      user.repos = [];
      _ref1 = this.gitServer.repos;
      for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
        repo = _ref1[_j];
        _ref2 = repo.users;
        for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
          repoUser = _ref2[_k];
          if (repoUser.user.username === user.username) {
            user.repos.push({
              name: repo.name,
              permissions: repoUser.permissions
            });
          }
        }
      }
    }
    table = new Table({
      head: ['Username', 'Password', 'Repos'],
      colWidths: [this.columnPercentage(40) - 1, this.columnPercentage(20) - 1, this.columnPercentage(40) - 1]
    });
    _ref3 = this.users;
    for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) {
      user = _ref3[_l];
      repos = (function() {
        var _len4, _m, _ref4, _results;
        _ref4 = user.repos;
        _results = [];
        for (_m = 0, _len4 = _ref4.length; _m < _len4; _m++) {
          repo = _ref4[_m];
          _results.push("" + repo.name + " (" + (repo.permissions.join(',')) + ")");
        }
        return _results;
      })();
      table.push([user.username, user.password, repos.join('\n')]);
    }
    console.log(table.toString());
    return callback();
  };

  GITCLI.prototype.listRepos = function(callback) {
    var repo, table, user, users, _i, _len;
    repos = this.gitServer.repos;
    table = new Table({
      head: ['Repo Name', 'Anonymous Reads', 'Users'],
      colWidths: [this.columnPercentage(40) - 1, this.columnPercentage(20) - 1, this.columnPercentage(40) - 1]
    });
    for (_i = 0, _len = repos.length; _i < _len; _i++) {
      repo = repos[_i];
      users = (function() {
        var _j, _len1, _ref, _results;
        _ref = repo.users;
        _results = [];
        for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {
          user = _ref[_j];
          _results.push("" + user.user.username + " (" + (user.permissions.join(',')) + ")");
        }
        return _results;
      })();
      table.push([repo.name, repo.anonRead, users.join('\n')]);
    }
    console.log(table.toString());
    return callback();
  };

  GITCLI.prototype.saveConfig = function() {
    var config;
    config = JSON.stringify({
      repos: this.gitServer.repos,
      users: this.users
    });
    return fs.writeFileSync(repoDB, config);
  };

  return GITCLI;

})(EventEmitter);

_g = new GitServer(repos.repos, logging, repoLocation, repoPort);

_c = new GITCLI(_g, repos.users);