libgit2 / libgit2/libgit2sharp

Submodule project nested in submodule gives "Unable to locate repository ..."

Ouverte
#1,683 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
C#
Étoiles
3.5k
Forks
925
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

Back link to https://github.com/dotnet/sourcelink/issues/276#issuecomment-489463618

repro, running this in a docker debian 9 (netcore sdk 2.2.203) container:

#idempotent script
rm -rf ~/repo ~/submodule

# setup dirs and submodule project 
mkdir -p ~/submodule/subdir && cd ~/submodule && git init && cd subdir && dotnet new classlib

# do submodule commit
git config user.email "you@example.com" && git config user.name "Your Name" && git add . && git commit -m "Initial commit"

#creat repo project 
mkdir -p ~/repo/src && cd ~/repo && git init && git submodule add ~/submodule submodule && cd src && dotnet new classlib && dotnet add reference ../submodule/subdir/subdir.csproj && cd -

# Add Directory.Build.props with SourceLink reference, so submodule will get it too.
echo -e '<Project>\n   <ItemGroup>\n     <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0-beta2-18618-05" PrivateAssets="All" />\n   </ItemGroup>\n</Project>' > Directory.Build.props

dotnet build src

This is an strace capturing opens around when the target warns that it cannot locate the directory:

[pid  1280] open("/root/.nuget/packages/microsoft.build.tasks.git/1.0.0-beta2-18618-05/tools/netcoreapp2.0/Microsoft.Build.Tasks.Git.Operations.dll", O_RDONLY) = 119
[pid  1284] open("/etc/hosts", O_RDONLY|O_CLOEXEC) = 120
[pid  1280] open("/root/.nuget/packages/microsoft.build.tasks.git/1.0.0-beta2-18618-05/tools/netcoreapp2.0/LibGit2Sharp.dll", O_RDONLY) = 120
[pid  1280] open("/root/.nuget/packages/microsoft.build.tasks.git/1.0.0-beta2-18618-05/build/../tools/netcoreapp2.0/runtimes/debian.9-x64/native/libgit2-a904fc6.so", O_RDONLY|O_CLOEXEC) = 118
[pid  1280] open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 118
[pid  1280] open("/usr/lib/x86_64-linux-gnu/libssl.so.1.1", O_RDONLY|O_CLOEXEC) = 118
[pid  1280] open("/usr/lib/x86_64-linux-gnu/libcrypto.so.1.1", O_RDONLY|O_CLOEXEC) = 118
[pid  1284] open("/root/.dotnet/corefx/cryptography/x509stores/my", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 118
[pid  1284] open("/root/.dotnet/corefx/cryptography/x509stores/my/2A56A5C2C6A932EAA4B04ACB89C0B77D933D53F2.pfx", O_RDONLY) = 123
[pid  1280] open("/dev/urandom", O_RDONLY|O_NOCTTY|O_NONBLOCK) = 124
[pid  1280] open("/usr/lib/ssl/cert.pem", O_RDONLY) = -1 ENOENT (No such file or directory)
/root/.nuget/packages/microsoft.build.tasks.git/1.0.0-beta2-18618-05/build/Microsoft.Build.Tasks.Git.targets(20,5): warning : Unable to locate repository containing directory '/repo/submodule/src'. [/repo/submodule/src/submodule.csproj]

This on the other hand is an strace around that same point after you run:

echo "gitdir: ../../.git/modules/submodule" > /repo/submodule/subdir/.git

[pid  1402] open("/root/.nuget/packages/microsoft.build.tasks.git/1.0.0-beta2-18618-05/tools/netcoreapp2.0/Microsoft.Build.Tasks.Git.dll", O_RDONLY) = 117
[pid  1402] open("/root/.nuget/packages/microsoft.build.tasks.git/1.0.0-beta2-18618-05/tools/netcoreapp2.0/Microsoft.Build.Tasks.Git.Operations.dll", O_RDONLY) = 108
[pid  1402] open("/root/.nuget/packages/microsoft.build.tasks.git/1.0.0-beta2-18618-05/tools/netcoreapp2.0/LibGit2Sharp.dll", O_RDONLY) = 119
[pid  1402] open("/root/.nuget/packages/microsoft.build.tasks.git/1.0.0-beta2-18618-05/build/../tools/netcoreapp2.0/runtimes/debian.9-x64/native/libgit2-a904fc6.so", O_RDONLY|O_CLOEXEC) = 121
[pid  1402] open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 121
[pid  1402] open("/usr/lib/x86_64-linux-gnu/libssl.so.1.1", O_RDONLY|O_CLOEXEC) = 121
[pid  1402] open("/usr/lib/x86_64-linux-gnu/libcrypto.so.1.1", O_RDONLY|O_CLOEXEC) = 121
[pid  1402] open("/dev/urandom", O_RDONLY|O_NOCTTY|O_NONBLOCK) = 121
[pid  1402] open("/usr/lib/ssl/cert.pem", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid  1402] open("/repo/submodule/subdir/.git", O_RDONLY|O_CLOEXEC) = 121
[pid  1402] open("/repo/.git/modules/submodule/config", O_RDONLY|O_CLOEXEC) = 121
[pid  1402] open("/repo/.git/modules/submodule/config", O_RDONLY|O_CLOEXEC) = 121
[pid  1402] open("/repo/.git/modules/submodule/config", O_RDONLY|O_CLOEXEC) = 121
[pid  1402] open("/repo/.git/modules/submodule/config", O_RDONLY|O_CLOEXEC) = 121
[pid  1402] open("/repo/.git/modules/submodule/config", O_RDONLY|O_CLOEXEC) = 121
[pid  1402] open("/repo/.git/modules/submodule/config", O_RDONLY|O_CLOEXEC) = 121
[pid  1402] open("/repo/.git/modules/submodule/config", O_RDONLY|O_CLOEXEC) = 121
[pid  1402] open("/repo/.git/modules/submodule/config", O_RDONLY|O_CLOEXEC) = 121
[pid  1402] open("/repo/.git/modules/submodule/HEAD", O_RDONLY|O_CLOEXEC) = 121
[pid  1402] open("/repo/.git/modules/submodule/refs/heads/master", O_RDONLY|O_CLOEXEC) = 121
[pid  1402] open("/repo/.git/modules/submodule/objects/pack/", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 121
[pid  1402] open("/repo/.git/modules/submodule/objects/1d/ecf60232961da48db8871270ab97b1acab642b", O_RDONLY|O_CLOEXEC) = 121
[pid  1402] open("/repo/.git/modules/submodule/config", O_RDONLY|O_CLOEXEC) = 121
[pid  1402] open("/repo/.git/modules/submodule/config", O_RDONLY|O_CLOEXEC) = 121

Notice the [pid 1402] open("/repo/submodule/subdir/.git", O_RDONLY|O_CLOEXEC) = 121 which is then followed by a lot of good opens to the actual git directory.

I fear something is going wrong in libgit2, possibly in find_repo https://github.com/libgit2/libgit2/blob/v0.28.1/src/repository.c#L472

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Reproduisez le cas de sous-module imbriqué décrit dans le corps de l’issue avec le conteneur Debian 9 et dotnet build src, puis examinez Microsoft.Build.Tasks.Git.targets à la ligne 20 ainsi que l’implémentation de find_repo dans repository.c de libgit2 autour de la ligne liée. Comparez la découverte du dépôt avec et sans le fichier .git du sous-module ; le travail est terminé lorsque le build localise le dépôt imbriqué sans l’avertissement et que les cas de dépôts existants continuent de fonctionner.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
csharp, git
Domaine
devtools
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.