Commit b66bcecec258b0a2631ec338501afa9409882fe8
Slice packfiles manually
Support vanilla multiblobcel committed on 5/29/2017, 4:42:44 AM
Parent: fd460396edec6969e0dae683021a7bda577f6d79
Files changed
lib/app.js | changed |
lib/git.js | changed |
lib/util.js | changed |
lib/app.js | ||
---|---|---|
@@ -176,28 +176,35 @@ | ||
176 | 176 … | var addCb = done() |
177 | 177 … | done(function (err, hash, add) { |
178 | 178 … | cb(err, hash) |
179 | 179 … | }) |
180 | - return pull( | |
181 | - hasher(hashCb), | |
182 | - this.sbot.blobs.add(addCb) | |
183 | - ) | |
180 … | + return sink | |
184 | 181 … | } |
185 | 182 … | |
186 | 183 … | App.prototype.pushBlob = function (id, cb) { |
187 | 184 … | console.error('pushing blob', id) |
188 | 185 … | this.sbot.blobs.push(id, cb) |
189 | 186 … | } |
190 | 187 … | |
191 | -App.prototype.readBlob = function (link, opts) { | |
188 … | +App.prototype.readBlob = function (link) { | |
192 | 189 … | link = u.toLink(link) |
193 | - opts = opts || {} | |
194 | 190 … | return this.sbot.blobs.get({ |
195 | 191 … | hash: link.link, |
196 | 192 … | size: link.size, |
193 … | + }) | |
194 … | +} | |
195 … | + | |
196 … | +App.prototype.readBlobSlice = function (link, opts) { | |
197 … | + if (this.sbot.blobs.getSlice) return this.sbot.blobs.getSlice({ | |
198 … | + hash: link.link, | |
199 … | + size: link.size, | |
197 | 200 … | start: opts.start, |
198 | 201 … | end: opts.end, |
199 | 202 … | }) |
203 … | + return pull( | |
204 … | + this.readBlob(link), | |
205 … | + u.pullSlice(opts.start, opts.end) | |
206 … | + ) | |
200 | 207 … | } |
201 | 208 … | |
202 | 209 … | App.prototype.ensureHasBlobs = function (links, cb) { |
203 | 210 … | var self = this |
lib/git.js | ||
---|---|---|
@@ -81,9 +81,9 @@ | ||
81 | 81 … | } |
82 | 82 … | |
83 | 83 … | Git.prototype.readObject = function (obj) { |
84 | 84 … | return pull( |
85 | - this.app.readBlob(obj.packLink, {start: obj.offset, end: obj.next}), | |
85 … | + this.app.readBlobSlice(obj.packLink, {start: obj.offset, end: obj.next}), | |
86 | 86 … | this.decodeObject({ |
87 | 87 … | type: obj.type, |
88 | 88 … | length: obj.length, |
89 | 89 … | packLink: obj.packLink, |
@@ -309,9 +309,9 @@ | ||
309 | 309 … | var offset = opts.idx.find(sourceHash) |
310 | 310 … | if (!offset) return cb(null, 'missing source object ' + |
311 | 311 … | sourcehash.toString('hex')) |
312 | 312 … | var readSource = pull( |
313 | - self.app.readBlob(opts.packLink, { | |
313 … | + self.app.readBlobSlice(opts.packLink, { | |
314 | 314 … | start: offset.offset, |
315 | 315 … | end: offset.next |
316 | 316 … | }), |
317 | 317 … | self.decodeObject({ |
lib/util.js | |||
---|---|---|---|
@@ -140,4 +140,32 @@ | |||
140 | 140 … | return html.toString('utf8') | |
141 | 141 … | .replace(/</g, '<') | |
142 | 142 … | .replace(/>/g, '>') | |
143 | 143 … | } | |
144 … | + | ||
145 … | +u.pullSlice = function (start, end) { | ||
146 … | + if (end == null) end = Infinity | ||
147 … | + var offset = 0 | ||
148 … | + return function (read) { | ||
149 … | + return function (abort, cb) { | ||
150 … | + if (abort) read(abort, cb) | ||
151 … | + else if (offset >= end) read(true, function (err) { | ||
152 … | + cb(err || true) | ||
153 … | + }) | ||
154 … | + else if (offset < start) read(null, function next(err, data) { | ||
155 … | + if (err) return cb(err) | ||
156 … | + offset += data.length | ||
157 … | + if (offset <= start) read(null, next) | ||
158 … | + else if (offset < end) cb(null, | ||
159 … | + data.slice(data.length - (offset - start))) | ||
160 … | + else cb(null, data.slice(data.length - (offset - start), | ||
161 … | + data.length - (offset - end))) | ||
162 … | + }) | ||
163 … | + else read(null, function (err, data) { | ||
164 … | + if (err) return cb(err) | ||
165 … | + offset += data.length | ||
166 … | + if (offset <= end) cb(null, data) | ||
167 … | + else cb(null, data.slice(0, data.length - (offset - end))) | ||
168 … | + }) | ||
169 … | + } | ||
170 … | + } | ||
171 … | +} |
Built with git-ssb-web