libgit2 / libgit2/libgit2sharp

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

Aperta
#1,683 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Lingua principale
C#
Stelle
3.5k
Fork
925
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

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

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Riproduci il caso di sottomodulo annidato descritto nel corpo dell'issue con il container Debian 9 e dotnet build src, quindi esamina Microsoft.Build.Tasks.Git.targets alla riga 20 e l'implementazione di find_repo in repository.c di libgit2 intorno alla riga collegata. Confronta l'individuazione del repository con e senza il file .git del sottomodulo; il lavoro è completato quando la build individua il repository annidato senza l'avviso e i casi di repository esistenti continuano a funzionare.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
csharp, git
Ambito
devtools
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.