| 323 | } |
| 324 | |
| 325 | pub fn write(&self, repo: &git2::Repository, before: Option<git2::Tree>) -> Result<git2::Oid> { |
| 326 | let mut builder = repo.treebuilder(before.as_ref())?; |
| 327 | |
| 328 | for (filename, subtree) in &self.subtrees { |
| 329 | let before = match &before { |
| 330 | Some(before) => match before.get_name(filename) { |
| 331 | Some(entry) => { |
| 332 | let tree_id = entry.id(); |
| 333 | Some(repo.find_tree(tree_id)?) |
| 334 | } |
| 335 | None => None, |
| 336 | }, |
| 337 | None => None, |
| 338 | }; |
| 339 | |
| 340 | let oid = subtree.write(repo, before)?; |
| 341 | builder.insert(filename, oid, 0o040000)?; |
| 342 | } |
| 343 | |
| 344 | for (filename, oid) in &self.files { |
| 345 | if let Some(oid) = oid { |
| 346 | builder.insert(filename, oid.to_owned(), 0o100644)?; |
| 347 | } else { |
| 348 | builder.remove(filename)?; |
| 349 | } |
| 350 | } |
| 351 | |
| 352 | let oid = builder.write()?; |
| 353 | Ok(oid) |
| 354 | } |
| 355 | } |
| 356 | |
| 357 | #[derive(Debug, Default)] |