diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 465ffaa..bae15c8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -52,7 +52,7 @@ jobs: uses: NuGet/setup-nuget@v1 - name: Package NuGet - run: nuget pack ../nuspec/nuget/*.nuspec + run: dotnet pack -c $BUILD_CONFIG -p:PackageVersion=$BUILD_VERSION - name: Publish NuGet - run: nuget push ./*.nupkg -Source 'https://api.nuget.org/v3/index.json' -ApiKey ${{secrets.NUGETORG}} + run: nuget push ./TfsUrlParser/bin/Release/TfsUrlParser.$BUILD_VERSION.nupkg -Source 'https://api.nuget.org/v3/index.json' -ApiKey ${{secrets.NUGETORG}} diff --git a/nuspec/nuget/TfsUrlParser.nuspec b/nuspec/nuget/TfsUrlParser.nuspec deleted file mode 100644 index 3c2456e..0000000 --- a/nuspec/nuget/TfsUrlParser.nuspec +++ /dev/null @@ -1,26 +0,0 @@ - - - - TfsUrlParser - Azure DevOps URL Parser - 1.4.1 - BBT Software AG - bbtsoftware, pascalberger - Provides a parser for Azure DevOps and Azure DevOps Server URLs. - Provides a parser to get repository information from an Azure DevOps and Azure DevOps Server URLs. - MIT - https://github.com/bbtsoftware/TfsUrlParser/ - - https://raw.githubusercontent.com/bbtsoftware/TfsUrlParser/fdaa354eef80c05070c93ef14b6774abe7eeac73/nuspec/nuget/icon.png - false - - Copyright © BBT Software AG - AzureDevOps Git Parser - https://github.com/bbtsoftware/TfsUrlParser/releases/tag/1.4.1 - - - - - - - diff --git a/src/TfsUrlParser.Tests/RepositoryDescriptionTests.cs b/src/TfsUrlParser.Tests/RepositoryDescriptionTests.cs index bacb2e8..b5cb7ef 100644 --- a/src/TfsUrlParser.Tests/RepositoryDescriptionTests.cs +++ b/src/TfsUrlParser.Tests/RepositoryDescriptionTests.cs @@ -7,12 +7,6 @@ public class RepositoryDescriptionTests { [Theory] - [InlineData( - @"http://myserver:8080/tfs/defaultcollection/myproject/", - "No valid Git repository URL.")] - [InlineData( - @"http://myserver:8080/tfs/defaultcollection/myproject/_git", - "No valid Git repository URL.")] [InlineData( @"http://myserver:8080/_git/myrepository", "No valid Git repository URL containing default collection and project name.")] @@ -25,6 +19,7 @@ public void Should_Throw_If_No_Valid_Url(string repoUrl, string expectedMessage) var result = Record.Exception(() => new RepositoryDescription(new Uri(repoUrl))); // Then + result.IsUriFormatExceptionException(expectedMessage); } @@ -192,6 +187,117 @@ public void Should_Parse_Repo_Url( repositoryDescription.ProjectName.ShouldBe(projectName); repositoryDescription.RepositoryName.ShouldBe(repositoryName); repositoryDescription.RepositoryUrl.ShouldBe(new Uri(repositoryUrl)); + repositoryDescription.IsRepository.ShouldBe(true); } + + [Theory] + [InlineData( + @"http://myserver:8080/tfs/defaultcollection/myproject/", + @"http://myserver:8080/", + "defaultcollection", + @"http://myserver:8080/tfs/defaultcollection", + "myproject")] + [InlineData( + @"http://tfs.myserver/defaultcollection/myproject/", + @"http://tfs.myserver/", + "defaultcollection", + @"http://tfs.myserver/defaultcollection", + "myproject")] + [InlineData( + @"http://mytenant.visualstudio.com/defaultcollection/myproject/", + @"http://mytenant.visualstudio.com/", + "defaultcollection", + @"http://mytenant.visualstudio.com/defaultcollection", + "myproject")] + [InlineData( + @"http://tfs.foo.com/foo/foo", + @"http://tfs.foo.com/", + "foo", + @"http://tfs.foo.com/foo", + "foo")] + [InlineData( + @"https://myserver:8080/tfs/defaultcollection/myproject/", + @"https://myserver:8080/", + "defaultcollection", + @"https://myserver:8080/tfs/defaultcollection", + "myproject")] + [InlineData( + @"https://tfs.myserver/defaultcollection/myproject/", + @"https://tfs.myserver/", + "defaultcollection", + @"https://tfs.myserver/defaultcollection", + "myproject")] + [InlineData( + @"https://mytenant.visualstudio.com/defaultcollection/myproject/", + @"https://mytenant.visualstudio.com/", + "defaultcollection", + @"https://mytenant.visualstudio.com/defaultcollection", + "myproject")] + [InlineData( + @"https://tfs.foo.com/foo/foo/", + @"https://tfs.foo.com/", + "foo", + @"https://tfs.foo.com/foo", + "foo")] + [InlineData( + @"ssh://myserver:8080/tfs/defaultcollection/myproject/", + @"ssh://myserver:8080/", + "defaultcollection", + @"https://myserver:8080/tfs/defaultcollection", + "myproject")] + [InlineData( + @"ssh://tfs.myserver/defaultcollection/myproject/", + @"ssh://tfs.myserver/", + "defaultcollection", + @"https://tfs.myserver/defaultcollection", + "myproject")] + [InlineData( + @"ssh://mytenant.visualstudio.com/defaultcollection/myproject/", + @"ssh://mytenant.visualstudio.com/", + "defaultcollection", + @"https://mytenant.visualstudio.com/defaultcollection", + "myproject")] + [InlineData( + @"ssh://tfs.foo.com/foo/foo/", + @"ssh://tfs.foo.com/", + "foo", + @"https://tfs.foo.com/foo", + "foo")] + [InlineData( + @"ssh://foo:bar@myserver:8080/tfs/defaultcollection/myproject/", + @"ssh://myserver:8080/", + "defaultcollection", + @"https://myserver:8080/tfs/defaultcollection", + "myproject")] + [InlineData( + @"https://myorganization@dev.azure.com/myorganization/myproject/", + @"https://myorganization@dev.azure.com/", + "myorganization", + @"https://myorganization@dev.azure.com/myorganization", + "myproject")] + [InlineData( + @"https://myorganization.visualstudio.com/myproject/", + @"https://myorganization.visualstudio.com/", + "DefaultCollection", + @"https://myorganization.visualstudio.com", + "myproject")] + public void Should_Parse_NonRepo_Url( + string repoUrl, + string serverUrl, + string collectionName, + string collectionurl, + string projectName) + { + // Given / When + var repositoryDescription = new RepositoryDescription(new Uri(repoUrl)); + + // Then + repositoryDescription.ServerUrl.ShouldBe(new Uri(serverUrl)); + repositoryDescription.CollectionName.ShouldBe(collectionName); + repositoryDescription.CollectionUrl.ShouldBe(new Uri(collectionurl)); + repositoryDescription.ProjectName.ShouldBe(projectName); + repositoryDescription.IsRepository.ShouldBe(false); + } + } } diff --git a/src/TfsUrlParser.Tests/TfsUrlParser.Tests.csproj b/src/TfsUrlParser.Tests/TfsUrlParser.Tests.csproj index 1a89d44..c71dfc6 100644 --- a/src/TfsUrlParser.Tests/TfsUrlParser.Tests.csproj +++ b/src/TfsUrlParser.Tests/TfsUrlParser.Tests.csproj @@ -1,4 +1,4 @@ - + Net6.0 @@ -22,13 +22,13 @@ - - - - + + + + all - + diff --git a/src/TfsUrlParser/RepositoryDescription.cs b/src/TfsUrlParser/RepositoryDescription.cs index fba203f..29941b4 100644 --- a/src/TfsUrlParser/RepositoryDescription.cs +++ b/src/TfsUrlParser/RepositoryDescription.cs @@ -28,9 +28,17 @@ public RepositoryDescription(Uri repoUrl) var gitSeparator = new[] { "/_git/" }; var splitPath = repoUrl.AbsolutePath.Split(gitSeparator, StringSplitOptions.None); - if (splitPath.Length < 2) + if (repoUrl.ToString().Contains("/_git/")) { - throw new UriFormatException("No valid Git repository URL."); + this.IsRepository = true; + if (splitPath.Length < 2) + { + throw new UriFormatException("No valid Git repository URL."); + } + } + else + { + this.IsRepository = false; } this.ServerUrl = new Uri(repoUrl.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped)); @@ -56,11 +64,13 @@ public RepositoryDescription(Uri repoUrl) { throw new UriFormatException("No valid Git repository URL containing default collection and project name."); } - - var splitLastPart = splitPath[1].Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries); - this.ProjectName = splitFirstPart.Last(); - this.RepositoryName = splitLastPart.First(); + + if (this.IsRepository) + { + var splitLastPart = splitPath[1].Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries); + this.RepositoryName = splitLastPart.First(); + } } /// @@ -94,6 +104,11 @@ public RepositoryDescription(Uri repoUrl) /// public Uri RepositoryUrl { get; private set; } + /// + /// Get a value that indicates if this is a Git Repo or another TFS URL. + /// + public bool IsRepository { get; private set; } + /// /// Converts the repository URL to a supported scheme if possible. /// diff --git a/src/TfsUrlParser/TfsUrlParser.csproj b/src/TfsUrlParser/TfsUrlParser.csproj index f344adb..3c7534b 100644 --- a/src/TfsUrlParser/TfsUrlParser.csproj +++ b/src/TfsUrlParser/TfsUrlParser.csproj @@ -1,21 +1,37 @@  + netstandard2.0 + TfsUrlParser + ..\TfsUrlParser.ruleset + bin\$(Configuration)\TfsUrlParser.xml + bin\$(Configuration)\ + true - TfsUrlParser - BBT Software AG + Azure DevOps URL Parser + Provides a parser to get repository information from an Azure DevOps and Azure DevOps Server URLs. TfsUrlParser - Azure DevOps URL Parser URL Parser + BBT Software AG + BBT Software AG Copyright © BBT Software AG - ..\TfsUrlParser.ruleset - bin\$(Configuration)\TfsUrlParser.XML - bin\$(Configuration)\ - true - true + TfsUrlParser + AzureDevOps Git Parser + icon.png + https://github.com/bbtsoftware/TfsUrlParser/ + MIT + false + git + https://github.com/bbtsoftware/TfsUrlParser.git + https://github.com/bbtsoftware/TfsUrlParser/releases/tag/1.5.0 + $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb;.xml + + + + all diff --git a/nuspec/nuget/icon.png b/src/TfsUrlParser/icon.png similarity index 100% rename from nuspec/nuget/icon.png rename to src/TfsUrlParser/icon.png