@@ -24,6 +24,7 @@ use chrono::NaiveDateTime;
24
24
use cursive:: theme:: BaseColor ;
25
25
use cursive:: utils:: markup:: StyledString ;
26
26
use git2:: DiffOptions ;
27
+ use git2_ext:: ops:: Sign ;
27
28
use itertools:: Itertools ;
28
29
use thiserror:: Error ;
29
30
use tracing:: { instrument, warn} ;
@@ -1152,31 +1153,81 @@ impl Repo {
1152
1153
}
1153
1154
1154
1155
/// Create a new commit.
1155
- #[ instrument]
1156
+ #[ instrument( skip ( signer ) ) ]
1156
1157
pub fn create_commit (
1157
1158
& self ,
1158
- update_ref : Option < & str > ,
1159
1159
author : & Signature ,
1160
1160
committer : & Signature ,
1161
1161
message : & str ,
1162
1162
tree : & Tree ,
1163
1163
parents : Vec < & Commit > ,
1164
+ signer : Option < & dyn Sign > ,
1164
1165
) -> Result < NonZeroOid > {
1165
1166
let parents = parents
1166
1167
. iter ( )
1167
1168
. map ( |commit| & commit. inner )
1168
1169
. collect :: < Vec < _ > > ( ) ;
1169
- let oid = self
1170
- . inner
1171
- . commit (
1172
- update_ref,
1173
- & author. inner ,
1174
- & committer. inner ,
1175
- message,
1176
- & tree. inner ,
1177
- parents. as_slice ( ) ,
1178
- )
1179
- . map_err ( Error :: CreateCommit ) ?;
1170
+ let oid = git2_ext:: ops:: commit (
1171
+ & self . inner ,
1172
+ & author. inner ,
1173
+ & committer. inner ,
1174
+ message,
1175
+ & tree. inner ,
1176
+ parents. as_slice ( ) ,
1177
+ signer,
1178
+ )
1179
+ . map_err ( Error :: CreateCommit ) ?;
1180
+ Ok ( make_non_zero_oid ( oid) )
1181
+ }
1182
+
1183
+ /// Amend a commit with all non-`None` values
1184
+ #[ instrument( skip( signer) ) ]
1185
+ pub fn amend_commit (
1186
+ & self ,
1187
+ commit_to_amend : & Commit ,
1188
+ author : Option < & Signature > ,
1189
+ committer : Option < & Signature > ,
1190
+ message : Option < & str > ,
1191
+ tree : Option < & Tree > ,
1192
+ signer : Option < & dyn Sign > ,
1193
+ ) -> Result < NonZeroOid > {
1194
+ macro_rules! owning_unwrap_or {
1195
+ ( $name: ident, $value_source: expr) => {
1196
+ let owned_value;
1197
+ let $name = if let Some ( value) = $name {
1198
+ value
1199
+ } else {
1200
+ owned_value = $value_source;
1201
+ & owned_value
1202
+ } ;
1203
+ } ;
1204
+ }
1205
+ owning_unwrap_or ! ( author, commit_to_amend. get_author( ) ) ;
1206
+ owning_unwrap_or ! ( committer, commit_to_amend. get_committer( ) ) ;
1207
+ owning_unwrap_or ! (
1208
+ message,
1209
+ commit_to_amend
1210
+ . inner
1211
+ . message_raw( )
1212
+ . ok_or( Error :: DecodeUtf8 {
1213
+ item: "raw message" ,
1214
+ } ) ?
1215
+ ) ;
1216
+ owning_unwrap_or ! ( tree, commit_to_amend. get_tree( ) ?) ;
1217
+
1218
+ let parents = commit_to_amend. get_parents ( ) ;
1219
+ let parents = parents. iter ( ) . map ( |parent| & parent. inner ) . collect_vec ( ) ;
1220
+
1221
+ let oid = git2_ext:: ops:: commit (
1222
+ & self . inner ,
1223
+ & author. inner ,
1224
+ & committer. inner ,
1225
+ message,
1226
+ & tree. inner ,
1227
+ parents. as_slice ( ) ,
1228
+ signer,
1229
+ )
1230
+ . map_err ( Error :: Amend ) ?;
1180
1231
Ok ( make_non_zero_oid ( oid) )
1181
1232
}
1182
1233
@@ -1365,12 +1416,12 @@ impl Repo {
1365
1416
vec ! [ ]
1366
1417
} ;
1367
1418
let dehydrated_commit_oid = self . create_commit (
1368
- None ,
1369
1419
& signature,
1370
1420
& signature,
1371
1421
& message,
1372
1422
& dehydrated_tree,
1373
1423
parents. iter ( ) . collect_vec ( ) ,
1424
+ None ,
1374
1425
) ?;
1375
1426
let dehydrated_commit = self . find_commit_or_fail ( dehydrated_commit_oid) ?;
1376
1427
Ok ( dehydrated_commit)
0 commit comments