edit in ui/src/routes/[user]/[repo]/change/+page.svelte at line 55
+ <a href="/{data.owner}/{data.repo}/change/{hash.hash}"
+ ><code class="hash">{hash.hash}</code></a>
+ </div>
+ </div>
+ {:else if hash.authors[0]?.login}
+ <div class="size-12 my-auto">
+ <img class="profile-picture" alt="" src="/identicon/{hash.authors[0].login}/small" />
+ </div>
+ <div>
+ <a class="link" href="/{data.owner}/{data.repo}/change/{hash.hash}">{hash.message}</a>
+ <div class="break-all">
+ Created by <a class="link" href="/{hash.authors[0].login}"
+ >{hash.authors[0].login}</a
+ > {timefmt(hash.timestamp)}
+ </div>
+
+ <div class="break-all">
replacement in ui/src/routes/[user]/[repo]/change/+page.svelte at line 83
[2.97461]→[3.1807:2070](∅→∅) − Created by {#if hash.authors[0].login}<a
− class="link"
− href="/{hash.authors[0].login}">{hash.authors[0].login}</a
− >{:else}{hash.authors[0].key}{/if} {timefmt(hash.timestamp)}
+ Created by {hash.authors[0].key} {timefmt(hash.timestamp)}
replacement in ui/src/routes/[user]/[repo]/change/+page.svelte at line 106
[2.98413]→[2.98413:98573](∅→∅) − {#if data.range && data.hashes[0].n < data.range[1]}
− <a class="btn btn-outline-secondary mx-2" href="?to={data.hashes[0].n + 1}">Previous</a>
+ {#if data.hashes[0].n < data.last}
+ <a class="btn btn-outline-secondary mx-2" href="?from={data.hashes[0].n + 1}">Newer</a>
replacement in ui/src/routes/[user]/[repo]/change/+page.svelte at line 110
[2.98643]→[2.98643:98740](∅→∅) − <a class="btn btn-outline-secondary mx-2" href="?from={data.hashes[0].n + 1}">Next</a>
+ <a
+ class="btn btn-outline-secondary mx-2"
+ href="?to={data.hashes[data.hashes.length - 1].n - 1}">Older</a>
edit in api/src/change/mod.rs at line 1
[2.548943]→[2.548944:548974](∅→∅) − use crate::permissions::Perm;
edit in api/src/change/mod.rs at line 2
+ use crate::permissions::Perm;
edit in api/src/change/mod.rs at line 4
edit in api/src/change/mod.rs at line 8
[2.549101]→[2.549101:549119](∅→∅) edit in api/src/change/mod.rs at line 112
+ debug!(
+ "bs58 {:?}",
+ data_encoding::HEXLOWER.encode(&bs58::decode(&key).into_vec().unwrap())
+ );
replacement in api/src/change/mod.rs at line 156
[2.553288]→[2.553288:553414](∅→∅) − let (id, _) = crate::repository::repository_id(&mut db, &repo.owner, &repo.repo, Some(uid), Perm::APPLY)
− .await?;
+ let (id, _) =
+ crate::repository::repository_id(&mut db, &repo.owner, &repo.repo, Some(uid), Perm::APPLY)
+ .await?;
edit in api/src/change/list.rs at line 1
edit in api/src/change/list.rs at line 4
[2.554198]→[2.554198:554217](∅→∅) replacement in api/src/change/list.rs at line 5
[2.554229]→[2.554229:554248](∅→∅) edit in api/src/change/list.rs at line 8
[2.554317]→[2.554317:554327](∅→∅) edit in api/src/change/list.rs at line 12
+ Base32, ChangeId, ChannelTxnT, DepsTxnT, GraphTxnT, TxnT, TxnTExt,
edit in api/src/change/list.rs at line 15
[2.554489]→[2.554489:554560](∅→∅) − Base32, ChangeId, ChannelTxnT, DepsTxnT, GraphTxnT, TxnT, TxnTExt,
edit in api/src/change/list.rs at line 24
replacement in api/src/change/list.rs at line 48
[2.555169]→[2.555169:555265](∅→∅) − Option<tokio::task::JoinHandle<libpijul::change::ChangeHeader_<libpijul::change::Author>>>,
+ Option<tokio::task::JoinHandle<libpijul::change::ChangeHeader_<libpijul::change::Author>>>,
edit in api/src/change/list.rs at line 90
+ let from = if let Some(from) = page.from {
+ from + count
+ } else if let Some(to) = page.to {
+ to
+ } else {
+ 0
+ };
replacement in api/src/change/list.rs at line 98
[2.556517]→[2.556517:556693](∅→∅) − let mut hashes = list_changes(
− &repo_locks,
− id,
− &channel,
− &req_paths,
− reverse,
− page.from,
− count,
− )
− .await?;
+ let (last, mut hashes) =
+ list_changes(&repo_locks, id, &channel, &req_paths, reverse, from, count).await?;
edit in api/src/change/list.rs at line 112
[2.557048]→[2.557048:557049](∅→∅) edit in api/src/change/list.rs at line 117
replacement in api/src/change/list.rs at line 145
[2.557945]→[2.557945:557968](∅→∅) replacement in api/src/change/list.rs at line 147
[2.557984]→[2.557984:558025](∅→∅) − ) -> Result<Vec<Change>, crate::Error> {
+ ) -> Result<(u64, Vec<Change>), crate::Error> {
replacement in api/src/change/list.rs at line 158
[2.558405]→[2.558405:558427](∅→∅) replacement in api/src/change/list.rs at line 173
[2.558972]→[2.558972:559019](∅→∅) − pos: u64::from_le(p.pos.0 .0),
+ pos: u64::from_le(p.pos.0.0),
replacement in api/src/change/list.rs at line 190
[2.559528]→[2.559528:559595](∅→∅) − .iter_tags(txn.tags(&*channel.read()), from.unwrap_or(0))?
+ .iter_tags(txn.tags(&*channel.read()), from)?
replacement in api/src/change/list.rs at line 194
[2.559679]→[2.559679:559718](∅→∅) − let mut from_ = from.unwrap_or(0);
edit in api/src/change/list.rs at line 197
+ let last = {
+ let ch = channel.read();
+ if let Some(Ok((n, _))) = txn.reverse_log(&ch, None)?.next() {
+ n
+ } else {
+ 0
+ }
+ };
replacement in api/src/change/list.rs at line 208
[2.559853]→[2.559853:559879](∅→∅) replacement in api/src/change/list.rs at line 231
[2.560532]→[2.560532:560562](∅→∅) replacement in api/src/change/list.rs at line 257
[2.561225]→[2.561225:561255](∅→∅) replacement in api/src/change/list.rs at line 261
[2.561285]→[2.561285:561295](∅→∅)