Commit d906788c7463b62013560e99db80c29c8e7ca974
Paginate feed pages and commits list
Close %p5d5lpE5HtEZWNWDq5OtV8JbXYCJrvIXs0FPbjm6ZSk=.sha256 Remove limit from repo activity feed, since links() can't be paginatedCharles Lehner committed on 4/1/2016, 4:53:13 AM
Parent: 77ade4785c4f38b2cd894a1f7c1daf2707c24308
Files changed
index.js | changed |
index.js | |||
---|---|---|---|
@@ -232,8 +232,51 @@ | |||
232 | 232 … | }) | |
233 | 233 … | } | |
234 | 234 … | } | |
235 | 235 … | ||
236 … | +function paginate(onFirst, through, onLast, onEmpty) { | ||
237 … | + var ended, last, first = true, queue = [] | ||
238 … | + return function (read) { | ||
239 … | + var mappedRead = through(function (end, cb) { | ||
240 … | + if (ended = end) return read(ended, cb) | ||
241 … | + if (queue.length) | ||
242 … | + return cb(null, queue.shift()) | ||
243 … | + read(null, function (end, data) { | ||
244 … | + if (end) return cb(end) | ||
245 … | + last = data | ||
246 … | + cb(null, data) | ||
247 … | + }) | ||
248 … | + }) | ||
249 … | + return function (end, cb) { | ||
250 … | + var tmp | ||
251 … | + if (ended) return cb(ended) | ||
252 … | + if (ended = end) return read(ended, cb) | ||
253 … | + if (first) | ||
254 … | + return read(null, function (end, data) { | ||
255 … | + if (ended = end) { | ||
256 … | + if (end === true && onEmpty) | ||
257 … | + return onEmpty(cb) | ||
258 … | + return cb(ended) | ||
259 … | + } | ||
260 … | + first = false | ||
261 … | + last = data | ||
262 … | + queue.push(data) | ||
263 … | + if (onFirst) | ||
264 … | + onFirst(data, cb) | ||
265 … | + else | ||
266 … | + mappedRead(null, cb) | ||
267 … | + }) | ||
268 … | + mappedRead(null, function (end, data) { | ||
269 … | + if (ended = end) { | ||
270 … | + if (end === true && last) | ||
271 … | + return onLast(last, cb) | ||
272 … | + } | ||
273 … | + cb(end, data) | ||
274 … | + }) | ||
275 … | + } | ||
276 … | + } | ||
277 … | +} | ||
278 … | + | ||
236 | 279 … | function readObjectString(obj, cb) { | |
237 | 280 … | pull(obj.read, pull.collect(function (err, bufs) { | |
238 | 281 … | if (err) return cb(err) | |
239 | 282 … | cb(null, Buffer.concat(bufs, obj.length).toString('utf8')) | |
@@ -267,8 +310,18 @@ | |||
267 | 310 … | function sortMsgs() { | |
268 | 311 … | return pullSort(compareMsgs) | |
269 | 312 … | } | |
270 | 313 … | ||
314 … | +function pullReverse() { | ||
315 … | + return function (read) { | ||
316 … | + return readNext(function (cb) { | ||
317 … | + pull(read, pull.collect(function (err, items) { | ||
318 … | + cb(err, items && pull.values(items.reverse())) | ||
319 … | + })) | ||
320 … | + }) | ||
321 … | + } | ||
322 … | +} | ||
323 … | + | ||
271 | 324 … | function tryDecodeURIComponent(str) { | |
272 | 325 … | if (!str || (str[0] == '%' && ref.isBlobId(str))) | |
273 | 326 … | return str | |
274 | 327 … | try { | |
@@ -521,9 +574,9 @@ | |||
521 | 574 … | return serveBlob(req, dir) | |
522 | 575 … | else if (ref.isMsgId(dir)) | |
523 | 576 … | return serveMessage(req, dir, dirs.slice(1)) | |
524 | 577 … | else if (ref.isFeedId(dir)) | |
525 | - return serveUserPage(dir, dirs.slice(1)) | ||
578 … | + return serveUserPage(req, dir, dirs.slice(1)) | ||
526 | 579 … | else | |
527 | 580 … | return serveFile(req, dirs) | |
528 | 581 … | } | |
529 | 582 … | ||
@@ -661,22 +714,46 @@ | |||
661 | 714 … | } | |
662 | 715 … | ||
663 | 716 … | /* Feed */ | |
664 | 717 … | ||
665 | - function renderFeed(feedId) { | ||
718 … | + function renderFeed(req, feedId) { | ||
719 … | + var query = req._u.query | ||
666 | 720 … | var opts = { | |
667 | - reverse: true, | ||
721 … | + reverse: !query.forwards, | ||
722 … | + lt: query.lt && +query.lt || Date.now(), | ||
723 … | + gt: query.gt && +query.gt, | ||
668 | 724 … | id: feedId | |
669 | 725 … | } | |
670 | 726 … | return pull( | |
671 | 727 … | feedId ? ssb.createUserStream(opts) : ssb.createFeedStream(opts), | |
672 | 728 … | pull.filter(function (msg) { | |
673 | - return msg.value.content.type in msgTypes && | ||
674 | - msg.value.timestamp < Date.now() | ||
729 … | + return msg.value.content.type in msgTypes | ||
675 | 730 … | }), | |
676 | 731 … | pull.take(20), | |
677 | 732 … | addAuthorName(about), | |
678 | - paramap(renderFeedItem, 8) | ||
733 … | + query.forwards && pullReverse(), | ||
734 … | + paginate( | ||
735 … | + function (first, cb) { | ||
736 … | + if (!query.lt && !query.gt) return cb(null, '') | ||
737 … | + var gt = feedId ? first.value.sequence : first.value.timestamp + 1 | ||
738 … | + var q = qs.stringify({ | ||
739 … | + gt: gt, | ||
740 … | + forwards: 1 | ||
741 … | + }) | ||
742 … | + cb(null, '<a href="?' + q + '">Newer</a>') | ||
743 … | + }, | ||
744 … | + paramap(renderFeedItem, 8), | ||
745 … | + function (last, cb) { | ||
746 … | + cb(null, '<a href="?' + qs.stringify({ | ||
747 … | + lt: feedId ? last.value.sequence : last.value.timestamp - 1 | ||
748 … | + }) + '">Older</a>') | ||
749 … | + }, | ||
750 … | + function (cb) { | ||
751 … | + cb(null, query.forwards ? | ||
752 … | + '<a href="?lt=' + (opts.gt + 1) + '">Older</a>' : | ||
753 … | + '<a href="?gt=' + (opts.lt - 1) + '&forwards=1">Newer</a>') | ||
754 … | + } | ||
755 … | + ) | ||
679 | 756 … | ) | |
680 | 757 … | } | |
681 | 758 … | ||
682 | 759 … | function renderFeedItem(msg, cb) { | |
@@ -713,18 +790,18 @@ | |||
713 | 790 … | } | |
714 | 791 … | ||
715 | 792 … | /* Index */ | |
716 | 793 … | ||
717 | - function serveIndex() { | ||
718 | - return serveTemplate('git ssb')(renderFeed()) | ||
794 … | + function serveIndex(req) { | ||
795 … | + return serveTemplate('git ssb')(renderFeed(req)) | ||
719 | 796 … | } | |
720 | 797 … | ||
721 | - function serveUserPage(feedId, dirs) { | ||
798 … | + function serveUserPage(req, feedId, dirs) { | ||
722 | 799 … | switch (dirs[0]) { | |
723 | 800 … | case undefined: | |
724 | 801 … | case '': | |
725 | 802 … | case 'activity': | |
726 | - return serveUserActivity(feedId) | ||
803 … | + return serveUserActivity(req, feedId) | ||
727 | 804 … | case 'repos': | |
728 | 805 … | return serveUserRepos(feedId) | |
729 | 806 … | } | |
730 | 807 … | } | |
@@ -744,10 +821,10 @@ | |||
744 | 821 … | body, | |
745 | 822 … | ])) | |
746 | 823 … | } | |
747 | 824 … | ||
748 | - function serveUserActivity(feedId) { | ||
749 | - return renderUserPage(feedId, 'activity', renderFeed(feedId)) | ||
825 … | + function serveUserActivity(req, feedId) { | ||
826 … | + return renderUserPage(feedId, 'activity', renderFeed(req, feedId)) | ||
750 | 827 … | } | |
751 | 828 … | ||
752 | 829 … | function serveUserRepos(feedId) { | |
753 | 830 … | return renderUserPage(feedId, 'repos', pull( | |
@@ -871,9 +948,9 @@ | |||
871 | 948 … | return serveRepoTree(repo, branch, []) | |
872 | 949 … | case 'activity': | |
873 | 950 … | return serveRepoActivity(repo, branch) | |
874 | 951 … | case 'commits': | |
875 | - return serveRepoCommits(repo, branch) | ||
952 … | + return serveRepoCommits(req, repo, branch) | ||
876 | 953 … | case 'commit': | |
877 | 954 … | return serveRepoCommit(repo, path[1]) | |
878 | 955 … | case 'tree': | |
879 | 956 … | return serveRepoTree(repo, branch, filePath) | |
@@ -1004,10 +1081,9 @@ | |||
1004 | 1081 … | dest: repo.id, | |
1005 | 1082 … | source: repo.feed, | |
1006 | 1083 … | rel: 'repo', | |
1007 | 1084 … | values: true, | |
1008 | - reverse: true, | ||
1009 | - limit: 8 | ||
1085 … | + reverse: true | ||
1010 | 1086 … | }), | |
1011 | 1087 … | pull.map(renderRepoUpdate.bind(this, repo)) | |
1012 | 1088 … | ) | |
1013 | 1089 … | ])) | |
@@ -1038,19 +1114,27 @@ | |||
1038 | 1114 … | } | |
1039 | 1115 … | ||
1040 | 1116 … | /* Repo commits */ | |
1041 | 1117 … | ||
1042 | - function serveRepoCommits(repo, branch) { | ||
1118 … | + function serveRepoCommits(req, repo, branch) { | ||
1119 … | + var query = req._u.query | ||
1043 | 1120 … | return renderRepoPage(repo, 'commits', branch, cat([ | |
1044 | 1121 … | pull.once('<h3>Commits</h3>'), | |
1045 | 1122 … | pull( | |
1046 | - repo.readLog(branch), | ||
1047 | - paramap(function (hash, cb) { | ||
1048 | - repo.getCommitParsed(hash, function (err, commit) { | ||
1049 | - if (err) return cb(err) | ||
1050 | - cb(null, renderCommit(repo, commit)) | ||
1051 | - }) | ||
1052 | - }, 8) | ||
1123 … | + repo.readLog(query.start || branch), | ||
1124 … | + pull.take(20), | ||
1125 … | + paginate( | ||
1126 … | + !query.start ? '' : function (first, cb) { | ||
1127 … | + cb(null, '…') | ||
1128 … | + }, | ||
1129 … | + pull( | ||
1130 … | + paramap(repo.getCommitParsed.bind(repo), 8), | ||
1131 … | + pull.map(renderCommit.bind(this, repo)) | ||
1132 … | + ), | ||
1133 … | + function (last, cb) { | ||
1134 … | + cb(null, '<a href="?start=' + last + '">Older</a>') | ||
1135 … | + } | ||
1136 … | + ) | ||
1053 | 1137 … | ) | |
1054 | 1138 … | ])) | |
1055 | 1139 … | } | |
1056 | 1140 … |
Built with git-ssb-web