feat(core): implement Git repository operations with gRPC services
- Add advertise_refs functionality for Git protocol communication - Implement archive service with TAR/ZIP format support and streaming - Create blame service for Git file annotation with line tracking - Add branch management including create, delete, rename and compare operations - Implement merge checking with conflict detection and fast-forward handling - Add cherry-pick functionality for applying commits between branches - Integrate gix library for Git repository operations and object handling - Add comprehensive test suite covering all Git operations - Implement proper error handling and repository validation - Add pagination support for large result sets - Create protobuf definitions for all Git operations and data structures - Add build system for gRPC code generation and dependency management
This commit is contained in:
@@ -0,0 +1,146 @@
|
||||
mod common;
|
||||
|
||||
use gitks::pb::*;
|
||||
|
||||
#[test]
|
||||
fn test_list_tags() {
|
||||
let (_dir, gb) = common::setup_bare_repo();
|
||||
let result = gb
|
||||
.list_tags(ListTagsRequest {
|
||||
repository: None,
|
||||
pattern: String::new(),
|
||||
pagination: None,
|
||||
sort_direction: 0,
|
||||
})
|
||||
.expect("list_tags");
|
||||
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,
|
||||
name: "v0.1.0".into(),
|
||||
include_raw: false,
|
||||
})
|
||||
.expect("get_tag");
|
||||
|
||||
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,
|
||||
name: "v0.2.0".into(),
|
||||
target: Some(ObjectSelector {
|
||||
selector: Some(object_selector::Selector::Revision(ObjectName {
|
||||
revision: "main".into(),
|
||||
})),
|
||||
}),
|
||||
message: String::new(),
|
||||
tagger: None,
|
||||
force: false,
|
||||
annotated: false,
|
||||
})
|
||||
.expect("create_tag");
|
||||
|
||||
assert_eq!(tag.name, "v0.2.0");
|
||||
assert!(!tag.annotated);
|
||||
|
||||
gb.delete_tag(DeleteTagRequest {
|
||||
repository: None,
|
||||
name: "v0.2.0".into(),
|
||||
})
|
||||
.expect("delete_tag");
|
||||
|
||||
let result = gb.get_tag(GetTagRequest {
|
||||
repository: None,
|
||||
name: "v0.2.0".into(),
|
||||
include_raw: false,
|
||||
});
|
||||
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,
|
||||
name: "v1.0.0".into(),
|
||||
target: Some(ObjectSelector {
|
||||
selector: Some(object_selector::Selector::Revision(ObjectName {
|
||||
revision: "main".into(),
|
||||
})),
|
||||
}),
|
||||
message: "Release v1.0.0".into(),
|
||||
tagger: None,
|
||||
force: false,
|
||||
annotated: true,
|
||||
})
|
||||
.expect("create annotated tag");
|
||||
|
||||
assert_eq!(tag.name, "v1.0.0");
|
||||
assert!(tag.annotated, "should be annotated");
|
||||
assert!(tag.tag_oid.is_some(), "annotated tag should have tag_oid");
|
||||
assert!(
|
||||
tag.message.contains("Release v1.0.0"),
|
||||
"message should be set"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_list_tags_with_pattern() {
|
||||
let (_dir, gb) = common::setup_bare_repo();
|
||||
|
||||
gb.create_tag(CreateTagRequest {
|
||||
repository: None,
|
||||
name: "release-1.0".into(),
|
||||
target: Some(ObjectSelector {
|
||||
selector: Some(object_selector::Selector::Revision(ObjectName {
|
||||
revision: "main".into(),
|
||||
})),
|
||||
}),
|
||||
message: String::new(),
|
||||
tagger: None,
|
||||
force: false,
|
||||
annotated: false,
|
||||
})
|
||||
.expect("create release tag");
|
||||
|
||||
let result = gb
|
||||
.list_tags(ListTagsRequest {
|
||||
repository: None,
|
||||
pattern: "release".into(),
|
||||
pagination: None,
|
||||
sort_direction: 0,
|
||||
})
|
||||
.expect("list_tags with pattern");
|
||||
|
||||
assert!(
|
||||
result.tags.iter().all(|t| t.name.contains("release")),
|
||||
"all tags should match 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,
|
||||
name: "v0.1.0".into(),
|
||||
})
|
||||
.expect("verify_tag");
|
||||
|
||||
assert!(!result.verified, "unsigned tag should not be verified");
|
||||
}
|
||||
Reference in New Issue
Block a user