pub fn write_ref(git_dir: &Path, refname: &str, oid: &ObjectId) -> Result<()>Examples found in repository?
examples/merge_base.rs (line 67)
62fn main() -> grit_lib::error::Result<()> {
63 let root = tempfile::tempdir()?;
64 let repo = init_repository(root.path(), false, "main", None, "files")?;
65
66 let base = commit_tree(&repo, None, "common root")?;
67 refs::write_ref(&repo.git_dir, "refs/heads/main", &base)?;
68
69 let feature_tip = commit_tree(&repo, Some(base), "feature work")?;
70 refs::write_ref(&repo.git_dir, "refs/heads/feature", &feature_tip)?;
71
72 let main_tip = base;
73 let bases = merge_bases_first_vs_rest(&repo, feature_tip, &[main_tip])?;
74 println!("merge base(s) of feature and main: {bases:?}");
75 assert!(bases.contains(&main_tip));
76
77 Ok(())
78}More examples
examples/rev_list.rs (line 54)
12fn make_initial_commit(repo: &Repository) -> grit_lib::error::Result<grit_lib::objects::ObjectId> {
13 use grit_lib::index::{Index, IndexEntry, MODE_REGULAR};
14
15 let blob_oid = repo.odb.write(ObjectKind::Blob, b"log line\n")?;
16 let path = b"file.txt".to_vec();
17 let entry = IndexEntry {
18 ctime_sec: 0,
19 ctime_nsec: 0,
20 mtime_sec: 0,
21 mtime_nsec: 0,
22 dev: 0,
23 ino: 0,
24 mode: MODE_REGULAR,
25 uid: 0,
26 gid: 0,
27 size: 0,
28 oid: blob_oid,
29 flags: (path.len().min(0xfff)) as u16,
30 flags_extended: None,
31 path,
32 base_index_pos: 0,
33 };
34 let mut index = Index::new();
35 index.add_or_replace(entry);
36 repo.write_index(&mut index)?;
37 let index = repo.load_index()?;
38 let tree_oid = write_tree_from_index(&repo.odb, &index, "")?;
39
40 let commit = CommitData {
41 tree: tree_oid,
42 parents: Vec::new(),
43 author: "Example <example@example.com> 1700000000 +0000".to_owned(),
44 committer: "Example <example@example.com> 1700000000 +0000".to_owned(),
45 author_raw: Vec::new(),
46 committer_raw: Vec::new(),
47 encoding: None,
48 message: "root\n".to_owned(),
49 raw_message: None,
50 };
51 let oid = repo
52 .odb
53 .write(ObjectKind::Commit, &serialize_commit(&commit))?;
54 refs::write_ref(&repo.git_dir, "refs/heads/main", &oid)?;
55 Ok(oid)
56}examples/commit_tree.rs (line 61)
12fn main() -> grit_lib::error::Result<()> {
13 let root = tempfile::tempdir()?;
14 let repo = init_repository(root.path(), false, "main", None, "files")?;
15
16 let blob_oid = repo
17 .odb
18 .write(ObjectKind::Blob, b"hello from grit-lib examples\n")?;
19 let path = b"README".to_vec();
20 let entry = IndexEntry {
21 ctime_sec: 0,
22 ctime_nsec: 0,
23 mtime_sec: 0,
24 mtime_nsec: 0,
25 dev: 0,
26 ino: 0,
27 mode: MODE_REGULAR,
28 uid: 0,
29 gid: 0,
30 size: 0,
31 oid: blob_oid,
32 flags: (path.len().min(0xfff)) as u16,
33 flags_extended: None,
34 path,
35 base_index_pos: 0,
36 };
37
38 let mut index = Index::new();
39 index.add_or_replace(entry);
40 repo.write_index(&mut index)?;
41
42 let index = repo.load_index()?;
43 let tree_oid = write_tree_from_index(&repo.odb, &index, "")?;
44 println!("tree: {tree_oid}");
45
46 let commit = CommitData {
47 tree: tree_oid,
48 parents: Vec::new(),
49 author: "Example <example@example.com> 1700000000 +0000".to_owned(),
50 committer: "Example <example@example.com> 1700000000 +0000".to_owned(),
51 author_raw: Vec::new(),
52 committer_raw: Vec::new(),
53 encoding: None,
54 message: "initial example commit\n".to_owned(),
55 raw_message: None,
56 };
57 let raw = serialize_commit(&commit);
58 let commit_oid = repo.odb.write(ObjectKind::Commit, &raw)?;
59 println!("commit: {commit_oid}");
60
61 refs::write_ref(&repo.git_dir, "refs/heads/main", &commit_oid)?;
62 println!("updated refs/heads/main -> {commit_oid}");
63
64 Ok(())
65}examples/rev_parse.rs (line 54)
11fn main() -> grit_lib::error::Result<()> {
12 let root = tempfile::tempdir()?;
13 let repo = init_repository(root.path(), false, "main", None, "files")?;
14
15 use grit_lib::index::{Index, IndexEntry, MODE_REGULAR};
16 let blob_oid = repo.odb.write(ObjectKind::Blob, b"x\n")?;
17 let path = b"a".to_vec();
18 let entry = IndexEntry {
19 ctime_sec: 0,
20 ctime_nsec: 0,
21 mtime_sec: 0,
22 mtime_nsec: 0,
23 dev: 0,
24 ino: 0,
25 mode: MODE_REGULAR,
26 uid: 0,
27 gid: 0,
28 size: 0,
29 oid: blob_oid,
30 flags: 1,
31 flags_extended: None,
32 path,
33 base_index_pos: 0,
34 };
35 let mut index = Index::new();
36 index.add_or_replace(entry);
37 repo.write_index(&mut index)?;
38 let index = repo.load_index()?;
39 let tree_oid = write_tree_from_index(&repo.odb, &index, "")?;
40 let commit = CommitData {
41 tree: tree_oid,
42 parents: Vec::new(),
43 author: "Example <example@example.com> 1700000000 +0000".to_owned(),
44 committer: "Example <example@example.com> 1700000000 +0000".to_owned(),
45 author_raw: Vec::new(),
46 committer_raw: Vec::new(),
47 encoding: None,
48 message: "r\n".to_owned(),
49 raw_message: None,
50 };
51 let oid = repo
52 .odb
53 .write(ObjectKind::Commit, &serialize_commit(&commit))?;
54 refs::write_ref(&repo.git_dir, "refs/heads/main", &oid)?;
55
56 let head = resolve_revision(&repo, "HEAD")?;
57 let full = resolve_revision(&repo, &oid.to_hex())?;
58 println!("HEAD resolves to {head}");
59 println!("full hex resolves to {full}");
60 assert_eq!(head, full);
61
62 Ok(())
63}examples/walk_tree.rs (line 87)
36fn main() -> grit_lib::error::Result<()> {
37 let root = tempfile::tempdir()?;
38 let repo = init_repository(root.path(), false, "main", None, "files")?;
39
40 use grit_lib::index::{Index, IndexEntry, MODE_REGULAR};
41
42 let blob_a = repo.odb.write(ObjectKind::Blob, b"a\n")?;
43 let blob_b = repo.odb.write(ObjectKind::Blob, b"b\n")?;
44
45 let mut index = Index::new();
46 for (rel, oid) in [
47 (b"a.txt".as_slice(), blob_a),
48 (b"sub/b.txt".as_slice(), blob_b),
49 ] {
50 let entry = IndexEntry {
51 ctime_sec: 0,
52 ctime_nsec: 0,
53 mtime_sec: 0,
54 mtime_nsec: 0,
55 dev: 0,
56 ino: 0,
57 mode: MODE_REGULAR,
58 uid: 0,
59 gid: 0,
60 size: 0,
61 oid,
62 flags: (rel.len().min(0xfff)) as u16,
63 flags_extended: None,
64 path: rel.to_vec(),
65 base_index_pos: 0,
66 };
67 index.add_or_replace(entry);
68 }
69 repo.write_index(&mut index)?;
70 let index = repo.load_index()?;
71 let tree_oid = write_tree_from_index(&repo.odb, &index, "")?;
72
73 let commit = CommitData {
74 tree: tree_oid,
75 parents: Vec::new(),
76 author: "Example <example@example.com> 1700000000 +0000".to_owned(),
77 committer: "Example <example@example.com> 1700000000 +0000".to_owned(),
78 author_raw: Vec::new(),
79 committer_raw: Vec::new(),
80 encoding: None,
81 message: "tree walk\n".to_owned(),
82 raw_message: None,
83 };
84 let commit_oid = repo
85 .odb
86 .write(ObjectKind::Commit, &serialize_commit(&commit))?;
87 refs::write_ref(&repo.git_dir, "refs/heads/main", &commit_oid)?;
88
89 let head_commit = resolve_revision(&repo, "HEAD")?;
90 let commit_obj = repo.odb.read(&head_commit)?;
91 let parsed = grit_lib::objects::parse_commit(&commit_obj.data)?;
92 println!("walking tree at {}", parsed.tree);
93 walk_tree(&repo, parsed.tree, "")?;
94
95 Ok(())
96}examples/cherry_pick.rs (line 78)
48fn main() -> grit_lib::error::Result<()> {
49 let root = tempfile::tempdir()?;
50 let repo = init_repository(root.path(), false, "main", None, "files")?;
51
52 use grit_lib::index::{Index, IndexEntry, MODE_REGULAR};
53
54 // Base commit on main: one file.
55 let blob_a = repo.odb.write(ObjectKind::Blob, b"base\n")?;
56 let mut index = Index::new();
57 index.add_or_replace(IndexEntry {
58 ctime_sec: 0,
59 ctime_nsec: 0,
60 mtime_sec: 0,
61 mtime_nsec: 0,
62 dev: 0,
63 ino: 0,
64 mode: MODE_REGULAR,
65 uid: 0,
66 gid: 0,
67 size: 0,
68 oid: blob_a,
69 flags: 7,
70 flags_extended: None,
71 path: b"base.txt".to_vec(),
72 base_index_pos: 0,
73 });
74 repo.write_index(&mut index)?;
75 let index = repo.load_index()?;
76 let tree_a = write_tree_from_index(&repo.odb, &index, "")?;
77 let commit_a = commit_from_tree(&repo, tree_a, &[], "initial\n")?;
78 refs::write_ref(&repo.git_dir, "refs/heads/main", &commit_a)?;
79
80 // Topic commit: parent A, adds picked.txt (not on main yet).
81 let blob_pick = repo.odb.write(ObjectKind::Blob, b"hello from topic\n")?;
82 let mut index = Index::new();
83 index.add_or_replace(IndexEntry {
84 ctime_sec: 0,
85 ctime_nsec: 0,
86 mtime_sec: 0,
87 mtime_nsec: 0,
88 dev: 0,
89 ino: 0,
90 mode: MODE_REGULAR,
91 uid: 0,
92 gid: 0,
93 size: 0,
94 oid: blob_a,
95 flags: 7,
96 flags_extended: None,
97 path: b"base.txt".to_vec(),
98 base_index_pos: 0,
99 });
100 index.add_or_replace(IndexEntry {
101 ctime_sec: 0,
102 ctime_nsec: 0,
103 mtime_sec: 0,
104 mtime_nsec: 0,
105 dev: 0,
106 ino: 0,
107 mode: MODE_REGULAR,
108 uid: 0,
109 gid: 0,
110 size: 0,
111 oid: blob_pick,
112 flags: 9,
113 flags_extended: None,
114 path: b"picked.txt".to_vec(),
115 base_index_pos: 0,
116 });
117 repo.write_index(&mut index)?;
118 let index = repo.load_index()?;
119 let tree_b = write_tree_from_index(&repo.odb, &index, "")?;
120 let commit_b = commit_from_tree(&repo, tree_b, &[commit_a], "add picked file\n")?;
121 refs::write_ref(&repo.git_dir, "refs/heads/topic", &commit_b)?;
122
123 // Cherry-pick `topic` onto `main` (still at A).
124 let head = resolve_revision(&repo, "main")?;
125 let picked = resolve_revision(&repo, "topic")?;
126 let picked_obj = repo.odb.read(&picked)?;
127 let picked_data = parse_commit(&picked_obj.data)?;
128 let parent = picked_data.parents.first().copied().ok_or_else(|| {
129 grit_lib::error::Error::CorruptObject("picked commit has no parent".into())
130 })?;
131
132 let base_tree = tree_of_commit(&repo, parent)?;
133 let ours_tree = tree_of_commit(&repo, head)?;
134 let theirs_tree = picked_data.tree;
135
136 let merged = merge_trees_three_way(
137 &repo,
138 base_tree,
139 ours_tree,
140 theirs_tree,
141 MergeFavor::default(),
142 WhitespaceMergeOptions::default(),
143 grit_lib::merge_trees::TreeMergeConflictPresentation {
144 label_ours: "HEAD",
145 label_theirs: grit_lib::merge_trees::TheirsConflictLabel::Fixed("picked"),
146 label_base: "parent of picked commit",
147 style: grit_lib::merge_file::ConflictStyle::Merge,
148 checkout_merge: false,
149 },
150 )?;
151
152 if !merged.conflict_content.is_empty() {
153 return Err(grit_lib::error::Error::Message(format!(
154 "merge produced {} conflict path(s); this example expects a clean pick",
155 merged.conflict_content.len()
156 )));
157 }
158
159 let new_tree = write_tree_from_index(&repo.odb, &merged.index, "")?;
160 let config = ConfigSet::load_repo_local_only(&repo.git_dir)?;
161 let msg = commit_trailers::finalize_cherry_pick_message(
162 &picked_data.message,
163 true,
164 false,
165 "Example",
166 "example@example.com",
167 &config,
168 &picked.to_hex(),
169 );
170 let new_commit = commit_from_tree(&repo, new_tree, &[head], &msg)?;
171 refs::write_ref(&repo.git_dir, "refs/heads/main", &new_commit)?;
172
173 println!("cherry-picked {} onto {}", picked, head);
174 println!("new main: {new_commit}");
175 let out = repo.odb.read(&new_commit)?;
176 println!("message:\n{}", parse_commit(&out.data)?.message);
177
178 Ok(())
179}