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