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

feat(nuget): create nuget packages for framework #325

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
2f8d2c0
chore: update package dependencies (#431)
Phil91 Jan 23, 2024
1a590bf
feat(nuget): create framework and framework.web nuget packages
Phil91 Oct 26, 2023
fc99871
feat(nuget) create solution
Phil91 Oct 29, 2023
b9f2e54
WIP: setup for framework projects
Phil91 Oct 30, 2023
61e64e9
WIP: adjust update script
Phil91 Oct 30, 2023
03dbd42
chore: update version build script
Phil91 Oct 31, 2023
29bd561
feat(nuget): adjust project refs
Phil91 Oct 31, 2023
f8ae2ca
feat(nuget): adjust scripts to build and push nuget packages
Phil91 Nov 2, 2023
1b49e63
WIP: adjust package references
Phil91 Nov 2, 2023
f5a85aa
feat(nuget): adjust readmes
Phil91 Nov 3, 2023
139e084
feat(nuget): version update
Phil91 Nov 3, 2023
050c20f
feat(nuget): update package references
Phil91 Nov 3, 2023
e70f608
feat(nuget): version upgrade
Phil91 Nov 3, 2023
8994134
chore: fix formatting
Phil91 Nov 3, 2023
4ded657
feat(nuget): update nuget package version
Phil91 Nov 3, 2023
75d43c8
chore: add github workflow
Phil91 Nov 6, 2023
95c44fb
chore: adjust documentation
Phil91 Nov 7, 2023
e3f14a0
chore: add workflows for nuget packages
Phil91 Nov 13, 2023
5cb7f2b
chore: adjust nuget scripts
Phil91 Nov 14, 2023
19cb25b
chore: update packages
Phil91 Nov 14, 2023
65db172
chore: add formatting for framework action
Phil91 Nov 14, 2023
b68ff34
test: adjust tests
Phil91 Nov 14, 2023
53fc7dc
chore: adjust workflows for nuget packages
Phil91 Nov 15, 2023
019ccc6
chore: adjust workflows
Phil91 Nov 15, 2023
8924f3e
feat(framework): adjust nuget packages
Phil91 Jan 12, 2024
302c248
feat(nuget): update framework web
Phil91 Jan 13, 2024
de700ff
feat(nuget): update framework web
Phil91 Jan 13, 2024
122f5e2
feat(nuget): adjust framework push process
Phil91 Jan 13, 2024
aa189a9
cleanup
ntruchsess Feb 1, 2024
e9b5fcd
feat(nuget): adjust file headers
Phil91 Feb 2, 2024
7059e33
feat(nuget): adjust framework linkage
Phil91 Feb 2, 2024
79d0191
adjust check message
ntruchsess Feb 2, 2024
acf8d1a
feat(nuget): adjust version check action
Phil91 Feb 5, 2024
bdc51d0
cleanup scripts
ntruchsess Feb 6, 2024
321049a
feat(nuget): adjust version check script
Phil91 Feb 6, 2024
096444f
feat(nuget): readd framework references to docker files
Phil91 Feb 6, 2024
3fe14b5
feat(nuget): add suffix check
Phil91 Feb 6, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/administration-service.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,12 @@ on:
# service and transitive paths
- 'src/administration/**'
- 'src/externalsystems/**'
- 'src/framework/**'
- 'src/keycloak/**'
- 'src/mailing/**'
- 'src/notifications/**'
- 'src/portalbackend/**'
- 'src/provisioning/**'
- 'src/web/**'
# workflow file
- '.github/workflows/administration-service.yml'
# dockerfile
Expand Down
1 change: 0 additions & 1 deletion .github/workflows/maintenance-service.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ on:
paths:
# service and transitive paths
- 'src/maintenance/Maintenance.App/**'
- 'src/framework/**'
- 'src/portalbackend/PortalBackend.PortalEntities/**'
# workflow file
- '.github/workflows/maintenance-service.yml'
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/marketplace-app-service.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,12 @@ on:
paths:
# service and transitive paths
- 'src/marketplace/Apps.Service/**'
- 'src/framework/**'
- 'src/marketplace/Offers.Library/**'
- 'src/keycloak/**'
- 'src/mailing/**'
- 'src/notifications/**'
- 'src/portalbackend/**'
- 'src/web/**'
# workflow file
- '.github/workflows/marketplace-app-service.yml'
# dockerfile
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/notification-service.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ on:
paths:
# service and transitive paths
- 'src/notifications/**'
- 'src/framework/**'
- 'src/keycloak/**'
- 'src/portalbackend/**'
- 'src/web/**'
# workflow file
- '.github/workflows/notification-service.yml'
# dockerfile
Expand Down
74 changes: 74 additions & 0 deletions .github/workflows/nuget-package-push.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
###############################################################
# Copyright (c) 2021, 2023 Contributors to the Eclipse Foundation
#
# See the NOTICE file(s) distributed with this work for additional
# information regarding copyright ownership.
#
# This program and the accompanying materials are made available under the
# terms of the Apache License, Version 2.0 which is available at
# https://www.apache.org/licenses/LICENSE-2.0.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# SPDX-License-Identifier: Apache-2.0
###############################################################

name: Push Nuget Packages and Tag
evegufy marked this conversation as resolved.
Show resolved Hide resolved

on:
workflow_dispatch:

jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
dotnet-version: ['7.0']
steps:
- name: Checkout code
uses: actions/checkout@v3

- name: Setup .NET Core SDK ${{ matrix.dotnet-version }}
uses: actions/setup-dotnet@v2
with:
dotnet-version: ${{ matrix.dotnet-version }}

- name: Install dependencies
run: dotnet restore src

- name: Build
run: dotnet build src --configuration Release --no-restore

- name: Check Package Suffix Versions
shell: bash
run: |
script_output=$(./scripts/no_suffix_check.sh)

if [ -z "$script_output" ]; then
echo "No version suffixes set"
else
echo "the following packages have a suffix version set, please remove them:"
echo "$script_output"
exit 1
fi

- name: Push nuget packages
shell: bash
run: |
bash ./scripts/pack_and_push_packages.sh --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate

- name: Get new version
id: nugetPackageVersion
shell: bash
run: |
current_version=$(./scripts/get_current_version.sh)
echo "version=$current_version" >> "$GITHUB_OUTPUT"

- name: Create git tag
uses: rickstaa/action-create-tag@v1
with:
tag: v${{ steps.nugetPackageVersion.outputs.version }}
1 change: 0 additions & 1 deletion .github/workflows/portal-migrations.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ on:
push:
paths:
# service and transitive paths
- 'src/framework/**'
- 'src/portalbackend/PortalBackend.Migrations/**'
- 'src/portalbackend/PortalBackend.PortalEntities/**'
# workflow file
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
###############################################################
# Copyright (c) 2021, 2023 Contributors to the Eclipse Foundation
# Copyright (c) 2021, 2024 Contributors to the Eclipse Foundation
#
# See the NOTICE file(s) distributed with this work for additional
# information regarding copyright ownership.
Expand All @@ -17,7 +17,9 @@
# SPDX-License-Identifier: Apache-2.0
###############################################################

name: Unit-Tests and Formatting
# This workflow builds all services and related projects, checks the formatting and if all tests are passing.
# If framework related code changed, all steps mentioned above will happen for framework related code as well as a check for a version update of the nuget packages will be made
name: Pre Checks

on:
push:
Expand All @@ -27,15 +29,32 @@ on:
workflow_dispatch:

jobs:
build:

changes:
name: Get changed paths
runs-on: ubuntu-latest
outputs:
framework: ${{ steps.changes.outputs.framework }}
steps:
- name: Checkout code
uses: actions/checkout@v3
- uses: dorny/paths-filter@v2
id: changes
with:
filters: |
framework:
- 'src/framework/**'

checkServices:
name: Build, check and test services
runs-on: ubuntu-latest
strategy:
matrix:
dotnet-version: ['7.0']

steps:
- uses: actions/checkout@v3
- name: Checkout code
uses: actions/checkout@v3
- name: Setup .NET Core SDK ${{ matrix.dotnet-version }}
uses: actions/setup-dotnet@v2
with:
Expand All @@ -50,3 +69,27 @@ jobs:
run: dotnet format src --verify-no-changes --no-restore
- name: Test
run: dotnet test src --filter FullyQualifiedName\!~Org.Eclipse.TractusX.Portal.Backend.EndToEnd.Tests --no-restore --verbosity normal

checkFramework:
name: Check nuget packages
needs: changes
if: ${{ needs.changes.outputs.framework == 'true' }}
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Check Package Versions
shell: bash
run: |
script_output=$(./scripts/nuget_version_check.sh origin/${{ github.event.pull_request.base.ref }})

if [ -z "$script_output" ]; then
echo "Expected version updates were made"
else
echo "the following packages need a version update:"
echo "$script_output"
echo "Please see https://github.com/eclipse-tractusx/portal-backend/blob/main/src/framework/README.md for further information"
exit 1
fi
2 changes: 1 addition & 1 deletion .github/workflows/processes-worker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@ on:
push:
paths:
# service and transitive paths
- 'src/processes/Processes.ProcessIdentity/**'
- 'src/processes/Processes.Worker/**'
- 'src/processes/ApplicationChecklist.Library/**'
- 'src/processes/ApplicationChecklist.Executor/**'
- 'src/processes/NetworkRegistration.Library/**'
- 'src/processes/NetworkRegistration.Executor/**'
- 'src/externalsystems/**'
- 'src/framework/**'
- 'src/portalbackend/PortalBackend.PortalEntities/**'
# workflow file
- '.github/workflows/processes-worker.yml'
Expand Down
1 change: 0 additions & 1 deletion .github/workflows/provisioning-migrations.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ on:
push:
paths:
# service and transitive paths
- 'src/framework/**'
- 'src/provisioning/Provisioning.Migrations/**'
- 'src/provisioning/Provisioning.ProvisioningEntities/**'
# workflow file
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/registration-service.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ on:
paths:
# service and transitive paths
- 'src/registration/**'
- 'src/framework/**'
- 'src/keycloak/**'
- 'src/mailing/**'
- 'src/portalbackend/**'
- 'src/provisioning/**'
- 'src/web/**'
# workflow file
- '.github/workflows/registration-service.yml'
# dockerfile
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/services-service.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ on:
# service and transitive paths
- 'src/marketplace/Services.Service/**'
- 'src/marketplace/Offers.Library/**'
- 'src/framework/**'
- 'src/keycloak/**'
- 'src/notifications/**'
- 'src/portalbackend/**'
- 'src/web/**'
# workflow file
- '.github/workflows/services-service.yml'
# dockerfile
Expand Down
2 changes: 2 additions & 0 deletions DEPENDENCIES
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,11 @@ nuget/nuget/-/Serilog.Extensions.Hosting/7.0.0, Apache-2.0, approved, #10078
nuget/nuget/-/Serilog.Extensions.Logging/7.0.0, Apache-2.0, approved, #10070
nuget/nuget/-/Serilog.Formatting.Compact/1.1.0, Apache-2.0, approved, #11115
nuget/nuget/-/Serilog.Settings.Configuration/7.0.0, Apache-2.0, approved, #10069
nuget/nuget/-/Serilog.Sinks.Console/4.0.1, Apache-2.0, approved, #12858
nuget/nuget/-/Serilog.Sinks.Console/4.1.0, Apache-2.0, approved, #8434
nuget/nuget/-/Serilog.Sinks.Debug/2.0.0, Apache-2.0, approved, clearlydefined
nuget/nuget/-/Serilog.Sinks.File/5.0.0, Apache-2.0, approved, #11116
nuget/nuget/-/Serilog/2.12.0, Apache-2.0, approved, #8435
nuget/nuget/-/Serilog/3.0.1, Apache-2.0, approved, #10063
nuget/nuget/-/SharpZipLib/1.4.2, MIT AND GFDL-1.3-or-later AND (Apache-2.0 AND MIT) AND WTFPL AND bzip2-1.0.6 AND LicenseRef-Permissive-license-with-conditions AND LicenseRef-Permission-Notice, approved, #10058
nuget/nuget/-/SshNet.Security.Cryptography/1.3.0, MIT, approved, clearlydefined
Expand Down
41 changes: 32 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,15 @@ This application provides container images for demonstration purposes.

### DockerHub

* https://hub.docker.com/r/tractusx/portal-registration-service
* https://hub.docker.com/r/tractusx/portal-administration-service
* https://hub.docker.com/r/tractusx/portal-marketplace-app-service
* https://hub.docker.com/r/tractusx/portal-services-service
* https://hub.docker.com/r/tractusx/portal-notification-service
* https://hub.docker.com/r/tractusx/portal-processes-worker
* https://hub.docker.com/r/tractusx/portal-portal-migrations
* https://hub.docker.com/r/tractusx/portal-provisioning-migrations
* https://hub.docker.com/r/tractusx/portal-maintenance-service
* [portal-registration-service](https://hub.docker.com/r/tractusx/portal-registration-service)
* [portal-administration-service](https://hub.docker.com/r/tractusx/portal-administration-service)
* [portal-marketplace-app-service](https://hub.docker.com/r/tractusx/portal-marketplace-app-service)
* [portal-services-service](https://hub.docker.com/r/tractusx/portal-services-service)
* [portal-notification-service](https://hub.docker.com/r/tractusx/portal-notification-service)
* [portal-processes-worker](https://hub.docker.com/r/tractusx/portal-processes-worker)
* [portal-portal-migrations](https://hub.docker.com/r/tractusx/portal-portal-migrations)
* [portal-provisioning-migrations](https://hub.docker.com/r/tractusx/portal-provisioning-migrations)
* [portal-maintenance-service](https://hub.docker.com/r/tractusx/portal-maintenance-service)

### Base images
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The notice for nuget is now in the middle of the notice for docker, the '### Base images' should be after '### DockerHub'.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved to the correct place


Expand All @@ -60,6 +60,29 @@ mcr.microsoft.com/dotnet/runtime:7.0-alpine:
* GitHub project: [https://github.com/dotnet/dotnet-docker](https://github.com/dotnet/dotnet-docker)
* DockerHub: [https://hub.docker.com/_/microsoft-dotnet-runtime](https://hub.docker.com/_/microsoft-dotnet-runtime)

## Notice for Nuget Packages

This application provides nuget packages to share functionalities across different repos. To see how the development and update of nuget packages is working please have a look at the [documentation](/docs/nuget/update-nuget-packages.md).

### Nuget

* [Org.Eclipse.TractusX.Portal.Backend.Framework.Async](https://www.nuget.org/packages/Org.Eclipse.TractusX.Portal.Backend.Framework.Async/)
* [Org.Eclipse.TractusX.Portal.Backend.Framework.Cors](https://www.nuget.org/packages/Org.Eclipse.TractusX.Portal.Backend.Framework.Cors/)
* [Org.Eclipse.TractusX.Portal.Backend.Framework.DateTimeProvider](https://www.nuget.org/packages/Org.Eclipse.TractusX.Portal.Backend.Framework.DateTimeProvider/)
* [Org.Eclipse.TractusX.Portal.Backend.Framework.DBAccess](https://www.nuget.org/packages/Org.Eclipse.TractusX.Portal.Backend.Framework.DBAccess/)
* [Org.Eclipse.TractusX.Portal.Backend.Framework.DependencyInjection](https://www.nuget.org/packages/Org.Eclipse.TractusX.Portal.Backend.Framework.DependencyInjection/)
* [Org.Eclipse.TractusX.Portal.Backend.Framework.ErrorHandling.Library](https://www.nuget.org/packages/Org.Eclipse.TractusX.Portal.Backend.Framework.ErrorHandling.Library/)
* [Org.Eclipse.TractusX.Portal.Backend.Framework.ErrorHandling.Web](https://www.nuget.org/packages/Org.Eclipse.TractusX.Portal.Backend.Framework.ErrorHandling.Web/)
* [Org.Eclipse.TractusX.Portal.Backend.Framework.HttpClientExtensions](https://www.nuget.org/packages/Org.Eclipse.TractusX.Portal.Backend.Framework.HttpClientExtensions/)
* [Org.Eclipse.TractusX.Portal.Backend.Framework.IO](https://www.nuget.org/packages/Org.Eclipse.TractusX.Portal.Backend.Framework.IO/)
* [Org.Eclipse.TractusX.Portal.Backend.Framework.Linq](https://www.nuget.org/packages/Org.Eclipse.TractusX.Portal.Backend.Framework.Linq/)
* [Org.Eclipse.TractusX.Portal.Backend.Framework.Logging](https://www.nuget.org/packages/Org.Eclipse.TractusX.Portal.Backend.Framework.Logging/)
* [Org.Eclipse.TractusX.Portal.Backend.Framework.Models](https://www.nuget.org/packages/Org.Eclipse.TractusX.Portal.Backend.Framework.Models/)
* [Org.Eclipse.TractusX.Portal.Backend.Framework.Seeding](https://www.nuget.org/packages/Org.Eclipse.TractusX.Portal.Backend.Framework.Seeding/)
* [Org.Eclipse.TractusX.Portal.Backend.Framework.Swagger](https://www.nuget.org/packages/Org.Eclipse.TractusX.Portal.Backend.Framework.Swagger/)
* [Org.Eclipse.TractusX.Portal.Backend.Framework.Token](https://www.nuget.org/packages/Org.Eclipse.TractusX.Portal.Backend.Framework.Token/)
* [Org.Eclipse.TractusX.Portal.Backend.Framework.Web](https://www.nuget.org/packages/Org.Eclipse.TractusX.Portal.Backend.Framework.Web/)

## License

Distributed under the Apache 2.0 License.
Expand Down
2 changes: 1 addition & 1 deletion docker/Dockerfile-iam-seeding
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ FROM mcr.microsoft.com/dotnet/sdk:7.0-alpine-amd64 AS publish
WORKDIR /
COPY LICENSE NOTICE.md DEPENDENCIES /
COPY /src/framework/Framework.Async /src/framework/Framework.Async
COPY /src/framework/Framework.ErrorHandling.Library /src/framework/Framework.ErrorHandling.Library
COPY /src/framework/Framework.ErrorHandling /src/framework/Framework.ErrorHandling
COPY /src/framework/Framework.Linq /src/framework/Framework.Linq
COPY /src/framework/Framework.Logging /src/framework/Framework.Logging
COPY /src/framework/Framework.Models /src/framework/Framework.Models
Expand Down
5 changes: 2 additions & 3 deletions docker/Dockerfile-maintenance-service
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,13 @@ COPY LICENSE NOTICE.md DEPENDENCIES /
COPY src/maintenance/Maintenance.App/ src/maintenance/Maintenance.App/
COPY src/portalbackend/PortalBackend.DBAccess/ src/portalbackend/PortalBackend.DBAccess/
COPY src/portalbackend/PortalBackend.PortalEntities/ src/portalbackend/PortalBackend.PortalEntities/
COPY src/framework/Framework.BaseDependencies/ src/framework/Framework.BaseDependencies/
COPY src/framework/Framework.DBAccess/ src/framework/Framework.DBAccess/
COPY src/framework/Framework.Linq/ src/framework/Framework.Linq/
COPY src/framework/Framework.Models/ src/framework/Framework.Models/
COPY src/framework/Framework.Logging/ src/framework/Framework.Logging/
COPY src/framework/Framework.Seeding/ src/framework/Framework.Seeding/
COPY src/framework/Framework.ErrorHandling.Library/ src/framework/Framework.ErrorHandling.Library/
COPY src/framework/Framework.ProcessIdentity/ src/framework/Framework.ProcessIdentity/
COPY src/framework/Framework.ErrorHandling/ src/framework/Framework.ErrorHandling/
COPY src/web/Web.Identity/ src/web/Web.Identity/
COPY /src/framework/Framework.DateTimeProvider /src/framework/Framework.DateTimeProvider
RUN dotnet restore "src/maintenance/Maintenance.App/Maintenance.App.csproj"
WORKDIR /src/maintenance/Maintenance.App
Expand Down
5 changes: 2 additions & 3 deletions docker/Dockerfile-portal-migrations
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,8 @@ COPY /src/framework/Framework.DBAccess /src/framework/Framework.DBAccess
COPY /src/framework/Framework.Logging /src/framework/Framework.Logging
COPY /src/framework/Framework.Models /src/framework/Framework.Models
COPY /src/framework/Framework.Linq /src/framework/Framework.Linq
COPY /src/framework/Framework.ErrorHandling.Library /src/framework/Framework.ErrorHandling.Library
COPY /src/framework/Framework.BaseDependencies /src/framework/Framework.BaseDependencies
COPY /src/framework/Framework.ProcessIdentity /src/framework/Framework.ProcessIdentity/
COPY /src/framework/Framework.ErrorHandling /src/framework/Framework.ErrorHandling
COPY /src/web/Web.Identity /src/web/Web.Identity/
COPY /src/framework/Framework.Seeding /src/framework/Framework.Seeding
COPY /src/framework/Framework.DateTimeProvider /src/framework/Framework.DateTimeProvider
WORKDIR /src/portalbackend/PortalBackend.Migrations
Expand Down
3 changes: 1 addition & 2 deletions docker/Dockerfile-provisioning-migrations
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@ FROM mcr.microsoft.com/dotnet/sdk:7.0-alpine-amd64 AS publish
WORKDIR /
COPY LICENSE NOTICE.md DEPENDENCIES /
COPY /src/provisioning /src/provisioning
COPY /src/framework/Framework.ErrorHandling.Library /src/framework/Framework.ErrorHandling.Library
COPY /src/framework/Framework.BaseDependencies /src/framework/Framework.BaseDependencies
COPY /src/framework/Framework.ErrorHandling /src/framework/Framework.ErrorHandling
COPY /src/framework/Framework.Seeding /src/framework/Framework.Seeding
COPY /src/framework/Framework.Models /src/framework/Framework.Models
COPY /src/framework/Framework.Linq /src/framework/Framework.Linq
Expand Down
Loading
Loading