feat(server): add tracing spans and caching to archive and blame services

- Add tracing spans with repo labels for archive and blame operations
- Implement caching for archive list entries when using OID selectors
- Implement caching for blame operations when using OID selectors
- Add detailed
This commit is contained in:
zhenyi
2026-06-04 15:33:16 +08:00
parent 729604f13b
commit cc202d6d1f
41 changed files with 2400 additions and 1067 deletions
+91 -61
View File
@@ -1,44 +1,59 @@
mod common;
use gitks::pb::tag_service_server::TagService;
use gitks::pb::*;
#[test]
fn test_list_tags() {
let (_dir, gb) = common::setup_bare_repo();
let result = gb
.list_tags(ListTagsRequest {
repository: None,
fn hdr() -> RepositoryHeader {
RepositoryHeader {
relative_path: "test-repo".into(),
..Default::default()
}
}
#[tokio::test]
async fn test_list_tags() {
let (dir, _gb) = common::setup_bare_repo();
let svc = common::setup_service(dir.path());
let result = svc
.list_tags(tonic::Request::new(ListTagsRequest {
repository: Some(hdr()),
pattern: String::new(),
pagination: None,
sort_direction: 0,
})
.expect("list_tags");
}))
.await
.unwrap()
.into_inner();
let names: Vec<String> = result.tags.iter().map(|t| t.name.clone()).collect();
assert!(names.contains(&"v0.1.0".to_string()));
}
#[test]
fn test_get_tag() {
let (_dir, gb) = common::setup_bare_repo();
let tag = gb
.get_tag(GetTagRequest {
repository: None,
#[tokio::test]
async fn test_get_tag() {
let (dir, _gb) = common::setup_bare_repo();
let svc = common::setup_service(dir.path());
let tag = svc
.get_tag(tonic::Request::new(GetTagRequest {
repository: Some(hdr()),
name: "v0.1.0".into(),
include_raw: false,
})
.expect("get_tag");
}))
.await
.unwrap()
.into_inner();
assert_eq!(tag.name, "v0.1.0");
assert!(tag.target_oid.is_some());
assert_eq!(tag.full_ref, "refs/tags/v0.1.0");
}
#[test]
fn test_create_and_delete_lightweight_tag() {
let (_dir, gb) = common::setup_bare_repo();
let tag = gb
.create_tag(CreateTagRequest {
repository: None,
#[tokio::test]
async fn test_create_and_delete_lightweight_tag() {
let (dir, _gb) = common::setup_bare_repo();
let svc = common::setup_service(dir.path());
let tag = svc
.create_tag(tonic::Request::new(CreateTagRequest {
repository: Some(hdr()),
name: "v0.2.0".into(),
target: Some(ObjectSelector {
selector: Some(object_selector::Selector::Revision(ObjectName {
@@ -49,32 +64,38 @@ fn test_create_and_delete_lightweight_tag() {
tagger: None,
force: false,
annotated: false,
})
.expect("create_tag");
}))
.await
.unwrap()
.into_inner();
assert_eq!(tag.name, "v0.2.0");
assert!(!tag.annotated);
gb.delete_tag(DeleteTagRequest {
repository: None,
svc.delete_tag(tonic::Request::new(DeleteTagRequest {
repository: Some(hdr()),
name: "v0.2.0".into(),
})
.expect("delete_tag");
}))
.await
.unwrap();
let result = gb.get_tag(GetTagRequest {
repository: None,
name: "v0.2.0".into(),
include_raw: false,
});
let result = svc
.get_tag(tonic::Request::new(GetTagRequest {
repository: Some(hdr()),
name: "v0.2.0".into(),
include_raw: false,
}))
.await;
assert!(result.is_err(), "deleted tag should not exist");
}
#[test]
fn test_create_annotated_tag() {
let (_dir, gb) = common::setup_bare_repo();
let tag = gb
.create_tag(CreateTagRequest {
repository: None,
#[tokio::test]
async fn test_create_annotated_tag() {
let (dir, _gb) = common::setup_bare_repo();
let svc = common::setup_service(dir.path());
let tag = svc
.create_tag(tonic::Request::new(CreateTagRequest {
repository: Some(hdr()),
name: "v1.0.0".into(),
target: Some(ObjectSelector {
selector: Some(object_selector::Selector::Revision(ObjectName {
@@ -85,8 +106,10 @@ fn test_create_annotated_tag() {
tagger: None,
force: false,
annotated: true,
})
.expect("create annotated tag");
}))
.await
.unwrap()
.into_inner();
assert_eq!(tag.name, "v1.0.0");
assert!(tag.annotated, "should be annotated");
@@ -97,12 +120,13 @@ fn test_create_annotated_tag() {
);
}
#[test]
fn test_list_tags_with_pattern() {
let (_dir, gb) = common::setup_bare_repo();
#[tokio::test]
async fn test_list_tags_with_pattern() {
let (dir, _gb) = common::setup_bare_repo();
let svc = common::setup_service(dir.path());
gb.create_tag(CreateTagRequest {
repository: None,
svc.create_tag(tonic::Request::new(CreateTagRequest {
repository: Some(hdr()),
name: "release-1.0".into(),
target: Some(ObjectSelector {
selector: Some(object_selector::Selector::Revision(ObjectName {
@@ -113,17 +137,20 @@ fn test_list_tags_with_pattern() {
tagger: None,
force: false,
annotated: false,
})
.expect("create release tag");
}))
.await
.unwrap();
let result = gb
.list_tags(ListTagsRequest {
repository: None,
let result = svc
.list_tags(tonic::Request::new(ListTagsRequest {
repository: Some(hdr()),
pattern: "release".into(),
pagination: None,
sort_direction: 0,
})
.expect("list_tags with pattern");
}))
.await
.unwrap()
.into_inner();
assert!(
result.tags.iter().all(|t| t.name.contains("release")),
@@ -132,15 +159,18 @@ fn test_list_tags_with_pattern() {
assert!(!result.tags.is_empty());
}
#[test]
fn test_verify_tag() {
let (_dir, gb) = common::setup_bare_repo();
let result = gb
.verify_tag(VerifyTagRequest {
repository: None,
#[tokio::test]
async fn test_verify_tag() {
let (dir, _gb) = common::setup_bare_repo();
let svc = common::setup_service(dir.path());
let result = svc
.verify_tag(tonic::Request::new(VerifyTagRequest {
repository: Some(hdr()),
name: "v0.1.0".into(),
})
.expect("verify_tag");
}))
.await
.unwrap()
.into_inner();
assert!(!result.verified, "unsigned tag should not be verified");
}