lib/serve.jsView |
---|
1650 | 1650 … | case 'tree': return this.gitTree(m[2]) |
1651 | 1651 … | case 'blob': return this.gitBlob(m[2]) |
1652 | 1652 … | case 'raw': return this.gitRaw(m[2]) |
1653 | 1653 … | case 'diff': return this.gitDiff(m[2]) |
| 1654 … | + case 'line-comment': return this.gitLineComment(m[2]) |
1654 | 1655 … | default: return this.respond(404, 'Not found') |
1655 | 1656 … | } |
1656 | 1657 … | } |
1657 | 1658 … | |
2113 | 2114 … | |
2114 | 2115 … | var done = multicb({pluck: 1, spread: true}) |
2115 | 2116 … | pull.collect(done())(self.app.git.readObject(obj1)) |
2116 | 2117 … | pull.collect(done())(self.app.git.readObject(obj2)) |
2117 | | - done(function (err, bufs1, bufs2) { |
| 2118 … | + self.app.getLineComments({obj: obj2, hash: rev2}, done()) |
| 2119 … | + done(function (err, bufs1, bufs2, lineComments) { |
2118 | 2120 … | if (err) return cb(err) |
2119 | 2121 … | var str1 = Buffer.concat(bufs1, obj1.length).toString('utf8') |
2120 | 2122 … | var str2 = Buffer.concat(bufs2, obj2.length).toString('utf8') |
2121 | 2123 … | var diff = Diff.structuredPatch('', '', str1, str2) |
2122 | | - cb(null, self.gitDiffTable(diff)) |
| 2124 … | + cb(null, self.gitDiffTable(diff, lineComments, { |
| 2125 … | + obj: obj2, |
| 2126 … | + hash: rev2, |
| 2127 … | + })) |
2123 | 2128 … | }) |
2124 | 2129 … | }) |
2125 | 2130 … | }) |
2126 | 2131 … | ]), |
2129 | 2134 … | ) |
2130 | 2135 … | }) |
2131 | 2136 … | } |
2132 | 2137 … | |
2133 | | -Serve.prototype.gitDiffTable = function (diff) { |
| 2138 … | +Serve.prototype.gitDiffTable = function (diff, lineComments, lineCommentInfo) { |
2134 | 2139 … | var self = this |
2135 | 2140 … | return pull( |
2136 | 2141 … | ph('table', [ |
2137 | | - ph('tr', [ |
2138 | | - ]), |
2139 | 2142 … | pull( |
2140 | 2143 … | pull.values(diff.hunks), |
2141 | 2144 … | pull.map(function (hunk) { |
2142 | 2145 … | var oldLine = hunk.oldStart |
2156 | 2159 … | var html = self.app.render.highlight(line) |
2157 | 2160 … | var lineNums = [s == '+' ? '' : oldLine++, s == '-' ? '' : newLine++] |
2158 | 2161 … | |
2159 | 2162 … | var newLineNum = lineNums[lineNums.length-1] |
2160 | | - return ph('tr', { |
2161 | | - class: s == '+' ? 'diff-new' : s == '-' ? 'diff-old' : '' |
2162 | | - }, [ |
2163 | | - lineNums.map(function (num, i) { |
2164 | | - return ph('td', String(num)) |
2165 | | - |
2166 | | - |
2167 | | - var idEnc = encodeURIComponent(id) |
2168 | | - return '<td class="code-linenum">' + |
2169 | | - (num ? '<a href="#' + idEnc + '">' + |
2170 | | - num + '</a>' + |
2171 | | - (updateId && i === lineNums.length-1 && s !== '-' ? |
2172 | | - ' <a href="?comment=' + idEnc + '#' + idEnc + '">…</a>' |
2173 | | - : '') |
2174 | | - : '') + '</td>' |
2175 | | - } |
2176 | | - */ |
2177 | | - }), |
2178 | | - ph('td', ph('pre', u.escapeHTML(html))) |
2179 | | - ]) |
2180 | | - |
2181 | | - |
2182 | | - |
2183 | | - (lineCommentThreads[newLineNum] ? |
2184 | | - '<tr><td colspan=4>' + |
2185 | | - lineCommentThreads[newLineNum] + |
2186 | | - '</td></tr>' |
2187 | | - : commit && query.comment === id ? |
2188 | | - '<tr><td colspan=4>' + |
2189 | | - forms.lineComment(req, repo, updateId, commit, filename, newLineNum) + |
2190 | | - '</td></tr>' |
2191 | | - : '') |
2192 | | - */ |
| 2163 … | + return [ |
| 2164 … | + ph('tr', { |
| 2165 … | + class: s == '+' ? 'diff-new' : s == '-' ? 'diff-old' : '' |
| 2166 … | + }, [ |
| 2167 … | + lineNums.map(function (num, i) { |
| 2168 … | + return ph('td', String(num)) |
| 2169 … | + |
| 2170 … | + |
| 2171 … | + var idEnc = encodeURIComponent(id) |
| 2172 … | + return '<td class="code-linenum">' + |
| 2173 … | + (num ? '<a href="#' + idEnc + '">' + |
| 2174 … | + num + '</a>' + |
| 2175 … | + (updateId && i === lineNums.length-1 && s !== '-' ? |
| 2176 … | + ' <a href="?comment=' + idEnc + '#' + idEnc + '">…</a>' |
| 2177 … | + : '') |
| 2178 … | + : '') + '</td>' |
| 2179 … | + } |
| 2180 … | + */ |
| 2181 … | + }), |
| 2182 … | + ph('td', ph('pre', u.escapeHTML(html))) |
| 2183 … | + ]), |
| 2184 … | + (lineComments[newLineNum] ? |
| 2185 … | + ph('tr', |
| 2186 … | + ph('td', {colspan: 4}, |
| 2187 … | + self.renderLineCommentThread(lineComments[newLineNum]) |
| 2188 … | + ) |
| 2189 … | + ) |
| 2190 … | + : |
| 2191 … | + ph('tr', |
| 2192 … | + ph('td', {colspan: 4}, |
| 2193 … | + |
| 2194 … | + self.renderLineCommentForm(lineCommentInfo) |
| 2195 … | + ) |
| 2196 … | + ) |
| 2197 … | + :*/ '') |
| 2198 … | + ] |
2193 | 2199 … | }) |
2194 | 2200 … | ) |
2195 | 2201 … | ] |
2196 | 2202 … | }) |
2198 | 2204 … | ]) |
2199 | 2205 … | ) |
2200 | 2206 … | } |
2201 | 2207 … | |
| 2208 … | +Serve.prototype.renderLineCommentThread = function (lineComment) { |
| 2209 … | + var self = this |
| 2210 … | + return ph('table', {class: 'ssb-msgs'}, pull( |
| 2211 … | + this.app.getThread(lineComment.msg), |
| 2212 … | + self.renderThread() |
| 2213 … | + )) |
| 2214 … | +} |
| 2215 … | + |
| 2216 … | +Serve.prototype.renderLineCommentForm = function (info) { |
| 2217 … | + var obj = info.obj |
| 2218 … | + var hash = info.hash |
| 2219 … | + return ph('pre', JSON.stringify(info, 0, 2)) |
| 2220 … | +} |
| 2221 … | + |
| 2222 … | +Serve.prototype.gitLineComment = function (path) { |
| 2223 … | + var self = this |
| 2224 … | + var id = decodeURIComponent(String(path)) |
| 2225 … | + self.getMsgDecryptedMaybeOoo(id, function (err, msg) { |
| 2226 … | + if (err) return pull( |
| 2227 … | + pull.once(u.renderError(err).outerHTML), |
| 2228 … | + self.respondSink(400, {'Content-Type': ctype('html')}) |
| 2229 … | + ) |
| 2230 … | + var c = msg && msg.value && msg.value.content |
| 2231 … | + if (!c) return pull( |
| 2232 … | + pull.once('Missing message ' + id), |
| 2233 … | + self.respondSink(500, {'Content-Type': ctype('html')}) |
| 2234 … | + ) |
| 2235 … | + self.app.git.getObjectAtPath({ |
| 2236 … | + msg: c.updateId, |
| 2237 … | + obj: c.commitId, |
| 2238 … | + path: c.filePath, |
| 2239 … | + }, function (err, obj) { |
| 2240 … | + if (err && err.name === 'BlobNotFoundError') |
| 2241 … | + return self.askWantBlobs(err.links) |
| 2242 … | + if (err) return pull( |
| 2243 … | + pull.once(err.stack), |
| 2244 … | + self.respondSink(400, {'Content-Type': 'text/plain'}) |
| 2245 … | + ) |
| 2246 … | + |
| 2247 … | + self.redirect(self.app.render.toUrl(publishedMsg.key)) |
| 2248 … | + |
| 2249 … | + |
| 2250 … | + pull( |
| 2251 … | + ph('pre', JSON.stringify(obj, 0, 2)), |
| 2252 … | + self.respondSink(200) |
| 2253 … | + ) |
| 2254 … | + */ |
| 2255 … | + }) |
| 2256 … | + }) |
| 2257 … | +} |
| 2258 … | + |
2202 | 2259 … | Serve.prototype.gitObjectLinks = function (headMsgId, type) { |
2203 | 2260 … | var self = this |
2204 | 2261 … | return paramap(function (id, cb) { |
2205 | 2262 … | self.app.git.getObjectMsg({ |