httpd: Add commit diff endpoint
Signed-off-by: Sebastian Martinez <me@sebastinez.dev>
This commit is contained in:
parent
f9980f7205
commit
fc724a2333
|
|
@ -33,6 +33,7 @@ pub fn router(ctx: Context) -> Router {
|
||||||
.route("/projects/:project", get(project_handler))
|
.route("/projects/:project", get(project_handler))
|
||||||
.route("/projects/:project/commits", get(history_handler))
|
.route("/projects/:project/commits", get(history_handler))
|
||||||
.route("/projects/:project/commits/:sha", get(commit_handler))
|
.route("/projects/:project/commits/:sha", get(commit_handler))
|
||||||
|
.route("/projects/:project/diff/:base/:oid", get(diff_handler))
|
||||||
.route(
|
.route(
|
||||||
"/projects/:project/activity",
|
"/projects/:project/activity",
|
||||||
get(
|
get(
|
||||||
|
|
@ -230,6 +231,35 @@ async fn commit_handler(
|
||||||
Ok::<_, Error>(Json(response))
|
Ok::<_, Error>(Json(response))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get diff between two commits
|
||||||
|
/// `GET /projects/:project/diff/:base/:oid`
|
||||||
|
async fn diff_handler(
|
||||||
|
State(ctx): State<Context>,
|
||||||
|
Path((project, base, oid)): Path<(Id, Oid, Oid)>,
|
||||||
|
) -> impl IntoResponse {
|
||||||
|
let storage = &ctx.profile.storage;
|
||||||
|
let repo = Repository::open(paths::repository(storage, &project))?;
|
||||||
|
let base = repo.commit(base)?;
|
||||||
|
let commit = repo.commit(oid)?;
|
||||||
|
let diff = repo.diff(base.id, commit.id)?;
|
||||||
|
|
||||||
|
let commits = repo
|
||||||
|
.history(commit.id)?
|
||||||
|
.take_while(|c| {
|
||||||
|
if let Ok(c) = c {
|
||||||
|
c.id != base.id
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.map(|r| r.map(|c| api::json::commit(&c)))
|
||||||
|
.collect::<Result<Vec<_>, _>>()?;
|
||||||
|
|
||||||
|
let response = json!({ "diff": diff, "commits": commits });
|
||||||
|
|
||||||
|
Ok::<_, Error>(Json(response))
|
||||||
|
}
|
||||||
|
|
||||||
/// Get project activity for the past year.
|
/// Get project activity for the past year.
|
||||||
/// `GET /projects/:project/activity`
|
/// `GET /projects/:project/activity`
|
||||||
async fn activity_handler(
|
async fn activity_handler(
|
||||||
|
|
@ -615,8 +645,8 @@ mod routes {
|
||||||
|
|
||||||
use crate::test::{
|
use crate::test::{
|
||||||
self, get, patch, post, CONTRIBUTOR_ISSUE_ID, CONTRIBUTOR_PUB_KEY, CONTRIBUTOR_RID, HEAD,
|
self, get, patch, post, CONTRIBUTOR_ISSUE_ID, CONTRIBUTOR_PUB_KEY, CONTRIBUTOR_RID, HEAD,
|
||||||
HEAD_1, ISSUE_COMMENT_ID, ISSUE_DISCUSSION_ID, ISSUE_ID, PATCH_ID, RID, SESSION_ID,
|
INITIAL_COMMIT, ISSUE_COMMENT_ID, ISSUE_DISCUSSION_ID, ISSUE_ID, PARENT, PATCH_ID, RID,
|
||||||
TIMESTAMP,
|
SESSION_ID, TIMESTAMP,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
|
|
@ -702,11 +732,30 @@ mod routes {
|
||||||
"committer": {
|
"committer": {
|
||||||
"name": "Alice Liddell",
|
"name": "Alice Liddell",
|
||||||
"email": "alice@radicle.xyz",
|
"email": "alice@radicle.xyz",
|
||||||
"time": 1673001014
|
"time": 1673003014
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"diff": {
|
"diff": {
|
||||||
"added": [
|
"added": [
|
||||||
|
{
|
||||||
|
"path": "README",
|
||||||
|
"diff": {
|
||||||
|
"type": "plain",
|
||||||
|
"hunks": [
|
||||||
|
{
|
||||||
|
"header": "@@ -0,0 +1 @@\n",
|
||||||
|
"lines": [
|
||||||
|
{
|
||||||
|
"line": "Hello World!\n",
|
||||||
|
"lineNo": 1,
|
||||||
|
"type": "addition",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"eof": "noneMissing",
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "dir1/README",
|
"path": "dir1/README",
|
||||||
"diff": {
|
"diff": {
|
||||||
|
|
@ -727,14 +776,34 @@ mod routes {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"deleted": [],
|
"deleted": [
|
||||||
|
{
|
||||||
|
"path": "CONTRIBUTING",
|
||||||
|
"diff": {
|
||||||
|
"type": "plain",
|
||||||
|
"hunks": [
|
||||||
|
{
|
||||||
|
"header": "@@ -1 +0,0 @@\n",
|
||||||
|
"lines": [
|
||||||
|
{
|
||||||
|
"line": "Thank you very much!\n",
|
||||||
|
"lineNo": 1,
|
||||||
|
"type": "deletion",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"eof": "noneMissing",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
"moved": [],
|
"moved": [],
|
||||||
"copied": [],
|
"copied": [],
|
||||||
"modified": [],
|
"modified": [],
|
||||||
"stats": {
|
"stats": {
|
||||||
"filesChanged": 1,
|
"filesChanged": 3,
|
||||||
"insertions": 1,
|
"insertions": 2,
|
||||||
"deletions": 0
|
"deletions": 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"branches": [
|
"branches": [
|
||||||
|
|
@ -743,17 +812,88 @@ mod routes {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"commit": {
|
"commit": {
|
||||||
"id": HEAD_1,
|
"id": PARENT,
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Alice Liddell",
|
"name": "Alice Liddell",
|
||||||
"email": "alice@radicle.xyz"
|
"email": "alice@radicle.xyz"
|
||||||
},
|
},
|
||||||
|
"summary": "Add contributing file",
|
||||||
|
"description": "",
|
||||||
|
"committer": {
|
||||||
|
"name": "Alice Liddell",
|
||||||
|
"email": "alice@radicle.xyz",
|
||||||
|
"time": 1673002014,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"diff": {
|
||||||
|
"added": [
|
||||||
|
{
|
||||||
|
"path": "CONTRIBUTING",
|
||||||
|
"diff": {
|
||||||
|
"type": "plain",
|
||||||
|
"hunks": [
|
||||||
|
{
|
||||||
|
"header": "@@ -0,0 +1 @@\n",
|
||||||
|
"lines": [
|
||||||
|
{
|
||||||
|
"line": "Thank you very much!\n",
|
||||||
|
"lineNo": 1,
|
||||||
|
"type": "addition",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"eof": "noneMissing",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"deleted": [
|
||||||
|
{
|
||||||
|
"path": "README",
|
||||||
|
"diff": {
|
||||||
|
"type": "plain",
|
||||||
|
"hunks": [
|
||||||
|
{
|
||||||
|
"header": "@@ -1 +0,0 @@\n",
|
||||||
|
"lines": [
|
||||||
|
{
|
||||||
|
"line": "Hello World!\n",
|
||||||
|
"lineNo": 1,
|
||||||
|
"type": "deletion",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"eof": "noneMissing",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"moved": [],
|
||||||
|
"copied": [],
|
||||||
|
"modified": [],
|
||||||
|
"stats": {
|
||||||
|
"filesChanged": 2,
|
||||||
|
"insertions": 1,
|
||||||
|
"deletions": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"branches": [
|
||||||
|
"refs/heads/master",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"commit": {
|
||||||
|
"id": INITIAL_COMMIT,
|
||||||
|
"author": {
|
||||||
|
"name": "Alice Liddell",
|
||||||
|
"email": "alice@radicle.xyz",
|
||||||
|
},
|
||||||
"summary": "Initial commit",
|
"summary": "Initial commit",
|
||||||
"description": "",
|
"description": "",
|
||||||
"committer": {
|
"committer": {
|
||||||
"name": "Alice Liddell",
|
"name": "Alice Liddell",
|
||||||
"email": "alice@radicle.xyz",
|
"email": "alice@radicle.xyz",
|
||||||
"time": 1673001014
|
"time": 1673001014,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"diff": {
|
"diff": {
|
||||||
|
|
@ -794,11 +934,10 @@ mod routes {
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"stats": {
|
"stats": {
|
||||||
"commits": 2,
|
"commits": 3,
|
||||||
"branches": 1,
|
"branches": 1,
|
||||||
"contributors": 1
|
"contributors": 1
|
||||||
}
|
}
|
||||||
|
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -824,11 +963,30 @@ mod routes {
|
||||||
"committer": {
|
"committer": {
|
||||||
"name": "Alice Liddell",
|
"name": "Alice Liddell",
|
||||||
"email": "alice@radicle.xyz",
|
"email": "alice@radicle.xyz",
|
||||||
"time": 1673001014
|
"time": 1673003014
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"diff": {
|
"diff": {
|
||||||
"added": [
|
"added": [
|
||||||
|
{
|
||||||
|
"path": "README",
|
||||||
|
"diff": {
|
||||||
|
"type": "plain",
|
||||||
|
"hunks": [
|
||||||
|
{
|
||||||
|
"header": "@@ -0,0 +1 @@\n",
|
||||||
|
"lines": [
|
||||||
|
{
|
||||||
|
"line": "Hello World!\n",
|
||||||
|
"lineNo": 1,
|
||||||
|
"type": "addition",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"eof": "noneMissing",
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "dir1/README",
|
"path": "dir1/README",
|
||||||
"diff": {
|
"diff": {
|
||||||
|
|
@ -849,14 +1007,34 @@ mod routes {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"deleted": [],
|
"deleted": [
|
||||||
|
{
|
||||||
|
"path": "CONTRIBUTING",
|
||||||
|
"diff": {
|
||||||
|
"type": "plain",
|
||||||
|
"hunks": [
|
||||||
|
{
|
||||||
|
"header": "@@ -1 +0,0 @@\n",
|
||||||
|
"lines": [
|
||||||
|
{
|
||||||
|
"line": "Thank you very much!\n",
|
||||||
|
"lineNo": 1,
|
||||||
|
"type": "deletion",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"eof": "noneMissing",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
"moved": [],
|
"moved": [],
|
||||||
"copied": [],
|
"copied": [],
|
||||||
"modified": [],
|
"modified": [],
|
||||||
"stats": {
|
"stats": {
|
||||||
"filesChanged": 1,
|
"filesChanged": 3,
|
||||||
"insertions": 1,
|
"insertions": 2,
|
||||||
"deletions": 0
|
"deletions": 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"branches": [
|
"branches": [
|
||||||
|
|
@ -899,14 +1077,14 @@ mod routes {
|
||||||
"committer": {
|
"committer": {
|
||||||
"name": "Alice Liddell",
|
"name": "Alice Liddell",
|
||||||
"email": "alice@radicle.xyz",
|
"email": "alice@radicle.xyz",
|
||||||
"time": 1673001014
|
"time": 1673003014
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"name": "",
|
"name": "",
|
||||||
"path": "",
|
"path": "",
|
||||||
"stats": {
|
"stats": {
|
||||||
|
"commits": 3,
|
||||||
"branches": 1,
|
"branches": 1,
|
||||||
"commits": 2,
|
|
||||||
"contributors": 1
|
"contributors": 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -937,14 +1115,14 @@ mod routes {
|
||||||
"committer": {
|
"committer": {
|
||||||
"name": "Alice Liddell",
|
"name": "Alice Liddell",
|
||||||
"email": "alice@radicle.xyz",
|
"email": "alice@radicle.xyz",
|
||||||
"time": 1673001014
|
"time": 1673003014
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"name": "dir1",
|
"name": "dir1",
|
||||||
"path": "dir1",
|
"path": "dir1",
|
||||||
"stats": {
|
"stats": {
|
||||||
"branches": 1,
|
"branches": 1,
|
||||||
"commits": 2,
|
"commits": 3,
|
||||||
"contributors": 1
|
"contributors": 1
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
@ -1006,23 +1184,23 @@ mod routes {
|
||||||
response.json().await,
|
response.json().await,
|
||||||
json!({
|
json!({
|
||||||
"binary": false,
|
"binary": false,
|
||||||
"content": "Hello World!\n",
|
|
||||||
"lastCommit": {
|
|
||||||
"id": HEAD_1,
|
|
||||||
"author": {
|
|
||||||
"name": "Alice Liddell",
|
|
||||||
"email": "alice@radicle.xyz"
|
|
||||||
},
|
|
||||||
"summary": "Initial commit",
|
|
||||||
"description": "",
|
|
||||||
"committer": {
|
|
||||||
"name": "Alice Liddell",
|
|
||||||
"email": "alice@radicle.xyz",
|
|
||||||
"time": 1673001014
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"name": "README",
|
"name": "README",
|
||||||
"path": "README"
|
"path": "README",
|
||||||
|
"lastCommit": {
|
||||||
|
"id": HEAD,
|
||||||
|
"author": {
|
||||||
|
"name": "Alice Liddell",
|
||||||
|
"email": "alice@radicle.xyz"
|
||||||
|
},
|
||||||
|
"summary": "Add another folder",
|
||||||
|
"description": "",
|
||||||
|
"committer": {
|
||||||
|
"name": "Alice Liddell",
|
||||||
|
"email": "alice@radicle.xyz",
|
||||||
|
"time": 1673003014
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"content": "Hello World!\n",
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -1031,7 +1209,7 @@ mod routes {
|
||||||
async fn test_projects_readme() {
|
async fn test_projects_readme() {
|
||||||
let tmp = tempfile::tempdir().unwrap();
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
let app = super::router(test::seed(tmp.path()));
|
let app = super::router(test::seed(tmp.path()));
|
||||||
let response = get(&app, format!("/projects/{RID}/readme/{HEAD}")).await;
|
let response = get(&app, format!("/projects/{RID}/readme/{INITIAL_COMMIT}")).await;
|
||||||
|
|
||||||
assert_eq!(response.status(), StatusCode::OK);
|
assert_eq!(response.status(), StatusCode::OK);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
|
@ -1040,18 +1218,18 @@ mod routes {
|
||||||
"binary": false,
|
"binary": false,
|
||||||
"content": "Hello World!\n",
|
"content": "Hello World!\n",
|
||||||
"lastCommit": {
|
"lastCommit": {
|
||||||
"id": HEAD_1,
|
"id": INITIAL_COMMIT,
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Alice Liddell",
|
"name": "Alice Liddell",
|
||||||
"email": "alice@radicle.xyz"
|
"email": "alice@radicle.xyz"
|
||||||
},
|
},
|
||||||
"summary": "Initial commit",
|
"summary": "Initial commit",
|
||||||
"description": "",
|
"description": "",
|
||||||
"committer": {
|
"committer": {
|
||||||
"name": "Alice Liddell",
|
"name": "Alice Liddell",
|
||||||
"email": "alice@radicle.xyz",
|
"email": "alice@radicle.xyz",
|
||||||
"time": 1673001014
|
"time": 1673001014
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"name": "README",
|
"name": "README",
|
||||||
"path": "README"
|
"path": "README"
|
||||||
|
|
@ -1059,6 +1237,86 @@ mod routes {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn test_projects_diff() {
|
||||||
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
|
let app = super::router(test::seed(tmp.path()));
|
||||||
|
let response = get(
|
||||||
|
&app,
|
||||||
|
format!("/projects/{RID}/diff/{INITIAL_COMMIT}/{HEAD}"),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
|
||||||
|
assert_eq!(response.status(), StatusCode::OK);
|
||||||
|
assert_eq!(
|
||||||
|
response.json().await,
|
||||||
|
json!({
|
||||||
|
"diff": {
|
||||||
|
"added": [
|
||||||
|
{
|
||||||
|
"path": "dir1/README",
|
||||||
|
"diff": {
|
||||||
|
"type": "plain",
|
||||||
|
"hunks": [
|
||||||
|
{
|
||||||
|
"header": "@@ -0,0 +1 @@\n",
|
||||||
|
"lines": [
|
||||||
|
{
|
||||||
|
"line": "Hello World from dir1!\n",
|
||||||
|
"lineNo": 1,
|
||||||
|
"type": "addition",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"eof": "noneMissing",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"deleted": [],
|
||||||
|
"moved": [],
|
||||||
|
"copied": [],
|
||||||
|
"modified": [],
|
||||||
|
"stats": {
|
||||||
|
"filesChanged": 1,
|
||||||
|
"insertions": 1,
|
||||||
|
"deletions": 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"commits": [
|
||||||
|
{
|
||||||
|
"id": HEAD,
|
||||||
|
"author": {
|
||||||
|
"name": "Alice Liddell",
|
||||||
|
"email": "alice@radicle.xyz",
|
||||||
|
},
|
||||||
|
"summary": "Add another folder",
|
||||||
|
"description": "",
|
||||||
|
"committer": {
|
||||||
|
"name": "Alice Liddell",
|
||||||
|
"email": "alice@radicle.xyz",
|
||||||
|
"time": 1673003014,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": PARENT,
|
||||||
|
"author": {
|
||||||
|
"name": "Alice Liddell",
|
||||||
|
"email": "alice@radicle.xyz",
|
||||||
|
},
|
||||||
|
"summary": "Add contributing file",
|
||||||
|
"description": "",
|
||||||
|
"committer": {
|
||||||
|
"name": "Alice Liddell",
|
||||||
|
"email": "alice@radicle.xyz",
|
||||||
|
"time": 1673002014,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn test_projects_issues_root() {
|
async fn test_projects_issues_root() {
|
||||||
let tmp = tempfile::tempdir().unwrap();
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
|
|
@ -1072,18 +1330,18 @@ mod routes {
|
||||||
{
|
{
|
||||||
"id": ISSUE_ID,
|
"id": ISSUE_ID,
|
||||||
"author": {
|
"author": {
|
||||||
"id": "did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
|
"id": "did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
|
||||||
},
|
},
|
||||||
"title": "Issue #1",
|
"title": "Issue #1",
|
||||||
"state": {
|
"state": {
|
||||||
"status": "open"
|
"status": "open"
|
||||||
},
|
},
|
||||||
"assignees": [],
|
"assignees": [],
|
||||||
"discussion": [
|
"discussion": [
|
||||||
{
|
{
|
||||||
"id": ISSUE_ID,
|
"id": ISSUE_ID,
|
||||||
"author": {
|
"author": {
|
||||||
"id": "did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
|
"id": "did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
|
||||||
},
|
},
|
||||||
"body": "Change 'hello world' to 'hello everyone'",
|
"body": "Change 'hello world' to 'hello everyone'",
|
||||||
"reactions": [],
|
"reactions": [],
|
||||||
|
|
@ -1140,22 +1398,22 @@ mod routes {
|
||||||
json!({
|
json!({
|
||||||
"id": CREATED_ISSUE_ID,
|
"id": CREATED_ISSUE_ID,
|
||||||
"author": {
|
"author": {
|
||||||
"id": CONTRIBUTOR_PUB_KEY,
|
"id": CONTRIBUTOR_PUB_KEY,
|
||||||
},
|
},
|
||||||
"assignees": [],
|
"assignees": [],
|
||||||
"title": "Issue #2",
|
"title": "Issue #2",
|
||||||
"state": {
|
"state": {
|
||||||
"status": "open",
|
"status": "open",
|
||||||
},
|
},
|
||||||
"discussion": [{
|
"discussion": [{
|
||||||
"id": CREATED_ISSUE_ID,
|
"id": CREATED_ISSUE_ID,
|
||||||
"author": {
|
"author": {
|
||||||
"id": CONTRIBUTOR_PUB_KEY,
|
"id": CONTRIBUTOR_PUB_KEY,
|
||||||
},
|
},
|
||||||
"body": "Change 'hello world' to 'hello everyone'",
|
"body": "Change 'hello world' to 'hello everyone'",
|
||||||
"reactions": [],
|
"reactions": [],
|
||||||
"timestamp": TIMESTAMP,
|
"timestamp": TIMESTAMP,
|
||||||
"replyTo": null,
|
"replyTo": null,
|
||||||
}],
|
}],
|
||||||
"tags": [
|
"tags": [
|
||||||
"bug",
|
"bug",
|
||||||
|
|
@ -1203,18 +1461,18 @@ mod routes {
|
||||||
json!({
|
json!({
|
||||||
"id": CONTRIBUTOR_ISSUE_ID,
|
"id": CONTRIBUTOR_ISSUE_ID,
|
||||||
"author": {
|
"author": {
|
||||||
"id": CONTRIBUTOR_PUB_KEY,
|
"id": CONTRIBUTOR_PUB_KEY,
|
||||||
},
|
},
|
||||||
"assignees": [],
|
"assignees": [],
|
||||||
"title": "Issue #1",
|
"title": "Issue #1",
|
||||||
"state": {
|
"state": {
|
||||||
"status": "open",
|
"status": "open",
|
||||||
},
|
},
|
||||||
"discussion": [
|
"discussion": [
|
||||||
{
|
{
|
||||||
"id": ISSUE_DISCUSSION_ID,
|
"id": ISSUE_DISCUSSION_ID,
|
||||||
"author": {
|
"author": {
|
||||||
"id": CONTRIBUTOR_PUB_KEY,
|
"id": CONTRIBUTOR_PUB_KEY,
|
||||||
},
|
},
|
||||||
"body": "Change 'hello world' to 'hello everyone'",
|
"body": "Change 'hello world' to 'hello everyone'",
|
||||||
"reactions": [],
|
"reactions": [],
|
||||||
|
|
@ -1224,7 +1482,7 @@ mod routes {
|
||||||
{
|
{
|
||||||
"id": "9685b141c2e939c3d60f8ca34f8c7bf01a609af1",
|
"id": "9685b141c2e939c3d60f8ca34f8c7bf01a609af1",
|
||||||
"author": {
|
"author": {
|
||||||
"id": CONTRIBUTOR_PUB_KEY,
|
"id": CONTRIBUTOR_PUB_KEY,
|
||||||
},
|
},
|
||||||
"body": "This is first-level comment",
|
"body": "This is first-level comment",
|
||||||
"reactions": [],
|
"reactions": [],
|
||||||
|
|
@ -1251,7 +1509,8 @@ mod routes {
|
||||||
"type": "comment",
|
"type": "comment",
|
||||||
"body": "This is a reply to the first comment",
|
"body": "This is a reply to the first comment",
|
||||||
"replyTo": ISSUE_DISCUSSION_ID,
|
"replyTo": ISSUE_DISCUSSION_ID,
|
||||||
}}))
|
}
|
||||||
|
}))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let _ = get(&app, format!("/projects/{CONTRIBUTOR_RID}/issues")).await;
|
let _ = get(&app, format!("/projects/{CONTRIBUTOR_RID}/issues")).await;
|
||||||
|
|
@ -1277,18 +1536,18 @@ mod routes {
|
||||||
json!({
|
json!({
|
||||||
"id": CONTRIBUTOR_ISSUE_ID,
|
"id": CONTRIBUTOR_ISSUE_ID,
|
||||||
"author": {
|
"author": {
|
||||||
"id": CONTRIBUTOR_PUB_KEY,
|
"id": CONTRIBUTOR_PUB_KEY,
|
||||||
},
|
},
|
||||||
"assignees": [],
|
"assignees": [],
|
||||||
"title": "Issue #1",
|
"title": "Issue #1",
|
||||||
"state": {
|
"state": {
|
||||||
"status": "open",
|
"status": "open",
|
||||||
},
|
},
|
||||||
"discussion": [
|
"discussion": [
|
||||||
{
|
{
|
||||||
"id": ISSUE_DISCUSSION_ID,
|
"id": ISSUE_DISCUSSION_ID,
|
||||||
"author": {
|
"author": {
|
||||||
"id": CONTRIBUTOR_PUB_KEY,
|
"id": CONTRIBUTOR_PUB_KEY,
|
||||||
},
|
},
|
||||||
"body": "Change 'hello world' to 'hello everyone'",
|
"body": "Change 'hello world' to 'hello everyone'",
|
||||||
"reactions": [],
|
"reactions": [],
|
||||||
|
|
@ -1298,7 +1557,7 @@ mod routes {
|
||||||
{
|
{
|
||||||
"id": ISSUE_COMMENT_ID,
|
"id": ISSUE_COMMENT_ID,
|
||||||
"author": {
|
"author": {
|
||||||
"id": CONTRIBUTOR_PUB_KEY,
|
"id": CONTRIBUTOR_PUB_KEY,
|
||||||
},
|
},
|
||||||
"body": "This is a reply to the first comment",
|
"body": "This is a reply to the first comment",
|
||||||
"reactions": [],
|
"reactions": [],
|
||||||
|
|
@ -1324,7 +1583,7 @@ mod routes {
|
||||||
{
|
{
|
||||||
"id": PATCH_ID,
|
"id": PATCH_ID,
|
||||||
"author": {
|
"author": {
|
||||||
"id": "did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
|
"id": "did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
|
||||||
},
|
},
|
||||||
"title": "A new `hello word`",
|
"title": "A new `hello word`",
|
||||||
"description": "change `hello world` in README to something else",
|
"description": "change `hello world` in README to something else",
|
||||||
|
|
@ -1332,16 +1591,16 @@ mod routes {
|
||||||
"target": "delegates",
|
"target": "delegates",
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"revisions": [
|
"revisions": [
|
||||||
{
|
{
|
||||||
"id": PATCH_ID,
|
"id": PATCH_ID,
|
||||||
"description": "",
|
"description": "",
|
||||||
"base": HEAD_1,
|
"base": PARENT,
|
||||||
"oid": HEAD,
|
"oid": HEAD,
|
||||||
"merges": [],
|
"merges": [],
|
||||||
"discussions": [],
|
"discussions": [],
|
||||||
"timestamp": 1671125284,
|
"timestamp": 1671125284,
|
||||||
"reviews": [],
|
"reviews": [],
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|
@ -1356,7 +1615,7 @@ mod routes {
|
||||||
{
|
{
|
||||||
"id": PATCH_ID,
|
"id": PATCH_ID,
|
||||||
"author": {
|
"author": {
|
||||||
"id": "did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
|
"id": "did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
|
||||||
},
|
},
|
||||||
"title": "A new `hello word`",
|
"title": "A new `hello word`",
|
||||||
"description": "change `hello world` in README to something else",
|
"description": "change `hello world` in README to something else",
|
||||||
|
|
@ -1364,16 +1623,16 @@ mod routes {
|
||||||
"target": "delegates",
|
"target": "delegates",
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"revisions": [
|
"revisions": [
|
||||||
{
|
{
|
||||||
"id": PATCH_ID,
|
"id": PATCH_ID,
|
||||||
"description": "",
|
"description": "",
|
||||||
"base": HEAD_1,
|
"base": PARENT,
|
||||||
"oid": HEAD,
|
"oid": HEAD,
|
||||||
"merges": [],
|
"merges": [],
|
||||||
"discussions": [],
|
"discussions": [],
|
||||||
"timestamp": 1671125284,
|
"timestamp": 1671125284,
|
||||||
"reviews": [],
|
"reviews": [],
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
@ -1382,7 +1641,7 @@ mod routes {
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn test_projects_create_patches() {
|
async fn test_projects_create_patches() {
|
||||||
const CREATED_PATCH_ID: &str = "9170195973fb145b327b1f5cd728a6e46b3bb082";
|
const CREATED_PATCH_ID: &str = "f69641cba6d7df2c22844d7f39225b5cda54d363";
|
||||||
|
|
||||||
let tmp = tempfile::tempdir().unwrap();
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
let ctx = test::contributor(tmp.path());
|
let ctx = test::contributor(tmp.path());
|
||||||
|
|
@ -1393,7 +1652,7 @@ mod routes {
|
||||||
let body = serde_json::to_vec(&json!({
|
let body = serde_json::to_vec(&json!({
|
||||||
"title": "Update README",
|
"title": "Update README",
|
||||||
"description": "Do some changes to README",
|
"description": "Do some changes to README",
|
||||||
"target": HEAD_1,
|
"target": INITIAL_COMMIT,
|
||||||
"oid": HEAD,
|
"oid": HEAD,
|
||||||
"tags": [],
|
"tags": [],
|
||||||
}))
|
}))
|
||||||
|
|
@ -1431,7 +1690,7 @@ mod routes {
|
||||||
{
|
{
|
||||||
"id": CREATED_PATCH_ID,
|
"id": CREATED_PATCH_ID,
|
||||||
"author": {
|
"author": {
|
||||||
"id": CONTRIBUTOR_PUB_KEY
|
"id": CONTRIBUTOR_PUB_KEY
|
||||||
},
|
},
|
||||||
"title": "Update README",
|
"title": "Update README",
|
||||||
"description": "Do some changes to README",
|
"description": "Do some changes to README",
|
||||||
|
|
@ -1439,16 +1698,16 @@ mod routes {
|
||||||
"target": "delegates",
|
"target": "delegates",
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"revisions": [
|
"revisions": [
|
||||||
{
|
{
|
||||||
"id": CREATED_PATCH_ID,
|
"id": CREATED_PATCH_ID,
|
||||||
"description": "",
|
"description": "",
|
||||||
"base": HEAD_1,
|
"base": INITIAL_COMMIT,
|
||||||
"oid": HEAD,
|
"oid": HEAD,
|
||||||
"merges": [],
|
"merges": [],
|
||||||
"discussions": [],
|
"discussions": [],
|
||||||
"timestamp": 1671125284,
|
"timestamp": 1671125284,
|
||||||
"reviews": [],
|
"reviews": [],
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -24,9 +24,10 @@ use radicle_crypto::test::signer::MockSigner;
|
||||||
use crate::api::{auth, Context};
|
use crate::api::{auth, Context};
|
||||||
|
|
||||||
pub const RID: &str = "rad:z4FucBZHZMCsxTyQE1dfE2YR59Qbp";
|
pub const RID: &str = "rad:z4FucBZHZMCsxTyQE1dfE2YR59Qbp";
|
||||||
pub const HEAD: &str = "1e978d19f251cd9821d9d9a76d1bd436bf0690d5";
|
pub const HEAD: &str = "e8c676b9e3b42308dc9d218b70faa5408f8e58ca";
|
||||||
pub const HEAD_1: &str = "f604ce9fd5b7cc77b7609beda45ea8760bee78f7";
|
pub const PARENT: &str = "ee8d6a29304623a78ebfa5eeed5af674d0e58f83";
|
||||||
pub const PATCH_ID: &str = "6ec9a764a888576abc7e582dbf82a31e23a9789d";
|
pub const INITIAL_COMMIT: &str = "f604ce9fd5b7cc77b7609beda45ea8760bee78f7";
|
||||||
|
pub const PATCH_ID: &str = "a6afa179631163169bf9fb0921229317ec3950af";
|
||||||
pub const ISSUE_ID: &str = "5ad77fa3f476beed9a26f49b2b3b844e61bef792";
|
pub const ISSUE_ID: &str = "5ad77fa3f476beed9a26f49b2b3b844e61bef792";
|
||||||
pub const ISSUE_DISCUSSION_ID: &str = "f1dff128a22e8183a23516dd9812e72e80914c92";
|
pub const ISSUE_DISCUSSION_ID: &str = "f1dff128a22e8183a23516dd9812e72e80914c92";
|
||||||
pub const ISSUE_COMMENT_ID: &str = "845218041bf9eb8155bfa4aaa8f0c91ce18e5c13";
|
pub const ISSUE_COMMENT_ID: &str = "845218041bf9eb8155bfa4aaa8f0c91ce18e5c13";
|
||||||
|
|
@ -100,6 +101,29 @@ fn seed_with_signer<G: Signer>(dir: &Path, profile: radicle::Profile, signer: &G
|
||||||
|
|
||||||
repo.checkout_tree(tree.as_object(), None).unwrap();
|
repo.checkout_tree(tree.as_object(), None).unwrap();
|
||||||
|
|
||||||
|
let tree = radicle::git::write_tree(
|
||||||
|
Path::new("CONTRIBUTING"),
|
||||||
|
"Thank you very much!\n".as_bytes(),
|
||||||
|
&repo,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
let sig_time = git2::Time::new(1673002014, 0);
|
||||||
|
let sig = git2::Signature::new("Alice Liddell", "alice@radicle.xyz", &sig_time).unwrap();
|
||||||
|
|
||||||
|
let oid2 = repo
|
||||||
|
.commit(
|
||||||
|
Some("HEAD"),
|
||||||
|
&sig,
|
||||||
|
&sig,
|
||||||
|
"Add contributing file\n",
|
||||||
|
&tree,
|
||||||
|
&[&commit],
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
let commit2 = repo.find_commit(oid2).unwrap();
|
||||||
|
|
||||||
|
repo.checkout_tree(tree.as_object(), None).unwrap();
|
||||||
|
|
||||||
fs::create_dir(workdir.join("dir1")).unwrap();
|
fs::create_dir(workdir.join("dir1")).unwrap();
|
||||||
fs::write(
|
fs::write(
|
||||||
workdir.join("dir1").join("README"),
|
workdir.join("dir1").join("README"),
|
||||||
|
|
@ -115,13 +139,15 @@ fn seed_with_signer<G: Signer>(dir: &Path, profile: radicle::Profile, signer: &G
|
||||||
let oid = index.write_tree().unwrap();
|
let oid = index.write_tree().unwrap();
|
||||||
let tree = repo.find_tree(oid).unwrap();
|
let tree = repo.find_tree(oid).unwrap();
|
||||||
|
|
||||||
|
let sig_time = git2::Time::new(1673003014, 0);
|
||||||
|
let sig = git2::Signature::new("Alice Liddell", "alice@radicle.xyz", &sig_time).unwrap();
|
||||||
repo.commit(
|
repo.commit(
|
||||||
Some("HEAD"),
|
Some("HEAD"),
|
||||||
&sig,
|
&sig,
|
||||||
&sig,
|
&sig,
|
||||||
"Add another folder\n",
|
"Add another folder\n",
|
||||||
&tree,
|
&tree,
|
||||||
&[&commit],
|
&[&commit2],
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
|
@ -149,7 +175,7 @@ fn seed_with_signer<G: Signer>(dir: &Path, profile: radicle::Profile, signer: &G
|
||||||
// eq. rad patch open
|
// eq. rad patch open
|
||||||
let mut patches = Patches::open(&repo).unwrap();
|
let mut patches = Patches::open(&repo).unwrap();
|
||||||
let oid = radicle::git::Oid::from_str(HEAD).unwrap();
|
let oid = radicle::git::Oid::from_str(HEAD).unwrap();
|
||||||
let base = radicle::git::Oid::from_str(HEAD_1).unwrap();
|
let base = radicle::git::Oid::from_str(PARENT).unwrap();
|
||||||
let _ = patches
|
let _ = patches
|
||||||
.create(
|
.create(
|
||||||
"A new `hello word`",
|
"A new `hello word`",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue