Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

checkout of a specific branch, tag or revision does not work #1930

Open
sassman opened this issue Apr 5, 2025 · 1 comment
Open

checkout of a specific branch, tag or revision does not work #1930

sassman opened this issue Apr 5, 2025 · 1 comment
Labels
acknowledged an issue is accepted as shortcoming to be fixed wontfix This will not be worked on

Comments

@sassman
Copy link
Contributor

sassman commented Apr 5, 2025

Current behavior 😯

In cargo-generate/cargo-generate#1460 we try to get away from git2 and migrate to gix. It looks all promising so far, only one thing does not work. It is checking out a specific branch, tag or revision.

What gix does, (see the code https://github.com/cargo-generate/cargo-generate/pull/1460/files#diff-dbcccd0cf247f619f177ddeb85fe8dfc4eb4c71c0de0bb47ec839764c7d4918dR82) it checks out the default branch (in our test case it is main).

Expected behavior 🤔

when we configure the prepare_clone with the refsepc like in https://github.com/cargo-generate/cargo-generate/pull/1460/files#diff-dbcccd0cf247f619f177ddeb85fe8dfc4eb4c71c0de0bb47ec839764c7d4918dR72

or here the excerpt:

        let (mut prepare_checkout, _) = if let Some(branch) = self.branch {
            let mut opts = Options::default();
            let ref_spec = gix::refspec::parse(branch.as_str().into(), Operation::Fetch).unwrap();
            dbg!(ref_spec);
            opts.extra_refspecs.push(ref_spec.to_owned());

            prepare_clone.with_fetch_options(opts)

Then I would expect that calling

        let (repo, _) = prepare_checkout
            .main_worktree(gix::progress::Discard, &gix::interrupt::IS_INTERRUPTED)?;

would check out the specific branch, tag or revision.

Git behavior

git2 has a .checkout_tree that does behave exactly as described above

here is some sample code: https://github.com/cargo-generate/cargo-generate/blob/0e9471d4991764270de8940c7695d13f932c086b/src/git/clone_tool.rs#L183

Steps to reproduce 🕹

  1. in cargo-generate you can checkout the PR The kstring integration in gix-attributes is unsound #1460 (gh pr checkout 1460)
  2. let the tests run simply cargo test
  3. all failing tests (2) relate to this problem
  gix::tests::test_cloning_a_repo_at_revision
  gix::tests::test_cloning_a_repo_with_a_specific_branch
@Byron Byron added wontfix This will not be worked on acknowledged an issue is accepted as shortcoming to be fixed labels Apr 5, 2025
@Byron
Copy link
Member

Byron commented Apr 5, 2025

Thanks for reporting.

gitoxide doesn't have a way to checkout a branch yet akin to git2_repo.checkout_*(), and the choice of ref to checkout after cloning is definitely specified differently.

gix clone --ref <name> … is able to clone and checkout a specific branch. I recommend looking at the source to see how this is specified - it should work for you.

Please do feel free to post your findings here, maybe they are useful for others as well.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
acknowledged an issue is accepted as shortcoming to be fixed wontfix This will not be worked on
Projects
None yet
Development

No branches or pull requests

2 participants