httpd: Add patch head refs to patch output
Signed-off-by: Sebastian Martinez <me@sebastinez.dev>
This commit is contained in:
parent
da9d63b284
commit
6b62f5bb28
|
|
@ -9,10 +9,12 @@ use serde_json::{json, Value};
|
||||||
use radicle::cob::issue::{Issue, IssueId};
|
use radicle::cob::issue::{Issue, IssueId};
|
||||||
use radicle::cob::patch::{Patch, PatchId};
|
use radicle::cob::patch::{Patch, PatchId};
|
||||||
use radicle::cob::thread::{self, CommentId};
|
use radicle::cob::thread::{self, CommentId};
|
||||||
use radicle::cob::{Author, Timestamp};
|
use radicle::cob::{ActorId, Author, Timestamp};
|
||||||
|
use radicle::git::RefString;
|
||||||
|
use radicle::storage::{git, refs, ReadRepository};
|
||||||
use radicle_surf::blob::Blob;
|
use radicle_surf::blob::Blob;
|
||||||
use radicle_surf::tree::Tree;
|
use radicle_surf::tree::Tree;
|
||||||
use radicle_surf::{Commit, Stats};
|
use radicle_surf::{Commit, Oid, Stats};
|
||||||
|
|
||||||
use crate::api::auth::Session;
|
use crate::api::auth::Session;
|
||||||
|
|
||||||
|
|
@ -102,7 +104,7 @@ pub(crate) fn issue(id: IssueId, issue: Issue) -> Value {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns JSON for a `patch`.
|
/// Returns JSON for a `patch`.
|
||||||
pub(crate) fn patch(id: PatchId, patch: Patch) -> Value {
|
pub(crate) fn patch(id: PatchId, patch: Patch, repo: &git::Repository) -> Value {
|
||||||
json!({
|
json!({
|
||||||
"id": id.to_string(),
|
"id": id.to_string(),
|
||||||
"author": patch.author(),
|
"author": patch.author(),
|
||||||
|
|
@ -117,6 +119,7 @@ pub(crate) fn patch(id: PatchId, patch: Patch) -> Value {
|
||||||
"description": rev.description(),
|
"description": rev.description(),
|
||||||
"base": rev.base,
|
"base": rev.base,
|
||||||
"oid": rev.oid,
|
"oid": rev.oid,
|
||||||
|
"refs": get_refs(repo, patch.author().id(), &rev.oid).unwrap_or(vec![]),
|
||||||
"merges": rev.merges().collect::<Vec<_>>(),
|
"merges": rev.merges().collect::<Vec<_>>(),
|
||||||
"discussions": rev.discussion.comments().collect::<Comments>(),
|
"discussions": rev.discussion.comments().collect::<Comments>(),
|
||||||
"timestamp": rev.timestamp,
|
"timestamp": rev.timestamp,
|
||||||
|
|
@ -134,6 +137,27 @@ fn name_in_path(path: &str) -> &str {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_refs(
|
||||||
|
repo: &git::Repository,
|
||||||
|
id: &ActorId,
|
||||||
|
head: &Oid,
|
||||||
|
) -> Result<Vec<RefString>, refs::Error> {
|
||||||
|
let remote = repo.remote(id)?;
|
||||||
|
let refs = remote
|
||||||
|
.refs
|
||||||
|
.iter()
|
||||||
|
.filter_map(|(name, o)| {
|
||||||
|
if o == head {
|
||||||
|
Some(name.to_owned())
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
Ok(refs)
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
struct Comment {
|
struct Comment {
|
||||||
|
|
|
||||||
|
|
@ -690,7 +690,7 @@ async fn patches_handler(
|
||||||
patches.sort_by(|(_, a, _), (_, b, _)| b.timestamp().cmp(&a.timestamp()));
|
patches.sort_by(|(_, a, _), (_, b, _)| b.timestamp().cmp(&a.timestamp()));
|
||||||
let patches = patches
|
let patches = patches
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(id, patch, _)| api::json::patch(id, patch))
|
.map(|(id, patch, _)| api::json::patch(id, patch, &repo))
|
||||||
.skip(page * per_page)
|
.skip(page * per_page)
|
||||||
.take(per_page)
|
.take(per_page)
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
|
@ -710,7 +710,7 @@ async fn patch_handler(
|
||||||
.get(&patch_id.into())?
|
.get(&patch_id.into())?
|
||||||
.ok_or(Error::NotFound)?;
|
.ok_or(Error::NotFound)?;
|
||||||
|
|
||||||
Ok::<_, Error>(Json(api::json::patch(patch_id.into(), patch)))
|
Ok::<_, Error>(Json(api::json::patch(patch_id.into(), patch, &repo)))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
@ -1670,6 +1670,9 @@ mod routes {
|
||||||
"description": "",
|
"description": "",
|
||||||
"base": PARENT,
|
"base": PARENT,
|
||||||
"oid": HEAD,
|
"oid": HEAD,
|
||||||
|
"refs": [
|
||||||
|
"refs/heads/master",
|
||||||
|
],
|
||||||
"merges": [],
|
"merges": [],
|
||||||
"discussions": [],
|
"discussions": [],
|
||||||
"timestamp": TIMESTAMP,
|
"timestamp": TIMESTAMP,
|
||||||
|
|
@ -1706,6 +1709,9 @@ mod routes {
|
||||||
"description": "",
|
"description": "",
|
||||||
"base": PARENT,
|
"base": PARENT,
|
||||||
"oid": HEAD,
|
"oid": HEAD,
|
||||||
|
"refs": [
|
||||||
|
"refs/heads/master",
|
||||||
|
],
|
||||||
"merges": [],
|
"merges": [],
|
||||||
"discussions": [],
|
"discussions": [],
|
||||||
"timestamp": TIMESTAMP,
|
"timestamp": TIMESTAMP,
|
||||||
|
|
@ -1781,6 +1787,9 @@ mod routes {
|
||||||
"description": "",
|
"description": "",
|
||||||
"base": INITIAL_COMMIT,
|
"base": INITIAL_COMMIT,
|
||||||
"oid": HEAD,
|
"oid": HEAD,
|
||||||
|
"refs": [
|
||||||
|
"refs/heads/master",
|
||||||
|
],
|
||||||
"merges": [],
|
"merges": [],
|
||||||
"discussions": [],
|
"discussions": [],
|
||||||
"timestamp": TIMESTAMP,
|
"timestamp": TIMESTAMP,
|
||||||
|
|
@ -1841,6 +1850,9 @@ mod routes {
|
||||||
"description": "",
|
"description": "",
|
||||||
"base": PARENT,
|
"base": PARENT,
|
||||||
"oid": HEAD,
|
"oid": HEAD,
|
||||||
|
"refs": [
|
||||||
|
"refs/heads/master",
|
||||||
|
],
|
||||||
"merges": [],
|
"merges": [],
|
||||||
"discussions": [],
|
"discussions": [],
|
||||||
"timestamp": TIMESTAMP,
|
"timestamp": TIMESTAMP,
|
||||||
|
|
@ -1898,6 +1910,9 @@ mod routes {
|
||||||
"description": "",
|
"description": "",
|
||||||
"base": PARENT,
|
"base": PARENT,
|
||||||
"oid": HEAD,
|
"oid": HEAD,
|
||||||
|
"refs": [
|
||||||
|
"refs/heads/master",
|
||||||
|
],
|
||||||
"merges": [],
|
"merges": [],
|
||||||
"discussions": [],
|
"discussions": [],
|
||||||
"timestamp": TIMESTAMP,
|
"timestamp": TIMESTAMP,
|
||||||
|
|
@ -1908,6 +1923,9 @@ mod routes {
|
||||||
"description": "This is a new revision",
|
"description": "This is a new revision",
|
||||||
"base": PARENT,
|
"base": PARENT,
|
||||||
"oid": HEAD,
|
"oid": HEAD,
|
||||||
|
"refs": [
|
||||||
|
"refs/heads/master",
|
||||||
|
],
|
||||||
"merges": [],
|
"merges": [],
|
||||||
"discussions": [],
|
"discussions": [],
|
||||||
"timestamp": TIMESTAMP,
|
"timestamp": TIMESTAMP,
|
||||||
|
|
@ -1965,6 +1983,9 @@ mod routes {
|
||||||
"description": "",
|
"description": "",
|
||||||
"base": PARENT,
|
"base": PARENT,
|
||||||
"oid": HEAD,
|
"oid": HEAD,
|
||||||
|
"refs": [
|
||||||
|
"refs/heads/master",
|
||||||
|
],
|
||||||
"merges": [],
|
"merges": [],
|
||||||
"discussions": [],
|
"discussions": [],
|
||||||
"timestamp": TIMESTAMP,
|
"timestamp": TIMESTAMP,
|
||||||
|
|
@ -2044,6 +2065,9 @@ mod routes {
|
||||||
"description": "",
|
"description": "",
|
||||||
"base": PARENT,
|
"base": PARENT,
|
||||||
"oid": HEAD,
|
"oid": HEAD,
|
||||||
|
"refs": [
|
||||||
|
"refs/heads/master",
|
||||||
|
],
|
||||||
"merges": [],
|
"merges": [],
|
||||||
"discussions": [
|
"discussions": [
|
||||||
{
|
{
|
||||||
|
|
@ -2137,6 +2161,9 @@ mod routes {
|
||||||
"description": "",
|
"description": "",
|
||||||
"base": PARENT,
|
"base": PARENT,
|
||||||
"oid": HEAD,
|
"oid": HEAD,
|
||||||
|
"refs": [
|
||||||
|
"refs/heads/master",
|
||||||
|
],
|
||||||
"merges": [],
|
"merges": [],
|
||||||
"discussions": [],
|
"discussions": [],
|
||||||
"timestamp": TIMESTAMP,
|
"timestamp": TIMESTAMP,
|
||||||
|
|
@ -2217,6 +2244,9 @@ mod routes {
|
||||||
"description": "",
|
"description": "",
|
||||||
"base": PARENT,
|
"base": PARENT,
|
||||||
"oid": HEAD,
|
"oid": HEAD,
|
||||||
|
"refs": [
|
||||||
|
"refs/heads/master",
|
||||||
|
],
|
||||||
"merges": [
|
"merges": [
|
||||||
{
|
{
|
||||||
"node": CONTRIBUTOR_NID,
|
"node": CONTRIBUTOR_NID,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue