Skip to content

NuGet: Order of pushing packages breaks version grouping #21434

Closed
@fitithw

Description

@fitithw

Description

Very weird bug, no idea what causes it besides the push order, package names don't matter, nor the push times.
You can skip steps 2-5 if you just want to see the bugged version.

  1. Create the packages:
$API_KEY="xxx"
$OWNER="xxx"
$GITEA_HOST="https://try.gitea.io"
$SOURCE="$GITEA_HOST/api/packages/$OWNER/nuget/index.json"
$HEADERS=@{Authorization = "bearer $API_KEY"}

dotnet new classlib -n TestGiteaNuGet
msbuild .\TestGiteaNuGet\TestGiteaNuGet.csproj /t:pack /p:version=1.0.1 /p:includesymbols=true /p:symbolpackageformat=snupkg
msbuild .\TestGiteaNuGet\TestGiteaNuGet.csproj /t:pack /p:version=1.0.2 /p:includesymbols=true /p:symbolpackageformat=snupkg
msbuild .\TestGiteaNuGet\TestGiteaNuGet.csproj /t:pack /p:version=1.0.3 /p:includesymbols=true /p:symbolpackageformat=snupkg

dotnet new classlib -n TestGiteaNuGet.UI
msbuild .\TestGiteaNuGet.UI\TestGiteaNuGet.UI.csproj /t:pack /p:version=1.0.1 /p:includesymbols=true /p:symbolpackageformat=snupkg
msbuild .\TestGiteaNuGet.UI\TestGiteaNuGet.UI.csproj /t:pack /p:version=1.0.2 /p:includesymbols=true /p:symbolpackageformat=snupkg
msbuild .\TestGiteaNuGet.UI\TestGiteaNuGet.UI.csproj /t:pack /p:version=1.0.3 /p:includesymbols=true /p:symbolpackageformat=snupkg
  1. Push the packages in order of package name and query the package server:
dotnet nuget push --source $SOURCE .\TestGiteaNuGet\bin\Debug\TestGiteaNuGet.1.0.1.nupkg --api-key $API_KEY
dotnet nuget push --source $SOURCE .\TestGiteaNuGet\bin\Debug\TestGiteaNuGet.1.0.2.nupkg --api-key $API_KEY
dotnet nuget push --source $SOURCE .\TestGiteaNuGet\bin\Debug\TestGiteaNuGet.1.0.3.nupkg --api-key $API_KEY
dotnet nuget push --source $SOURCE .\TestGiteaNuGet.UI\bin\Debug\TestGiteaNuGet.UI.1.0.1.nupkg --api-key $API_KEY
dotnet nuget push --source $SOURCE .\TestGiteaNuGet.UI\bin\Debug\TestGiteaNuGet.UI.1.0.2.nupkg --api-key $API_KEY
dotnet nuget push --source $SOURCE .\TestGiteaNuGet.UI\bin\Debug\TestGiteaNuGet.UI.1.0.3.nupkg --api-key $API_KEY

(Invoke-WebRequest -Uri $GITEA_HOST/api/packages/$OWNER/nuget/query?q=TestGiteaNuGet -Headers $HEADERS).Content

The results of NuGet query are correct:

{
    "totalHits": 6,
    "data": [
        {
            "id": "TestGiteaNuGet.UI",
            "version": "1.0.3",
            "versions": [
                {
                    "@id": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet.UI/1.0.3.json",
                    "version": "1.0.3",
                    "downloads": 0
                },
                {
                    "@id": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet.UI/1.0.2.json",
                    "version": "1.0.2",
                    "downloads": 0
                },
                {
                    "@id": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet.UI/1.0.1.json",
                    "version": "1.0.1",
                    "downloads": 0
                }
            ],
            "description": "Package Description",
            "authors": "TestGiteaNuGet.UI",
            "projectURL": "",
            "registration": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet.UI/index.json"
        },
        {
            "id": "TestGiteaNuGet",
            "version": "1.0.3",
            "versions": [
                {
                    "@id": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet/1.0.3.json",
                    "version": "1.0.3",
                    "downloads": 0
                },
                {
                    "@id": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet/1.0.2.json",
                    "version": "1.0.2",
                    "downloads": 0
                },
                {
                    "@id": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet/1.0.1.json",
                    "version": "1.0.1",
                    "downloads": 0
                }
            ],
            "description": "Package Description",
            "authors": "TestGiteaNuGet",
            "projectURL": "",
            "registration": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet/index.json"
        }
    ]
}
  1. Now delete the packages from Gitea, either through UI or API:
Invoke-WebRequest -Uri $GITEA_HOST/api/v1/packages/$OWNER/nuget/testgiteanuget.ui/1.0.3 -Method DELETE -Headers $HEADERS
Invoke-WebRequest -Uri $GITEA_HOST/api/v1/packages/$OWNER/nuget/testgiteanuget.ui/1.0.2 -Method DELETE -Headers $HEADERS
Invoke-WebRequest -Uri $GITEA_HOST/api/v1/packages/$OWNER/nuget/testgiteanuget.ui/1.0.1 -Method DELETE -Headers $HEADERS
Invoke-WebRequest -Uri $GITEA_HOST/api/v1/packages/$OWNER/nuget/testgiteanuget/1.0.3 -Method DELETE -Headers $HEADERS
Invoke-WebRequest -Uri $GITEA_HOST/api/v1/packages/$OWNER/nuget/testgiteanuget/1.0.2 -Method DELETE -Headers $HEADERS
Invoke-WebRequest -Uri $GITEA_HOST/api/v1/packages/$OWNER/nuget/testgiteanuget/1.0.1 -Method DELETE -Headers $HEADERS
  1. Optional (local instance): clear the package SQL table as the methods above do not, just to be sure (it works either way):
delete from package where lower_name in ('testgiteanuget', 'testgiteanuget.ui')
  1. Push the packages in order of package version and query the package server:
dotnet nuget push --source $SOURCE .\TestGiteaNuGet\bin\Debug\TestGiteaNuGet.1.0.1.nupkg --api-key $API_KEY
dotnet nuget push --source $SOURCE .\TestGiteaNuGet.UI\bin\Debug\TestGiteaNuGet.UI.1.0.1.nupkg --api-key $API_KEY
dotnet nuget push --source $SOURCE .\TestGiteaNuGet\bin\Debug\TestGiteaNuGet.1.0.2.nupkg --api-key $API_KEY
dotnet nuget push --source $SOURCE .\TestGiteaNuGet.UI\bin\Debug\TestGiteaNuGet.UI.1.0.2.nupkg --api-key $API_KEY
dotnet nuget push --source $SOURCE .\TestGiteaNuGet\bin\Debug\TestGiteaNuGet.1.0.3.nupkg --api-key $API_KEY
dotnet nuget push --source $SOURCE .\TestGiteaNuGet.UI\bin\Debug\TestGiteaNuGet.UI.1.0.3.nupkg --api-key $API_KEY

(Invoke-WebRequest -Uri $GITEA_HOST/api/packages/$OWNER/nuget/query?q=TestGiteaNuGet -Headers $HEADERS).Content

The results of NuGet query are incorrect, every version is an individual package:

{
    "totalHits": 6,
    "data": [
        {
            "id": "TestGiteaNuGet.UI",
            "version": "1.0.3",
            "versions": [
                {
                    "@id": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet.UI/1.0.3.json",
                    "version": "1.0.3",
                    "downloads": 0
                }
            ],
            "description": "Package Description",
            "authors": "TestGiteaNuGet.UI",
            "projectURL": "",
            "registration": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet.UI/index.json"
        },
        {
            "id": "TestGiteaNuGet",
            "version": "1.0.3",
            "versions": [
                {
                    "@id": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet/1.0.3.json",
                    "version": "1.0.3",
                    "downloads": 0
                }
            ],
            "description": "Package Description",
            "authors": "TestGiteaNuGet",
            "projectURL": "",
            "registration": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet/index.json"
        },
        {
            "id": "TestGiteaNuGet.UI",
            "version": "1.0.2",
            "versions": [
                {
                    "@id": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet.UI/1.0.2.json",
                    "version": "1.0.2",
                    "downloads": 0
                }
            ],
            "description": "Package Description",
            "authors": "TestGiteaNuGet.UI",
            "projectURL": "",
            "registration": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet.UI/index.json"
        },
        {
            "id": "TestGiteaNuGet",
            "version": "1.0.2",
            "versions": [
                {
                    "@id": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet/1.0.2.json",
                    "version": "1.0.2",
                    "downloads": 0
                }
            ],
            "description": "Package Description",
            "authors": "TestGiteaNuGet",
            "projectURL": "",
            "registration": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet/index.json"
        },
        {
            "id": "TestGiteaNuGet.UI",
            "version": "1.0.1",
            "versions": [
                {
                    "@id": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet.UI/1.0.1.json",
                    "version": "1.0.1",
                    "downloads": 0
                }
            ],
            "description": "Package Description",
            "authors": "TestGiteaNuGet.UI",
            "projectURL": "",
            "registration": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet.UI/index.json"
        },
        {
            "id": "TestGiteaNuGet",
            "version": "1.0.1",
            "versions": [
                {
                    "@id": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet/1.0.1.json",
                    "version": "1.0.1",
                    "downloads": 0
                }
            ],
            "description": "Package Description",
            "authors": "TestGiteaNuGet",
            "projectURL": "",
            "registration": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet/index.json"
        }
    ]
}

Here's how it looks on Visual Studio 2022 Package Manager:
vs_nuget_bug

  1. Now let's delete one of the packages and see if it "fixed" the other one:
Invoke-WebRequest -Uri $GITEA_HOST/api/v1/packages/$OWNER/nuget/testgiteanuget.ui/1.0.3 -Method DELETE -Headers $HEADERS
Invoke-WebRequest -Uri $GITEA_HOST/api/v1/packages/$OWNER/nuget/testgiteanuget.ui/1.0.2 -Method DELETE -Headers $HEADERS
Invoke-WebRequest -Uri $GITEA_HOST/api/v1/packages/$OWNER/nuget/testgiteanuget.ui/1.0.1 -Method DELETE -Headers $HEADERS

(Invoke-WebRequest -Uri $GITEA_HOST/api/packages/$OWNER/nuget/query?q=TestGiteaNuGet -Headers $HEADERS).Content

The other one is back to normal:

{
    "totalHits": 3,
    "data": [
        {
            "id": "TestGiteaNuGet",
            "version": "1.0.3",
            "versions": [
                {
                    "@id": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet/1.0.3.json",
                    "version": "1.0.3",
                    "downloads": 0
                },
                {
                    "@id": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet/1.0.2.json",
                    "version": "1.0.2",
                    "downloads": 0
                },
                {
                    "@id": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet/1.0.1.json",
                    "version": "1.0.1",
                    "downloads": 0
                }
            ],
            "description": "Package Description",
            "authors": "TestGiteaNuGet",
            "projectURL": "",
            "registration": "https://try.gitea.io/api/packages/fitithw/nuget/registration/TestGiteaNuGet/index.json"
        }
    ]
}

Gitea Version

1.17.2

Can you reproduce the bug on the Gitea demo site?

Yes

Log Gist

No response

Screenshots

No response

Git Version

No response

Operating System

Windows Server 2019 Standard

How are you running Gitea?

Windows service from downloaded exe, but the bug can be reproduced on try.gitea.io.

Database

MSSQL

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions