git2-rs icon indicating copy to clipboard operation
git2-rs copied to clipboard

Submodule update fails when submodule OID is detached

Open jkoppel opened this issue 8 months ago • 0 comments

Summary

Tried to clone and submodule-update repo where some submodules point to detached commits; got "object not found" error; could not find any configuration option in git2-rs that would help.

Expected to work with default settings, since it works fine in git command line.

Details

I have a program built using git2-rs, and am trying to run it on the repo https://github.com/Cork-Technology/Depeg-swap .

This repo is interesting in that two of its submodules point to commits which are not in any branch in the target repo, namely https://github.com/Uniswap/v2-core/commit/89b08b5b8deac65f7bea81c5eea2183e31dc5dad and https://github.com/Uniswap/v2-periphery/commit/6820d8be7e111cbda3358226cc3a13489b6a625e .

Submodule::update fails when running on these submodules.

Simplified code:

    info!("Cloning repo");
    let path = Path::new("/some/tmp/path");
    let mut repo = git2::build::RepoBuilder::new();
    repo.clone("https://github.com/Cork-Technology/Depeg-swap", path)?;

    let local_repo = git2::Repository::open(path)?;
    for mut submodule in local_repo.submodules()? {
        info!("Updating submodule: {:?}", submodule.name());
        let mut update_opts = git2::SubmoduleUpdateOptions::new();
        update_opts.allow_fetch(true);
        match submodule.update(true, Some(&mut update_opts)) {
            Ok(_) => (),
            Err(e) => warn!("Failed to update submodule: {:?}", e),
        }
    }

Output (error lines bolded):

T08:15:59.175948Z  INFO myprogram Cloning repo
2025-05-27T08:16:01.035119Z  INFO myprogram: Updating submodule: Some("lib/BokkyPooBahsDateTimeLibrary")
2025-05-27T08:16:01.931884Z  INFO myprogram: Updating submodule: Some("lib/Cork-Hook")
2025-05-27T08:16:02.528602Z  INFO myprogram: Updating submodule: Some("lib/forge-std")
2025-05-27T08:16:03.243375Z  INFO myprogram: Updating submodule: Some("lib/openzeppelin-contracts")
2025-05-27T08:16:19.119010Z  INFO myprogram: Updating submodule: Some("lib/openzeppelin-contracts-upgradeable")
2025-05-27T08:16:31.146724Z  INFO  myprogram: Updating submodule: Some("lib/openzeppelin-foundry-upgrades")
2025-05-27T08:16:31.903167Z  INFO myprogram: Updating submodule: Some("lib/permit2")
2025-05-27T08:16:33.215988Z  INFO myprogram: Updating submodule: Some("lib/prb-math")
2025-05-27T08:16:35.373183Z  INFO myprogram: Updating submodule: Some("lib/v2-core")
**2025-05-27T08:16:36.121215Z  WARN myprogram: Failed to update submodule: Error { code: -3, klass: 9, message: "object not found - no match for id (89b08b5b8deac65f7bea81c5eea2183e31dc5dad)" }**
2025-05-27T08:16:36.121263Z  INFO myprogram: Updating submodule: Some("lib/v2-periphery")
**2025-05-27T08:16:36.954935Z  WARN myprogram: Failed to update submodule: Error { code: -3, klass: 9, message: "object not found - no match for id (6820d8be7e111cbda3358226cc3a13489b6a625e)" }**

I have scoured the docs and source of git2-rs looking for options that could potentially allow this operation to succeed. The only one I found is allow_fetch, which is already on. I tried looking through libgit2 as well, though I did not get very far.

Running git submodule update from the command line works without a hitch, so it seems sensible to hope that this would work with default settings. Interestingly, when cloning the v2-core and v2-periphery repositories directly, I am not able to checkout the respective revisions (89b08b and 6820d8be7e) without first doing a git fetch origin.

Anyway,

Ask

Either

  1. There is a way to make this work with git2-rs that I did not find, or
  2. This is a missing configuration option in git2-rs, or
  3. This is a missing configuration option in libgit2, or
  4. It should just work; this is a bug in either git2-rs or libgit2

Which one is it?

And if it's (1), I would really appreciate some help making this work.

jkoppel avatar May 27 '25 08:05 jkoppel