UNPKG

3.05 kBJavaScriptView Raw
1'use strict'
2
3var debug = require('debug')('ggit')
4var la = require('lazy-ass')
5var check = require('check-more-types')
6var getOneLineLog = require('./get-one-line-log')
7la(check.fn(getOneLineLog), 'missing one line log function')
8var fs = require('fs')
9var folders = require('chdir-promise')
10var R = require('ramda')
11var getTags = require('./tags')
12var pluralize = require('pluralize')
13
14function getLog () {
15 return getOneLineLog({ full: true })
16}
17
18function getLogAfter (commit, branchName = 'master') {
19 return getOneLineLog({
20 full: true,
21 from: commit,
22 firstParent: branchName
23 })
24}
25
26/*
27 // returns commits from given repo folder
28 // latest commits first
29
30 // get last 2 commits and print them
31 commits.all(gitRepoFolder)
32 .then(R.take(2))
33 .then(console.table)
34 .done();
35*/
36function commits (gitRepoRootFolder) {
37 if (!gitRepoRootFolder) {
38 gitRepoRootFolder = process.cwd()
39 }
40 la(check.unemptyString(gitRepoRootFolder), 'missing git repo folder')
41 la(fs.existsSync(gitRepoRootFolder), 'cannot find folder', gitRepoRootFolder)
42
43 return folders.to(gitRepoRootFolder).then(getLog).tap(folders.back)
44}
45
46// returns list of commits after given commit sha
47function commitsAfter (commit, branchName, gitRepoRootFolder) {
48 if (!gitRepoRootFolder) {
49 gitRepoRootFolder = process.cwd()
50 }
51 la(check.unemptyString(gitRepoRootFolder), 'missing git repo folder')
52 la(fs.existsSync(gitRepoRootFolder), 'cannot find folder', gitRepoRootFolder)
53
54 return folders
55 .to(gitRepoRootFolder)
56 .then(() => getLogAfter(commit, branchName))
57 .tap(folders.back)
58}
59
60/*
61 zips list of commits into object where keys = ids, values = messages
62
63 For example to get an object with 2 commit ids as keys
64
65 commits.all(gitRepoFolder)
66 .then(R.take(2))
67 .then(commits.byId)
68 .then(console.log)
69 .done();
70*/
71function byId (commits) {
72 var ids = R.map(R.prop('id'))(commits)
73 var messages = R.map(R.prop('message'))(commits)
74 var commitInfo = R.zipObj(ids, messages)
75 return commitInfo
76}
77
78function afterLastTag (vTagsOnly) {
79 return commits().then(function (list) {
80 vTagsOnly = vTagsOnly !== false
81 return getTags(vTagsOnly).then(function (tags) {
82 debug('found %s', pluralize('tag', tags.length, true))
83 if (check.empty(tags)) {
84 return list
85 }
86 var lastTag = tags[tags.length - 1]
87 var lastTagCommit = lastTag.commit
88 la(
89 check.unemptyString(lastTagCommit),
90 'missing commit in the last tag',
91 lastTag
92 )
93 debug('last tag %s commit %s', lastTag, lastTagCommit)
94 var found
95 var lastCommits = list.filter(function (commit) {
96 if (found) {
97 return
98 }
99 if (commit.id === lastTagCommit) {
100 found = true
101 return
102 }
103 return true
104 })
105 return lastCommits
106 })
107 })
108}
109
110module.exports = {
111 all: commits,
112 byId: check.defend(
113 byId,
114 check.array,
115 'need array of commit info objects to zip'
116 ),
117 afterLastTag: afterLastTag,
118 after: commitsAfter
119}