diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json deleted file mode 100644 index b6554f3..0000000 --- a/.config/dotnet-tools.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version": 1, - "isRoot": true, - "tools": { - "cake.tool": { - "version": "5.0.0", - "commands": [ - "dotnet-cake" - ], - "rollForward": false - } - } -} \ No newline at end of file diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..6ed2e0b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,43 @@ +########################################## +# Common Settings +########################################## + +# This file is the top-most EditorConfig file +root = true + +# All Files +[*] +charset = utf-8 +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true + +# JSON +[*.{json,json5,webmanifest}] +indent_size = 2 + +# Markdown +[*.{md,mdx}] +trim_trailing_whitespace = false + +# Visual Studio +[*.{csproj}] +indent_size = 2 + +[*.cs] +# https://learn.microsoft.com/de-de/dotnet/fundamentals/code-analysis/style-rules/ide0063 +dotnet_diagnostic.IDE0063.severity = none +csharp_prefer_simple_using_statement = false + +# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0290 +dotnet_diagnostic.IDE0290.severity = none +csharp_style_prefer_primary_constructors = false + +# ReSharper +# https://www.jetbrains.com/help/rider/ConvertToPrimaryConstructor.html +resharper_convert_to_primary_constructor_highlighting = none + +resharper_convert_to_using_declaration_highlighting = none + +resharper_foreach_can_be_converted_to_query_using_another_get_enumerator_highlighting = none diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index feed56d..0000000 --- a/.gitattributes +++ /dev/null @@ -1,31 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto -*.cs diff=csharp - -# Documents -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain -*.md text -*.adoc text -*.textile text -*.mustache text -*.csv text -*.tab text -*.tsv text -*.sql text - -# Graphics -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.ico binary -*.svg text \ No newline at end of file diff --git a/.github/actions/build-and-test-solution/action.yml b/.github/actions/build-and-test-solution/action.yml new file mode 100644 index 0000000..9ce4cbb --- /dev/null +++ b/.github/actions/build-and-test-solution/action.yml @@ -0,0 +1,32 @@ +name: Build and test solution +description: Build and test solution +inputs: + dotnet-version: + description: 'The dotnet version' + default: '9.0.x' + configuration: + description: 'The dotnet build configuration' + default: 'Release' +runs: + using: "composite" + steps: + - name: Setup dotnet + uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ inputs.dotnet-version }} + + - name: Restore dependencies + shell: bash + run: dotnet restore + + - name: Build solution + shell: bash + run: dotnet build --configuration ${{ inputs.configuration }} --no-restore + + - name: Run unit tests + shell: bash + run: | + export TEST_PROJECTS=$(find ./tests -type f -name "*.Tests.csproj") + for project in $TEST_PROJECTS; do + dotnet test --configuration ${{ inputs.configuration }} $project --no-build --verbosity Normal --logger trx --collect:"XPlat Code Coverage" --results-directory:"test-results/coverage/" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.ExcludeByAttribute=GeneratedCodeAttribute,CompilerGeneratedAttribute,ExcludeFromCodeCoverageAttribute + done diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml new file mode 100644 index 0000000..9e0fe72 --- /dev/null +++ b/.github/workflows/build-and-test.yml @@ -0,0 +1,40 @@ +name: Build and test + +on: + push: + branches: + - main + paths: + - 'src/**' + - 'tests/**' + pull_request: + branches: + - main + +# Permissions for the 'Publish test results' action +permissions: + contents: read + issues: read + checks: write + pull-requests: write + +jobs: + build-and-test: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [windows-latest, ubuntu-latest, macos-latest] + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Build and test solution + uses: ./.github/actions/build-and-test-solution + + - name: Publish test results + if: matrix.os == 'ubuntu-latest' + uses: EnricoMi/publish-unit-test-result-action@v2 + with: + files: | + test-results/**/*.trx diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml deleted file mode 100644 index daca051..0000000 --- a/.github/workflows/dotnet.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: .NET - -on: - push: - -jobs: - build: - - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [windows-latest, ubuntu-latest, macos-latest] - - steps: - - uses: actions/checkout@v2 - - name: Setup .NET - uses: actions/setup-dotnet@v1 - with: - dotnet-version: 8.0.x - - name: Restore dependencies - run: dotnet restore ./src/Cake.Compression.sln - - name: Build - run: dotnet build ./src/Cake.Compression.sln --no-restore - - name: Test - run: dotnet test ./src/Cake.Compression.sln --no-build --verbosity normal \ No newline at end of file diff --git a/.github/workflows/publish-nuget.yml b/.github/workflows/publish-nuget.yml new file mode 100644 index 0000000..0cca910 --- /dev/null +++ b/.github/workflows/publish-nuget.yml @@ -0,0 +1,29 @@ +name: Publish NuGet + +on: + push: + tags: + - v*.*.* + +env: + NUGET_PACKAGE_DIR: ./nupkg + NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} + NUGET_SOURCE: ${{ vars.NUGET_SOURCE }} + +jobs: + publish-nuget: + if: github.event.base_ref == 'refs/heads/main' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Build and test solution + uses: ./.github/actions/build-and-test-solution + + - name: Pack NuGet packages + run: dotnet pack --configuration Release --no-build --output $NUGET_PACKAGE_DIR + + - name: Publish NuGet packages and symbols + run: dotnet nuget push $NUGET_PACKAGE_DIR/*.nupkg --api-key $NUGET_API_KEY --source $NUGET_SOURCE diff --git a/.gitignore b/.gitignore index 119b008..26f53b8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,10 @@ ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore # User-specific files +*.rsuser *.suo *.user *.userosscache @@ -10,6 +13,9 @@ # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs +# Mono auto generated files +mono_crash.* + # Build results [Dd]ebug/ [Dd]ebugPublic/ @@ -17,41 +23,62 @@ [Rr]eleases/ x64/ x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ bld/ [Bb]in/ [Oo]bj/ [Ll]og/ +[Ll]ogs/ -# Visual Studio 2015 cache/options directory +# Visual Studio 2015/2017 cache/options directory .vs/ # Uncomment if you have tasks that create the project's static files in wwwroot #wwwroot/ +# Visual Studio 2017 auto generated files +Generated\ Files/ + # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* -# NUNIT +# NUnit *.VisualState.xml TestResult.xml +nunit-*.xml # Build Results of an ATL Project [Dd]ebugPS/ [Rr]eleasePS/ dlldata.c -# DNX +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core project.lock.json +project.fragment.lock.json artifacts/ +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio *_i.c *_p.c -*_i.h +*_h.h *.ilk *.meta *.obj +*.iobj *.pch *.pdb +*.ipdb *.pgc *.pgd *.rsp @@ -61,7 +88,9 @@ artifacts/ *.tlh *.tmp *.tmp_proj +*_wpftmp.csproj *.log +*.tlog *.vspscc *.vssscc .builds @@ -80,6 +109,8 @@ ipch/ *.opensdf *.sdf *.cachefile +*.VC.db +*.VC.VC.opendb # Visual Studio profiler *.psess @@ -87,6 +118,9 @@ ipch/ *.vspx *.sap +# Visual Studio Trace Files +*.e2e + # TFS 2012 Local Workspace $tf/ @@ -98,15 +132,25 @@ _ReSharper*/ *.[Rr]e[Ss]harper *.DotSettings.user -# JustCode is a .NET coding add-in -.JustCode - # TeamCity is a build add-in _TeamCity* # DotCover is a Code Coverage Tool *.dotCover +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + # NCrunch _NCrunch_* .*crunch*.local.xml @@ -138,20 +182,27 @@ publish/ # Publish Web Output *.[Pp]ublish.xml *.azurePubxml -# TODO: Comment the next line if you want to checkin your web deploy settings +# Note: Comment the next line if you want to checkin your web deploy settings, # but database connection strings (with potential passwords) will be unencrypted *.pubxml *.publishproj +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + # NuGet Packages *.nupkg +# NuGet Symbol Packages +*.snupkg # The packages folder can be ignored because of Package Restore -**/packages/* +**/[Pp]ackages/* # except build/, which is used as an MSBuild target. -!**/packages/build/ +!**/[Pp]ackages/build/ # Uncomment if necessary however generally it will be regenerated when needed -#!**/packages/repositories.config -# NuGet v3's project.json files produces more ignoreable files +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files *.nuget.props *.nuget.targets @@ -163,18 +214,20 @@ csx/ ecf/ rcf/ -# Microsoft Azure ApplicationInsights config file -ApplicationInsights.config - -# Windows Store app package directory +# Windows Store app package directories and files AppPackages/ BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload # Visual Studio cache files # files ending in .cache can be ignored *.[Cc]ache # but keep track of directories ending in .cache -!*.[Cc]ache/ +!?*.[Cc]ache/ # Others ClientBin/ @@ -182,11 +235,19 @@ ClientBin/ *~ *.dbmdl *.dbproj.schemaview +*.jfm *.pfx *.publishsettings -node_modules/ orleans.codegen.cs +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + # RIA/Silverlight projects Generated_Code/ @@ -197,15 +258,22 @@ _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak # SQL Server files *.mdf *.ldf +*.ndf # Business Intelligence projects *.rdl.data *.bim.layout *.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl # Microsoft Fakes FakesAssemblies/ @@ -215,6 +283,7 @@ FakesAssemblies/ # Node.js Tools for Visual Studio .ntvs_analysis.dat +node_modules/ # Visual Studio 6 build log *.plg @@ -222,6 +291,20 @@ FakesAssemblies/ # Visual Studio 6 workspace options file *.opt +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + # Visual Studio LightSwitch build output **/*.HTMLClient/GeneratedArtifacts **/*.DesktopClient/GeneratedArtifacts @@ -232,17 +315,85 @@ _Pvt_Extensions # Paket dependency manager .paket/paket.exe +paket-files/ # FAKE - F# Make .fake/ -# SandCastle Docs -**/[Dd]ocs/[Hh]elp +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ -# Cake -**/artifacts/* -**/tools/* -!**/tools/packages.config +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp -# Rider -.idea/ \ No newline at end of file +# JetBrains Rider +.idea/ +*.sln.iml diff --git a/Cake.Compression.sln b/Cake.Compression.sln new file mode 100644 index 0000000..64cd80b --- /dev/null +++ b/Cake.Compression.sln @@ -0,0 +1,39 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36301.6 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cake.Compression", "src\Cake.Compression\Cake.Compression.csproj", "{978AD8C9-1363-4C75-A51E-205FEE4A9376}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{683DB8BF-2DC6-4334-97CA-FF99043FD9FD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cake.Compression.Tests", "tests\Cake.Compression.Tests\Cake.Compression.Tests.csproj", "{08B15274-DDDD-4407-9280-5940AC3D3CC5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {978AD8C9-1363-4C75-A51E-205FEE4A9376}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {978AD8C9-1363-4C75-A51E-205FEE4A9376}.Debug|Any CPU.Build.0 = Debug|Any CPU + {978AD8C9-1363-4C75-A51E-205FEE4A9376}.Release|Any CPU.ActiveCfg = Release|Any CPU + {978AD8C9-1363-4C75-A51E-205FEE4A9376}.Release|Any CPU.Build.0 = Release|Any CPU + {08B15274-DDDD-4407-9280-5940AC3D3CC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {08B15274-DDDD-4407-9280-5940AC3D3CC5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {08B15274-DDDD-4407-9280-5940AC3D3CC5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {08B15274-DDDD-4407-9280-5940AC3D3CC5}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {978AD8C9-1363-4C75-A51E-205FEE4A9376} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {08B15274-DDDD-4407-9280-5940AC3D3CC5} = {683DB8BF-2DC6-4334-97CA-FF99043FD9FD} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A2EBF436-64E6-43E6-9C30-C55788575F35} + EndGlobalSection +EndGlobal diff --git a/README.md b/README.md index 37cad7b..922778f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Cake.Compression -[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE.txt) -[![Build status](https://ci.appveyor.com/api/projects/status/6a3mixcwnvb1q4nn/branch/master?svg=true)](https://ci.appveyor.com/project/ArturKordowski/cake-compression/branch/master) +[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/akordowski/Cake.Compression/LICENSE) +[![Build status](https://github.com/akordowski/Cake.Compression/actions/workflows/build-and-test.yml/badge.svg)](https://github.com/akordowski/Cake.Compression/actions/workflows/build-and-test.yml) [![NuGet Version](https://img.shields.io/nuget/v/Cake.Compression.svg)](https://www.nuget.org/packages/Cake.Compression/) A Cake AddIn which provides compression functionality for BZip2, GZip and Zip. @@ -18,4 +18,4 @@ or directly in your build script via a Cake `#addin` directive: ```csharp #addin nuget:?package=SharpZipLib #addin nuget:?package=Cake.Compression -``` \ No newline at end of file +``` diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 1b8067a..610f54e 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -1,56 +1,57 @@ ### 0.4.0 -Update to Cake 5.0.0 -Add framework support for `net8.0` -Drop framework support for `netcoreapp3.1`, `net5.0`, `net6.0` +Refactor project and tests +Update to `Cake 5.0.0` +Add framework support for `net8.0` and `net9.0` +Drop framework support for `netcoreapp3.1`, `net5.0`, `net6.0` ### 0.3.0 -Update to Cake 2.0.0 -Add framework support for `netcoreapp3.1`, `net6.0` -Drop framework support for `net461`, `netstandard2.0` -Update contrib icon -Update dependencies +Update to `Cake 2.0.0` +Add framework support for `netcoreapp3.1`, `net6.0` +Drop framework support for `net461`, `netstandard2.0` +Update contrib icon +Update dependencies Add GitHub Action ### 0.2.6 Add framework support for `net461`, `netstandard2.0`, `net5.0` ### 0.2.5 -Update to Cake 1.0. -Update dependencies. +Update to `Cake 1.0` +Update dependencies ### 0.2.4 -Update dependencies. +Update dependencies ### 0.2.3 -Update dependencies. +Update dependencies ### 0.2.2 -Update dependencies. +Update dependencies ### 0.2.1 -Fix nuspec to target SharpZipLib 1.0.0-rc1. +Fix nuspec to target `SharpZipLib 1.0.0-rc1` ### 0.2.0 -Update to target .netstandard2.0. -Update SharpZipLib to version 1.0.0-rc1. +Update to target `.netstandard2.0` +Update to `SharpZipLib 1.0.0-rc1` ### 0.1.7 -Update to Cake 0.29.0. +Update to `Cake 0.29.0` ### 0.1.6 -* #13 Bugfix +#13 Bugfix ### 0.1.5 -Update to Cake 0.26.1. +Update to `Cake 0.26.1` ### 0.1.4 -Update to Cake 0.22.0. +Update to `Cake 0.22.0` ### 0.1.2 -* #8 Sets date on zip entries +#8 Sets date on zip entries ### 0.1.1 -Update to Cake 0.18.0. +Update to `Cake 0.18.0` ### 0.1.0 -Initial Release. \ No newline at end of file +Initial release diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 3de3c51..0000000 --- a/appveyor.yml +++ /dev/null @@ -1,17 +0,0 @@ -image: Visual Studio 2022 - -skip_commits: - files: - - nuspec/* - - tools/* - - '**/*.cake' - - '**/*.md' - - '**/*.yml' - -init: - - git config --global core.autocrlf true - -build_script: - - ps: .\build.ps1 -settings_skipverification=true -target AppVeyor - -test: off \ No newline at end of file diff --git a/build.bat b/build.bat deleted file mode 100644 index 2ff2176..0000000 --- a/build.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -powershell ./build.ps1 --settings_skipverification=true %CAKE_ARGS% %* \ No newline at end of file diff --git a/build.cake b/build.cake deleted file mode 100644 index 6d6dbdb..0000000 --- a/build.cake +++ /dev/null @@ -1,31 +0,0 @@ -#load nuget:https://www.myget.org/F/arkord/api/v2?package=Cake.Baker - -var twitterMessage = Messages.DefaultMessage + "\n#cakebuild #nuget #csharp #dotnet"; - -Task("CreateImage") - .IsDependeeOf("Image") - .Does(() => - { - var pathTarget = Build.Paths.Directories.Image.Combine("lib/net8.0"); - var pathSource = string.Format("{0}/{1}/**/{1}.*", Build.Paths.Directories.PublishedLibraries, Build.Parameters.Title); - var files = GetFiles(pathSource).Where(fileSystemInfo => - { - var fullPath = fileSystemInfo.FullPath; - return fullPath.EndsWith(".dll") || fullPath.EndsWith(".pdb") || fullPath.EndsWith(".xml"); - }); - - CleanDirectory(pathTarget); - CopyFiles(Build.Paths.Files.License.ToString(), Build.Paths.Directories.Image); - CopyFiles(files, pathTarget); - }); - -Build - .SetParameters( - "Cake.Compression", - "akordowski", - shouldPublishToNuGet:true, - shouldPublishToGitHub:true, - shouldPostToTwitter:true) - .SetMessages( - twitterMessage: twitterMessage) - .Run(); \ No newline at end of file diff --git a/build.ps1 b/build.ps1 deleted file mode 100644 index 21821d2..0000000 --- a/build.ps1 +++ /dev/null @@ -1,13 +0,0 @@ -$ErrorActionPreference = 'Stop' - -Set-Location -LiteralPath $PSScriptRoot - -$env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE = '1' -$env:DOTNET_CLI_TELEMETRY_OPTOUT = '1' -$env:DOTNET_NOLOGO = '1' - -dotnet tool restore -if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } - -dotnet cake @args -if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } diff --git a/build.sh b/build.sh deleted file mode 100644 index 31be886..0000000 --- a/build.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash -set -euox pipefail - -cd "$(dirname "${BASH_SOURCE[0]}")" - -export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 -export DOTNET_CLI_TELEMETRY_OPTOUT=1 -export DOTNET_NOLOGO=1 - -dotnet tool restore - -dotnet cake "$@" diff --git a/nuget.config b/nuget.config new file mode 100644 index 0000000..a63a3ea --- /dev/null +++ b/nuget.config @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + diff --git a/nuget/NUGET.md b/nuget/NUGET.md new file mode 100644 index 0000000..922778f --- /dev/null +++ b/nuget/NUGET.md @@ -0,0 +1,21 @@ +# Cake.Compression +[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/akordowski/Cake.Compression/LICENSE) +[![Build status](https://github.com/akordowski/Cake.Compression/actions/workflows/build-and-test.yml/badge.svg)](https://github.com/akordowski/Cake.Compression/actions/workflows/build-and-test.yml) +[![NuGet Version](https://img.shields.io/nuget/v/Cake.Compression.svg)](https://www.nuget.org/packages/Cake.Compression/) + +A Cake AddIn which provides compression functionality for BZip2, GZip and Zip. + +## Referencing + +Cake.Compression is available as a nuget package from the package manager console: + +```csharp +Install-Package Cake.Compression +``` + +or directly in your build script via a Cake `#addin` directive: + +```csharp +#addin nuget:?package=SharpZipLib +#addin nuget:?package=Cake.Compression +``` diff --git a/nuget/NuGet.Package.props b/nuget/NuGet.Package.props new file mode 100644 index 0000000..143891e --- /dev/null +++ b/nuget/NuGet.Package.props @@ -0,0 +1,56 @@ + + + Debug;Release + true + true + $(NoWarn);NU5104 + + + 0.4.0 + + $(VersionPrefix)-$(VersionSuffix) + $(VersionPrefix) + + + 0.1.0 + + + Artur Kordowski + Cake.Compression + A Cake AddIn which provides compression functionality for BZip2, GZip and Zip. + cake-addin cake build compression bzip2 gzip tar zip + $(AssemblyName) + + + MIT + Copyright (c) 2016-present Artur Kordowski. All rights reserved. + https://github.com/akordowski/Cake.Compression + https://github.com/akordowski/Cake.Compression + true + + + cake-contrib-medium.png + cake-contrib-medium.png + NUGET.md + + + true + snupkg + + + bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml + + + + + + + + + + + + + + + diff --git a/assets/cake-contrib-medium.png b/nuget/cake-contrib-medium.png similarity index 100% rename from assets/cake-contrib-medium.png rename to nuget/cake-contrib-medium.png diff --git a/src/Cake.Compression.Tests/Cake.Compression.Tests.csproj b/src/Cake.Compression.Tests/Cake.Compression.Tests.csproj deleted file mode 100644 index 1f297b5..0000000 --- a/src/Cake.Compression.Tests/Cake.Compression.Tests.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - net8.0 - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Cake.Compression.Tests/Classes/BZip2Tests.cs b/src/Cake.Compression.Tests/Classes/BZip2Tests.cs deleted file mode 100644 index ad61746..0000000 --- a/src/Cake.Compression.Tests/Classes/BZip2Tests.cs +++ /dev/null @@ -1,190 +0,0 @@ -using Cake.Compression.Classes; -using Cake.Core; -using Cake.Core.Diagnostics; -using Cake.Core.IO; -using Cake.Testing; -using NSubstitute; -using NUnit.Framework; -using System; -using System.Collections.Generic; - -namespace Cake.Compression.Tests.Classes -{ - [TestFixture] - public class BZip2Test - { - #region Private Fields - private readonly DirectoryPath rootPath = "/Root"; - private readonly FilePath outputPath = "/archive.tar.bz2"; - private readonly IEnumerable filePaths = new FilePath[] { "/Root/file.txt" }; - private readonly int level = 6; - #endregion - - #region Constructor Tests - [Test] - public void Constructor_Should_Throw_If_FileSystem_Is_Null() - { - // Given - var environment = Substitute.For(); - var log = Substitute.For(); - - // Then - Assert.That(() => new BZip2(null, environment, log), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("fileSystem")); - } - - [Test] - public void Constructor_Should_Throw_If_Environment_Is_Null() - { - // Given - var fileSystem = Substitute.For(); - var log = Substitute.For(); - - // Then - Assert.That(() => new BZip2(fileSystem, null, log), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("environment")); - } - - [Test] - public void Constructor_Should_Throw_If_Log_Is_Null() - { - // Given - var fileSystem = Substitute.For(); - var environment = Substitute.For(); - - // Then - Assert.That(() => new BZip2(fileSystem, environment, null), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("log")); - } - #endregion - - #region Methods Tests - [Test] - public void Compress_Should_Throw_If_RootPath_Is_Null() - { - // Given - var fileSystem = Substitute.For(); - var environment = Substitute.For(); - var log = Substitute.For(); - var zip = new BZip2(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Compress(null, outputPath, filePaths, level), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("rootPath")); - } - - [Test] - public void Compress_Should_Throw_If_OutputPath_Is_Null() - { - // Given - var fileSystem = Substitute.For(); - var environment = Substitute.For(); - var log = Substitute.For(); - var zip = new BZip2(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Compress(rootPath, null, filePaths, level), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("outputPath")); - } - - [Test] - public void Compress_Should_Throw_If_FilePaths_Are_Null() - { - // Given - var fileSystem = Substitute.For(); - var environment = Substitute.For(); - var log = Substitute.For(); - var zip = new BZip2(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Compress(rootPath, outputPath, null, level), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("filePaths")); - } - - [TestCase(0)] - [TestCase(10)] - public void Compress_Should_Throw_If_Level_Is_Invalid(int compressLevel) - { - // Given - var fileSystem = Substitute.For(); - var environment = Substitute.For(); - var log = Substitute.For(); - var zip = new BZip2(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Compress(rootPath, outputPath, filePaths, compressLevel), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("level")); - } - - [Test] - public void Compress_Should_Throw_If_File_Is_Not_Relative_To_Root() - { - // Given - var environment = FakeEnvironment.CreateUnixEnvironment(); - var fileSystem = new FakeFileSystem(environment); - fileSystem.CreateFile("/NotRoot/file.txt"); - var log = Substitute.For(); - var zip = new BZip2(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Compress(rootPath, outputPath, new FilePath[] { "/NotRoot/file.txt" }, level), - Throws.InstanceOf() - .And.Message.EqualTo("File '/NotRoot/file.txt' is not relative to root path '/Root'.")); - } - - [Test] - public void Compress_Creates_BZip2_File() - { - // Given - var environment = FakeEnvironment.CreateUnixEnvironment(); - var fileSystem = new FakeFileSystem(environment); - fileSystem.CreateFile("/Root/file.txt"); - var log = Substitute.For(); - var zip = new BZip2(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Compress(rootPath, outputPath, filePaths, level), Throws.Nothing); - Assert.That(fileSystem.Exist(outputPath), Is.True); - } - - [Test] - public void Uncompress_Should_Throw_If_FilePath_Is_Null() - { - // Given - var fileSystem = Substitute.For(); - var environment = Substitute.For(); - var log = Substitute.For(); - var zip = new BZip2(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Uncompress(null, "/Uncompress"), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("filePath")); - } - - [Test] - public void Uncompress_Should_Throw_If_OutputPath_Is_Null() - { - // Given - var filePath = "/archive.tar.bz2"; - var environment = FakeEnvironment.CreateUnixEnvironment(); - var fileSystem = new FakeFileSystem(environment); - fileSystem.CreateFile(filePath); - var log = Substitute.For(); - var zip = new BZip2(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Uncompress(filePath, null), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("outputPath")); - } - #endregion - } -} \ No newline at end of file diff --git a/src/Cake.Compression.Tests/Classes/GZipTests.cs b/src/Cake.Compression.Tests/Classes/GZipTests.cs deleted file mode 100644 index 8b965e6..0000000 --- a/src/Cake.Compression.Tests/Classes/GZipTests.cs +++ /dev/null @@ -1,190 +0,0 @@ -using Cake.Compression.Classes; -using Cake.Core; -using Cake.Core.Diagnostics; -using Cake.Core.IO; -using Cake.Testing; -using NSubstitute; -using NUnit.Framework; -using System; -using System.Collections.Generic; - -namespace Cake.Compression.Tests.Classes -{ - [TestFixture] - public class GZipTest - { - #region Private Fields - private readonly DirectoryPath rootPath = "/Root"; - private readonly FilePath outputPath = "/archive.tar.gz"; - private readonly IEnumerable filePaths = new FilePath[] { "/Root/file.txt" }; - private readonly int level = 6; - #endregion - - #region Constructor Tests - [Test] - public void Constructor_Should_Throw_If_FileSystem_Is_Null() - { - // Given - var environment = Substitute.For(); - var log = Substitute.For(); - - // Then - Assert.That(() => new GZip(null, environment, log), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("fileSystem")); - } - - [Test] - public void Constructor_Should_Throw_If_Environment_Is_Null() - { - // Given - var fileSystem = Substitute.For(); - var log = Substitute.For(); - - // Then - Assert.That(() => new GZip(fileSystem, null, log), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("environment")); - } - - [Test] - public void Constructor_Should_Throw_If_Log_Is_Null() - { - // Given - var fileSystem = Substitute.For(); - var environment = Substitute.For(); - - // Then - Assert.That(() => new GZip(fileSystem, environment, null), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("log")); - } - #endregion - - #region Methods Tests - [Test] - public void Compress_Should_Throw_If_RootPath_Is_Null() - { - // Given - var fileSystem = Substitute.For(); - var environment = Substitute.For(); - var log = Substitute.For(); - var zip = new GZip(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Compress(null, outputPath, filePaths, level), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("rootPath")); - } - - [Test] - public void Compress_Should_Throw_If_OutputPath_Is_Null() - { - // Given - var fileSystem = Substitute.For(); - var environment = Substitute.For(); - var log = Substitute.For(); - var zip = new GZip(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Compress(rootPath, null, filePaths, level), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("outputPath")); - } - - [Test] - public void Compress_Should_Throw_If_FilePaths_Are_Null() - { - // Given - var fileSystem = Substitute.For(); - var environment = Substitute.For(); - var log = Substitute.For(); - var zip = new GZip(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Compress(rootPath, outputPath, null, level), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("filePaths")); - } - - [TestCase(0)] - [TestCase(10)] - public void Compress_Should_Throw_If_Level_Is_Invalid(int compressLevel) - { - // Given - var fileSystem = Substitute.For(); - var environment = Substitute.For(); - var log = Substitute.For(); - var zip = new GZip(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Compress(rootPath, outputPath, filePaths, compressLevel), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("level")); - } - - [Test] - public void Compress_Should_Throw_If_File_Is_Not_Relative_To_Root() - { - // Given - var environment = FakeEnvironment.CreateUnixEnvironment(); - var fileSystem = new FakeFileSystem(environment); - fileSystem.CreateFile("/NotRoot/file.txt"); - var log = Substitute.For(); - var zip = new GZip(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Compress(rootPath, outputPath, new FilePath[] { "/NotRoot/file.txt" }, level), - Throws.InstanceOf() - .And.Message.EqualTo("File '/NotRoot/file.txt' is not relative to root path '/Root'.")); - } - - [Test] - public void Compress_Creates_GZip_File() - { - // Given - var environment = FakeEnvironment.CreateUnixEnvironment(); - var fileSystem = new FakeFileSystem(environment); - fileSystem.CreateFile("/Root/file.txt"); - var log = Substitute.For(); - var zip = new GZip(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Compress(rootPath, outputPath, filePaths, level), Throws.Nothing); - Assert.That(fileSystem.Exist(outputPath), Is.True); - } - - [Test] - public void Uncompress_Should_Throw_If_FilePath_Is_Null() - { - // Given - var fileSystem = Substitute.For(); - var environment = Substitute.For(); - var log = Substitute.For(); - var zip = new GZip(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Uncompress(null, "/Uncompress"), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("filePath")); - } - - [Test] - public void Uncompress_Should_Throw_If_OutputPath_Is_Null() - { - // Given - var filePath = "/archive.tar.gz"; - var environment = FakeEnvironment.CreateUnixEnvironment(); - var fileSystem = new FakeFileSystem(environment); - fileSystem.CreateFile(filePath); - var log = Substitute.For(); - var zip = new GZip(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Uncompress(filePath, null), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("outputPath")); - } - #endregion - } -} \ No newline at end of file diff --git a/src/Cake.Compression.Tests/Classes/ZipTest.cs b/src/Cake.Compression.Tests/Classes/ZipTest.cs deleted file mode 100644 index 529bef4..0000000 --- a/src/Cake.Compression.Tests/Classes/ZipTest.cs +++ /dev/null @@ -1,190 +0,0 @@ -using Cake.Compression.Classes; -using Cake.Core; -using Cake.Core.Diagnostics; -using Cake.Core.IO; -using Cake.Testing; -using NSubstitute; -using NUnit.Framework; -using System; -using System.Collections.Generic; - -namespace Cake.Compression.Tests.Classes -{ - [TestFixture] - public class ZipTest - { - #region Private Fields - private readonly DirectoryPath rootPath = "/Root"; - private readonly FilePath outputPath = "/archive.zip"; - private readonly IEnumerable filePaths = new FilePath[] { "/Root/file.txt" }; - private readonly int level = 6; - #endregion - - #region Constructor Tests - [Test] - public void Constructor_Should_Throw_If_FileSystem_Is_Null() - { - // Given - var environment = Substitute.For(); - var log = Substitute.For(); - - // Then - Assert.That(() => new Zip(null, environment, log), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("fileSystem")); - } - - [Test] - public void Constructor_Should_Throw_If_Environment_Is_Null() - { - // Given - var fileSystem = Substitute.For(); - var log = Substitute.For(); - - // Then - Assert.That(() => new Zip(fileSystem, null, log), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("environment")); - } - - [Test] - public void Constructor_Should_Throw_If_Log_Is_Null() - { - // Given - var fileSystem = Substitute.For(); - var environment = Substitute.For(); - - // Then - Assert.That(() => new Zip(fileSystem, environment, null), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("log")); - } - #endregion - - #region Methods Tests - [Test] - public void Compress_Should_Throw_If_RootPath_Is_Null() - { - // Given - var fileSystem = Substitute.For(); - var environment = Substitute.For(); - var log = Substitute.For(); - var zip = new Zip(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Compress(null, outputPath, filePaths, level), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("rootPath")); - } - - [Test] - public void Compress_Should_Throw_If_OutputPath_Is_Null() - { - // Given - var fileSystem = Substitute.For(); - var environment = Substitute.For(); - var log = Substitute.For(); - var zip = new Zip(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Compress(rootPath, null, filePaths, level), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("outputPath")); - } - - [Test] - public void Compress_Should_Throw_If_FilePaths_Are_Null() - { - // Given - var fileSystem = Substitute.For(); - var environment = Substitute.For(); - var log = Substitute.For(); - var zip = new Zip(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Compress(rootPath, outputPath, null, level), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("filePaths")); - } - - [TestCase(0)] - [TestCase(10)] - public void Compress_Should_Throw_If_Level_Is_Invalid(int compressLevel) - { - // Given - var fileSystem = Substitute.For(); - var environment = Substitute.For(); - var log = Substitute.For(); - var zip = new Zip(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Compress(rootPath, outputPath, filePaths, compressLevel), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("level")); - } - - [Test] - public void Compress_Should_Throw_If_File_Is_Not_Relative_To_Root() - { - // Given - var environment = FakeEnvironment.CreateUnixEnvironment(); - var fileSystem = new FakeFileSystem(environment); - fileSystem.CreateFile("/NotRoot/file.txt"); - var log = Substitute.For(); - var zip = new Zip(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Compress(rootPath, outputPath, new FilePath[] { "/NotRoot/file.txt" }, level), - Throws.InstanceOf() - .And.Message.EqualTo("File '/NotRoot/file.txt' is not relative to root path '/Root'.")); - } - - [Test] - public void Compress_Creates_Zip_File() - { - // Given - var environment = FakeEnvironment.CreateUnixEnvironment(); - var fileSystem = new FakeFileSystem(environment); - fileSystem.CreateFile("/Root/file.txt"); - var log = Substitute.For(); - var zip = new Zip(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Compress(rootPath, outputPath, filePaths, level), Throws.Nothing); - Assert.That(fileSystem.Exist(outputPath), Is.True); - } - - [Test] - public void Uncompress_Should_Throw_If_FilePath_Is_Null() - { - // Given - var fileSystem = Substitute.For(); - var environment = Substitute.For(); - var log = Substitute.For(); - var zip = new Zip(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Uncompress(null, "/Uncompress"), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("filePath")); - } - - [Test] - public void Uncompress_Should_Throw_If_OutputPath_Is_Null() - { - // Given - var filePath = "/archive.zip"; - var environment = FakeEnvironment.CreateUnixEnvironment(); - var fileSystem = new FakeFileSystem(environment); - fileSystem.CreateFile(filePath); - var log = Substitute.For(); - var zip = new Zip(fileSystem, environment, log); - - // Then - Assert.That(() => zip.Uncompress(filePath, null), - Throws.InstanceOf() - .And.Property("ParamName").EqualTo("outputPath")); - } - #endregion - } -} \ No newline at end of file diff --git a/src/Cake.Compression.sln b/src/Cake.Compression.sln deleted file mode 100644 index af22471..0000000 --- a/src/Cake.Compression.sln +++ /dev/null @@ -1,48 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.1.32421.90 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cake.Compression", "Cake.Compression\Cake.Compression.csproj", "{DFCE574D-731A-4C89-9B74-9FF2A93ED966}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{5CF45611-BAAE-42E7-BD9C-3910A7DEB68C}" - ProjectSection(SolutionItems) = preProject - ..\build.bat = ..\build.bat - ..\build.cake = ..\build.cake - ..\build.ps1 = ..\build.ps1 - ..\build.sh = ..\build.sh - ..\.github\workflows\dotnet.yml = ..\.github\workflows\dotnet.yml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Project", "Project", "{8CF42A9F-2A6F-4E2B-9495-A90E3A0A3032}" - ProjectSection(SolutionItems) = preProject - ..\appveyor.yml = ..\appveyor.yml - ..\LICENSE = ..\LICENSE - ..\README.md = ..\README.md - ..\RELEASENOTES.md = ..\RELEASENOTES.md - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cake.Compression.Tests", "Cake.Compression.Tests\Cake.Compression.Tests.csproj", "{3BBE9E87-073D-4191-9A4B-13ED553FA7DA}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DFCE574D-731A-4C89-9B74-9FF2A93ED966}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DFCE574D-731A-4C89-9B74-9FF2A93ED966}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DFCE574D-731A-4C89-9B74-9FF2A93ED966}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DFCE574D-731A-4C89-9B74-9FF2A93ED966}.Release|Any CPU.Build.0 = Release|Any CPU - {3BBE9E87-073D-4191-9A4B-13ED553FA7DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3BBE9E87-073D-4191-9A4B-13ED553FA7DA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3BBE9E87-073D-4191-9A4B-13ED553FA7DA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3BBE9E87-073D-4191-9A4B-13ED553FA7DA}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {FFF88EAA-356D-491C-A3DA-3037CCE6EA6F} - EndGlobalSection -EndGlobal diff --git a/src/Cake.Compression/Cake.Compression.csproj b/src/Cake.Compression/Cake.Compression.csproj index d0672eb..9ee0250 100644 --- a/src/Cake.Compression/Cake.Compression.csproj +++ b/src/Cake.Compression/Cake.Compression.csproj @@ -1,32 +1,15 @@  + - net8.0 - true - 0.4.0 - Copyright (c) $([System.DateTime]::Now.Year) Artur Kordowski - A Cake AddIn which provides compression functionality for BZip2, GZip and Zip. - Artur Kordowski - https://github.com/akordowski/Cake.Compression - https://github.com/akordowski/Cake.Compression - cake-addin cake build compression bzip2 gzip tar zip - cake-contrib-medium.png - LICENSE + net8.0;net9.0 + $(NoWarn);CA1062;CA1724 - - bin\Release\net8.0\Cake.Compression.xml - - - - - + - - True - - - - True - - + + - \ No newline at end of file + + + + diff --git a/src/Cake.Compression/Classes/Bzip2.cs b/src/Cake.Compression/Classes/Bzip2.cs index 66bf5ec..2fb4ffe 100644 --- a/src/Cake.Compression/Classes/Bzip2.cs +++ b/src/Cake.Compression/Classes/Bzip2.cs @@ -1,109 +1,110 @@ -using Cake.Core; +using Cake.Core; using Cake.Core.Diagnostics; using Cake.Core.IO; using ICSharpCode.SharpZipLib.BZip2; using ICSharpCode.SharpZipLib.Tar; -using System.Collections.Generic; -using System.IO; using System.Text; -namespace Cake.Compression.Classes +namespace Cake.Compression.Classes; + +/// +/// Provides a class. +/// +public sealed class BZip2 : CompressionBase { /// - /// Provides a class. + /// Initializes a new instance of the class. /// - public class BZip2 : CompressionBase + public BZip2( + IFileSystem fileSystem, + ICakeEnvironment environment, + ICakeLog log) + : base(fileSystem, environment, log) { - #region Constructor - /// - /// Initializes a new instance of the class. - /// - public BZip2(IFileSystem fileSystem, ICakeEnvironment environment, ICakeLog log) - : base(fileSystem, environment, log) - { - } - #endregion - - #region Public Methods - /// - /// Create a BZip2 Tar archive of the specified files. - /// - /// The root path. - /// The output path. - /// The file paths. - /// The compression level (1-9). - public override void Compress(DirectoryPath rootPath, FilePath outputPath, IEnumerable filePaths, int level) - { - Precondition.IsNotNull(rootPath, nameof(rootPath)); - Precondition.IsNotNull(outputPath, nameof(outputPath)); - Precondition.IsNotNull(filePaths, nameof(filePaths)); - Precondition.IsBetween(level, 1, 9, nameof(level)); + } + + /// + /// Create a BZip2 Tar archive of the specified files. + /// + /// The root path. + /// The output path. + /// The file paths. + /// The compression level (1-9). + public override void Compress( + DirectoryPath rootPath, + FilePath outputPath, + IEnumerable filePaths, + int level) + { + ArgumentNullException.ThrowIfNull(rootPath, nameof(rootPath)); + ArgumentNullException.ThrowIfNull(outputPath, nameof(outputPath)); + ArgumentNullException.ThrowIfNull(filePaths, nameof(filePaths)); + ArgumentOutOfRangeException.ThrowIfLessThan(level, 1, nameof(level)); + ArgumentOutOfRangeException.ThrowIfGreaterThan(level, 9, nameof(level)); - // Make root path and output file path absolute. - rootPath = rootPath.MakeAbsolute(environment); - outputPath = outputPath.MakeAbsolute(environment); + // Make root path and output file path absolute. + rootPath = rootPath.MakeAbsolute(Environment); + outputPath = outputPath.MakeAbsolute(Environment); - // Get the output file. - var outputFile = fileSystem.GetFile(outputPath); + // Get the output file. + var outputFile = FileSystem.GetFile(outputPath); - // Open up a stream to the output file. - log.Verbose("Creating BZip2 file: {0}", outputPath.FullPath); + // Open up a stream to the output file. + Log.Verbose("Creating BZip2 file: {0}", outputPath.FullPath); - using (var outputStream = outputFile.Open(FileMode.Create, FileAccess.Write, FileShare.None)) - using (var bzip2OutputStream = new BZip2OutputStream(outputStream, level)) - using (var tarOutputStream = new TarOutputStream(bzip2OutputStream, Encoding.UTF8)) + using (var outputStream = outputFile.Open(FileMode.Create, FileAccess.Write, FileShare.None)) + using (var bzip2OutputStream = new BZip2OutputStream(outputStream, level)) + using (var tarOutputStream = new TarOutputStream(bzip2OutputStream, Encoding.UTF8)) + { + foreach (var inputPath in filePaths) { - foreach (var inputPath in filePaths) + var absoluteInputPath = inputPath.MakeAbsolute(Environment); + var file = FileSystem.GetFile(absoluteInputPath); + + using (var inputStream = file.Open(FileMode.Open, FileAccess.Read, FileShare.Read)) { - var absoluteInputPath = inputPath.MakeAbsolute(environment); - var file = fileSystem.GetFile(absoluteInputPath); - - using (var inputStream = file.Open(FileMode.Open, FileAccess.Read, FileShare.Read)) - { - // Get the relative filename to the rootPath. - var relativeFilePath = GetRelativeFilePath(rootPath, absoluteInputPath); - log.Verbose("Compressing file {0}", absoluteInputPath); - - // Create the tar archive entry. - TarEntry entry = TarEntry.CreateTarEntry(relativeFilePath.FullPath); - entry.Size = inputStream.Length; - - tarOutputStream.PutNextEntry(entry); - inputStream.CopyTo(tarOutputStream); - tarOutputStream.CloseEntry(); - } + // Get the relative filename to the rootPath. + var relativeFilePath = GetRelativeFilePath(rootPath, absoluteInputPath); + Log.Verbose("Compressing file {0}", absoluteInputPath); + + // Create the tar archive entry. + var entry = TarEntry.CreateTarEntry(relativeFilePath.FullPath); + entry.Size = inputStream.Length; + + tarOutputStream.PutNextEntry(entry); + inputStream.CopyTo(tarOutputStream); + tarOutputStream.CloseEntry(); } } - - log.Verbose("BZip2 file successfully created: {0}", outputPath.FullPath); } - /// - /// Uncompress the specified BZip2 Tar file. - /// - /// BZip2 file to uncompress. - /// Output path to uncompress into. - public override void Uncompress(FilePath filePath, DirectoryPath outputPath) - { - Precondition.IsNotNull(filePath, nameof(filePath)); - Precondition.IsNotNull(outputPath, nameof(outputPath)); + Log.Verbose("BZip2 file successfully created: {0}", outputPath.FullPath); + } - // Make root path and output file path absolute. - filePath = filePath.MakeAbsolute(environment); - outputPath = outputPath.MakeAbsolute(environment); + /// + /// Decompress the specified BZip2 Tar file. + /// + /// BZip2 file to decompress. + /// Output path to decompress into. + public override void Decompress(FilePath filePath, DirectoryPath outputPath) + { + ArgumentNullException.ThrowIfNull(filePath, nameof(filePath)); + ArgumentNullException.ThrowIfNull(outputPath, nameof(outputPath)); - var file = fileSystem.GetFile(filePath); + // Make root path and output file path absolute. + filePath = filePath.MakeAbsolute(Environment); + outputPath = outputPath.MakeAbsolute(Environment); - log.Verbose("Uncompress BZip2 file {0} to {1}", filePath.FullPath, outputPath.FullPath); + var file = FileSystem.GetFile(filePath); - using (Stream inputStream = file.Open(FileMode.Open, FileAccess.Read, FileShare.Read)) - using (Stream bzip2InputStream = new BZip2InputStream(inputStream)) - { - TarArchive archive = TarArchive.CreateInputTarArchive(bzip2InputStream, Encoding.UTF8); - archive.ExtractContents(outputPath.FullPath); - archive.Close(); - } + Log.Verbose("Decompress BZip2 file {0} to {1}", filePath.FullPath, outputPath.FullPath); + + using (var inputStream = file.Open(FileMode.Open, FileAccess.Read, FileShare.Read)) + using (var bzip2InputStream = new BZip2InputStream(inputStream)) + { + var archive = TarArchive.CreateInputTarArchive(bzip2InputStream, Encoding.UTF8); + archive.ExtractContents(outputPath.FullPath); + archive.Close(); } - #endregion } -} \ No newline at end of file +} diff --git a/src/Cake.Compression/Classes/CompressionBase.cs b/src/Cake.Compression/Classes/CompressionBase.cs index 5afb9f0..8545ba7 100644 --- a/src/Cake.Compression/Classes/CompressionBase.cs +++ b/src/Cake.Compression/Classes/CompressionBase.cs @@ -1,94 +1,90 @@ -using Cake.Core; +using Cake.Core; using Cake.Core.Diagnostics; using Cake.Core.IO; -using System; -using System.Collections.Generic; -using System.Globalization; -namespace Cake.Compression.Classes +namespace Cake.Compression.Classes; + +/// +/// Provides a class. +/// +public abstract class CompressionBase { /// - /// Provides a class. + /// Gets the file system. /// - public abstract class CompressionBase - { - #region Protected Fields - /// - /// Gets the file system. - /// - protected readonly IFileSystem fileSystem; + protected IFileSystem FileSystem { get; } - /// - /// Gets the environment. - /// - protected readonly ICakeEnvironment environment; + /// + /// Gets the environment. + /// + protected ICakeEnvironment Environment { get; } - /// - /// Gets the log. - /// - protected readonly ICakeLog log; + /// + /// Gets the log. + /// + protected ICakeLog Log { get; } - /// - /// Gets the string comparison. - /// - protected readonly StringComparison comparison; - #endregion + /// + /// Gets the string comparison. + /// + protected StringComparison Comparison { get; } - #region Constructor - /// - /// Initializes a new instance of the class. - /// - /// The file system. - /// The environment. - /// The log. - protected CompressionBase(IFileSystem fileSystem, ICakeEnvironment environment, ICakeLog log) - { - Precondition.IsNotNull(fileSystem, nameof(fileSystem)); - Precondition.IsNotNull(environment, nameof(environment)); - Precondition.IsNotNull(log, nameof(log)); + /// + /// Initializes a new instance of the class. + /// + /// The file system. + /// The environment. + /// The log. + protected CompressionBase( + IFileSystem fileSystem, + ICakeEnvironment environment, + ICakeLog log) + { + ArgumentNullException.ThrowIfNull(fileSystem, nameof(fileSystem)); + ArgumentNullException.ThrowIfNull(environment, nameof(environment)); + ArgumentNullException.ThrowIfNull(log, nameof(log)); - this.fileSystem = fileSystem; - this.environment = environment; - this.log = log; - this.comparison = environment.Platform.IsUnix() ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase; - } - #endregion + FileSystem = fileSystem; + Environment = environment; + Log = log; + Comparison = environment.Platform.IsUnix() + ? StringComparison.Ordinal + : StringComparison.OrdinalIgnoreCase; + } - #region Public Methods - /// - /// Create a archive of the specified files. - /// - /// The root path. - /// The output path. - /// The file paths. - /// The compression level (1-9). - public abstract void Compress(DirectoryPath rootPath, FilePath outputPath, IEnumerable filePaths, int level); + /// + /// Create a archive of the specified files. + /// + /// The root path. + /// The output path. + /// The file paths. + /// The compression level (1-9). + public abstract void Compress( + DirectoryPath rootPath, + FilePath outputPath, + IEnumerable filePaths, + int level); - /// - /// Uncompress the specified archive. - /// - /// Archive to uncompress. - /// Output path to uncompress into. - public abstract void Uncompress(FilePath filePath, DirectoryPath outputPath); - #endregion + /// + /// Decompress the specified archive. + /// + /// Archive to decompress. + /// Output path to decompress into. + public abstract void Decompress(FilePath filePath, DirectoryPath outputPath); - #region Protected Methods - /// - /// Gets a relative file path. - /// - /// A directory path. - /// A file path. - /// Returns a relative file path. - protected FilePath GetRelativeFilePath(DirectoryPath root, FilePath file) + /// + /// Gets a relative file path. + /// + /// A directory path. + /// A file path. + /// Returns a relative file path. + protected FilePath GetRelativeFilePath(DirectoryPath root, FilePath file) + { + if (file.FullPath.StartsWith(root.FullPath, Comparison)) { - if (!file.FullPath.StartsWith(root.FullPath, comparison)) - { - const string format = "File '{0}' is not relative to root path '{1}'."; - throw new CakeException(string.Format(CultureInfo.InvariantCulture, format, file.FullPath, root.FullPath)); - } - - return file.FullPath.Substring(root.FullPath.Length + 1); + return file.FullPath[(root.FullPath.Length + 1)..]; } - #endregion + + throw new CakeException($"File '{file.FullPath}' is not relative to root path '{root.FullPath}'."); } -} \ No newline at end of file +} diff --git a/src/Cake.Compression/Classes/GZip.cs b/src/Cake.Compression/Classes/GZip.cs index 8853ddf..1167ea6 100644 --- a/src/Cake.Compression/Classes/GZip.cs +++ b/src/Cake.Compression/Classes/GZip.cs @@ -1,111 +1,112 @@ -using Cake.Core; +using Cake.Core; using Cake.Core.Diagnostics; using Cake.Core.IO; using ICSharpCode.SharpZipLib.GZip; using ICSharpCode.SharpZipLib.Tar; -using System.Collections.Generic; -using System.IO; using System.Text; -namespace Cake.Compression.Classes +namespace Cake.Compression.Classes; + +/// +/// Provides a class. +/// +public sealed class GZip : CompressionBase { /// - /// Provides a class. + /// Initializes a new instance of the class. /// - public class GZip : CompressionBase + public GZip( + IFileSystem fileSystem, + ICakeEnvironment environment, + ICakeLog log) + : base(fileSystem, environment, log) { - #region Constructor - /// - /// Initializes a new instance of the class. - /// - public GZip(IFileSystem fileSystem, ICakeEnvironment environment, ICakeLog log) - : base(fileSystem, environment, log) - { - } - #endregion - - #region Public Methods - /// - /// Create a GZip Tar archive of the specified files. - /// - /// The root path. - /// The output path. - /// The file paths. - /// The compression level (1-9). - public override void Compress(DirectoryPath rootPath, FilePath outputPath, IEnumerable filePaths, int level) - { - Precondition.IsNotNull(rootPath, nameof(rootPath)); - Precondition.IsNotNull(outputPath, nameof(outputPath)); - Precondition.IsNotNull(filePaths, nameof(filePaths)); - Precondition.IsBetween(level, 1, 9, nameof(level)); + } + + /// + /// Create a GZip Tar archive of the specified files. + /// + /// The root path. + /// The output path. + /// The file paths. + /// The compression level (1-9). + public override void Compress( + DirectoryPath rootPath, + FilePath outputPath, + IEnumerable filePaths, + int level) + { + ArgumentNullException.ThrowIfNull(rootPath, nameof(rootPath)); + ArgumentNullException.ThrowIfNull(outputPath, nameof(outputPath)); + ArgumentNullException.ThrowIfNull(filePaths, nameof(filePaths)); + ArgumentOutOfRangeException.ThrowIfLessThan(level, 1, nameof(level)); + ArgumentOutOfRangeException.ThrowIfGreaterThan(level, 9, nameof(level)); - // Make root path and output file path absolute. - rootPath = rootPath.MakeAbsolute(environment); - outputPath = outputPath.MakeAbsolute(environment); + // Make root path and output file path absolute. + rootPath = rootPath.MakeAbsolute(Environment); + outputPath = outputPath.MakeAbsolute(Environment); - // Get the output file. - var outputFile = fileSystem.GetFile(outputPath); + // Get the output file. + var outputFile = FileSystem.GetFile(outputPath); - // Open up a stream to the output file. - log.Verbose("Creating Zip file: {0}", outputPath.FullPath); + // Open up a stream to the output file. + Log.Verbose("Creating Zip file: {0}", outputPath.FullPath); - using (var outputStream = outputFile.Open(FileMode.Create, FileAccess.Write, FileShare.None)) - using (var gzipOutputStream = new GZipOutputStream(outputStream)) - using (var tarOutputStream = new TarOutputStream(gzipOutputStream, Encoding.UTF8)) + using (var outputStream = outputFile.Open(FileMode.Create, FileAccess.Write, FileShare.None)) + using (var gzipOutputStream = new GZipOutputStream(outputStream)) + using (var tarOutputStream = new TarOutputStream(gzipOutputStream, Encoding.UTF8)) + { + gzipOutputStream.SetLevel(level); + + foreach (var inputPath in filePaths) { - gzipOutputStream.SetLevel(level); + var absoluteInputPath = inputPath.MakeAbsolute(Environment); + var file = FileSystem.GetFile(absoluteInputPath); - foreach (var inputPath in filePaths) + using (var inputStream = file.Open(FileMode.Open, FileAccess.Read, FileShare.Read)) { - var absoluteInputPath = inputPath.MakeAbsolute(environment); - var file = fileSystem.GetFile(absoluteInputPath); - - using (var inputStream = file.Open(FileMode.Open, FileAccess.Read, FileShare.Read)) - { - // Get the relative filename to the rootPath. - var relativeFilePath = GetRelativeFilePath(rootPath, absoluteInputPath); - log.Verbose("Compressing file {0}", absoluteInputPath); - - // Create the tar archive entry. - TarEntry entry = TarEntry.CreateTarEntry(relativeFilePath.FullPath); - entry.Size = inputStream.Length; - - tarOutputStream.PutNextEntry(entry); - inputStream.CopyTo(tarOutputStream); - tarOutputStream.CloseEntry(); - } + // Get the relative filename to the rootPath. + var relativeFilePath = GetRelativeFilePath(rootPath, absoluteInputPath); + Log.Verbose("Compressing file {0}", absoluteInputPath); + + // Create the tar archive entry. + var entry = TarEntry.CreateTarEntry(relativeFilePath.FullPath); + entry.Size = inputStream.Length; + + tarOutputStream.PutNextEntry(entry); + inputStream.CopyTo(tarOutputStream); + tarOutputStream.CloseEntry(); } } - - log.Verbose("GZip file successfully created: {0}", outputPath.FullPath); } - /// - /// Uncompress the specified GZip Tar file. - /// - /// GZip file to uncompress. - /// Output path to uncompress into. - public override void Uncompress(FilePath filePath, DirectoryPath outputPath) - { - Precondition.IsNotNull(filePath, nameof(filePath)); - Precondition.IsNotNull(outputPath, nameof(outputPath)); + Log.Verbose("GZip file successfully created: {0}", outputPath.FullPath); + } - // Make root path and output file path absolute. - filePath = filePath.MakeAbsolute(environment); - outputPath = outputPath.MakeAbsolute(environment); + /// + /// Decompress the specified GZip Tar file. + /// + /// GZip file to decompress. + /// Output path to decompress into. + public override void Decompress(FilePath filePath, DirectoryPath outputPath) + { + ArgumentNullException.ThrowIfNull(filePath, nameof(filePath)); + ArgumentNullException.ThrowIfNull(outputPath, nameof(outputPath)); - var file = fileSystem.GetFile(filePath); + // Make root path and output file path absolute. + filePath = filePath.MakeAbsolute(Environment); + outputPath = outputPath.MakeAbsolute(Environment); - log.Verbose("Uncompress GZip file {0} to {1}", filePath.FullPath, outputPath.FullPath); + var file = FileSystem.GetFile(filePath); - using (Stream inputStream = file.Open(FileMode.Open, FileAccess.Read, FileShare.Read)) - using (Stream gzipInputStream = new GZipInputStream(inputStream)) - { - TarArchive archive = TarArchive.CreateInputTarArchive(gzipInputStream, Encoding.UTF8); - archive.ExtractContents(outputPath.FullPath); - archive.Close(); - } + Log.Verbose("Decompress GZip file {0} to {1}", filePath.FullPath, outputPath.FullPath); + + using (var inputStream = file.Open(FileMode.Open, FileAccess.Read, FileShare.Read)) + using (var gzipInputStream = new GZipInputStream(inputStream)) + { + var archive = TarArchive.CreateInputTarArchive(gzipInputStream, Encoding.UTF8); + archive.ExtractContents(outputPath.FullPath); + archive.Close(); } - #endregion } -} \ No newline at end of file +} diff --git a/src/Cake.Compression/Classes/Zip.cs b/src/Cake.Compression/Classes/Zip.cs index 9eab41c..db819b7 100644 --- a/src/Cake.Compression/Classes/Zip.cs +++ b/src/Cake.Compression/Classes/Zip.cs @@ -1,137 +1,138 @@ -using Cake.Core; +using Cake.Core; using Cake.Core.Diagnostics; using Cake.Core.IO; using ICSharpCode.SharpZipLib.Core; using ICSharpCode.SharpZipLib.Zip; -using System.Collections.Generic; -using System.IO; -namespace Cake.Compression.Classes +namespace Cake.Compression.Classes; + +/// +/// Provides a class. +/// +public sealed class Zip : CompressionBase { /// - /// Provides a class. + /// Initializes a new instance of the class. /// - public class Zip : CompressionBase + public Zip( + IFileSystem fileSystem, + ICakeEnvironment environment, + ICakeLog log) + : base(fileSystem, environment, log) { - #region Constructor - /// - /// Initializes a new instance of the class. - /// - public Zip(IFileSystem fileSystem, ICakeEnvironment environment, ICakeLog log) - : base(fileSystem, environment, log) - { - } - #endregion - - #region Public Methods - /// - /// Create a Zip archive of the specified files. - /// - /// The root path. - /// The output path. - /// The file paths. - /// The compression level (1-9). - public override void Compress(DirectoryPath rootPath, FilePath outputPath, IEnumerable filePaths, int level) - { - Precondition.IsNotNull(rootPath, nameof(rootPath)); - Precondition.IsNotNull(outputPath, nameof(outputPath)); - Precondition.IsNotNull(filePaths, nameof(filePaths)); - Precondition.IsBetween(level, 1, 9, nameof(level)); + } + + /// + /// Create a Zip archive of the specified files. + /// + /// The root path. + /// The output path. + /// The file paths. + /// The compression level (1-9). + public override void Compress( + DirectoryPath rootPath, + FilePath outputPath, + IEnumerable filePaths, + int level) + { + ArgumentNullException.ThrowIfNull(rootPath, nameof(rootPath)); + ArgumentNullException.ThrowIfNull(outputPath, nameof(outputPath)); + ArgumentNullException.ThrowIfNull(filePaths, nameof(filePaths)); + ArgumentOutOfRangeException.ThrowIfLessThan(level, 1, nameof(level)); + ArgumentOutOfRangeException.ThrowIfGreaterThan(level, 9, nameof(level)); - // Make root path and output file path absolute. - rootPath = rootPath.MakeAbsolute(environment); - outputPath = outputPath.MakeAbsolute(environment); + // Make root path and output file path absolute. + rootPath = rootPath.MakeAbsolute(Environment); + outputPath = outputPath.MakeAbsolute(Environment); - // Get the output file. - var outputFile = fileSystem.GetFile(outputPath); + // Get the output file. + var outputFile = FileSystem.GetFile(outputPath); - // Open up a stream to the output file. - log.Verbose("Creating Zip file: {0}", outputPath.FullPath); + // Open up a stream to the output file. + Log.Verbose("Creating Zip file: {0}", outputPath.FullPath); + + using (var outputStream = outputFile.Open(FileMode.Create, FileAccess.Write, FileShare.None)) + using (var zipOutputStream = new ZipOutputStream(outputStream)) + { + zipOutputStream.SetLevel(level); - using (var outputStream = outputFile.Open(FileMode.Create, FileAccess.Write, FileShare.None)) - using (var zipOutputStream = new ZipOutputStream(outputStream)) + foreach (var inputPath in filePaths) { - zipOutputStream.SetLevel(level); + var absoluteInputPath = inputPath.MakeAbsolute(Environment); + var file = FileSystem.GetFile(absoluteInputPath); - foreach (var inputPath in filePaths) + using (var inputStream = file.Open(FileMode.Open, FileAccess.Read, FileShare.Read)) { - var absoluteInputPath = inputPath.MakeAbsolute(environment); - var file = fileSystem.GetFile(absoluteInputPath); + // Get the relative filename to the rootPath. + var relativeFilePath = GetRelativeFilePath(rootPath, absoluteInputPath); + Log.Verbose("Compressing file {0}", absoluteInputPath); - using (var inputStream = file.Open(FileMode.Open, FileAccess.Read, FileShare.Read)) + var entryName = relativeFilePath.FullPath; + entryName = ZipEntry.CleanName(entryName); + + // Create the tar archive entry. + var entry = new ZipEntry(entryName) { - // Get the relative filename to the rootPath. - var relativeFilePath = GetRelativeFilePath(rootPath, absoluteInputPath); - log.Verbose("Compressing file {0}", absoluteInputPath); - - string entryName = relativeFilePath.FullPath; - entryName = ZipEntry.CleanName(entryName); - - // Create the tar archive entry. - ZipEntry entry = new ZipEntry(entryName) - { - DateTime = File.GetLastWriteTime(absoluteInputPath.FullPath), - Size = inputStream.Length - }; - - zipOutputStream.PutNextEntry(entry); - inputStream.CopyTo(zipOutputStream); - zipOutputStream.CloseEntry(); - } + DateTime = File.GetLastWriteTime(absoluteInputPath.FullPath), + Size = inputStream.Length + }; + + zipOutputStream.PutNextEntry(entry); + inputStream.CopyTo(zipOutputStream); + zipOutputStream.CloseEntry(); } } - - log.Verbose("Zip file successfully created: {0}", outputPath.FullPath); } - /// - /// Uncompress the specified Zip file. - /// - /// Zip file to uncompress. - /// Output path to uncompress into. - public override void Uncompress(FilePath filePath, DirectoryPath outputPath) - { - Precondition.IsNotNull(filePath, nameof(filePath)); - Precondition.IsNotNull(outputPath, nameof(outputPath)); + Log.Verbose("Zip file successfully created: {0}", outputPath.FullPath); + } - // Make root path and output file path absolute. - filePath = filePath.MakeAbsolute(environment); - outputPath = outputPath.MakeAbsolute(environment); + /// + /// Decompress the specified Zip file. + /// + /// Zip file to decompress. + /// Output path to decompress into. + public override void Decompress(FilePath filePath, DirectoryPath outputPath) + { + ArgumentNullException.ThrowIfNull(filePath, nameof(filePath)); + ArgumentNullException.ThrowIfNull(outputPath, nameof(outputPath)); + + // Make root path and output file path absolute. + filePath = filePath.MakeAbsolute(Environment); + outputPath = outputPath.MakeAbsolute(Environment); - var file = fileSystem.GetFile(filePath); + var file = FileSystem.GetFile(filePath); - log.Verbose("Uncompress Zip file {0} to {1}", filePath.FullPath, outputPath.FullPath); + Log.Verbose("Decompress Zip file {0} to {1}", filePath.FullPath, outputPath.FullPath); - using (Stream inputStream = file.Open(FileMode.Open, FileAccess.Read, FileShare.Read)) - using (ZipFile zipFile = new ZipFile(inputStream)) + using (var inputStream = file.Open(FileMode.Open, FileAccess.Read, FileShare.Read)) + using (var zipFile = new ZipFile(inputStream)) + { + foreach (ZipEntry zipEntry in zipFile) { - foreach (ZipEntry zipEntry in zipFile) + if (!zipEntry.IsFile) { - if (!zipEntry.IsFile) - { - continue; // Ignore directories - } + continue; // Ignore directories + } - string entryFileName = zipEntry.Name; + var entryFileName = zipEntry.Name; - byte[] buffer = new byte[4096]; // 4K is optimum - Stream zipStream = zipFile.GetInputStream(zipEntry); + var buffer = new byte[4096]; // 4K is optimum + var zipStream = zipFile.GetInputStream(zipEntry); - string fullZipToPath = System.IO.Path.Combine(outputPath.FullPath, entryFileName); - string directoryName = System.IO.Path.GetDirectoryName(fullZipToPath); + var fullZipToPath = System.IO.Path.Combine(outputPath.FullPath, entryFileName); + var directoryName = System.IO.Path.GetDirectoryName(fullZipToPath)!; - if (directoryName.Length > 0) - { - Directory.CreateDirectory(directoryName); - } + if (directoryName.Length > 0) + { + Directory.CreateDirectory(directoryName); + } - using (FileStream streamWriter = File.Create(fullZipToPath)) - { - StreamUtils.Copy(zipStream, streamWriter, buffer); - } + using (var streamWriter = File.Create(fullZipToPath)) + { + StreamUtils.Copy(zipStream, streamWriter, buffer); } } } - #endregion } -} \ No newline at end of file +} diff --git a/src/Cake.Compression/CompressionAliases.cs b/src/Cake.Compression/CompressionAliases.cs index a279bdc..6683fcf 100644 --- a/src/Cake.Compression/CompressionAliases.cs +++ b/src/Cake.Compression/CompressionAliases.cs @@ -1,653 +1,755 @@ -using Cake.Common.IO; +using Cake.Common.IO; using Cake.Compression.Classes; using Cake.Core; using Cake.Core.Annotations; using Cake.Core.Diagnostics; using Cake.Core.IO; -using System; -using System.Collections.Generic; -using System.Linq; -namespace Cake.Compression +namespace Cake.Compression; + +/// +/// Contains functionality related to compress files. +/// +[CakeAliasCategory("Compression")] +public static class CompressionAliases { + private const int Level = 6; + /// - /// Contains functionality related to compress files. + /// Create a BZip2 Tar archive of the specified directory. /// - [CakeAliasCategory("Compression")] - public static class CompressionAliases - { - #region Private Constants - private const int Level = 6; - #endregion - - #region BZip2 - /// - /// Create a BZip2 Tar archive of the specified directory. - /// - /// The context. - /// The root path. - /// The output path. - /// - /// - /// BZip2Compress("./publish", "publish.tar.bz2"); - /// - /// - [CakeMethodAlias] - public static void BZip2Compress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath) - { - Compress(context, rootPath, outputPath, Level); - } + /// The context. + /// The root path. + /// The output path. + /// + /// + /// BZip2Compress("./publish", "publish.tar.bz2"); + /// + /// + [CakeMethodAlias] + public static void BZip2Compress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath) => + Compress(context, rootPath, outputPath, Level); - /// - /// Create a BZip2 Tar archive of the specified directory. - /// - /// The context. - /// The root path. - /// The output path. - /// The compression level (1-9). - /// - /// - /// BZip2Compress("./publish", "publish.tar.bz2", 6); - /// - /// - [CakeMethodAlias] - public static void BZip2Compress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath, int level) - { - Compress(context, rootPath, outputPath, level); - } + /// + /// Create a BZip2 Tar archive of the specified directory. + /// + /// The context. + /// The root path. + /// The output path. + /// The compression level (1-9). + /// + /// + /// BZip2Compress("./publish", "publish.tar.bz2", 6); + /// + /// + [CakeMethodAlias] + public static void BZip2Compress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + int level) => + Compress(context, rootPath, outputPath, level); - /// - /// Create a BZip2 Tar archive of the files matching the specified pattern. - /// - /// The context. - /// The root path. - /// The output path. - /// The pattern. - /// - /// - /// BZip2Compress("./", "xmlfiles.tar.bz2", "./*.xml"); - /// - /// - [CakeMethodAlias] - public static void BZip2Compress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath, string pattern) - { - Compress(context, rootPath, outputPath, pattern, Level); - } + /// + /// Create a BZip2 Tar archive of the files matching the specified pattern. + /// + /// The context. + /// The root path. + /// The output path. + /// The pattern. + /// + /// + /// BZip2Compress("./", "xmlfiles.tar.bz2", "./*.xml"); + /// + /// + [CakeMethodAlias] + public static void BZip2Compress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + string pattern) => + Compress(context, rootPath, outputPath, pattern, Level); - /// - /// Create a BZip2 Tar archive of the files matching the specified pattern. - /// - /// The context. - /// The root path. - /// The output path. - /// The pattern. - /// The compression level (1-9). - /// - /// - /// BZip2Compress("./", "xmlfiles.tar.bz2", "./*.xml", 6); - /// - /// - [CakeMethodAlias] - public static void BZip2Compress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath, string pattern, int level) - { - Compress(context, rootPath, outputPath, pattern, level); - } + /// + /// Create a BZip2 Tar archive of the files matching the specified pattern. + /// + /// The context. + /// The root path. + /// The output path. + /// The pattern. + /// The compression level (1-9). + /// + /// + /// BZip2Compress("./", "xmlfiles.tar.bz2", "./*.xml", 6); + /// + /// + [CakeMethodAlias] + public static void BZip2Compress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + string pattern, + int level) => + Compress(context, rootPath, outputPath, pattern, level); - /// - /// Create a BZip2 Tar archive of the specified files. - /// - /// The context. - /// The root path. - /// The output path. - /// The file paths. - /// - /// - /// var files = GetFiles("./**/Cake.*.dll"); - /// BZip2Compress("./", "cakeassemblies.tar.bz2", files); - /// - /// - [CakeMethodAlias] - public static void BZip2Compress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath, IEnumerable filePaths) - { - Compress(context, rootPath, outputPath, filePaths, Level); - } + /// + /// Create a BZip2 Tar archive of the specified files. + /// + /// The context. + /// The root path. + /// The output path. + /// The file paths. + /// + /// + /// var files = GetFiles("./**/Cake.*.dll"); + /// BZip2Compress("./", "cakeassemblies.tar.bz2", files); + /// + /// + [CakeMethodAlias] + public static void BZip2Compress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + IEnumerable filePaths) => + Compress(context, rootPath, outputPath, filePaths, Level); - /// - /// Create a BZip2 Tar archive of the specified files. - /// - /// The context. - /// The root path. - /// The output path. - /// The file paths. - /// The compression level (1-9). - /// - /// - /// var files = GetFiles("./**/Cake.*.dll"); - /// BZip2Compress("./", "cakeassemblies.tar.bz2", files, 6); - /// - /// - [CakeMethodAlias] - public static void BZip2Compress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath, IEnumerable filePaths, int level) - { - Compress(context, rootPath, outputPath, filePaths, level); - } + /// + /// Create a BZip2 Tar archive of the specified files. + /// + /// The context. + /// The root path. + /// The output path. + /// The file paths. + /// The compression level (1-9). + /// + /// + /// var files = GetFiles("./**/Cake.*.dll"); + /// BZip2Compress("./", "cakeassemblies.tar.bz2", files, 6); + /// + /// + [CakeMethodAlias] + public static void BZip2Compress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + IEnumerable filePaths, + int level) => + Compress(context, rootPath, outputPath, filePaths, level); - /// - /// Create a BZip2 Tar archive of the specified files. - /// - /// The context. - /// The root path. - /// The output path. - /// The file paths. - /// - /// - /// var files = new [] { - /// "./src/Cake/bin/Debug/Autofac.dll", - /// "./src/Cake/bin/Debug/Cake.Common.dll", - /// "./src/Cake/bin/Debug/Cake.Core.dll", - /// "./src/Cake/bin/Debug/Cake.exe" - /// }; - /// BZip2Compress("./", "cakebinaries.tar.bz2", files); - /// - /// - [CakeMethodAlias] - public static void BZip2Compress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath, IEnumerable filePaths) - { - Compress(context, rootPath, outputPath, filePaths, Level); - } + /// + /// Create a BZip2 Tar archive of the specified files. + /// + /// The context. + /// The root path. + /// The output path. + /// The file paths. + /// + /// + /// var files = new [] { + /// "./src/Cake/bin/Debug/Autofac.dll", + /// "./src/Cake/bin/Debug/Cake.Common.dll", + /// "./src/Cake/bin/Debug/Cake.Core.dll", + /// "./src/Cake/bin/Debug/Cake.exe" + /// }; + /// BZip2Compress("./", "cakebinaries.tar.bz2", files); + /// + /// + [CakeMethodAlias] + public static void BZip2Compress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + IEnumerable filePaths) => + Compress(context, rootPath, outputPath, filePaths, Level); - /// - /// Create a BZip2 Tar archive of the specified files. - /// - /// The context. - /// The root path. - /// The output path. - /// The file paths. - /// The compression level (1-9). - /// - /// - /// var files = new [] { - /// "./src/Cake/bin/Debug/Autofac.dll", - /// "./src/Cake/bin/Debug/Cake.Common.dll", - /// "./src/Cake/bin/Debug/Cake.Core.dll", - /// "./src/Cake/bin/Debug/Cake.exe" - /// }; - /// BZip2Compress("./", "cakebinaries.tar.bz2", files, 6); - /// - /// - [CakeMethodAlias] - public static void BZip2Compress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath, IEnumerable filePaths, int level) - { - Compress(context, rootPath, outputPath, filePaths, level); - } + /// + /// Create a BZip2 Tar archive of the specified files. + /// + /// The context. + /// The root path. + /// The output path. + /// The file paths. + /// The compression level (1-9). + /// + /// + /// var files = new [] { + /// "./src/Cake/bin/Debug/Autofac.dll", + /// "./src/Cake/bin/Debug/Cake.Common.dll", + /// "./src/Cake/bin/Debug/Cake.Core.dll", + /// "./src/Cake/bin/Debug/Cake.exe" + /// }; + /// BZip2Compress("./", "cakebinaries.tar.bz2", files, 6); + /// + /// + [CakeMethodAlias] + public static void BZip2Compress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + IEnumerable filePaths, + int level) => + Compress(context, rootPath, outputPath, filePaths, level); - /// - /// Uncompress the specified BZip2 Tar file. - /// - /// The context. - /// BZip2 file to uncompress. - /// Output path to uncompress into. - /// - /// - /// BZip2Uncompress("Cake.tar.bz2", "./cake"); - /// - /// - [CakeMethodAlias] - public static void BZip2Uncompress(this ICakeContext context, FilePath filePath, DirectoryPath outputPath) - { - Uncompress(context, filePath, outputPath); - } - #endregion - - #region GZip - /// - /// Create a GZip Tar archive of the specified directory. - /// - /// The context. - /// The root path. - /// The output path. - /// - /// - /// GZipCompress("./publish", "publish.tar.gz"); - /// - /// - [CakeMethodAlias] - public static void GZipCompress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath) - { - Compress(context, rootPath, outputPath, Level); - } + /// + /// Decompress the specified BZip2 Tar file. + /// + /// The context. + /// BZip2 file to decompress. + /// Output path to decompress into. + /// + /// + /// BZip2Decompress("Cake.tar.bz2", "./cake"); + /// + /// + [CakeMethodAlias] + public static void BZip2Decompress( + this ICakeContext context, + FilePath filePath, + DirectoryPath outputPath) => + Decompress(context, filePath, outputPath); - /// - /// Create a GZip Tar archive of the specified directory. - /// - /// The context. - /// The root path. - /// The output path. - /// The compression level (1-9). - /// - /// - /// GZipCompress("./publish", "publish.tar.gz", 6); - /// - /// - [CakeMethodAlias] - public static void GZipCompress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath, int level) - { - Compress(context, rootPath, outputPath, level); - } + /// + /// Decompress the specified BZip2 Tar file. + /// + /// The context. + /// BZip2 file to decompress. + /// Output path to decompress into. + /// + /// + /// BZip2Uncompress("Cake.tar.bz2", "./cake"); + /// + /// + [CakeMethodAlias] + [Obsolete($"Use the '{nameof(BZip2Decompress)}' method instead.")] + public static void BZip2Uncompress( + this ICakeContext context, + FilePath filePath, + DirectoryPath outputPath) => + Decompress(context, filePath, outputPath); - /// - /// Create a GZip Tar archive of the files matching the specified pattern. - /// - /// The context. - /// The root path. - /// The output path. - /// The pattern. - /// - /// - /// GZipCompress("./", "xmlfiles.tar.gz", "./*.xml"); - /// - /// - [CakeMethodAlias] - public static void GZipCompress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath, string pattern) - { - Compress(context, rootPath, outputPath, pattern, Level); - } + /// + /// Create a GZip Tar archive of the specified directory. + /// + /// The context. + /// The root path. + /// The output path. + /// + /// + /// GZipCompress("./publish", "publish.tar.gz"); + /// + /// + [CakeMethodAlias] + public static void GZipCompress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath) => + Compress(context, rootPath, outputPath, Level); - /// - /// Create a GZip Tar archive of the files matching the specified pattern. - /// - /// The context. - /// The root path. - /// The output path. - /// The pattern. - /// The compression level (1-9). - /// - /// - /// GZipCompress("./", "xmlfiles.tar.gz", "./*.xml", 6); - /// - /// - [CakeMethodAlias] - public static void GZipCompress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath, string pattern, int level) - { - Compress(context, rootPath, outputPath, pattern, level); - } + /// + /// Create a GZip Tar archive of the specified directory. + /// + /// The context. + /// The root path. + /// The output path. + /// The compression level (1-9). + /// + /// + /// GZipCompress("./publish", "publish.tar.gz", 6); + /// + /// + [CakeMethodAlias] + public static void GZipCompress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + int level) => + Compress(context, rootPath, outputPath, level); - /// - /// Create a GZip Tar archive of the specified files. - /// - /// The context. - /// The root path. - /// The output path. - /// The file paths. - /// - /// - /// var files = GetFiles("./**/Cake.*.dll"); - /// GZipCompress("./", "cakeassemblies.tar.gz", files); - /// - /// - [CakeMethodAlias] - public static void GZipCompress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath, IEnumerable filePaths) - { - Compress(context, rootPath, outputPath, filePaths, Level); - } + /// + /// Create a GZip Tar archive of the files matching the specified pattern. + /// + /// The context. + /// The root path. + /// The output path. + /// The pattern. + /// + /// + /// GZipCompress("./", "xmlfiles.tar.gz", "./*.xml"); + /// + /// + [CakeMethodAlias] + public static void GZipCompress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + string pattern) => + Compress(context, rootPath, outputPath, pattern, Level); - /// - /// Create a GZip Tar archive of the specified files. - /// - /// The context. - /// The root path. - /// The output path. - /// The file paths. - /// The compression level (1-9). - /// - /// - /// var files = GetFiles("./**/Cake.*.dll"); - /// GZipCompress("./", "cakeassemblies.tar.gz", files, 6); - /// - /// - [CakeMethodAlias] - public static void GZipCompress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath, IEnumerable filePaths, int level) - { - Compress(context, rootPath, outputPath, filePaths, level); - } + /// + /// Create a GZip Tar archive of the files matching the specified pattern. + /// + /// The context. + /// The root path. + /// The output path. + /// The pattern. + /// The compression level (1-9). + /// + /// + /// GZipCompress("./", "xmlfiles.tar.gz", "./*.xml", 6); + /// + /// + [CakeMethodAlias] + public static void GZipCompress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + string pattern, + int level) => + Compress(context, rootPath, outputPath, pattern, level); - /// - /// Create a GZip Tar archive of the specified files. - /// - /// The context. - /// The root path. - /// The output path. - /// The file paths. - /// - /// - /// var files = new [] { - /// "./src/Cake/bin/Debug/Autofac.dll", - /// "./src/Cake/bin/Debug/Cake.Common.dll", - /// "./src/Cake/bin/Debug/Cake.Core.dll", - /// "./src/Cake/bin/Debug/Cake.exe" - /// }; - /// GZipCompress("./", "cakebinaries.tar.gz", files); - /// - /// - [CakeMethodAlias] - public static void GZipCompress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath, IEnumerable filePaths) - { - Compress(context, rootPath, outputPath, filePaths, Level); - } + /// + /// Create a GZip Tar archive of the specified files. + /// + /// The context. + /// The root path. + /// The output path. + /// The file paths. + /// + /// + /// var files = GetFiles("./**/Cake.*.dll"); + /// GZipCompress("./", "cakeassemblies.tar.gz", files); + /// + /// + [CakeMethodAlias] + public static void GZipCompress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + IEnumerable filePaths) => + Compress(context, rootPath, outputPath, filePaths, Level); - /// - /// Create a GZip Tar archive of the specified files. - /// - /// The context. - /// The root path. - /// The output path. - /// The file paths. - /// The compression level (1-9). - /// - /// - /// var files = new [] { - /// "./src/Cake/bin/Debug/Autofac.dll", - /// "./src/Cake/bin/Debug/Cake.Common.dll", - /// "./src/Cake/bin/Debug/Cake.Core.dll", - /// "./src/Cake/bin/Debug/Cake.exe" - /// }; - /// GZipCompress("./", "cakebinaries.tar.gz", files, 6); - /// - /// - [CakeMethodAlias] - public static void GZipCompress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath, IEnumerable filePaths, int level) - { - Compress(context, rootPath, outputPath, filePaths, level); - } + /// + /// Create a GZip Tar archive of the specified files. + /// + /// The context. + /// The root path. + /// The output path. + /// The file paths. + /// The compression level (1-9). + /// + /// + /// var files = GetFiles("./**/Cake.*.dll"); + /// GZipCompress("./", "cakeassemblies.tar.gz", files, 6); + /// + /// + [CakeMethodAlias] + public static void GZipCompress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + IEnumerable filePaths, + int level) => + Compress(context, rootPath, outputPath, filePaths, level); - /// - /// Uncompress the specified GZip Tar file. - /// - /// The context. - /// GZip file to uncompress. - /// Output path to uncompress into. - /// - /// - /// GZipUncompress("Cake.tar.gz", "./cake"); - /// - /// - [CakeMethodAlias] - public static void GZipUncompress(this ICakeContext context, FilePath filePath, DirectoryPath outputPath) - { - Uncompress(context, filePath, outputPath); - } - #endregion - - #region Zip - /// - /// Create a Zip archive of the specified directory. - /// - /// The context. - /// The root path. - /// The output path. - /// - /// - /// ZipCompress("./publish", "publish.zip"); - /// - /// - [CakeMethodAlias] - public static void ZipCompress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath) - { - Compress(context, rootPath, outputPath, Level); - } + /// + /// Create a GZip Tar archive of the specified files. + /// + /// The context. + /// The root path. + /// The output path. + /// The file paths. + /// + /// + /// var files = new [] { + /// "./src/Cake/bin/Debug/Autofac.dll", + /// "./src/Cake/bin/Debug/Cake.Common.dll", + /// "./src/Cake/bin/Debug/Cake.Core.dll", + /// "./src/Cake/bin/Debug/Cake.exe" + /// }; + /// GZipCompress("./", "cakebinaries.tar.gz", files); + /// + /// + [CakeMethodAlias] + public static void GZipCompress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + IEnumerable filePaths) => + Compress(context, rootPath, outputPath, filePaths, Level); - /// - /// Create a Zip archive of the specified directory. - /// - /// The context. - /// The root path. - /// The output path. - /// The compression level (1-9). - /// - /// - /// ZipCompress("./publish", "publish.zip", 6); - /// - /// - [CakeMethodAlias] - public static void ZipCompress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath, int level) - { - Compress(context, rootPath, outputPath, level); - } + /// + /// Create a GZip Tar archive of the specified files. + /// + /// The context. + /// The root path. + /// The output path. + /// The file paths. + /// The compression level (1-9). + /// + /// + /// var files = new [] { + /// "./src/Cake/bin/Debug/Autofac.dll", + /// "./src/Cake/bin/Debug/Cake.Common.dll", + /// "./src/Cake/bin/Debug/Cake.Core.dll", + /// "./src/Cake/bin/Debug/Cake.exe" + /// }; + /// GZipCompress("./", "cakebinaries.tar.gz", files, 6); + /// + /// + [CakeMethodAlias] + public static void GZipCompress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + IEnumerable filePaths, + int level) => + Compress(context, rootPath, outputPath, filePaths, level); - /// - /// Create a Zip archive of the files matching the specified pattern. - /// - /// The context. - /// The root path. - /// The output path. - /// The pattern. - /// - /// - /// ZipCompress("./", "xmlfiles.zip", "./*.xml"); - /// - /// - [CakeMethodAlias] - public static void ZipCompress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath, string pattern) - { - Compress(context, rootPath, outputPath, pattern, Level); - } + /// + /// Decompress the specified GZip Tar file. + /// + /// The context. + /// GZip file to decompress. + /// Output path to decompress into. + /// + /// + /// GZipDecompress("Cake.tar.gz", "./cake"); + /// + /// + [CakeMethodAlias] + public static void GZipDecompress( + this ICakeContext context, + FilePath filePath, + DirectoryPath outputPath) => + Decompress(context, filePath, outputPath); - /// - /// Create a Zip archive of the files matching the specified pattern. - /// - /// The context. - /// The root path. - /// The output path. - /// The pattern. - /// The compression level (1-9). - /// - /// - /// ZipCompress("./", "xmlfiles.zip", "./*.xml", 6); - /// - /// - [CakeMethodAlias] - public static void ZipCompress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath, string pattern, int level) - { - Compress(context, rootPath, outputPath, pattern, level); - } + /// + /// Decompress the specified GZip Tar file. + /// + /// The context. + /// GZip file to decompress. + /// Output path to decompress into. + /// + /// + /// GZipUncompress("Cake.tar.gz", "./cake"); + /// + /// + [CakeMethodAlias] + [Obsolete($"Use the '{nameof(GZipDecompress)}' method instead.")] + public static void GZipUncompress( + this ICakeContext context, + FilePath filePath, + DirectoryPath outputPath) => + Decompress(context, filePath, outputPath); - /// - /// Create a Zip archive of the specified files. - /// - /// The context. - /// The root path. - /// The output path. - /// The file paths. - /// - /// - /// var files = GetFiles("./**/Cake.*.dll"); - /// ZipCompress("./", "cakeassemblies.zip", files); - /// - /// - [CakeMethodAlias] - public static void ZipCompress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath, IEnumerable filePaths) - { - Compress(context, rootPath, outputPath, filePaths, Level); - } + /// + /// Create a Zip archive of the specified directory. + /// + /// The context. + /// The root path. + /// The output path. + /// + /// + /// ZipCompress("./publish", "publish.zip"); + /// + /// + [CakeMethodAlias] + public static void ZipCompress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath) => + Compress(context, rootPath, outputPath, Level); - /// - /// Create a Zip archive of the specified files. - /// - /// The context. - /// The root path. - /// The output path. - /// The file paths. - /// The compression level (1-9). - /// - /// - /// var files = GetFiles("./**/Cake.*.dll"); - /// ZipCompress("./", "cakeassemblies.zip", files, 6); - /// - /// - [CakeMethodAlias] - public static void ZipCompress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath, IEnumerable filePaths, int level) - { - Compress(context, rootPath, outputPath, filePaths, level); - } + /// + /// Create a Zip archive of the specified directory. + /// + /// The context. + /// The root path. + /// The output path. + /// The compression level (1-9). + /// + /// + /// ZipCompress("./publish", "publish.zip", 6); + /// + /// + [CakeMethodAlias] + public static void ZipCompress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + int level) => + Compress(context, rootPath, outputPath, level); - /// - /// Create a Zip archive of the specified files. - /// - /// The context. - /// The root path. - /// The output path. - /// The file paths. - /// - /// - /// var files = new [] { - /// "./src/Cake/bin/Debug/Autofac.dll", - /// "./src/Cake/bin/Debug/Cake.Common.dll", - /// "./src/Cake/bin/Debug/Cake.Core.dll", - /// "./src/Cake/bin/Debug/Cake.exe" - /// }; - /// ZipCompress("./", "cakebinaries.zip", files); - /// - /// - [CakeMethodAlias] - public static void ZipCompress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath, IEnumerable filePaths) - { - Compress(context, rootPath, outputPath, filePaths, Level); - } + /// + /// Create a Zip archive of the files matching the specified pattern. + /// + /// The context. + /// The root path. + /// The output path. + /// The pattern. + /// + /// + /// ZipCompress("./", "xmlfiles.zip", "./*.xml"); + /// + /// + [CakeMethodAlias] + public static void ZipCompress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + string pattern) => + Compress(context, rootPath, outputPath, pattern, Level); - /// - /// Create a Zip archive of the specified files. - /// - /// The context. - /// The root path. - /// The output path. - /// The file paths. - /// The compression level (1-9). - /// - /// - /// var files = new [] { - /// "./src/Cake/bin/Debug/Autofac.dll", - /// "./src/Cake/bin/Debug/Cake.Common.dll", - /// "./src/Cake/bin/Debug/Cake.Core.dll", - /// "./src/Cake/bin/Debug/Cake.exe" - /// }; - /// ZipCompress("./", "cakebinaries.zip", files, 6); - /// - /// - [CakeMethodAlias] - public static void ZipCompress(this ICakeContext context, DirectoryPath rootPath, FilePath outputPath, IEnumerable filePaths, int level) - { - Compress(context, rootPath, outputPath, filePaths, level); - } + /// + /// Create a Zip archive of the files matching the specified pattern. + /// + /// The context. + /// The root path. + /// The output path. + /// The pattern. + /// The compression level (1-9). + /// + /// + /// ZipCompress("./", "xmlfiles.zip", "./*.xml", 6); + /// + /// + [CakeMethodAlias] + public static void ZipCompress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + string pattern, + int level) => + Compress(context, rootPath, outputPath, pattern, level); - /// - /// Uncompress the specified Zip Tar file. - /// - /// The context. - /// Zip file to uncompress. - /// Output path to uncompress into. - /// - /// - /// ZipUncompress("Cake.zip", "./cake"); - /// - /// - [CakeMethodAlias] - public static void ZipUncompress(this ICakeContext context, FilePath filePath, DirectoryPath outputPath) - { - Uncompress(context, filePath, outputPath); - } - #endregion + /// + /// Create a Zip archive of the specified files. + /// + /// The context. + /// The root path. + /// The output path. + /// The file paths. + /// + /// + /// var files = GetFiles("./**/Cake.*.dll"); + /// ZipCompress("./", "cakeassemblies.zip", files); + /// + /// + [CakeMethodAlias] + public static void ZipCompress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + IEnumerable filePaths) => + Compress(context, rootPath, outputPath, filePaths, Level); - #region Private Static Methods - private static T CreateInstance(params object[] args) - { - return (T)Activator.CreateInstance(typeof(T), args); - } + /// + /// Create a Zip archive of the specified files. + /// + /// The context. + /// The root path. + /// The output path. + /// The file paths. + /// The compression level (1-9). + /// + /// + /// var files = GetFiles("./**/Cake.*.dll"); + /// ZipCompress("./", "cakeassemblies.zip", files, 6); + /// + /// + [CakeMethodAlias] + public static void ZipCompress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + IEnumerable filePaths, + int level) => + Compress(context, rootPath, outputPath, filePaths, level); - private static void Compress( - ICakeContext context, - DirectoryPath rootPath, - FilePath outputPath, - int level) where T : CompressionBase - { - Precondition.IsNotNull(context, nameof(context)); - Precondition.IsNotNull(rootPath, nameof(rootPath)); - Precondition.IsNotNull(outputPath, nameof(outputPath)); - Precondition.IsBetween(level, 1, 9, nameof(level)); + /// + /// Create a Zip archive of the specified files. + /// + /// The context. + /// The root path. + /// The output path. + /// The file paths. + /// + /// + /// var files = new [] { + /// "./src/Cake/bin/Debug/Autofac.dll", + /// "./src/Cake/bin/Debug/Cake.Common.dll", + /// "./src/Cake/bin/Debug/Cake.Core.dll", + /// "./src/Cake/bin/Debug/Cake.exe" + /// }; + /// ZipCompress("./", "cakebinaries.zip", files); + /// + /// + [CakeMethodAlias] + public static void ZipCompress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + IEnumerable filePaths) => + Compress(context, rootPath, outputPath, filePaths, Level); - FilePathCollection filePaths = context.GetFiles(string.Concat(rootPath, "/**/*")); - Compress(context, rootPath, outputPath, filePaths, level); - } + /// + /// Create a Zip archive of the specified files. + /// + /// The context. + /// The root path. + /// The output path. + /// The file paths. + /// The compression level (1-9). + /// + /// + /// var files = new [] { + /// "./src/Cake/bin/Debug/Autofac.dll", + /// "./src/Cake/bin/Debug/Cake.Common.dll", + /// "./src/Cake/bin/Debug/Cake.Core.dll", + /// "./src/Cake/bin/Debug/Cake.exe" + /// }; + /// ZipCompress("./", "cakebinaries.zip", files, 6); + /// + /// + [CakeMethodAlias] + public static void ZipCompress( + this ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + IEnumerable filePaths, + int level) => + Compress(context, rootPath, outputPath, filePaths, level); - private static void Compress( - ICakeContext context, - DirectoryPath rootPath, - FilePath outputPath, - string pattern, - int level) where T : CompressionBase - { - Precondition.IsNotNull(context, nameof(context)); - Precondition.IsNotNull(rootPath, nameof(rootPath)); - Precondition.IsNotNull(outputPath, nameof(outputPath)); - Precondition.IsNotNullOrEmpty(pattern, nameof(pattern)); - Precondition.IsBetween(level, 1, 9, nameof(level)); + /// + /// Decompress the specified Zip Tar file. + /// + /// The context. + /// Zip file to decompress. + /// Output path to decompress into. + /// + /// + /// ZipDecompress("Cake.zip", "./cake"); + /// + /// + [CakeMethodAlias] + public static void ZipDecompress( + this ICakeContext context, + FilePath filePath, + DirectoryPath outputPath) => + Decompress(context, filePath, outputPath); - FilePathCollection filePaths = context.GetFiles(pattern); + /// + /// Decompress the specified Zip Tar file. + /// + /// The context. + /// Zip file to decompress. + /// Output path to decompress into. + /// + /// + /// ZipUncompress("Cake.zip", "./cake"); + /// + /// + [CakeMethodAlias] + [Obsolete($"Use the '{nameof(ZipDecompress)}' method instead.")] + public static void ZipUncompress( + this ICakeContext context, + FilePath filePath, + DirectoryPath outputPath) => + Decompress(context, filePath, outputPath); + + private static T CreateInstance(params object[] args) => + (T)Activator.CreateInstance(typeof(T), args)!; + + private static void Compress( + ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + int level) where T : CompressionBase + { + ArgumentNullException.ThrowIfNull(context, nameof(context)); + ArgumentNullException.ThrowIfNull(rootPath, nameof(rootPath)); + ArgumentNullException.ThrowIfNull(outputPath, nameof(outputPath)); + ArgumentOutOfRangeException.ThrowIfLessThan(level, 1, nameof(level)); + ArgumentOutOfRangeException.ThrowIfGreaterThan(level, 9, nameof(level)); + + var filePaths = context.GetFiles(string.Concat(rootPath, "/**/*")); + Compress(context, rootPath, outputPath, filePaths, level); + } - if (filePaths.Count == 0) - { - context.Log.Verbose("The provided pattern did not match any files."); - return; - } + private static void Compress( + ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + string pattern, + int level) where T : CompressionBase + { + ArgumentNullException.ThrowIfNull(context, nameof(context)); + ArgumentNullException.ThrowIfNull(rootPath, nameof(rootPath)); + ArgumentNullException.ThrowIfNull(outputPath, nameof(outputPath)); + ArgumentException.ThrowIfNullOrWhiteSpace(pattern, nameof(pattern)); + ArgumentOutOfRangeException.ThrowIfLessThan(level, 1, nameof(level)); + ArgumentOutOfRangeException.ThrowIfGreaterThan(level, 9, nameof(level)); - Compress(context, rootPath, outputPath, filePaths, level); - } + var filePaths = context.GetFiles(pattern); - private static void Compress( - ICakeContext context, - DirectoryPath rootPath, - FilePath outputPath, - IEnumerable filePaths, - int level) where T : CompressionBase + if (filePaths.Count == 0) { - Precondition.IsNotNull(context, nameof(context)); - Precondition.IsNotNull(rootPath, nameof(rootPath)); - Precondition.IsNotNull(outputPath, nameof(outputPath)); - Precondition.IsNotNull(filePaths, nameof(filePaths)); - Precondition.IsBetween(level, 1, 9, nameof(level)); - - T zip = CreateInstance(context.FileSystem, context.Environment, context.Log); - zip.Compress(rootPath, outputPath, filePaths, level); + context.Log.Verbose("The provided pattern did not match any files."); + return; } - private static void Compress( - ICakeContext context, - DirectoryPath rootPath, - FilePath outputPath, - IEnumerable filePaths, - int level) where T : CompressionBase - { - Precondition.IsNotNull(context, nameof(context)); - Precondition.IsNotNull(rootPath, nameof(rootPath)); - Precondition.IsNotNull(outputPath, nameof(outputPath)); - Precondition.IsNotNull(filePaths, nameof(filePaths)); - Precondition.IsBetween(level, 1, 9, nameof(level)); - - List paths = filePaths.Select(path => new FilePath(path)).ToList(); - Compress(context, rootPath, outputPath, paths, level); - } + Compress(context, rootPath, outputPath, filePaths, level); + } - private static void Uncompress( - ICakeContext context, - FilePath zipPath, - DirectoryPath outputPath) where T : CompressionBase - { - Precondition.IsNotNull(context, nameof(context)); - Precondition.IsNotNull(zipPath, nameof(zipPath)); - Precondition.IsNotNull(outputPath, nameof(outputPath)); + private static void Compress( + ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + IEnumerable filePaths, + int level) where T : CompressionBase + { + ArgumentNullException.ThrowIfNull(context, nameof(context)); + ArgumentNullException.ThrowIfNull(rootPath, nameof(rootPath)); + ArgumentNullException.ThrowIfNull(outputPath, nameof(outputPath)); + ArgumentNullException.ThrowIfNull(filePaths, nameof(filePaths)); + ArgumentOutOfRangeException.ThrowIfLessThan(level, 1, nameof(level)); + ArgumentOutOfRangeException.ThrowIfGreaterThan(level, 9, nameof(level)); + + var zip = CreateInstance(context.FileSystem, context.Environment, context.Log); + zip.Compress(rootPath, outputPath, filePaths, level); + } - T zip = CreateInstance(context.FileSystem, context.Environment, context.Log); - zip.Uncompress(zipPath, outputPath); - } - #endregion + private static void Compress( + ICakeContext context, + DirectoryPath rootPath, + FilePath outputPath, + IEnumerable filePaths, + int level) where T : CompressionBase + { + ArgumentNullException.ThrowIfNull(context, nameof(context)); + ArgumentNullException.ThrowIfNull(rootPath, nameof(rootPath)); + ArgumentNullException.ThrowIfNull(outputPath, nameof(outputPath)); + ArgumentNullException.ThrowIfNull(filePaths, nameof(filePaths)); + ArgumentOutOfRangeException.ThrowIfLessThan(level, 1, nameof(level)); + ArgumentOutOfRangeException.ThrowIfGreaterThan(level, 9, nameof(level)); + + var paths = filePaths.Select(path => new FilePath(path)).ToList(); + Compress(context, rootPath, outputPath, paths, level); + } + + private static void Decompress( + ICakeContext context, + FilePath zipPath, + DirectoryPath outputPath) where T : CompressionBase + { + ArgumentNullException.ThrowIfNull(context, nameof(context)); + ArgumentNullException.ThrowIfNull(zipPath, nameof(zipPath)); + ArgumentNullException.ThrowIfNull(outputPath, nameof(outputPath)); + + var zip = CreateInstance(context.FileSystem, context.Environment, context.Log); + zip.Decompress(zipPath, outputPath); } -} \ No newline at end of file +} diff --git a/src/Cake.Compression/Precondition.cs b/src/Cake.Compression/Precondition.cs deleted file mode 100644 index 7a86e9d..0000000 --- a/src/Cake.Compression/Precondition.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; - -namespace Cake.Compression -{ - /// - /// Provides static methods that help a constructor or method to verify correct arguments and - /// state. - /// - internal static class Precondition - { - #region Public Static Methods - /// - /// Checks whether the value is between a minimum and maximum value. - /// - /// The value to test. - /// The minimum value to test. - /// The maximum value to test. - /// The name of the parameter that caused the exception. - /// value is out of - /// range. - public static void IsBetween(IComparable value, IComparable min, IComparable max, string paramName) - { - if (value.CompareTo(min) == -1 || value.CompareTo(max) == 1) - { - throw new ArgumentOutOfRangeException(paramName); - } - } - - /// - /// Checks whether the specified object is not null. - /// - /// The object to test. - /// The name of the parameter that caused the exception. - /// obj is - /// null. - public static void IsNotNull(object obj, string paramName) - { - if (obj == null) - { - throw new ArgumentNullException(paramName); - } - } - - /// - /// Checks whether the specified string is not null or an empty string. - /// - /// The string to test. - /// The name of the parameter that caused the exception. - /// str is - /// null. - /// str is empty. - public static void IsNotNullOrEmpty(string str, string paramName) - { - if (str == null) - { - throw new ArgumentNullException(paramName); - } - else if (string.IsNullOrEmpty(str)) - { - string message = "The parameter cannot be empty."; - throw new ArgumentException(message, paramName); - } - } - #endregion - } -} \ No newline at end of file diff --git a/src/Directory.Build.props b/src/Directory.Build.props new file mode 100644 index 0000000..ab8e34a --- /dev/null +++ b/src/Directory.Build.props @@ -0,0 +1,21 @@ + + + + enable + enable + $(NoWarn) + + true + true + AllEnabledByDefault + latest + + false + + $([System.IO.Path]::GetDirectoryName($([MSBuild]::GetPathOfFileAbove('.gitignore', '$(MSBuildThisFileDirectory)')))) + + + + True + + diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets new file mode 100644 index 0000000..a4884e7 --- /dev/null +++ b/src/Directory.Build.targets @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props new file mode 100644 index 0000000..5269d3d --- /dev/null +++ b/src/Directory.Packages.props @@ -0,0 +1,15 @@ + + + + + true + + + + + + + + + + diff --git a/tests/Cake.Compression.Tests/Cake.Compression.Tests.csproj b/tests/Cake.Compression.Tests/Cake.Compression.Tests.csproj new file mode 100644 index 0000000..bc9a082 --- /dev/null +++ b/tests/Cake.Compression.Tests/Cake.Compression.Tests.csproj @@ -0,0 +1,35 @@ + + + + net8.0;net9.0 + enable + enable + false + CA1806 + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + diff --git a/tests/Cake.Compression.Tests/CompressionTests.cs b/tests/Cake.Compression.Tests/CompressionTests.cs new file mode 100644 index 0000000..793c273 --- /dev/null +++ b/tests/Cake.Compression.Tests/CompressionTests.cs @@ -0,0 +1,185 @@ +using Cake.Compression.Classes; +using Cake.Core; +using Cake.Core.Diagnostics; +using Cake.Core.IO; +using Cake.Testing; +using FluentAssertions; +using NSubstitute; + +// ReSharper disable ObjectCreationAsStatement + +namespace Cake.Compression.Tests; + +public class CompressionTests +{ + private static readonly Type TypeArgumentNullException = typeof(ArgumentNullException); + private static readonly Type TypeArgumentOutOfRangeException = typeof(ArgumentOutOfRangeException); + private static readonly Type TypeCakeException = typeof(CakeException); + + private static readonly DirectoryPath RootPath = "/Root"; + private static readonly DirectoryPath OutputPath = "/Decompressed"; + private static readonly FilePath OutputArchivePath = "/archive.ext"; + private static readonly IEnumerable FilePaths = ["/Root/file.txt"]; + private const int Level = 6; + + public static TheoryData ConstructWithNullParameters + { + get + { + var fileSystem = Substitute.For(); + var environment = Substitute.For(); + var log = Substitute.For(); + + return new TheoryData + { + { () => new BZip2(null!, environment, log), "fileSystem" }, + { () => new BZip2(fileSystem, null!, log), "environment" }, + { () => new BZip2(fileSystem, environment, null!), "log" }, + + { () => new GZip(null!, environment, log), "fileSystem" }, + { () => new GZip(fileSystem, null!, log), "environment" }, + { () => new GZip(fileSystem, environment, null!), "log" }, + + { () => new Zip(null!, environment, log), "fileSystem" }, + { () => new Zip(fileSystem, null!, log), "environment" }, + { () => new Zip(fileSystem, environment, null!), "log" } + }; + } + } + + public static TheoryData CompressWithInvalidParameters + { + get + { + var environment = FakeEnvironment.CreateUnixEnvironment(); + var fileSystem = new FakeFileSystem(environment); + fileSystem.CreateFile("/NotRoot/file.txt"); + var log = Substitute.For(); + + var bzip = new BZip2(fileSystem, environment, log); + var gzip = new GZip(fileSystem, environment, log); + var zip = new Zip(fileSystem, environment, log); + + FilePath bzipOutputPath = "/archive.tar.bz2"; + FilePath gzipOutputPath = "/archive.tar.gz"; + FilePath zipOutputPath = "/archive.zip"; + IEnumerable filePathsNotRoot = ["/NotRoot/file.txt"]; + + const string message = "File '/NotRoot/file.txt' is not relative to root path '/Root'."; + + return new TheoryData + { + { () => bzip.Compress(null!, bzipOutputPath, FilePaths, Level), "rootPath", null, TypeArgumentNullException }, + { () => bzip.Compress(RootPath, null!, FilePaths, Level), "outputPath", null, TypeArgumentNullException }, + { () => bzip.Compress(RootPath, bzipOutputPath, null!, Level), "filePaths", null, TypeArgumentNullException }, + { () => bzip.Compress(RootPath, bzipOutputPath, FilePaths, 0), "level", null, TypeArgumentOutOfRangeException }, + { () => bzip.Compress(RootPath, bzipOutputPath, FilePaths, 10), "level", null, TypeArgumentOutOfRangeException }, + { () => bzip.Compress(RootPath, bzipOutputPath, filePathsNotRoot, Level), null, message, TypeCakeException }, + + { () => gzip.Compress(null!, gzipOutputPath, FilePaths, Level), "rootPath", null, TypeArgumentNullException }, + { () => gzip.Compress(RootPath, null!, FilePaths, Level), "outputPath", null, TypeArgumentNullException }, + { () => gzip.Compress(RootPath, gzipOutputPath, null!, Level), "filePaths", null, TypeArgumentNullException }, + { () => gzip.Compress(RootPath, gzipOutputPath, FilePaths, 0), "level", null, TypeArgumentOutOfRangeException }, + { () => gzip.Compress(RootPath, gzipOutputPath, FilePaths, 10), "level", null, TypeArgumentOutOfRangeException }, + { () => gzip.Compress(RootPath, gzipOutputPath, filePathsNotRoot, Level), null, message, TypeCakeException }, + + { () => zip.Compress(null!, zipOutputPath, FilePaths, Level), "rootPath", null, TypeArgumentNullException }, + { () => zip.Compress(RootPath, null!, FilePaths, Level), "outputPath", null, TypeArgumentNullException }, + { () => zip.Compress(RootPath, zipOutputPath, null!, Level), "filePaths", null, TypeArgumentNullException }, + { () => zip.Compress(RootPath, zipOutputPath, FilePaths, 0), "level", null, TypeArgumentOutOfRangeException }, + { () => zip.Compress(RootPath, zipOutputPath, FilePaths, 10), "level", null, TypeArgumentOutOfRangeException }, + { () => zip.Compress(RootPath, zipOutputPath, filePathsNotRoot, Level), null, message, TypeCakeException }, + }; + } + } + + public static TheoryData DecompressWithNullParameters + { + get + { + var environment = FakeEnvironment.CreateUnixEnvironment(); + var fileSystem = new FakeFileSystem(environment); + var log = Substitute.For(); + + var bzip = new BZip2(fileSystem, environment, log); + var gzip = new GZip(fileSystem, environment, log); + var zip = new Zip(fileSystem, environment, log); + + return new TheoryData + { + { () => bzip.Decompress(null!, OutputPath), "filePath" }, + { () => bzip.Decompress("/archive.tar.bz2", null!), "outputPath" }, + + { () => gzip.Decompress(null!, OutputPath), "filePath" }, + { () => gzip.Decompress("/archive.tar.gz", null!), "outputPath" }, + + { () => zip.Decompress(null!, OutputPath), "filePath" }, + { () => zip.Decompress("/archive.zip", null!), "outputPath" } + }; + } + } + + public static TheoryData CompressionBaseInstances + { + get + { + var environment = FakeEnvironment.CreateUnixEnvironment(); + var fileSystem = new FakeFileSystem(environment); + fileSystem.CreateFile("/Root/file.txt"); + var log = Substitute.For(); + + return new TheoryData + { + { new BZip2(fileSystem, environment, log), fileSystem }, + { new GZip(fileSystem, environment, log), fileSystem }, + { new Zip(fileSystem, environment, log), fileSystem }, + }; + } + } + + [Theory] + [MemberData(nameof(ConstructWithNullParameters))] + public void Should_Throw_On_Construct_With_Null_Parameters(Action act, string parameterName) + { + // Assert + act.Should().Throw().WithParameterName(parameterName); + } + + [Theory] + [MemberData(nameof(CompressWithInvalidParameters))] + public void Should_Throw_On_Compress_With_Invalid_Parameters(Action act, string? parameterName, string? message, Type exceptionType) + { + // Assert + if (exceptionType == TypeArgumentNullException) + { + act.Should().Throw().WithParameterName(parameterName); + } + else if (exceptionType == TypeArgumentOutOfRangeException) + { + act.Should().Throw().WithParameterName(parameterName); + } + else if (exceptionType == TypeCakeException) + { + act.Should().Throw().WithMessage(message); + } + } + + [Theory] + [MemberData(nameof(DecompressWithNullParameters))] + public void Should_Throw_On_Decompress_With_Null_Parameters(Action act, string parameterName) + { + // Assert + act.Should().Throw().WithParameterName(parameterName); + } + + [Theory] + [MemberData(nameof(CompressionBaseInstances))] + public void Should_Compress_Files(CompressionBase zip, FakeFileSystem fileSystem) + { + // Act + zip.Compress(RootPath, OutputArchivePath, FilePaths, Level); + + // Assert + fileSystem.Exist(OutputArchivePath).Should().BeTrue(); + } +} diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props new file mode 100644 index 0000000..7c03f27 --- /dev/null +++ b/tests/Directory.Build.props @@ -0,0 +1,9 @@ + + + + enable + enable + $(NoWarn) + false + + diff --git a/tests/Directory.Build.targets b/tests/Directory.Build.targets new file mode 100644 index 0000000..a4884e7 --- /dev/null +++ b/tests/Directory.Build.targets @@ -0,0 +1,6 @@ + + + + + + diff --git a/tests/Directory.Packages.props b/tests/Directory.Packages.props new file mode 100644 index 0000000..9be5b9e --- /dev/null +++ b/tests/Directory.Packages.props @@ -0,0 +1,20 @@ + + + + + true + + + + + + + + + + + + + + + diff --git a/tools/packages.config b/tools/packages.config deleted file mode 100644 index f27ab48..0000000 --- a/tools/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - -