ggit

Local promise-returning git command wrappers

ggit v0.14.0

Local promise-returning git command wrappers

You can install and run this tool as a stand alone CLI application.

npm install -g ggit
ggit --help
# get last commit id in the current folder, save into json file
ggit last -f build.json
var clone = require('ggit').cloneRepo;
clone({
    url: 'git@github.com:bahmutov/test-next-updater.git',
    folder: 'folder to create, should not exist yet'
}).then(function () {
    console.log('cloned repo to destination folder');
});
var exec = require('ggit').exec;
var cmd = 'rm -rf folder';
var verbose = true;
exec(cmd, verbose).then(function () {
    console.log('removed folder');
});

Finds last person who has touched specific line in a file

  • filename - full or partial filename (from the repo's root)
  • lineNumber - starts with 1
var blame = require('ggit').blame;
blame(filename, lineNumber).then(function (info) {
  /*
    info is object with fields like
    { commit: '6e65f8ec5ed63cac92ed130b1246d9c23223c04e',
      author: 'Gleb Bahmutov',
      committer: 'Gleb Bahmutov',
      summary: 'adding blame feature',
      filename: 'test/blame.js',
      line: 'var blame = require(\'../index\').blame;' }
  */
});

Equivalent to porcelain git output: see git-blame

Returns true if given path is tracked in the repo.

  • path
var isTracked = require('ggit').isTracked;
isTracked(filename).then(function (result) {
    // result is true or false 
});

Returns true if there are local uncommitted stages

var changed = require('ggit').hasChanges;
changed().then(function (result) {
    // result is true or false 
});

Commit any changes with a given message. Second argument is optional and will be added after a blank line to the short main message.

var commit = require('ggit').commit;
commit('added foo', 'long text').then(function () {
    // after commit 
});

Push commits to the remote

var psuh = require('ggit').psuh;
psuh().then(function () {
    // after the push 
});

Returns list of commits in the given folder as a list or object

// commits.all - gets all commits 
var commits = require('ggit').commits;
commits.all(gitRepoFolder)
    .then(R.take(2))
    .then(console.table)
    .done();
// commits.byId - transforms list of commits into object 
// where keys = ids, values = messages 
// For example to get an object with 2 commit ids as keys 
commits.all(gitRepoFolder)
    .then(R.take(2))
    .then(commits.byId)
    .then(console.log)
    .done();

Returns all tracked source files in the given folder matching pattern. Both folder and pattern are optional.

require('ggit')
    .trackedFiles(__dirname, '*.js')
    .then(function (list) {
        console.log('javascript tracked in the current folder are');
        console.log(list);
    })
    .done();

Returns an object where for each key (filename) there is a list of commits for each line.

  • list of filenames
var perLine = require('ggit').commitPerLine;
perLine(['foo.js', 'bar.js']).then(function (result) {
    /*
    {
        'foo.js': [{
            commit: '3c6b01eb3c96db1cbdf277904545107ef97cbb56',
            author: 'Gleb Bahmutov',
            committer: 'Gleb Bahmutov',
            summary: 'cool commit',
            filename: 'foo.js',
            line: '// actual source line' 
        },
            ...
        }],
        'bar.js': [...]
    }
    */
});

Returns info for a specific commit - number of lines changed, deleted. Same as $ git show --numstat <id>.

require('ggit')
    .numstat('5d3ee3')
    .then(function (result) {
        /* result is
            {
                commit: <full commit SHA>,
                author:
                message:
                date:
                changes: {
                    'filename 1': {
                        filename: 'filename 1',
                        added: 10,
                        deleted: 3
                    },
                    ...
                }
            }
        */
    })
    .done();

Returns last commit id

require('ggit')
    .lastCommitId()
    .then(function (str) {
        // str is full SHA id string 
    })
    .done();

You can pass options object as in lastCommitId(options) where

  • file - save id into the JSON file with the given file name.

Resolves with the current branch name

require('ggit').branchName()
    .then(function (name) {
        // name = "master" or whatever 
    });

Edit source, run unit tests, run end to end tests and release new version commands:

npm test
grunt release
npm publish

Author: Gleb Bahmutov © 2015

License: MIT - do anything with the code, but don't blame uTest if it does not work.

Spread the word: tweet, star on github, etc.

Support: if you find any problems with this module, email / tweet / open issue on Github