diff --git a/anda/devs/powershell/Microsoft.PowerShell.SDK.csproj.TypeCatalog.targets b/anda/devs/powershell/Microsoft.PowerShell.SDK.csproj.TypeCatalog.targets new file mode 100644 index 0000000000..65d52cfcb5 --- /dev/null +++ b/anda/devs/powershell/Microsoft.PowerShell.SDK.csproj.TypeCatalog.targets @@ -0,0 +1,9 @@ + + + + <_RefAssemblyPath Include="%(_ReferencesFromRAR.OriginalItemSpec)%3B" Condition=" '%(_ReferencesFromRAR.NuGetPackageId)' != 'Microsoft.Management.Infrastructure' "/> + + + + diff --git a/anda/devs/powershell/anda.hcl b/anda/devs/powershell/anda.hcl new file mode 100644 index 0000000000..46a5bcc5b0 --- /dev/null +++ b/anda/devs/powershell/anda.hcl @@ -0,0 +1,6 @@ +project pkg { + arches = ["x86_64"] + rpm { + spec = "powershell.spec" + } +} diff --git a/anda/devs/powershell/com.microsoft.PowerShell.metainfo.xml b/anda/devs/powershell/com.microsoft.PowerShell.metainfo.xml new file mode 100644 index 0000000000..5d665687dc --- /dev/null +++ b/anda/devs/powershell/com.microsoft.PowerShell.metainfo.xml @@ -0,0 +1,19 @@ + + + com.microsoft.PowerShell + Microsoft PowerShell + PowerShell for every system! + + https://github.com/PowerShell/PowerShell/blob/master/assets/Powershell_256.png + + +

+ PowerShell is a cross-platform (Windows, Linux, and macOS) automation and configuration tool/framework that works well with your existing tools and is optimized for dealing with structured data (e.g. JSON, CSV, XML, etc.), REST APIs, and object models. It includes a command-line shell, an associated scripting language, and a framework for processing cmdlets. +

+
+ https://microsoft.com/PowerShell + + Microsoft Corporation + + com.microsoft.PowerShell +
diff --git a/anda/devs/powershell/powershell.spec b/anda/devs/powershell/powershell.spec new file mode 100644 index 0000000000..3e70c6d5ca --- /dev/null +++ b/anda/devs/powershell/powershell.spec @@ -0,0 +1,239 @@ +%global debug_package %{nil} +# It's Electron all over again +%global __requires_exclude_from %{_libdir}/%{name}/.* +%global __provides_exclude_from %{_libdir}/%{name}/.* +%global git_name PowerShell +# Not currently tracked, all PowerShell specifies is a version under 4.99 +%global pester_version 4.10.1 +%global dotnet_version 9.0 +# Arch defined by .NET +%ifarch %{x86_64} +%global darch x64 +%elifarch %{arm64} +%global darch arm64 +%endif +%global appid com.microsoft.PowerShell +%global org com.microsoft +%global appstream_component console-application +%bcond test 1 + +Name: powershell +Version: 7.5.4 +Release: 1%{?dist} +Summary: A cross-platform automation and configuration tool/framework +SourceLicense: MIT +License: Apache-2.0 AND BSD-2-Clause AND MIT +URL: https://microsoft.com/PowerShell +Source0: https://github.com/%{git_name}/%{git_name}/archive/refs/tags/v%{version}.tar.gz +Source1: https://globalcdn.nuget.org/packages/pester.%{pester_version}.nupkg +# For some reason the build doesn't provide this information to itself +Source2: Microsoft.PowerShell.SDK.csproj.TypeCatalog.targets +Source3: %{appid}.metainfo.xml +BuildRequires: dotnet-host +BuildRequires: dotnet-sdk-%{dotnet_version} +BuildRequires: git-core +BuildRequires: jq +BuildRequires: nuget +BuildRequires: unzip +%if %{with test} +BuildRequires: glibc-all-langpacks +BuildRequires: iputils +BuildRequires: langpacks-en +%endif +Requires: dotnet-hostfxr-%{dotnet_version} +Requires: dotnet-runtime-%{dotnet_version} +# .NET versioning +Provides: mono(pwsh) = %{version}.0 +Packager: Gilver E. + +%description +%{git_name} is a cross-platform automation and configuration tool/framework. + +%package doc +Summary: Documentation files for PowerShell +Requires: %{name} = %{evr} + +%description doc +This package contains documentation for PowerShell. + +%prep +%git_clone https://github.com/%{git_name}/%{git_name}.git v%{version} + +# Patch sources to fetch from upstream NuGet otherwise some fail +sed -i 's|add key=.*"|add key="nuget.org" value="https://api.nuget.org/v3/index.json"|g' nuget.config + +jq '.sdk.version = "%{dotnet_version}.0" | .sdk.rollForward = "feature"' global.json > _global.json + mv _global.json global.json + +%build +export NUGET_PACKAGES="$PWD/nuget" +export DOTNET_NOLOGO=true +export DOTNET_CLI_TELEMETRY_OPTOUT=true + +dotnet restore src/powershell-unix -p:PublishReadyToRun=true +dotnet restore src/TypeCatalogGen +dotnet restore src/ResGen +dotnet restore src/Modules +dotnet restore src/Microsoft.PowerShell.GlobalTool.Shim +dotnet restore test/tools/TestAlc +dotnet restore test/tools/TestExe +dotnet restore test/tools/UnixSocket +dotnet restore test/tools/Modules +dotnet restore test/tools/TestService -p:RuntimeIdentifiers=linux-%{darch} +dotnet restore test/tools/WebListener -p:RuntimeIdentifiers=linux-%{darch} +dotnet restore test/tools/NamedPipeConnection/src/code + +pushd src/ResGen +dotnet run --no-restore +popd + +cp -t src/Microsoft.PowerShell.SDK/obj \ + "%{SOURCE2}" + +INCFILE="$PWD/src/TypeCatalogGen/powershell_linux-%{darch}.inc" +dotnet msbuild \ + src/Microsoft.PowerShell.SDK \ + -t:_GetDependencies \ + -p:DesignTimeBuild=true \ + -p:_DependencyFile="$INCFILE" \ + -nologo + +dotnet run \ + --no-restore \ + --project src/TypeCatalogGen \ + src/System.Management.Automation/CoreCLR/CorePsTypeCatalog.cs \ + "$INCFILE" + +dotnet publish \ + --no-restore \ + --runtime linux-%{darch} \ + --no-self-contained \ + --configuration Release \ + --output lib \ + src/powershell-unix/ + +grep 'Microsoft.NETCore.App' "$INCFILE" | sed 's/;//' | while read -r assembly; do + install -Dm755 -t lib/ref "$assembly" +done + +cp -a $NUGET_PACKAGES/microsoft.powershell.archive/1.2.5/. lib/Modules/Microsoft.PowerShell.Archive +cp -a $NUGET_PACKAGES/microsoft.powershell.psresourceget/1.1.1/. lib/Modules/Microsoft.PowerShell.PSResourceGet +cp -a $NUGET_PACKAGES/packagemanagement/1.4.8.1/. lib/Modules/PackageManagement +cp -a $NUGET_PACKAGES/powershellget/2.2.5/. lib/Modules/PowerShellGet +cp -a $NUGET_PACKAGES/psreadline/2.3.6/. lib/Modules/PSReadLine +cp -a $NUGET_PACKAGES/threadjob/2.0.3/. lib/Modules/ThreadJob + +# Restore-PSPester +unzip -ud temp_pester %{SOURCE1} +cp -a temp_pester/tools lib/Modules/Pester + +# Generate manpage +lib/pwsh -noprofile -command ' + Import-Module ./build.psm1 -ArgumentList $true + Import-Module ./tools/packaging/packaging.psm1 + New-ManGzip +' + +%install +mkdir -p %{buildroot}%{_libdir}/%{name} +cp -a lib/* -t %{buildroot}%{_libdir}/%{name} +mkdir -p %{buildroot}%{_bindir} +ln -s %{_libdir}/%{name}/pwsh %{buildroot}%{_bindir}/pwsh +install -Dpm644 assets/manpage/pwsh.1.gz -t %{buildroot}%{_mandir}/man1 +install -Dpm644 assets/powershell_128.svg %{buildroot}%{_scalableiconsdir}/%{name}.svg + +%terra_appstream -o %{SOURCE3} + +%if %{with test} +%check +export NUGET_PACKAGES="$PWD/nuget" +export DOTNET_NOLOGO=true +export DOTNET_CLI_TELEMETRY_OPTOUT=true + +# Remove tests that fail in CIs +rm test/powershell/engine/Help/HelpSystem.Tests.ps1 +rm test/powershell/Modules/Microsoft.PowerShell.Management/Start-Process.Tests.ps1 +rm test/powershell/Modules/Microsoft.PowerShell.Utility/Format-Table.Tests.ps1 +rm test/powershell/Language/Parser/RedirectionOperator.Tests.ps1 +rm test/powershell/Language/Scripting/NativeExecution/NativeWindowsTildeExpansion.Tests.ps1 +rm test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1 +rm test/powershell/Modules/Microsoft.PowerShell.PSResourceGet/Microsoft.PowerShell.PSResourceGet.Tests.ps1 + +# Fails on timezone format +rm test/powershell/Modules/Microsoft.PowerShell.Management/TimeZone.Tests.ps1 + +# Opens browser +rm test/powershell/Language/Scripting/NativeExecution/NativeCommandProcessor.Tests.ps1 +rm test/powershell/Modules/Microsoft.PowerShell.Utility/Invoke-Item.Tests.ps1 + +# Creates directories in $HOME +rm test/powershell/Language/Parser/ParameterBinding.Tests.ps1 +rm test/powershell/Language/Scripting/ScriptHelp.Tests.ps1 +rm test/powershell/Modules/Microsoft.PowerShell.Utility/Add-Type.Tests.ps1 +rm test/powershell/Modules/Microsoft.PowerShell.Utility/Set-PSBreakpoint.Tests.ps1 +rm test/powershell/engine/Basic/Assembly.LoadFrom.Tests.ps1 +rm test/powershell/engine/Basic/Assembly.LoadNative.Tests.ps1 + +unzip -ud test/tools/Modules/SelfSignedCertificate \ +"$NUGET_PACKAGES/selfsignedcertificate/0.0.4/selfsignedcertificate.0.0.4.nupkg" + +dotnet publish \ + --no-restore \ + --configuration Debug \ + test/tools/TestAlc + +for project in TestExe TestService UnixSocket WebListener; do + dotnet publish \ + --no-restore \ + --runtime linux-%{darch} \ + --self-contained \ + --configuration Debug \ + --output test/tools/$project/bin \ + test/tools/$project + export PATH="$PATH:$PWD/test/tools/$project/bin/Debug/net%{dotnet_version}/linux-%{darch}" + done + +dotnet publish \ + --no-restore \ + --configuration Debug \ + --framework net%{dotnet_version} \ + --output test/tools/Modules/Microsoft.PowerShell.NamedPipeConnection \ + test/tools/NamedPipeConnection/src/code + +install -Dm644 -t test/tools/Modules/Microsoft.PowerShell.NamedPipeConnection \ + test/tools/NamedPipeConnection/src/Microsoft.PowerShell.NamedPipeConnection.psd1 + +export LANG="en_US.UTF-8" +export LC_ALL="$LANG" + +# shellcheck disable=SC2016 +lib/pwsh -noprofile -command ' + $env:PSModulePath = "$(Get-Location)/test/tools/Modules:" + $env:PSModulePath + Import-Module "Pester" + Invoke-Pester -Show Header,Failed,Summary -EnableExit ` + -OutputFormat NUnitXml -OutputFile pester-tests.xml ` + -ExcludeTag @("Slow", "RequireSudoOnUnix") ` + -Tag @("CI", "Feature") ` + "test/powershell" + ' +%endif + +%files +%license LICENSE.txt +%license assets/additionalAttributions.txt +%doc README.md +%doc CODE_OF_CONDUCT.md +%{_bindir}/pwsh +%{_libdir}/%{name}/ +%{_mandir}/man1/pwsh.1.* +%{_scalableiconsdir}/%{name}.svg +%{_metainfodir}/%{appid}.metainfo.xml + +%files doc +%doc docs/* +%doc CHANGELOG +%doc ADOPTERS.md + +%changelog +* Wed Dec 24 2025 Gilver E. - 7.5.4-1 +- Initial package diff --git a/anda/devs/powershell/update.rhai b/anda/devs/powershell/update.rhai new file mode 100644 index 0000000000..385dc2813b --- /dev/null +++ b/anda/devs/powershell/update.rhai @@ -0,0 +1,6 @@ +let v = gh("PowerShell/PowerShell"); + +if `[\d.]+-preview\.\d+`.find_all(v).len == 0 { + rpm.version(v); + rpm.global("dotnet_version", (find(`\"version\": \"([\d.]+)\.\d.+\"`, get(`https://github.com/PowerShell/PowerShell/raw/refs/tags/${v}/global.json`), 1))); +}