Oxidize `comtrya`
Required Features
- [x] fetch
- [ ] rebase
- [ ] merge
- [ ] worktree reset
- …more analysis TBD
See the sibling issue in https://github.com/comtrya/comtrya/issues/347
Scratch that, let me try and implement this again and see what happens.
Hi @Byron,
I've updated GitSync to (which Comtrya uses) to use this for clone_repository()
fn clone_repository(&self) -> Result<(), errors::GitSyncError> {
info!("Attempting to clone {} to {:?}", self.repo, self.dir,);
unsafe {
match gix::interrupt::init_handler(1, || {}) {
Ok(_) => (),
Err(error) => {
return Err(GitSyncError::GenericError { error });
}
};
}
if !self.dir.exists() {
match std::fs::create_dir_all(&self.dir) {
Ok(_) => {}
Err(error) => {
return Err(GitSyncError::GenericError { error });
}
}
}
let url = match gix::url::parse(self.repo.as_str().into()) {
Ok(url) => url,
Err(error) => {
return Err(GitSyncError::GixParseError { error });
}
};
let mut prepare_clone = match gix::prepare_clone(url, &self.dir) {
Ok(prepared_fetch) => prepared_fetch,
Err(error) => {
return Err(GitSyncError::GixCloneError { error });
}
};
let (mut prepare_checkout, _) = match prepare_clone
.fetch_then_checkout(gix::progress::Discard, &gix::interrupt::IS_INTERRUPTED)
{
Ok(checkout) => checkout,
Err(error) => {
return Err(GitSyncError::GixCloneFetchError { error });
}
};
match prepare_checkout
.main_worktree(gix::progress::Discard, &gix::interrupt::IS_INTERRUPTED)
{
Ok(repository) => repository,
Err(error) => {
return Err(GitSyncError::GixCloneCheckoutError { error });
}
};
Ok(())
}
and this works well.
We also have a sync function, which is using gix::open(); but I can't work out how to fetch_then_checkout on an existing repository.
I've also tried just using clone_repository with the dir being the existing checkout, but it doesn't seem like HEAD is updated.
Any advice?
Draft PR
https://github.com/rawkode/gitsync/pull/4
Thanks for trying it out!
and this works well.
Is the question-mark operation ? forbidden in your codebase? I am pretty sure clippy would take offence in not using it -error-handling seems unnecessarily verbose. Since it's an application, I'd recommend anyhow as well.
We also have a
syncfunction, which is usinggix::open(); but I can't work out how tofetch_then_checkouton an existing repository.
One cannot yet checkout into an existing repository, and I'd hope it refuses to do so into an existing non-empty directory as it would bluntly overwrite everything. It's only possible to checkout the initial clone.
It will take a while until git reset/checkout are possible, but this PR and it's follow-ups will lead there.