1 | var path = require('path')
|
2 | var ssbRef = require('ssb-ref')
|
3 | var proc = require('child_process')
|
4 | var u = exports
|
5 |
|
6 | u.help = function (cmd) {
|
7 | require('./help').fn({_: [cmd]})
|
8 | }
|
9 |
|
10 | u.getAppName = function () {
|
11 | return 'ssb_appname' in process.env ? process.env.ssb_appname :
|
12 | u.gitSync('config', 'ssb.appname')
|
13 | }
|
14 |
|
15 | u.gitSync = function () {
|
16 | var args = [].concat.apply([], arguments)
|
17 | return proc.spawnSync('git', args, {encoding: 'utf8'}).stdout.trim()
|
18 | }
|
19 |
|
20 | u.getCurrentBranch = function () {
|
21 | return u.gitSync('symbolic-ref', '--short', 'HEAD')
|
22 | }
|
23 |
|
24 | function getRemoteUrl(name) {
|
25 | if (!name) return null
|
26 | return u.gitSync('ls-remote', '--get-url', name)
|
27 | }
|
28 |
|
29 | function repoId(id) {
|
30 | if (!id) return null
|
31 | id = String(id).replace(/^ssb:\/*/, '')
|
32 | return ssbRef.isMsg(id) ? id : null
|
33 | }
|
34 |
|
35 | u.getRemote = function (name) {
|
36 | return name
|
37 | ? repoId(name) || repoId(getRemoteUrl(name))
|
38 | : repoId(getRemoteUrl('origin')) || repoId(getRemoteUrl('ssb'))
|
39 | }
|
40 |
|
41 | u.getSbot = function (config, cb) {
|
42 | var keys = require('ssb-keys')
|
43 | .loadOrCreateSync(path.join(config.path, 'secret'))
|
44 | require('ssb-client')(keys, config, cb)
|
45 | }
|
46 |
|
47 | u.gitDir = function () {
|
48 | return u.gitSync('rev-parse', '-q', '--git-dir')
|
49 | }
|
50 |
|
51 | u.editor = function (name, defaultText, useText, cb) {
|
52 | var fs = require('fs')
|
53 | var filename = path.resolve(u.gitDir(), name + '_EDITMSG')
|
54 |
|
55 |
|
56 | var separator = '=== This line and anything below will be removed ==='
|
57 | var text = fs.existsSync(filename) ?
|
58 | fs.readFileSync(filename, 'utf8').split(separator)[0].trim() : ''
|
59 | text += '\n\n' + separator + '\n' + defaultText
|
60 | fs.writeFileSync(filename, text)
|
61 |
|
62 |
|
63 | var editor = u.gitSync('var', 'GIT_EDITOR')
|
64 | var args = [filename]
|
65 |
|
66 | if (/[ng]?vim?$/.test(editor))
|
67 | args.unshift('-c', '"set ft=markdown tw=0 wrap lbr"')
|
68 | var child = proc.spawn(editor, args, {shell: true, stdio: 'inherit'})
|
69 | child.on('exit', function (code) {
|
70 | if (code) return cb('error using text editor')
|
71 | fs.readFile(filename, 'utf8', function (err, text) {
|
72 | if (err) return cb(err)
|
73 |
|
74 | useText(text.split(separator)[0].trim(), function (err) {
|
75 | if (err) return cb(err)
|
76 |
|
77 | fs.unlink(filename, cb)
|
78 | })
|
79 | })
|
80 | })
|
81 | }
|
82 |
|
83 |
|
84 | u.getName = function (sbot, sources, dest, cb) {
|
85 | var pull = require('pull-stream')
|
86 | var cat = require('pull-cat')
|
87 | var name
|
88 | pull(
|
89 | cat(sources.map(function (source) {
|
90 | return sbot.links({
|
91 | source: source, dest: dest, rel: 'about',
|
92 | values: true, keys: false, meta: false,
|
93 | reverse: true
|
94 | })
|
95 | })),
|
96 | pull.drain(function (value) {
|
97 | name = value && value.content && value.content.name
|
98 | if (name) return false
|
99 | }, function (err) {
|
100 | cb(err === true ? null : err, name)
|
101 | })
|
102 | )
|
103 | }
|
104 |
|
105 | u.formatTitle = function (str, len) {
|
106 | str = String(str).replace(/[\n\r\t ]+/g, ' ')
|
107 | if (str.length > len) str = str.substr(0, len) + '…'
|
108 | return str
|
109 | }
|
110 |
|
111 | u.issueStateBool = function (argv) {
|
112 | return argv.all || (argv.open && argv.closed) ? null :
|
113 | argv.open ? true :
|
114 | argv.closed ? false :
|
115 | true
|
116 | }
|
117 |
|
118 | u.getForks = function(sbot, baseMsg, eachFork) {
|
119 | var cat = require('pull-cat')
|
120 | var pull = require('pull-stream')
|
121 | return cat([
|
122 | pull.once(baseMsg),
|
123 | pull(
|
124 | sbot.links({
|
125 | dest: baseMsg.key,
|
126 | rel: 'upstream',
|
127 | values: true
|
128 | }),
|
129 | pull.map(function (msg) {
|
130 | if (eachFork) eachFork(msg, baseMsg)
|
131 | return u.getForks(sbot, msg, eachFork)
|
132 | }),
|
133 | pull.flatten()
|
134 | )
|
135 | ])
|
136 | }
|
137 |
|
138 | function formatRecps(r) {
|
139 | switch (typeof r) {
|
140 | case 'object': return r
|
141 | case 'string': return r.split(',')
|
142 | default: return []
|
143 | }
|
144 | }
|
145 |
|
146 | u.getRecps = function (sbot, argv, cb) {
|
147 | if (!argv.recps && !argv.private) return cb(null, [])
|
148 | sbot.whoami(function (err, feed) {
|
149 | if (err) return cb(err)
|
150 | var recps = [feed.id]
|
151 | var recpsArr = formatRecps(argv.recps)
|
152 | for (var i = 0; i in recpsArr; i++) {
|
153 | var recp = recpsArr[i]
|
154 | if (!recp || ~recps.indexOf(recp)) continue
|
155 | if (!ssbRef.isFeed(recp)) return cb(new Error('Invalid feed: ' + recp))
|
156 | recps.push(recp)
|
157 | }
|
158 | cb(null, recps)
|
159 | })
|
160 | }
|