gitoxide icon indicating copy to clipboard operation
gitoxide copied to clipboard

Oxidize `comtrya`

Open Byron opened this issue 1 year ago • 4 comments

Required Features

  • [x] fetch
  • [ ] rebase
  • [ ] merge
  • [ ] worktree reset
  • …more analysis TBD

See the sibling issue in https://github.com/comtrya/comtrya/issues/347

Byron avatar Mar 16 '24 07:03 Byron

Scratch that, let me try and implement this again and see what happens.

rawkode avatar Apr 02 '24 09:04 rawkode

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?

rawkode avatar Apr 02 '24 11:04 rawkode

Draft PR

https://github.com/rawkode/gitsync/pull/4

rawkode avatar Apr 02 '24 11:04 rawkode

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 sync function, which is using gix::open(); but I can't work out how to fetch_then_checkout on 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.

Byron avatar Apr 02 '24 11:04 Byron