summaryrefslogtreecommitdiffstats
path: root/tasks/util/git.js
blob: 03802630dfb8434f1551a2f8fe64342144931ccd (plain)
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
var childProcess = require('child_process');

module.exports = {
  debug: function(callback) {
    childProcess.exec('git remote -v', {}, function(err, remotes) {
      if (err) {
        throw new Error('git.remote: ' + err.message);
      }

      childProcess.exec('git branch -a', {}, function(err, branches) {
        if (err) {
          throw new Error('git.branch: ' + err.message);
        }

        callback(remotes, branches);
      });
    });
  },
  clean: function(callback) {
    childProcess.exec('git diff-index --name-only HEAD --', {}, function(err, stdout) {
      callback(undefined, !err && !stdout);
    });
  },

  commitInfo: function(callback) {
    module.exports.head(function(err, headSha) {
      module.exports.master(function(err, masterSha) {
        module.exports.tagName(function(err, tagName) {
          callback(undefined, {
            head: headSha,
            master: masterSha,
            tagName: tagName,
            isMaster: headSha === masterSha
          });
        });
      });
    });
  },

  head: function(callback) {
    childProcess.exec('git rev-parse --short HEAD', {}, function(err, stdout) {
      if (err) {
        throw new Error('git.head: ' + err.message);
      }

      callback(undefined, stdout.trim());
    });
  },
  master: function(callback) {
    childProcess.exec('git rev-parse --short origin/master', {}, function(err, stdout) {
      // This will error if master was not checked out but in this case we know we are not master
      // so we can ignore.
      if (err && !(/Needed a single revision/.test(err.message))) {
        throw new Error('git.master: ' + err.message);
      }

      callback(undefined, stdout.trim());
    });
  },

  add: function(path, callback) {
    childProcess.exec('git add -f ' + path, {}, function(err) {
      if (err) {
        throw new Error('git.add: ' + err.message);
      }

      callback();
    });
  },
  commit: function(name, callback) {
    childProcess.exec('git commit --message=' + name, {}, function(err) {
      if (err) {
        throw new Error('git.commit: ' + err.message);
      }

      callback();
    });
  },
  tag: function(name, callback) {
    childProcess.exec('git tag -a --message=' + name + ' ' + name, {}, function(err) {
      if (err) {
        throw new Error('git.tag: ' + err.message);
      }

      callback();
    });
  },
  tagName: function(callback) {
    childProcess.exec('git describe --tags', {}, function(err, stdout) {
      if (err) {
        throw new Error('git.tagName: ' + err.message);
      }

      var tags = stdout.trim().split(/\n/);
      tags = tags.filter(function(info) {
        info = info.split('-');
        return info.length == 1;
      });

      var versionTags = tags.filter(function(info) {
        return (/^v/.test(info[0]));
      });

      callback(undefined, versionTags[0] || tags[0]);
    });
  }
};