UNPKG

4.32 kBJavaScriptView Raw
1var path = require('path')
2var ssbRef = require('ssb-ref')
3var proc = require('child_process')
4var u = exports
5
6u.help = function (cmd) {
7 require('./help').fn({_: [cmd]})
8}
9
10u.getAppName = function () {
11 return 'ssb_appname' in process.env ? process.env.ssb_appname :
12 u.gitSync('config', 'ssb.appname')
13}
14
15u.gitSync = function () {
16 var args = [].concat.apply([], arguments)
17 return proc.spawnSync('git', args, {encoding: 'utf8'}).stdout.trim()
18}
19
20u.getCurrentBranch = function () {
21 return u.gitSync('symbolic-ref', '--short', 'HEAD')
22}
23
24function getRemoteUrl(name) {
25 if (!name) return null
26 return u.gitSync('ls-remote', '--get-url', name)
27}
28
29function repoId(id) {
30 if (!id) return null
31 id = String(id).replace(/^ssb:\/*/, '')
32 return ssbRef.isMsg(id) ? id : null
33}
34
35u.getRemote = function (name) {
36 return name
37 ? repoId(name) || repoId(getRemoteUrl(name))
38 : repoId(getRemoteUrl('origin')) || repoId(getRemoteUrl('ssb'))
39}
40
41u.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
47u.gitDir = function () {
48 return u.gitSync('rev-parse', '-q', '--git-dir')
49}
50
51u.editor = function (name, defaultText, useText, cb) {
52 var fs = require('fs')
53 var filename = path.resolve(u.gitDir(), name + '_EDITMSG')
54
55 // prepare the file for editing
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 // edit the file
63 var editor = u.gitSync('var', 'GIT_EDITOR')
64 var args = [filename]
65 // give vim special formats, like hub(1) does
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 // use the data
74 useText(text.split(separator)[0].trim(), function (err) {
75 if (err) return cb(err)
76 // delete the file after succesful read
77 fs.unlink(filename, cb)
78 })
79 })
80 })
81}
82
83// Get a name for a thing from multiple fallback sources
84u.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
105u.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
111u.issueStateBool = function (argv) {
112 return argv.all || (argv.open && argv.closed) ? null :
113 argv.open ? true :
114 argv.closed ? false :
115 true
116}
117
118u.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
138function formatRecps(r) {
139 switch (typeof r) {
140 case 'object': return r
141 case 'string': return r.split(',')
142 default: return []
143 }
144}
145
146u.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}