aboutsummaryrefslogtreecommitdiff
path: root/src/update
diff options
context:
space:
mode:
authorMax Audron <audron@cocaine.farm>2024-03-27 12:57:30 +0100
committerMax Audron <audron@cocaine.farm>2024-03-27 12:57:30 +0100
commit3a88527328952ddffef0bf228f0832e81fcfdf19 (patch)
tree8de19b16c5038537a714d2bfe34892d20e6d5626 /src/update
parentrelease 1.0.4 (diff)
implement basic cloning and updating with gix
Diffstat (limited to 'src/update')
-rw-r--r--src/update/mod.rs77
1 files changed, 40 insertions, 37 deletions
diff --git a/src/update/mod.rs b/src/update/mod.rs
index 8f10663..7b51136 100644
--- a/src/update/mod.rs
+++ b/src/update/mod.rs
@@ -1,11 +1,10 @@
use std::fmt::{Debug, Display};
-use git2::BranchType;
use tracing::debug;
use crate::{
batch::batch,
- repo::{Repo, RepoError, Repos},
+ repo::{LocalRepoState, Repo, RepoError, Repos},
};
impl crate::GTree {
@@ -35,51 +34,52 @@ impl Repo {
}
fn update_inner(&mut self) -> Result<UpdateResult, RepoError> {
- let repo = self.repo.as_ref().unwrap();
- let mut remote = self.main_remote(repo)?;
+ let repo_state = self.is_clean()?;
+ if self.repo.is_some() && repo_state != LocalRepoState::Clean {
+ return Ok(UpdateResult::dirty(self.name.clone(), repo_state));
+ };
- self.fetch(&mut remote)?;
+ debug!("repo is clean");
- self.default_branch = remote.default_branch()?.as_str().unwrap().to_string();
+ let mut progress = gix::progress::Discard {};
- debug!("default branch: {}", self.default_branch);
+ let _fetched = self.fetch()?;
+ let (remote, head) = self.default_remote_head()?;
+ self.update_default_branch_ref(remote.clone(), head)?;
+ self.checkout(remote, head, &mut progress)?;
- if self.is_clean()? {
- debug!("repo is clean");
+ // let merged = repo.branches(Some(BranchType::Local))?
+ // .filter_map(|x| x.ok())
+ // .try_fold(false, |mut merged, (mut branch, _)| {
+ // let name = format!("refs/heads/{}", Repo::branch_name(&branch));
- let merged = repo.branches(Some(BranchType::Local))?
- .filter_map(|x| x.ok())
- .try_fold(false, |mut merged, (mut branch, _)| {
- let name = format!("refs/heads/{}", Repo::branch_name(&branch));
+ // if branch.upstream().is_ok() {
+ // let upstream = branch.upstream().unwrap();
- if branch.upstream().is_ok() {
- let upstream = branch.upstream().unwrap();
+ // debug!("branch: {}", name);
- debug!("branch: {}", name);
+ // merged |= self.merge(repo, &mut branch, &upstream)?;
+ // Ok::<bool, RepoError>(merged)
+ // } else {
+ // debug!("not updating branch: {}: branch does not have upstream tracking branch set", name);
+ // Ok(merged)
+ // }
+ // })?;
- merged |= self.merge(repo, &mut branch, &upstream)?;
- Ok::<bool, RepoError>(merged)
- } else {
- debug!("not updating branch: {}: branch does not have upstream tracking branch set", name);
- Ok(merged)
- }
- })?;
+ // if merged {
+ // Ok(UpdateResult::merged(self.name.clone()))
+ // } else {
+ // Ok(UpdateResult::no_changes(self.name.clone()))
+ // }
- if merged {
- Ok(UpdateResult::merged(self.name.clone()))
- } else {
- Ok(UpdateResult::no_changes(self.name.clone()))
- }
- } else {
- Ok(UpdateResult::dirty(self.name.clone()))
- }
+ Ok(UpdateResult::no_changes(self.name.clone()))
}
}
#[derive(Debug)]
pub enum UpdateResult {
NoChanges { name: String },
- Dirty { name: String },
+ Dirty { name: String, state: LocalRepoState },
Merged { name: String },
Error { name: String, error: RepoError },
}
@@ -93,8 +93,8 @@ impl UpdateResult {
UpdateResult::Merged { name }
}
- pub fn dirty(name: String) -> UpdateResult {
- UpdateResult::Dirty { name }
+ pub fn dirty(name: String, state: LocalRepoState) -> UpdateResult {
+ UpdateResult::Dirty { name, state }
}
pub fn no_changes(name: String) -> UpdateResult {
@@ -110,9 +110,12 @@ impl Display for UpdateResult {
UpdateResult::NoChanges { name } => {
f.write_fmt(format_args!("{} {}", Blue.paint("FETCHED"), name))
}
- UpdateResult::Dirty { name } => {
- f.write_fmt(format_args!("{} {}", Yellow.paint("DIRTY "), name))
- }
+ UpdateResult::Dirty { name, state } => f.write_fmt(format_args!(
+ "{} {} [{}]",
+ Yellow.paint("DIRTY "),
+ name,
+ state
+ )),
UpdateResult::Merged { name } => {
f.write_fmt(format_args!("{} {}", Green.paint("PULLED "), name))
}