@@ -3,6 +3,7 @@ use std::fmt::Debug;
3
3
use std:: path:: { Path , PathBuf } ;
4
4
5
5
use bstr:: ByteVec ;
6
+ use git2:: build:: TreeUpdateBuilder ;
6
7
use itertools:: Itertools ;
7
8
use thiserror:: Error ;
8
9
use tracing:: { instrument, warn} ;
@@ -116,6 +117,31 @@ impl Tree<'_> {
116
117
. map ( |maybe_entry| maybe_entry. map ( |entry| entry. inner . id ( ) . into ( ) ) )
117
118
}
118
119
120
+ /// Remove the given path from the Tree, creating a new Tree in the given repo.
121
+ pub fn remove ( & self , repo : & Repo , path : & Path ) -> Result < NonZeroOid > {
122
+ let mut builder = TreeUpdateBuilder :: new ( ) ;
123
+ let tree_oid = builder
124
+ . remove ( path)
125
+ . create_updated ( & repo. inner , & self . inner )
126
+ . map_err ( Error :: BuildTree ) ?;
127
+ Ok ( make_non_zero_oid ( tree_oid) )
128
+ }
129
+
130
+ /// Add or replace the given path/entry from the Tree, creating a new Tree in the given repo.
131
+ pub fn add_or_replace (
132
+ & self ,
133
+ repo : & Repo ,
134
+ path : & Path ,
135
+ entry : & TreeEntry ,
136
+ ) -> Result < NonZeroOid > {
137
+ let mut builder = TreeUpdateBuilder :: new ( ) ;
138
+ let tree_oid = builder
139
+ . upsert ( path, entry. get_oid ( ) . into ( ) , entry. get_filemode ( ) . into ( ) )
140
+ . create_updated ( & repo. inner , & self . inner )
141
+ . map_err ( Error :: BuildTree ) ?;
142
+ Ok ( make_non_zero_oid ( tree_oid) )
143
+ }
144
+
119
145
/// Get the (top-level) list of paths in this tree, for testing.
120
146
pub fn get_entry_paths_for_testing ( & self ) -> impl Debug {
121
147
self . inner
@@ -456,6 +482,7 @@ pub fn hydrate_tree(
456
482
Ok ( make_non_zero_oid ( tree_oid) )
457
483
}
458
484
485
+ /// Create a new, empty Tree in the given Repo.
459
486
pub fn make_empty_tree ( repo : & Repo ) -> Result < Tree < ' _ > > {
460
487
let tree_oid = hydrate_tree ( repo, None , Default :: default ( ) ) ?;
461
488
repo. find_tree_or_fail ( tree_oid)
0 commit comments