git-stat-project

A tool for git projects statistics generation per every user.

Usage no npm install needed!

<script type="module">
  import gitStatProject from 'https://cdn.skypack.dev/git-stat-project';
</script>

README

Git project stat

A tool for git projects statistics generation per every user.

What does the result look like?

I've used rship repo for this example.

pkondratenko:~/projects/experimental/git-stat-project (*)
> yarn start -- --folder ~/projects/tmp/rship --after 01.01.2017 --before 31.12.2017
yarn start v0.18.1
$ node ./script.js --folder /Users/pkondratenko/projects/tmp/rship --after 01.01.2017 --before 31.12.2017

Commits pushed report
  User name                                Total value ratio                                   Count
  m.chernobrov@rambler-co.ru               |██████████████████████████████████████████████████     16
  abietis@gmail.com                        |█████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░      3
  me@mrsum.ru                              |██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░      2
  a-ignatov-parc@users.noreply.github.com  |███░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░      1
  mrsum@mrsum.local                        |███░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░      1

Lines affected report (added plus removed)
  User name                                Total value ratio                                   Count
  m.chernobrov@rambler-co.ru               |██████████████████████████████████████████████████    691
  abietis@gmail.com                        |█████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░     63
  me@mrsum.ru                              |█░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░     20
  mrsum@mrsum.local                        |░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░      4
  a-ignatov-parc@users.noreply.github.com  |░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░      0

Lines diff report (added minus removed)
  User name                                Total value ratio                                   Count
  a-ignatov-parc@users.noreply.github.com  ░░░░░░░░░░░░░░░░░░░░░░░░░|░░░░░░░░░░░░░░░░░░░░░░░░░      0
  me@mrsum.ru                              ░░░░░░░░░░░░░░░░░░░░░░░░░|░░░░░░░░░░░░░░░░░░░░░░░░░      0
  mrsum@mrsum.local                        ░░░░░░░░░░░░░░░░░░░░░░░░░|░░░░░░░░░░░░░░░░░░░░░░░░░      0
  m.chernobrov@rambler-co.ru               ░░░░█████████████████████|░░░░░░░░░░░░░░░░░░░░░░░░░    -33
  abietis@gmail.com                        █████████████████████████|░░░░░░░░░░░░░░░░░░░░░░░░░    -39

Done in 0.33s.

Requirements

If you want to use this in your console, you need to use node.js >= 7.1.

Installation as a global package

1. Install via npm

npm install -g git-stat-project

2. Use through console

git-stat-project --folder ~/projects/project --after 01.01.2017 --before 01.12.2017

Installation as separate project

1. Clone the repo

git clone git@github.com:gustarus/git-stat-project.git && cd git-stat-project

2. Use needed node.js version

nvm use

3. Install dependencies

yarn

Or via npm:

npm i

4. Use through console

Clone and install this project and then type in console from this project dir:

yarn start -- --folder ~/projects/project --after 01.01.2017 --before 01.12.2017

Or via npm:

npm start -- --folder ~/projects/project --after 01.01.2017 --before 01.12.2017

How you can use this in your project?

This code u can find in script.js.

const stat = require('git-stat-project');
const {helpers, Log, GitProject, CommitsReport, LinesAffectedReport, LinesDiffReport} = stat;
const {getArgv} = helpers;

const {folder, before, after} = getArgv(process.argv);
const reports = [CommitsReport, LinesAffectedReport, LinesDiffReport];

const log = new Log();
const git = new GitProject({folder});
git.stat(after, before).then(collection => {
  if (!Object.keys(collection).length) {
    throw new Error('There is no history for this project. May be the folder is incorrect?');
  }

  return reports.map(Report => {
    const report = new Report({collection});
    const records = report.generate();
    return report.render(records);
  });
}).then(blocks => {
  log.info('\n' + blocks.join('\n\n') + '\n');
}).catch(error => {
  log.error(`\n${error.stack}\n`);
  process.exit(1);
});

Which kinds of reports do you have?

Each report can be required with the following syntax (where collection - git statistic results from GitProject instance):

const {GeneralReport} = require('git-stat-project');
const report = new Report({collection});
const records = report.generate();
return report.render(records);

GeneralReport

General report - commits pushed and lines affected ratio
  User name                                Percents value                                       Commits  Lines
  m.chernobrov@rambler-co.ru               |██████████████████████████████████████████████████       16    691
  abietis@gmail.com                        |██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░        3     63
  me@mrsum.ru                              |███░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░        2     20
  mrsum@mrsum.local                        |█░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░        1      4
  a-ignatov-parc@users.noreply.github.com  |█░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░        1      0

CommitsReport

Commits pushed report
  User name                                Total value ratio                                    Commits
  m.chernobrov@rambler-co.ru               |██████████████████████████████████████████████████       16
  abietis@gmail.com                        |█████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░        3
  me@mrsum.ru                              |██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░        2
  a-ignatov-parc@users.noreply.github.com  |███░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░        1
  mrsum@mrsum.local                        |███░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░        1

LinesAddedReport

Lines added report
  User name                                Total value ratio                                    Added
  m.chernobrov@rambler-co.ru               |██████████████████████████████████████████████████    329
  abietis@gmail.com                        |██░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░     12
  me@mrsum.ru                              |██░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░     10
  mrsum@mrsum.local                        |░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░      2
  a-ignatov-parc@users.noreply.github.com  |░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░      0

LinesRemovedReport

Lines removed report
  User name                                Total value ratio                                    Removed
  m.chernobrov@rambler-co.ru               |██████████████████████████████████████████████████      362
  abietis@gmail.com                        |███████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░       51
  me@mrsum.ru                              |█░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░       10
  mrsum@mrsum.local                        |░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░        2
  a-ignatov-parc@users.noreply.github.com  |░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░        0

LinesDiffReport

Lines diff report (added minus removed)
  User name                                Total value ratio                                    Diff
  a-ignatov-parc@users.noreply.github.com  ░░░░░░░░░░░░░░░░░░░░░░░░░|░░░░░░░░░░░░░░░░░░░░░░░░░     0
  me@mrsum.ru                              ░░░░░░░░░░░░░░░░░░░░░░░░░|░░░░░░░░░░░░░░░░░░░░░░░░░     0
  mrsum@mrsum.local                        ░░░░░░░░░░░░░░░░░░░░░░░░░|░░░░░░░░░░░░░░░░░░░░░░░░░     0
  m.chernobrov@rambler-co.ru               ░░░░█████████████████████|░░░░░░░░░░░░░░░░░░░░░░░░░   -33
  abietis@gmail.com                        █████████████████████████|░░░░░░░░░░░░░░░░░░░░░░░░░   -39

LinesAffectedReport

Lines affected report (added plus removed)
  User name                                Total value ratio                                    Affected
  m.chernobrov@rambler-co.ru               |██████████████████████████████████████████████████       691
  abietis@gmail.com                        |█████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░        63
  me@mrsum.ru                              |█░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░        20
  mrsum@mrsum.local                        |░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░         4
  a-ignatov-parc@users.noreply.github.com  |░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░         0

What does the module export?

// base components
module.exports.Base = require('./components/base/base');
module.exports.Log = require('./components/base/log');
module.exports.GitProject = require('./components/base/git-project');
module.exports.Report = require('./components/base/report');
module.exports.KeyReport = require('./components/base/key-report');
module.exports.Table = require('./components/base/table');

// key reports
module.exports.CommitsReport = require('./components/reports/key/commits');
module.exports.LinesDiffReport = require('./components/reports/key/lines-diff');
module.exports.LinesAddedReport = require('./components/reports/key/lines-added');
module.exports.LinesRemovedReport = require('./components/reports/key/lines-removed');
module.exports.LinesAffectedReport = require('./components/reports/key/lines-affected');

// more complicated reports
module.exports.GeneralReport = require('./components/reports/general');