diff --git a/.editorconfig b/.editorconfig index 98824c08..fb31b8c2 100644 --- a/.editorconfig +++ b/.editorconfig @@ -79,3 +79,9 @@ csharp_new_line_before_catch = true csharp_new_line_before_finally = true csharp_new_line_before_members_in_object_initializers = true csharp_new_line_before_members_in_anonymous_types = true + +# CSIsNull001: Use `is null` for null checks +dotnet_diagnostic.CSIsNull001.severity = warning + +# CSIsNull002: Use `is object` for non-null checks +dotnet_diagnostic.CSIsNull002.severity = warning diff --git a/3rdPartyNotices.txt b/3rdPartyNotices.txt index f96a675c..3a888faa 100644 --- a/3rdPartyNotices.txt +++ b/3rdPartyNotices.txt @@ -127,31 +127,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -dotnet/PInvoke (https://github.com/dotnet/pinvoke) -============== - -MIT License - -Copyright (c) .NET Foundation and Contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - Cake Contrib (https://github.com/cake-contrib/graphics) ============ diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 10d8b58c..c03e99ab 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -43,6 +43,7 @@ stages: windows: imageName: 'windows-2019' testModifier: + dotnet32: "\"C:\\Program Files (x86)\\dotnet\\dotnet.exe\"" variables: - ${{ if eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/andrewarnott/') }}: - group: dotnetfoundation code signing @@ -58,17 +59,24 @@ stages: displayName: Configure git commit author for testing - task: UseDotNet@2 - displayName: Install .NET Core SDK 5.0.202 + displayName: Install .NET Core 5.0.202 SDK inputs: packageType: sdk version: 5.0.202 - task: UseDotNet@2 - displayName: Install .NET Core 3.1 + displayName: Install .NET Core 3.1 runtime inputs: packageType: runtime version: 3.1.x + - pwsh: | + Invoke-WebRequest -Uri "https://dot.net/v1/dotnet-install.ps1" -OutFile dotnet-install.ps1 + & .\dotnet-install.ps1 -Architecture x86 -Version 5.0.202 -InstallDir "C:\Program Files (x86)\dotnet\" -NoPath -Verbose + & .\dotnet-install.ps1 -Architecture x86 -Channel 3.1 -InstallDir "C:\Program Files (x86)\dotnet\" -NoPath -Verbose + displayName: Install 32-bit .NET Core SDK 5.0.202, 3.1 + condition: ne(variables['dotnet32'], '') + - script: dotnet --info displayName: Show dotnet SDK info @@ -121,8 +129,22 @@ stages: --collect:"XPlat Code Coverage" -- RunConfiguration.DisableAppDomain=true - displayName: Run tests + displayName: Run x64 tests + workingDirectory: src + + - script: > + $(dotnet32) test NerdBank.GitVersioning.Tests + --no-build $(testModifier) + -c $(BuildConfiguration) + --filter "TestCategory!=FailsOnAzurePipelines" + --logger "trx;LogFileName=$(Build.ArtifactStagingDirectory)/TestLogs/TestResults.trx" + --results-directory $(Build.ArtifactStagingDirectory)/CodeCoverage/ + --collect:"XPlat Code Coverage" + -- + RunConfiguration.DisableAppDomain=true + displayName: Run x86 tests workingDirectory: src + condition: ne(variables['dotnet32'], '') - task: PublishCodeCoverageResults@1 displayName: Publish code coverage results @@ -296,17 +318,17 @@ stages: vmImage: $(imageName) steps: - task: UseDotNet@2 - displayName: Install .NET Core SDK 2.1.811 + displayName: Install .NET Core 2.1 runtime inputs: - packageType: sdk - version: 2.1.811 + packageType: runtime + version: 2.1.x - task: UseDotNet@2 - displayName: Install .NET Core SDK 3.1.100 + displayName: Install .NET Core 3.1 runtime inputs: - packageType: sdk - version: 3.1.100 + packageType: runtime + version: 3.1.x - task: UseDotNet@2 - displayName: Install .NET Core SDK 5.0.202 + displayName: Install .NET Core 5.0.202 SDK inputs: packageType: sdk version: 5.0.202 diff --git a/src/Directory.Build.props b/src/Directory.Build.props index e283fab8..94a570b3 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -24,9 +24,13 @@ 2.0.312 - + + + all + runtime; build; native; contentfiles; analyzers + diff --git a/src/NerdBank.GitVersioning.Tests/BuildIntegrationTests.cs b/src/NerdBank.GitVersioning.Tests/BuildIntegrationTests.cs index b2ab89f5..d931f2e2 100644 --- a/src/NerdBank.GitVersioning.Tests/BuildIntegrationTests.cs +++ b/src/NerdBank.GitVersioning.Tests/BuildIntegrationTests.cs @@ -219,7 +219,7 @@ public async Task GetBuildVersion_In_Git_But_Head_Lacks_VersionFile() var repo = new Repository(this.RepoPath); // do not assign Repo property to avoid commits being generated later repo.Commit("empty", this.Signer, this.Signer, new CommitOptions { AllowEmptyCommit = true }); this.WriteVersionFile("3.4"); - Assumes.True(repo.Index[VersionFile.JsonFileName] == null); + Assumes.True(repo.Index[VersionFile.JsonFileName] is null); var buildResult = await this.BuildAsync(); Assert.Equal("3.4.0." + this.GetVersion().Revision, buildResult.BuildVersion); Assert.Equal("3.4.0+" + repo.Head.Tip.Id.Sha.Substring(0, VersionOptions.DefaultGitCommitIdShortFixedLength), buildResult.AssemblyInformationalVersion); diff --git a/src/NerdBank.GitVersioning.Tests/ManagedGit/DeltaStreamReaderTests.cs b/src/NerdBank.GitVersioning.Tests/ManagedGit/DeltaStreamReaderTests.cs index 2e475ca9..279e0a16 100644 --- a/src/NerdBank.GitVersioning.Tests/ManagedGit/DeltaStreamReaderTests.cs +++ b/src/NerdBank.GitVersioning.Tests/ManagedGit/DeltaStreamReaderTests.cs @@ -89,7 +89,7 @@ public void ReadStreamTest() DeltaInstruction? current; - while ((current = DeltaStreamReader.Read(stream)) != null) + while ((current = DeltaStreamReader.Read(stream)) is not null) { instructions.Add(current.Value); } @@ -139,7 +139,7 @@ public void ReadStreamTest_Memory() DeltaInstruction? current; - while ((current = DeltaStreamReader.Read(ref memory)) != null) + while ((current = DeltaStreamReader.Read(ref memory)) is not null) { instructions.Add(current.Value); } diff --git a/src/NerdBank.GitVersioning.Tests/ManagedGit/GitPackTests.cs b/src/NerdBank.GitVersioning.Tests/ManagedGit/GitPackTests.cs index 94905c70..0c14a314 100644 --- a/src/NerdBank.GitVersioning.Tests/ManagedGit/GitPackTests.cs +++ b/src/NerdBank.GitVersioning.Tests/ManagedGit/GitPackTests.cs @@ -63,7 +63,15 @@ public void GetPackedObject() // This commit is not deltafied. It is stored as a .gz-compressed stream in the pack file. var zlibStream = Assert.IsType(commitStream); var deflateStream = Assert.IsType(zlibStream.BaseStream); - var pooledStream = Assert.IsType(deflateStream.BaseStream); + + if (IntPtr.Size > 4) + { + var pooledStream = Assert.IsType(deflateStream.BaseStream); + } + else + { + var pooledStream = Assert.IsType(deflateStream.BaseStream); + } Assert.Equal(222, commitStream.Length); Assert.Equal("/zgldANj+jvgOwlecnOKylZDVQg=", Convert.ToBase64String(sha.ComputeHash(commitStream))); @@ -85,7 +93,15 @@ public void GetDeltafiedObject() var deltaStream = Assert.IsType(commitStream); var zlibStream = Assert.IsType(deltaStream.BaseStream); var deflateStream = Assert.IsType(zlibStream.BaseStream); - var pooledStream = Assert.IsType(deflateStream.BaseStream); + + if (IntPtr.Size > 4) + { + var pooledStream = Assert.IsType(deflateStream.BaseStream); + } + else + { + var directAccessStream = Assert.IsType(deflateStream.BaseStream); + } Assert.Equal(137, commitStream.Length); Assert.Equal("lZu/7nGb0n1UuO9SlPluFnSvj4o=", Convert.ToBase64String(sha.ComputeHash(commitStream))); @@ -120,14 +136,24 @@ public void TryGetObjectTest() using (SHA1 sha = SHA1.Create()) { Assert.True(gitPack.TryGetObject(GitObjectId.Parse("f5b401f40ad83f13030e946c9ea22cb54cb853cd"), "commit", out Stream commitStream)); + using (commitStream) + { + // This commit is not deltafied. It is stored as a .gz-compressed stream in the pack file. + var zlibStream = Assert.IsType(commitStream); + var deflateStream = Assert.IsType(zlibStream.BaseStream); - // This commit is not deltafied. It is stored as a .gz-compressed stream in the pack file. - var zlibStream = Assert.IsType(commitStream); - var deflateStream = Assert.IsType(zlibStream.BaseStream); - var pooledStream = Assert.IsType(deflateStream.BaseStream); + if (IntPtr.Size > 4) + { + var pooledStream = Assert.IsType(deflateStream.BaseStream); + } + else + { + var directAccessStream = Assert.IsType(deflateStream.BaseStream); + } - Assert.Equal(222, commitStream.Length); - Assert.Equal("/zgldANj+jvgOwlecnOKylZDVQg=", Convert.ToBase64String(sha.ComputeHash(commitStream))); + Assert.Equal(222, commitStream.Length); + Assert.Equal("/zgldANj+jvgOwlecnOKylZDVQg=", Convert.ToBase64String(sha.ComputeHash(commitStream))); + } } } diff --git a/src/NerdBank.GitVersioning.Tests/ReleaseManagerTests.cs b/src/NerdBank.GitVersioning.Tests/ReleaseManagerTests.cs index 9ad8c96c..fb3e248c 100644 --- a/src/NerdBank.GitVersioning.Tests/ReleaseManagerTests.cs +++ b/src/NerdBank.GitVersioning.Tests/ReleaseManagerTests.cs @@ -320,7 +320,7 @@ public void PrepeareRelease_ReleaseBranchWithVersionDecrement(string initialVers // prepare release var releaseManager = new ReleaseManager(); - releaseManager.PrepareRelease(this.RepoPath, releaseUnstableTag, (nextVersion == null ? null : Version.Parse(nextVersion)), parameterVersionIncrement); + releaseManager.PrepareRelease(this.RepoPath, releaseUnstableTag, (nextVersion is null ? null : Version.Parse(nextVersion)), parameterVersionIncrement); // check if a branch was created Assert.Contains(this.LibGit2Repository.Branches, branch => branch.FriendlyName == expectedBranchName); @@ -394,7 +394,7 @@ public void PrepareRelease_MasterWithVersionDecrement(string initialVersion, str // running PrepareRelease should result in an error // because we're setting the version on master to a lower version this.AssertError( - () => new ReleaseManager().PrepareRelease(this.RepoPath, releaseUnstableTag, (nextVersion == null ? null : Version.Parse(nextVersion))), + () => new ReleaseManager().PrepareRelease(this.RepoPath, releaseUnstableTag, (nextVersion is null ? null : Version.Parse(nextVersion))), ReleasePreparationError.VersionDecrement); } @@ -412,7 +412,7 @@ public void PrepareRelease_MasterWithoutVersionIncrement(string initialVersion, // running PrepareRelease should result in an error // because we're trying to set master to the version it already has this.AssertError( - () => new ReleaseManager().PrepareRelease(this.RepoPath, null, (nextVersion == null ? null : Version.Parse(nextVersion))), + () => new ReleaseManager().PrepareRelease(this.RepoPath, null, (nextVersion is null ? null : Version.Parse(nextVersion))), ReleasePreparationError.NoVersionIncrement); } diff --git a/src/NerdBank.GitVersioning.Tests/RepoTestBase.cs b/src/NerdBank.GitVersioning.Tests/RepoTestBase.cs index 4bcd8bbb..5cc81647 100644 --- a/src/NerdBank.GitVersioning.Tests/RepoTestBase.cs +++ b/src/NerdBank.GitVersioning.Tests/RepoTestBase.cs @@ -143,7 +143,7 @@ protected void AddCommits(int count = 1) protected Commit? WriteVersionTxtFile(string version = "1.2", string prerelease = "", string? relativeDirectory = null) { - if (relativeDirectory == null) + if (relativeDirectory is null) { relativeDirectory = string.Empty; } @@ -163,7 +163,7 @@ protected void AddCommits(int count = 1) { Requires.NotNull(versionData, nameof(versionData)); - if (relativeDirectory == null) + if (relativeDirectory is null) { relativeDirectory = string.Empty; } @@ -197,7 +197,7 @@ protected void AddCommits(int count = 1) if (Path.GetExtension(relativeFilePath) == ".json") { string txtFilePath = relativeFilePath.Substring(0, relativeFilePath.Length - 4) + "txt"; - if (!File.Exists(Path.Combine(this.RepoPath, txtFilePath)) && this.LibGit2Repository.Index[txtFilePath] != null) + if (!File.Exists(Path.Combine(this.RepoPath, txtFilePath)) && this.LibGit2Repository.Index[txtFilePath] is not null) { this.LibGit2Repository.Index.Remove(txtFilePath); } diff --git a/src/NerdBank.GitVersioning.Tests/TestUtilities.cs b/src/NerdBank.GitVersioning.Tests/TestUtilities.cs index cad5242a..6ea6efc3 100644 --- a/src/NerdBank.GitVersioning.Tests/TestUtilities.cs +++ b/src/NerdBank.GitVersioning.Tests/TestUtilities.cs @@ -54,7 +54,7 @@ internal static void ExtractEmbeddedResource(string resourcePath, string extract using (var stream = GetEmbeddedResource(resourcePath)) { - Requires.Argument(stream != null, nameof(resourcePath), "Resource not found."); + Requires.Argument(stream is not null, nameof(resourcePath), "Resource not found."); using (var extractedFile = File.OpenWrite(extractedFilePath)) { stream.CopyTo(extractedFile); diff --git a/src/NerdBank.GitVersioning.Tests/VersionFileTests.cs b/src/NerdBank.GitVersioning.Tests/VersionFileTests.cs index a4ad2af3..f6330e61 100644 --- a/src/NerdBank.GitVersioning.Tests/VersionFileTests.cs +++ b/src/NerdBank.GitVersioning.Tests/VersionFileTests.cs @@ -140,7 +140,7 @@ public void SetVersion_WritesSimplestFile(string version, string assemblyVersion var versionOptions = new VersionOptions { Version = SemanticVersion.Parse(version), - AssemblyVersion = assemblyVersion != null || precision != null ? new VersionOptions.AssemblyVersionOptions(assemblyVersion != null ? new Version(assemblyVersion) : null, precision) : null, + AssemblyVersion = assemblyVersion is not null || precision is not null ? new VersionOptions.AssemblyVersionOptions(assemblyVersion is not null ? new Version(assemblyVersion) : null, precision) : null, VersionHeightOffset = versionHeightOffset, Inherit = inherit, }; diff --git a/src/NerdBank.GitVersioning/AssemblyVersionOptionsConverter.cs b/src/NerdBank.GitVersioning/AssemblyVersionOptionsConverter.cs index 0f88e0f5..0e88f638 100644 --- a/src/NerdBank.GitVersioning/AssemblyVersionOptionsConverter.cs +++ b/src/NerdBank.GitVersioning/AssemblyVersionOptionsConverter.cs @@ -51,7 +51,7 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var data = value as VersionOptions.AssemblyVersionOptions; - if (data != null) + if (data is not null) { if (data.PrecisionOrDefault == VersionOptions.DefaultVersionPrecision && !this.includeDefaults) { diff --git a/src/NerdBank.GitVersioning/CloudBuildServices/GitLab.cs b/src/NerdBank.GitVersioning/CloudBuildServices/GitLab.cs index aa0c649a..21abebd2 100644 --- a/src/NerdBank.GitVersioning/CloudBuildServices/GitLab.cs +++ b/src/NerdBank.GitVersioning/CloudBuildServices/GitLab.cs @@ -14,13 +14,13 @@ internal class GitLab : ICloudBuild { public string BuildingBranch => - Environment.GetEnvironmentVariable("CI_COMMIT_TAG") == null ? + Environment.GetEnvironmentVariable("CI_COMMIT_TAG") is null ? $"refs/heads/{Environment.GetEnvironmentVariable("CI_COMMIT_REF_NAME")}" : null; public string BuildingRef => this.BuildingBranch ?? this.BuildingTag; public string BuildingTag => - Environment.GetEnvironmentVariable("CI_COMMIT_TAG") != null ? + Environment.GetEnvironmentVariable("CI_COMMIT_TAG") is not null ? $"refs/tags/{Environment.GetEnvironmentVariable("CI_COMMIT_TAG")}" : null; public string GitCommitId => Environment.GetEnvironmentVariable("CI_COMMIT_SHA"); diff --git a/src/NerdBank.GitVersioning/CloudBuildServices/SpaceAutomation.cs b/src/NerdBank.GitVersioning/CloudBuildServices/SpaceAutomation.cs index cf1930ab..b3d11a0d 100644 --- a/src/NerdBank.GitVersioning/CloudBuildServices/SpaceAutomation.cs +++ b/src/NerdBank.GitVersioning/CloudBuildServices/SpaceAutomation.cs @@ -19,7 +19,7 @@ internal class SpaceAutomation : ICloudBuild public string GitCommitId => Environment.GetEnvironmentVariable("JB_SPACE_GIT_REVISION"); - public bool IsApplicable => this.GitCommitId != null; + public bool IsApplicable => this.GitCommitId is not null; public bool IsPullRequest => false; diff --git a/src/NerdBank.GitVersioning/CloudBuildServices/TeamCity.cs b/src/NerdBank.GitVersioning/CloudBuildServices/TeamCity.cs index da5367e9..828798ee 100644 --- a/src/NerdBank.GitVersioning/CloudBuildServices/TeamCity.cs +++ b/src/NerdBank.GitVersioning/CloudBuildServices/TeamCity.cs @@ -19,7 +19,7 @@ internal class TeamCity : ICloudBuild public string GitCommitId => Environment.GetEnvironmentVariable("BUILD_VCS_NUMBER"); - public bool IsApplicable => this.GitCommitId != null; + public bool IsApplicable => this.GitCommitId is not null; public bool IsPullRequest => false; diff --git a/src/NerdBank.GitVersioning/FilterPathJsonConverter.cs b/src/NerdBank.GitVersioning/FilterPathJsonConverter.cs index acd57e03..304c41f0 100644 --- a/src/NerdBank.GitVersioning/FilterPathJsonConverter.cs +++ b/src/NerdBank.GitVersioning/FilterPathJsonConverter.cs @@ -22,7 +22,7 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist throw new NotSupportedException(); } - if (this.repoRelativeBaseDirectory == null) + if (this.repoRelativeBaseDirectory is null) { throw new ArgumentNullException(nameof(this.repoRelativeBaseDirectory), $"Base directory must not be null to be able to deserialize filter paths. Ensure that one was passed to {nameof(VersionOptions.GetJsonSettings)}, and that the version.json file is being written to a Git repository."); } @@ -37,7 +37,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s throw new NotSupportedException(); } - if (this.repoRelativeBaseDirectory == null) + if (this.repoRelativeBaseDirectory is null) { throw new ArgumentNullException(nameof(this.repoRelativeBaseDirectory), $"Base directory must not be null to be able to serialize filter paths. Ensure that one was passed to {nameof(VersionOptions.GetJsonSettings)}, and that the version.json file is being written to a Git repository."); } diff --git a/src/NerdBank.GitVersioning/LibGit2/LibGit2GitExtensions.cs b/src/NerdBank.GitVersioning/LibGit2/LibGit2GitExtensions.cs index aa27910b..b644803f 100644 --- a/src/NerdBank.GitVersioning/LibGit2/LibGit2GitExtensions.cs +++ b/src/NerdBank.GitVersioning/LibGit2/LibGit2GitExtensions.cs @@ -60,13 +60,13 @@ internal static int GetVersionHeight(LibGit2Context context, Version? baseVersio var tracker = new GitWalkTracker(context); var versionOptions = tracker.GetVersion(context.Commit); - if (versionOptions == null) + if (versionOptions is null) { return 0; } var baseSemVer = - baseVersion != null ? SemanticVersion.Parse(baseVersion.ToString()) : + baseVersion is not null ? SemanticVersion.Parse(baseVersion.ToString()) : versionOptions.Version ?? SemVer0; var versionHeightPosition = versionOptions.VersionHeightPosition; @@ -148,7 +148,7 @@ public static IEnumerable GetCommitsFromVersion(LibGit2Context context, var tracker = new GitWalkTracker(context); var possibleCommits = from commit in GetCommitsReachableFromRefs(context.Repository) let commitVersionOptions = tracker.GetVersion(commit) - where commitVersionOptions != null + where commitVersionOptions is not null where !IsCommitIdMismatch(version, commitVersionOptions, commit) where !IsVersionHeightMismatch(version, commitVersionOptions, commit, tracker) select commit; @@ -195,7 +195,7 @@ private static bool CommitMatchesVersion(this Commit commit, SemanticVersion exp var commitVersionData = tracker.GetVersion(commit); var semVerFromFile = commitVersionData?.Version; - if (semVerFromFile == null) + if (semVerFromFile is null) { return false; } @@ -224,7 +224,7 @@ private static bool CommitMatchesVersion(this Commit commit, Version expectedVer var commitVersionData = tracker.GetVersion(commit); var semVerFromFile = commitVersionData?.Version; - if (semVerFromFile == null) + if (semVerFromFile is null) { return false; } @@ -401,7 +401,7 @@ bool TryCalculateHeight(Commit commit) int height = 1; - if (includePaths != null) + if (includePaths is not null) { // If there are no include paths, or any of the include // paths refer to the root of the repository, then do not @@ -506,8 +506,8 @@ internal static Version GetIdAsVersionHelper(this Commit? commit, VersionOptions // Don't use the ?? coalescing operator here because the position property getters themselves can return null, which should NOT be overridden with our default. // The default value is only appropriate if versionOptions itself is null. - var versionHeightPosition = versionOptions != null ? versionOptions.VersionHeightPosition : SemanticVersion.Position.Build; - var commitIdPosition = versionOptions != null ? versionOptions.GitCommitIdPosition : SemanticVersion.Position.Revision; + var versionHeightPosition = versionOptions is not null ? versionOptions.VersionHeightPosition : SemanticVersion.Position.Build; + var commitIdPosition = versionOptions is not null ? versionOptions.GitCommitIdPosition : SemanticVersion.Position.Revision; // The compiler (due to WinPE header requirements) only allows 16-bit version components, // and forbids 0xffff as a value. diff --git a/src/NerdBank.GitVersioning/Managed/ManagedGitContext.cs b/src/NerdBank.GitVersioning/Managed/ManagedGitContext.cs index d42f1aec..a6d4fab5 100644 --- a/src/NerdBank.GitVersioning/Managed/ManagedGitContext.cs +++ b/src/NerdBank.GitVersioning/Managed/ManagedGitContext.cs @@ -94,7 +94,7 @@ internal override int CalculateVersionHeight(VersionOptions? committedVersion, V { var workingCopyVersion = workingVersion?.Version?.Version; - if (workingCopyVersion == null || !workingCopyVersion.Equals(headCommitVersion)) + if (workingCopyVersion is null || !workingCopyVersion.Equals(headCommitVersion)) { // The working copy has changed the major.minor version. // So by definition the version height is 0, since no commit represents it yet. @@ -153,8 +153,8 @@ private Version GetIdAsVersionHelper(VersionOptions? versionOptions, int version // Don't use the ?? coalescing operator here because the position property getters themselves can return null, which should NOT be overridden with our default. // The default value is only appropriate if versionOptions itself is null. - var versionHeightPosition = versionOptions != null ? versionOptions.VersionHeightPosition : SemanticVersion.Position.Build; - var commitIdPosition = versionOptions != null ? versionOptions.GitCommitIdPosition : SemanticVersion.Position.Revision; + var versionHeightPosition = versionOptions is not null ? versionOptions.VersionHeightPosition : SemanticVersion.Position.Build; + var commitIdPosition = versionOptions is not null ? versionOptions.GitCommitIdPosition : SemanticVersion.Position.Revision; // The compiler (due to WinPE header requirements) only allows 16-bit version components, // and forbids 0xffff as a value. diff --git a/src/NerdBank.GitVersioning/Managed/ManagedGitExtensions.cs b/src/NerdBank.GitVersioning/Managed/ManagedGitExtensions.cs index 58b8206e..2f05103e 100644 --- a/src/NerdBank.GitVersioning/Managed/ManagedGitExtensions.cs +++ b/src/NerdBank.GitVersioning/Managed/ManagedGitExtensions.cs @@ -35,13 +35,13 @@ internal static int GetVersionHeight(ManagedGitContext context, Version? baseVer var tracker = new GitWalkTracker(context); var versionOptions = tracker.GetVersion(context.Commit.Value); - if (versionOptions == null) + if (versionOptions is null) { return 0; } var baseSemVer = - baseVersion != null ? SemanticVersion.Parse(baseVersion.ToString()) : + baseVersion is not null ? SemanticVersion.Parse(baseVersion.ToString()) : versionOptions.Version ?? SemVer0; var versionHeightPosition = versionOptions.VersionHeightPosition; @@ -69,7 +69,7 @@ private static bool CommitMatchesVersion(GitCommit commit, SemanticVersion expec var commitVersionData = tracker.GetVersion(commit); var semVerFromFile = commitVersionData?.Version; - if (commitVersionData == null || semVerFromFile == null) + if (commitVersionData is null || semVerFromFile is null) { return false; } @@ -167,7 +167,7 @@ bool TryCalculateHeight(GitCommit commit) int height = 1; - if (pathFilters != null) + if (pathFilters is not null) { var relevantCommit = true; @@ -250,7 +250,7 @@ private static bool IsRelevantCommit(GitRepository repository, GitTree tree, Git isRelevant = IsRelevantCommit( repository, repository.GetTree(entry.Sha), - parentEntry == null ? GitTree.Empty : repository.GetTree(parentEntry.Sha), + parentEntry is null ? GitTree.Empty : repository.GetTree(parentEntry.Sha), $"{fullPath}/", filters); } @@ -262,7 +262,7 @@ private static bool IsRelevantCommit(GitRepository repository, GitTree tree, Git } } - if (parentEntry != null) + if (parentEntry is not null) { parent.Children.Remove(child.Key); } diff --git a/src/NerdBank.GitVersioning/ManagedGit/FileHelpers.cs b/src/NerdBank.GitVersioning/ManagedGit/FileHelpers.cs index 623539a1..e1d9713b 100644 --- a/src/NerdBank.GitVersioning/ManagedGit/FileHelpers.cs +++ b/src/NerdBank.GitVersioning/ManagedGit/FileHelpers.cs @@ -5,8 +5,9 @@ using System.IO; using System.Runtime.InteropServices; using Microsoft.Win32.SafeHandles; -using static PInvoke.Kernel32; -using FileShare = PInvoke.Kernel32.FileShare; +using Windows.Win32; +using Windows.Win32.Storage.FileSystem; +using Windows.Win32.System.SystemServices; namespace Nerdbank.GitVersioning.ManagedGit { @@ -24,7 +25,7 @@ internal static bool TryOpen(string path, out FileStream? stream) { if (IsWindows) { - var handle = CreateFile(path, ACCESS_MASK.GenericRight.GENERIC_READ, FileShare.FILE_SHARE_READ, (SECURITY_ATTRIBUTES?)null, CreationDisposition.OPEN_EXISTING, CreateFileFlags.FILE_ATTRIBUTE_NORMAL, SafeObjectHandle.Null); + var handle = PInvoke.CreateFile(path, FILE_ACCESS_FLAGS.FILE_GENERIC_READ, FILE_SHARE_MODE.FILE_SHARE_READ, lpSecurityAttributes: null, FILE_CREATION_DISPOSITION.OPEN_EXISTING, FILE_FLAGS_AND_ATTRIBUTES.FILE_ATTRIBUTE_NORMAL, null); if (!handle.IsInvalid) { @@ -62,12 +63,15 @@ internal static unsafe bool TryOpen(ReadOnlySpan path, [NotNullWhen(true)] { if (IsWindows) { - var handle = CreateFile(path, ACCESS_MASK.GenericRight.GENERIC_READ, FileShare.FILE_SHARE_READ, null, CreationDisposition.OPEN_EXISTING, CreateFileFlags.FILE_ATTRIBUTE_NORMAL, SafeObjectHandle.Null); + HANDLE handle; + fixed (char* pPath = &path[0]) + { + handle = PInvoke.CreateFile(pPath, FILE_ACCESS_FLAGS.FILE_GENERIC_READ, FILE_SHARE_MODE.FILE_SHARE_READ, null, FILE_CREATION_DISPOSITION.OPEN_EXISTING, FILE_FLAGS_AND_ATTRIBUTES.FILE_ATTRIBUTE_NORMAL, default); + } - if (!handle.IsInvalid) + if (!handle.Equals(Constants.INVALID_HANDLE_VALUE)) { - var fileHandle = new SafeFileHandle(handle.DangerousGetHandle(), ownsHandle: true); - handle.SetHandleAsInvalid(); + var fileHandle = new SafeFileHandle(handle, ownsHandle: true); stream = new FileStream(fileHandle, System.IO.FileAccess.Read); return true; } diff --git a/src/NerdBank.GitVersioning/ManagedGit/GitCommitReader.cs b/src/NerdBank.GitVersioning/ManagedGit/GitCommitReader.cs index 25b22e49..8af84e05 100644 --- a/src/NerdBank.GitVersioning/ManagedGit/GitCommitReader.cs +++ b/src/NerdBank.GitVersioning/ManagedGit/GitCommitReader.cs @@ -38,7 +38,7 @@ public static class GitCommitReader /// public static GitCommit Read(Stream stream, GitObjectId sha, bool readAuthor = false) { - if (stream == null) + if (stream is null) { throw new ArgumentNullException(nameof(stream)); } diff --git a/src/NerdBank.GitVersioning/ManagedGit/GitObjectId.cs b/src/NerdBank.GitVersioning/ManagedGit/GitObjectId.cs index f21794b7..3e62f158 100644 --- a/src/NerdBank.GitVersioning/ManagedGit/GitObjectId.cs +++ b/src/NerdBank.GitVersioning/ManagedGit/GitObjectId.cs @@ -174,7 +174,7 @@ public override bool Equals(object? obj) /// public override string ToString() { - if (this.sha == null) + if (this.sha is null) { this.sha = this.CreateString(0, 20); } diff --git a/src/NerdBank.GitVersioning/ManagedGit/GitPack.cs b/src/NerdBank.GitVersioning/ManagedGit/GitPack.cs index 27c45c69..576dd50d 100644 --- a/src/NerdBank.GitVersioning/ManagedGit/GitPack.cs +++ b/src/NerdBank.GitVersioning/ManagedGit/GitPack.cs @@ -31,8 +31,8 @@ public class GitPack : IDisposable private readonly Func packStream; private readonly Lazy indexStream; private readonly GitPackCache cache; - private MemoryMappedFile packFile; - private MemoryMappedViewAccessor accessor; + private MemoryMappedFile? packFile = null; + private MemoryMappedViewAccessor? accessor = null; // Maps GitObjectIds to offets in the git pack. private readonly Dictionary offsets = new Dictionary(); @@ -98,8 +98,11 @@ public GitPack(GetObjectFromRepositoryDelegate getObjectFromRepositoryDelegate, this.indexStream = indexStream ?? throw new ArgumentNullException(nameof(indexStream)); this.cache = cache ?? new GitPackMemoryCache(); - this.packFile = MemoryMappedFile.CreateFromFile(this.packStream(), mapName: null, 0, MemoryMappedFileAccess.Read, HandleInheritability.None, leaveOpen: false); - this.accessor = this.packFile.CreateViewAccessor(0, 0, MemoryMappedFileAccess.Read); + if (IntPtr.Size > 4) + { + this.packFile = MemoryMappedFile.CreateFromFile(this.packStream(), mapName: null, 0, MemoryMappedFileAccess.Read, HandleInheritability.None, leaveOpen: false); + this.accessor = this.packFile.CreateViewAccessor(0, 0, MemoryMappedFileAccess.Read); + } } /// @@ -143,7 +146,7 @@ public bool TryGetObject(GitObjectId objectId, string objectType, out Stream? va { var offset = this.GetOffset(objectId); - if (offset == null) + if (offset is null) { value = null; return false; @@ -202,7 +205,17 @@ public Stream GetObject(long offset, string objectType) } var packStream = this.GetPackStream(); - Stream objectStream = GitPackReader.GetObject(this, packStream, offset, objectType, packObjectType); + Stream objectStream; + + try + { + objectStream = GitPackReader.GetObject(this, packStream, offset, objectType, packObjectType); + } + catch + { + packStream.Dispose(); + throw; + } return this.cache.Add(offset, objectStream); } @@ -240,8 +253,8 @@ public void Dispose() this.indexReader.Value.Dispose(); } - this.accessor.Dispose(); - this.packFile.Dispose(); + this.accessor?.Dispose(); + this.packFile?.Dispose(); this.cache.Dispose(); } @@ -255,7 +268,7 @@ public void Dispose() var indexReader = this.indexReader.Value; var offset = indexReader.GetOffset(objectId); - if (offset != null) + if (offset is not null) { this.offsets.Add(objectId, offset.Value); } @@ -265,7 +278,17 @@ public void Dispose() private Stream GetPackStream() { - return new MemoryMappedStream(this.accessor); + // On 64-bit processes, we can use Memory Mapped Streams (the address space + // will be large enough to map the entire packfile). On 32-bit processes, + // we directly access the underlying stream. + if (IntPtr.Size > 4) + { + return new MemoryMappedStream(this.accessor); + } + else + { + return this.packStream(); + } } private GitPackIndexReader OpenIndex() diff --git a/src/NerdBank.GitVersioning/ManagedGit/GitPackDeltafiedStream.cs b/src/NerdBank.GitVersioning/ManagedGit/GitPackDeltafiedStream.cs index f2ab7d0e..3cff6c53 100644 --- a/src/NerdBank.GitVersioning/ManagedGit/GitPackDeltafiedStream.cs +++ b/src/NerdBank.GitVersioning/ManagedGit/GitPackDeltafiedStream.cs @@ -169,7 +169,7 @@ protected override void Dispose(bool disposing) private bool TryGetInstruction(out DeltaInstruction instruction) { - if (this.current != null && this.offset < this.current.Value.Size) + if (this.current is not null && this.offset < this.current.Value.Size) { instruction = this.current.Value; return true; @@ -177,7 +177,7 @@ private bool TryGetInstruction(out DeltaInstruction instruction) this.current = DeltaStreamReader.Read(this.deltaStream); - if (this.current == null) + if (this.current is null) { instruction = default; return false; diff --git a/src/NerdBank.GitVersioning/ManagedGit/GitPackIndexMappedReader.cs b/src/NerdBank.GitVersioning/ManagedGit/GitPackIndexMappedReader.cs index 8f895ac1..b3690166 100644 --- a/src/NerdBank.GitVersioning/ManagedGit/GitPackIndexMappedReader.cs +++ b/src/NerdBank.GitVersioning/ManagedGit/GitPackIndexMappedReader.cs @@ -32,7 +32,7 @@ public unsafe class GitPackIndexMappedReader : GitPackIndexReader /// public GitPackIndexMappedReader(FileStream stream) { - if (stream == null) + if (stream is null) { throw new ArgumentNullException(nameof(stream)); } @@ -128,7 +128,7 @@ public override (long?, GitObjectId?) GetOffset(Span objectName, bool ends { // If the first bit of the offset address is set, the offset is stored as a 64-bit value in the table of 8-byte offset entries, // which follows the table of 4-byte offset entries: "large offsets are encoded as an index into the next table with the msbit set." - offset = offset & 0x7FF; + offset = offset & 0x7FFFFFFF; offsetBuffer = this.Value.Slice(offsetTableStart + 4 * objectCount + 8 * (int)offset, 8); var offset64 = BinaryPrimitives.ReadInt64BigEndian(offsetBuffer); diff --git a/src/NerdBank.GitVersioning/ManagedGit/GitPackReader.cs b/src/NerdBank.GitVersioning/ManagedGit/GitPackReader.cs index 30d3bead..354060d4 100644 --- a/src/NerdBank.GitVersioning/ManagedGit/GitPackReader.cs +++ b/src/NerdBank.GitVersioning/ManagedGit/GitPackReader.cs @@ -13,12 +13,12 @@ internal static class GitPackReader public static Stream GetObject(GitPack pack, Stream stream, long offset, string objectType, GitPackObjectType packObjectType) { - if (pack == null) + if (pack is null) { throw new ArgumentNullException(nameof(pack)); } - if (stream == null) + if (stream is null) { throw new ArgumentNullException(nameof(stream)); } @@ -44,7 +44,7 @@ public static Stream GetObject(GitPack pack, Stream stream, long offset, string if (type == GitPackObjectType.OBJ_OFS_DELTA) { var baseObjectRelativeOffset = ReadVariableLengthInteger(stream); - var baseObjectOffset = (int)(offset - baseObjectRelativeOffset); + long baseObjectOffset = offset - baseObjectRelativeOffset; var deltaStream = new ZLibStream(stream, decompressedSize); var baseObjectStream = pack.GetObject(baseObjectOffset, objectType); @@ -98,9 +98,9 @@ private static (GitPackObjectType, long) ReadObjectHeader(Stream stream) return (type, length); } - private static int ReadVariableLengthInteger(Stream stream) + private static long ReadVariableLengthInteger(Stream stream) { - int offset = -1; + long offset = -1; int b; do diff --git a/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs b/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs index 459f23c6..05e8fd53 100644 --- a/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs +++ b/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs @@ -192,7 +192,7 @@ public string ShortenObjectId(GitObjectId objectId, int minimum) { var objectish = sha.Substring(0, length); - if (this.Lookup(objectish) != null) + if (this.Lookup(objectish) is not null) { return objectish; } @@ -263,7 +263,7 @@ public GitCommit GetCommit(GitObjectId sha, bool readAuthor = false) { using (Stream? stream = this.GetObjectBySha(sha, "commit")) { - if (stream == null) + if (stream is null) { throw new GitException($"The commit {sha} was not found in this repository.") { ErrorCode = GitException.ErrorCodes.ObjectNotFound }; } @@ -396,7 +396,7 @@ public GitCommit GetCommit(GitObjectId sha, bool readAuthor = false) // It's possible for the same object to be present in both the object database and the pack files, // or in multiple pack files. - if (objectId != null && !possibleObjectIds.Contains(objectId.Value)) + if (objectId is not null && !possibleObjectIds.Contains(objectId.Value)) { if (possibleObjectIds.Count > 0) { @@ -435,7 +435,7 @@ public GitTree GetTree(GitObjectId sha) { using (Stream? stream = this.GetObjectBySha(sha, "tree")) { - if (stream == null) + if (stream is null) { throw new GitException($"The tree {sha} was not found in this repository.") { ErrorCode = GitException.ErrorCodes.ObjectNotFound }; } @@ -461,7 +461,7 @@ public GitObjectId GetTreeEntry(GitObjectId treeId, ReadOnlySpan nodeName) { using (Stream? treeStream = this.GetObjectBySha(treeId, "tree")) { - if (treeStream == null) + if (treeStream is null) { throw new GitException($"The tree {treeId} was not found in this repository.") { ErrorCode = GitException.ErrorCodes.ObjectNotFound }; } diff --git a/src/NerdBank.GitVersioning/ManagedGit/ZLibStream.cs b/src/NerdBank.GitVersioning/ManagedGit/ZLibStream.cs index 31d11366..d4e68212 100644 --- a/src/NerdBank.GitVersioning/ManagedGit/ZLibStream.cs +++ b/src/NerdBank.GitVersioning/ManagedGit/ZLibStream.cs @@ -56,9 +56,9 @@ public ZLibStream(Stream stream, long length = -1) Span zlibHeader = stackalloc byte[2]; stream.ReadAll(zlibHeader); - if (zlibHeader[0] != 0x78 || (zlibHeader[1] != 0x01 && zlibHeader[1] != 0x9C)) + if (zlibHeader[0] != 0x78 || (zlibHeader[1] != 0x01 && zlibHeader[1] != 0x9C && zlibHeader[1] != 0x5E && zlibHeader[1] != 0xDA)) { - throw new GitException(); + throw new GitException($"Invalid zlib header {zlibHeader[0]:X2} {zlibHeader[1]:X2}"); } } diff --git a/src/NerdBank.GitVersioning/NativeMethods.json b/src/NerdBank.GitVersioning/NativeMethods.json new file mode 100644 index 00000000..69d2bcc5 --- /dev/null +++ b/src/NerdBank.GitVersioning/NativeMethods.json @@ -0,0 +1,3 @@ +{ + "$schema": "https://aka.ms/CsWin32.schema.json" +} \ No newline at end of file diff --git a/src/NerdBank.GitVersioning/NativeMethods.txt b/src/NerdBank.GitVersioning/NativeMethods.txt new file mode 100644 index 00000000..885be08e --- /dev/null +++ b/src/NerdBank.GitVersioning/NativeMethods.txt @@ -0,0 +1,2 @@ +CreateFile +INVALID_HANDLE_VALUE diff --git a/src/NerdBank.GitVersioning/NerdBank.GitVersioning.csproj b/src/NerdBank.GitVersioning/NerdBank.GitVersioning.csproj index afeb8233..1119a781 100644 --- a/src/NerdBank.GitVersioning/NerdBank.GitVersioning.csproj +++ b/src/NerdBank.GitVersioning/NerdBank.GitVersioning.csproj @@ -10,14 +10,14 @@ - + + - diff --git a/src/NerdBank.GitVersioning/ReleaseManager.cs b/src/NerdBank.GitVersioning/ReleaseManager.cs index 42324946..6656a73e 100644 --- a/src/NerdBank.GitVersioning/ReleaseManager.cs +++ b/src/NerdBank.GitVersioning/ReleaseManager.cs @@ -248,7 +248,7 @@ public void PrepareRelease(string projectDirectory, string releaseUnstableTag = // get the current version var versionOptions = context.VersionFile.GetVersion(); - if (versionOptions == null) + if (versionOptions is null) { this.stderr.WriteLine($"Failed to load version file for directory '{projectDirectory}'."); throw new ReleasePreparationException(ReleasePreparationError.NoVersionFile); @@ -287,7 +287,7 @@ public void PrepareRelease(string projectDirectory, string releaseUnstableTag = } // check if the release branch already exists - if (repository.Branches[releaseBranchName] != null) + if (repository.Branches[releaseBranchName] is not null) { this.stderr.WriteLine($"Cannot create branch '{releaseBranchName}' because it already exists."); throw new ReleasePreparationException(ReleasePreparationError.BranchAlreadyExists); @@ -384,7 +384,7 @@ private void UpdateVersion(LibGit2Context context, SemanticVersion oldVersion, S private Signature GetSignature(Repository repository) { var signature = repository.Config.BuildSignature(DateTimeOffset.Now); - if (signature == null) + if (signature is null) { this.stderr.WriteLine("Cannot create commits in this repo because git user name and email are not configured."); throw new ReleasePreparationException(ReleasePreparationError.UserNotConfigured); @@ -443,7 +443,7 @@ private SemanticVersion GetNextDevVersion(VersionOptions versionOptions, Version var currentVersion = versionOptions.Version; SemanticVersion nextDevVersion; - if (nextVersionOverride != null) + if (nextVersionOverride is not null) { nextDevVersion = new SemanticVersion(nextVersionOverride, currentVersion.Prerelease, currentVersion.BuildMetadata); } diff --git a/src/NerdBank.GitVersioning/SemanticVersion.cs b/src/NerdBank.GitVersioning/SemanticVersion.cs index 9b503b46..ad07b529 100644 --- a/src/NerdBank.GitVersioning/SemanticVersion.cs +++ b/src/NerdBank.GitVersioning/SemanticVersion.cs @@ -155,7 +155,7 @@ internal enum Position /// /// Gets a value indicating whether this instance is the default "0.0" instance. /// - internal bool IsDefault => this.Version?.Major == 0 && this.Version.Minor == 0 && this.Version.Build == -1 && this.Version.Revision == -1 && this.Prerelease == null && this.BuildMetadata == null; + internal bool IsDefault => this.Version?.Major == 0 && this.Version.Minor == 0 && this.Version.Build == -1 && this.Version.Revision == -1 && this.Prerelease is null && this.BuildMetadata is null; /// /// Gets the debugger display for this instance. @@ -239,7 +239,7 @@ public override string ToString() /// true if the instances have equal values; false otherwise. public bool Equals(SemanticVersion other) { - if (other == null) + if (other is null) { return false; } diff --git a/src/NerdBank.GitVersioning/SemanticVersionJsonConverter.cs b/src/NerdBank.GitVersioning/SemanticVersionJsonConverter.cs index a064cb19..a4ae7f34 100644 --- a/src/NerdBank.GitVersioning/SemanticVersionJsonConverter.cs +++ b/src/NerdBank.GitVersioning/SemanticVersionJsonConverter.cs @@ -32,7 +32,7 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var version = value as SemanticVersion; - if (version != null) + if (version is not null) { writer.WriteValue(version.ToString()); return; diff --git a/src/NerdBank.GitVersioning/VersionOptions.cs b/src/NerdBank.GitVersioning/VersionOptions.cs index 7aee1dfa..cac77f86 100644 --- a/src/NerdBank.GitVersioning/VersionOptions.cs +++ b/src/NerdBank.GitVersioning/VersionOptions.cs @@ -570,9 +570,7 @@ internal bool IsDefaultVersionTheOnlyPropertySet { get { - return this.Version != null - && this.AssemblyVersion == null - && (this.CloudBuild?.IsDefault ?? true) + return this.Version is not null && this.AssemblyVersion is null && (this.CloudBuild?.IsDefault ?? true) && this.VersionHeightOffset == 0 && !this.SemVer1NumericIdentifierPadding.HasValue && !this.Inherit; @@ -693,7 +691,7 @@ public bool Equals(NuGetPackageVersionOptions? x, NuGetPackageVersionOptions? y) return true; } - if (x == null || y == null) + if (x is null || y is null) { return false; } @@ -1575,7 +1573,7 @@ public bool Equals(ReleaseOptions? x, ReleaseOptions? y) /// public int GetHashCode(ReleaseOptions? obj) { - if (obj == null) + if (obj is null) return 0; unchecked diff --git a/src/NerdBank.GitVersioning/VersionOracle.cs b/src/NerdBank.GitVersioning/VersionOracle.cs index 84c83019..93a11394 100644 --- a/src/NerdBank.GitVersioning/VersionOracle.cs +++ b/src/NerdBank.GitVersioning/VersionOracle.cs @@ -294,7 +294,7 @@ public IEnumerable BuildMetadataWithCommitId var properties = this.GetType().GetTypeInfo().GetProperties(BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance); foreach (var property in properties) { - if (property.GetCustomAttribute() == null) + if (property.GetCustomAttribute() is null) { var value = property.GetValue(this); if (value is object) diff --git a/src/Nerdbank.GitVersioning.Tasks/ContextAwareTask.cs b/src/Nerdbank.GitVersioning.Tasks/ContextAwareTask.cs index b4c1e51b..f3bb3e17 100644 --- a/src/Nerdbank.GitVersioning.Tasks/ContextAwareTask.cs +++ b/src/Nerdbank.GitVersioning.Tasks/ContextAwareTask.cs @@ -31,11 +31,11 @@ public override bool Execute() var outerProperties = this.GetType().GetRuntimeProperties().ToDictionary(i => i.Name); var innerProperties = innerTaskType.GetRuntimeProperties().ToDictionary(i => i.Name); var propertiesDiscovery = from outerProperty in outerProperties.Values - where outerProperty.SetMethod != null && outerProperty.GetMethod != null + where outerProperty.SetMethod is not null && outerProperty.GetMethod is not null let innerProperty = innerProperties[outerProperty.Name] select new { outerProperty, innerProperty }; var propertiesMap = propertiesDiscovery.ToArray(); - var outputPropertiesMap = propertiesMap.Where(pair => pair.outerProperty.GetCustomAttribute() != null).ToArray(); + var outputPropertiesMap = propertiesMap.Where(pair => pair.outerProperty.GetCustomAttribute() is not null).ToArray(); foreach (var propertyPair in propertiesMap) { @@ -54,7 +54,7 @@ public override bool Execute() return result; #else // On .NET Framework (on Windows), we find native binaries by adding them to our PATH. - if (this.UnmanagedDllDirectory != null) + if (this.UnmanagedDllDirectory is not null) { string pathEnvVar = Environment.GetEnvironmentVariable("PATH"); string[] searchPaths = pathEnvVar.Split(Path.PathSeparator); diff --git a/src/Nerdbank.GitVersioning.Tasks/GetBuildVersion.cs b/src/Nerdbank.GitVersioning.Tasks/GetBuildVersion.cs index 2a9c00d4..77b79342 100644 --- a/src/Nerdbank.GitVersioning.Tasks/GetBuildVersion.cs +++ b/src/Nerdbank.GitVersioning.Tasks/GetBuildVersion.cs @@ -237,7 +237,7 @@ protected override bool ExecuteInner() oracle.PublicRelease = string.Equals(this.DefaultPublicRelease, "true", StringComparison.OrdinalIgnoreCase); } - if (this.BuildMetadata != null) + if (this.BuildMetadata is not null) { oracle.BuildMetadata.AddRange(this.BuildMetadata.Split(';')); } @@ -259,7 +259,7 @@ protected override bool ExecuteInner() this.PrereleaseVersion = oracle.PrereleaseVersion; this.GitCommitId = oracle.GitCommitId; this.GitCommitIdShort = oracle.GitCommitIdShort; - this.GitCommitDateTicks = oracle.GitCommitDate != null ? oracle.GitCommitDate.Value.UtcTicks.ToString(CultureInfo.InvariantCulture) : null; + this.GitCommitDateTicks = oracle.GitCommitDate is not null ? oracle.GitCommitDate.Value.UtcTicks.ToString(CultureInfo.InvariantCulture) : null; this.GitVersionHeight = oracle.VersionHeight; this.BuildMetadataFragment = oracle.BuildMetadataFragment; this.CloudBuildNumber = oracle.CloudBuildNumberEnabled ? oracle.CloudBuildNumber : null; @@ -279,7 +279,7 @@ protected override bool ExecuteInner() var allVariables = oracle.CloudBuildAllVars .Select(item => new TaskItem(item.Key, new Dictionary { { "Value", item.Value } })); - if (cloudBuildVersionVars != null) + if (cloudBuildVersionVars is not null) { cloudBuildVersionVars = cloudBuildVersionVars .Union(allVariables); @@ -290,7 +290,7 @@ protected override bool ExecuteInner() } } - if (cloudBuildVersionVars != null) + if (cloudBuildVersionVars is not null) { this.CloudBuildVersionVars = cloudBuildVersionVars.ToArray(); } diff --git a/src/Nerdbank.GitVersioning.Tasks/NativeVersionInfo.cs b/src/Nerdbank.GitVersioning.Tasks/NativeVersionInfo.cs index 8709c89e..8153a545 100644 --- a/src/Nerdbank.GitVersioning.Tasks/NativeVersionInfo.cs +++ b/src/Nerdbank.GitVersioning.Tasks/NativeVersionInfo.cs @@ -106,7 +106,7 @@ BLOCK NBGV_VERSION_BLOCK public override bool Execute() { this.generator = this.CreateGenerator(); - if (this.generator != null) + if (this.generator is not null) { this.generator.StartFile(); @@ -300,7 +300,7 @@ protected void AddCodeComment(string comment, string token) { var sr = new StringReader(comment); string line; - while ((line = sr.ReadLine()) != null) + while ((line = sr.ReadLine()) is not null) { this.codeBuilder.Append(token); this.codeBuilder.AppendLine(line); diff --git a/src/Nerdbank.GitVersioning.Tasks/Nerdbank.GitVersioning.nuspec b/src/Nerdbank.GitVersioning.Tasks/Nerdbank.GitVersioning.nuspec index 30e035fc..48fc3455 100644 --- a/src/Nerdbank.GitVersioning.Tasks/Nerdbank.GitVersioning.nuspec +++ b/src/Nerdbank.GitVersioning.Tasks/Nerdbank.GitVersioning.nuspec @@ -23,7 +23,6 @@ IMPORTANT: The 3.x release may produce a different version height than prior maj - @@ -49,7 +48,6 @@ IMPORTANT: The 3.x release may produce a different version height than prior maj - diff --git a/src/Nerdbank.GitVersioning.Tasks/SetCloudBuildVariables.cs b/src/Nerdbank.GitVersioning.Tasks/SetCloudBuildVariables.cs index 9939043d..b721152c 100644 --- a/src/Nerdbank.GitVersioning.Tasks/SetCloudBuildVariables.cs +++ b/src/Nerdbank.GitVersioning.Tasks/SetCloudBuildVariables.cs @@ -20,7 +20,7 @@ public class SetCloudBuildVariables : Task public override bool Execute() { var cloudBuild = CloudBuild.Active; - if (cloudBuild != null) + if (cloudBuild is not null) { var envVars = new Dictionary(StringComparer.OrdinalIgnoreCase); @@ -42,7 +42,7 @@ public override bool Execute() } } - if (this.CloudBuildVersionVars != null) + if (this.CloudBuildVersionVars is not null) { foreach (var variable in this.CloudBuildVersionVars) { @@ -82,7 +82,7 @@ private void PipeOutputToMSBuildLog(string output, bool warning) using (var logReader = new StringReader(output)) { string line; - while ((line = logReader.ReadLine()) != null) + while ((line = logReader.ReadLine()) is not null) { // The prefix is presumed to nullify the effect in a real cloud build, // yet make it detectable by a unit test. diff --git a/src/Nerdbank.GitVersioning.sln b/src/Nerdbank.GitVersioning.sln index 66c96ce6..43ffb2c7 100644 --- a/src/Nerdbank.GitVersioning.sln +++ b/src/Nerdbank.GitVersioning.sln @@ -1,12 +1,13 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.28404.58 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31411.2 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{4BD1A7CD-6F52-4F5A-825B-50E4D8C3ECFF}" ProjectSection(SolutionItems) = preProject ..\.editorconfig = ..\.editorconfig ..\.gitignore = ..\.gitignore + ..\3rdPartyNotices.txt = ..\3rdPartyNotices.txt ..\azure-pipelines.yml = ..\azure-pipelines.yml ..\build.ps1 = ..\build.ps1 Directory.Build.props = Directory.Build.props diff --git a/src/nbgv/Program.cs b/src/nbgv/Program.cs index e23b2d42..b68a1fef 100644 --- a/src/nbgv/Program.cs +++ b/src/nbgv/Program.cs @@ -282,7 +282,7 @@ private static int OnInstallCommand(string path, string version, IReadOnlyList met } var oracle = new VersionOracle(context, CloudBuild.Active); - if (metadata != null) + if (metadata is not null) { oracle.BuildMetadata.AddRange(metadata); } @@ -418,7 +418,7 @@ private static int OnGetVersionCommand(string project, IReadOnlyList met } var property = oracle.GetType().GetProperty(variable, CaseInsensitiveFlags); - if (property == null) + if (property is null) { Console.Error.WriteLine("Variable \"{0}\" not a version property.", variable); return (int)ExitCodes.BadVariable; @@ -447,7 +447,7 @@ private static int OnSetVersionCommand(string project, string version) using var context = GitContext.Create(searchPath, writable: true); var existingOptions = context.VersionFile.GetVersion(out string actualDirectory); string versionJsonPath; - if (existingOptions != null) + if (existingOptions is not null) { existingOptions.Version = semver; versionJsonPath = context.VersionFile.SetVersion(actualDirectory, existingOptions); @@ -598,7 +598,7 @@ private static int OnCloudCommand(string project, IReadOnlyList metadata using var context = GitContext.Create(searchPath, writable: AlwaysUseLibGit2); var oracle = new VersionOracle(context, cloudBuild: activeCloudBuild); - if (metadata != null) + if (metadata is not null) { oracle.BuildMetadata.AddRange(metadata); } @@ -620,7 +620,7 @@ private static int OnCloudCommand(string project, IReadOnlyList metadata } } - if (define != null) + if (define is not null) { foreach (string def in define) { @@ -641,7 +641,7 @@ private static int OnCloudCommand(string project, IReadOnlyList metadata } } - if (activeCloudBuild != null) + if (activeCloudBuild is not null) { if (string.IsNullOrEmpty(version)) { diff --git a/src/nuget.config b/src/nuget.config index 7ada9430..ede70863 100644 --- a/src/nuget.config +++ b/src/nuget.config @@ -13,6 +13,7 @@ Microsoft;aarnott;xunit;kzu;castleproject;patrickb8man;jamesnk;ethomson;AndreyAkinshin;MarcoRossignoli;cake-build;ericnewton76;0xd4d;manuel.roemer +