Vpk Upload GitHub - add targetCommitish option

This commit is contained in:
Alex
2024-04-23 00:36:49 +03:00
committed by Caelan Sayler
parent d807e843b8
commit 1c376f95ee
4 changed files with 113 additions and 3 deletions

View File

@@ -25,6 +25,8 @@ public class GitHubUploadOptions : GitHubDownloadOptions
public string TagName { get; set; }
public string TargetCommitish { get; set; }
public bool Merge { get; set; }
}
@@ -92,6 +94,7 @@ public class GitHubRepository : SourceRepository<GitHubDownloadOptions, GithubSo
Draft = true,
Prerelease = options.Prerelease,
Name = string.IsNullOrWhiteSpace(options.ReleaseName) ? semVer.ToString() : options.ReleaseName,
TargetCommitish = options.TargetCommitish,
};
Log.Info($"Creating draft release titled '{newReleaseReq.Name}'");
release = await client.Repository.Release.Create(repoOwner, repoName, newReleaseReq);

View File

@@ -8,6 +8,8 @@ public class GitHubUploadCommand : GitHubBaseCommand
public string TagName { get; private set; }
public string TargetCommitish { get; private set; }
public bool Prerelease { get; private set; }
public bool Merge { get; private set; }
@@ -32,6 +34,10 @@ public class GitHubUploadCommand : GitHubBaseCommand
.SetDescription("A custom tag for the release.")
.SetArgumentHelpName("NAME");
AddOption<string>((v) => TargetCommitish = v, "--targetCommitish")
.SetDescription("A commitish value for tag (branch or commit SHA).")
.SetArgumentHelpName("NAME");
ReleaseDirectoryOption.SetRequired();
ReleaseDirectoryOption.MustNotBeEmpty();
}

View File

@@ -97,4 +97,26 @@ public class GitHubUploadCommandTests : GitHubCommandTests<GitHubUploadCommand>
Assert.Equal("my release", command.ReleaseName);
}
[Fact]
public void Tag_WithTag_ParsesValue()
{
var command = new GitHubUploadCommand();
string cli = GetRequiredDefaultOptions() + $"--tag \"v1.2.3\"";
ParseResult parseResult = command.ParseAndApply(cli);
Assert.Equal("v1.2.3", command.TagName);
}
[Fact]
public void TargetCommitish_WithTargetCommitish_ParsesValue()
{
var command = new GitHubUploadCommand();
string cli = GetRequiredDefaultOptions() + $"--targetCommitish \"main\"";
ParseResult parseResult = command.ParseAndApply(cli);
Assert.Equal("main", command.TargetCommitish);
}
}

View File

@@ -184,22 +184,95 @@ This is just a _test_!
Assert.True(File.Exists(Path.Combine(releaseDirNew, filename)));
}
[SkippableFact]
public void WillCreateTagOnDefaultBranchIfTargetCommitishNotSet()
{
Skip.If(String.IsNullOrWhiteSpace(GITHUB_TOKEN), "VELOPACK_GITHUB_TEST_TOKEN is not set.");
using var logger = _output.BuildLoggerFor<GithubDeploymentTests>();
using var _1 = Utility.GetTempDirectory(out var releaseDir);
using var ghvar = GitHubReleaseTest.Create("targetCommitish", logger, true);
var (repoOwner, repoName) = GitHubRepository.GetOwnerAndRepo(GITHUB_REPOURL);
var id = "GithubUpdateTest";
var releaseName = ghvar.ReleaseName;
var client = ghvar.Client;
var uniqueSuffix = ghvar.UniqueSuffix;
var version = $"0.0.1-{uniqueSuffix}";
TestApp.PackTestApp(id, version, "t1", releaseDir, logger, channel: uniqueSuffix);
var gh = new GitHubRepository(logger);
var options = new GitHubUploadOptions {
ReleaseName = releaseName,
ReleaseDir = new DirectoryInfo(releaseDir),
RepoUrl = GITHUB_REPOURL,
Token = GITHUB_TOKEN,
Prerelease = false,
Publish = true,
Channel = uniqueSuffix,
TagName = version
};
gh.UploadMissingAssetsAsync(options).GetAwaiterResult();
var expected = "main"; //Default branch in VelopackGithubUpdateTest repo
var newRelease = client.Repository.Release.GetAll(repoOwner, repoName).GetAwaiterResult().Single(s => s.Name == releaseName);
Assert.Equal(expected, newRelease.TargetCommitish);
}
[SkippableTheory]
[InlineData("main")]
[InlineData("31fca3d97e657a4fbee076462c5efb271f074656")] //Commit SHA in VelopackGithubUpdateTest repo
public void WillCreateTagUsingTargetCommitish(string targetCommitish)
{
Skip.If(String.IsNullOrWhiteSpace(GITHUB_TOKEN), "VELOPACK_GITHUB_TEST_TOKEN is not set.");
using var logger = _output.BuildLoggerFor<GithubDeploymentTests>();
using var _1 = Utility.GetTempDirectory(out var releaseDir);
using var ghvar = GitHubReleaseTest.Create("targetCommitish", logger, true);
var (repoOwner, repoName) = GitHubRepository.GetOwnerAndRepo(GITHUB_REPOURL);
var id = "GithubUpdateTest";
var releaseName = ghvar.ReleaseName;
var client = ghvar.Client;
var uniqueSuffix = ghvar.UniqueSuffix;
var version = $"0.0.1-{uniqueSuffix}";
TestApp.PackTestApp(id, version, "t1", releaseDir, logger, channel: uniqueSuffix);
var gh = new GitHubRepository(logger);
var options = new GitHubUploadOptions {
ReleaseName = releaseName,
ReleaseDir = new DirectoryInfo(releaseDir),
RepoUrl = GITHUB_REPOURL,
Token = GITHUB_TOKEN,
Prerelease = false,
Publish = true,
Channel = uniqueSuffix,
TagName = version,
TargetCommitish = targetCommitish
};
gh.UploadMissingAssetsAsync(options).GetAwaiterResult();
var newRelease = client.Repository.Release.GetAll(repoOwner, repoName).GetAwaiterResult().Single(s => s.Name == releaseName);
Assert.Equal(targetCommitish, newRelease.TargetCommitish);
}
private class GitHubReleaseTest : IDisposable
{
private readonly bool deleteTagOnDispose;
public string ReleaseName { get; }
public string UniqueSuffix { get; }
public GitHubClient Client { get; }
public ILogger Logger { get; }
public GitHubReleaseTest(string releaseName, string uniqueSuffix, GitHubClient client, ILogger logger)
public GitHubReleaseTest(string releaseName, string uniqueSuffix, GitHubClient client, ILogger logger, bool deleteTagOnDispose = false)
{
ReleaseName = releaseName;
UniqueSuffix = uniqueSuffix;
Client = client;
Logger = logger;
this.deleteTagOnDispose = deleteTagOnDispose;
}
public static GitHubReleaseTest Create(string method, ILogger logger)
public static GitHubReleaseTest Create(string method, ILogger logger, bool deleteTagOnDispose = false)
{
var ci = !String.IsNullOrEmpty(Environment.GetEnvironmentVariable("CI"));
var uniqueSuffix = (ci ? "ci-" : "local-") + VelopackRuntimeInfo.SystemOs.GetOsShortName();
@@ -213,9 +286,12 @@ This is just a _test_!
var existingRelease = client.Repository.Release.GetAll(repoOwner, repoName).GetAwaiterResult().SingleOrDefault(s => s.Name == releaseName);
if (existingRelease != null) {
client.Repository.Release.Delete(repoOwner, repoName, existingRelease.Id).GetAwaiterResult();
if (deleteTagOnDispose) {
client.Git.Reference.Delete(repoOwner, repoName, $"tags/{existingRelease.TagName}").GetAwaiterResult();
}
logger.Info("Deleted existing release: " + releaseName);
}
return new GitHubReleaseTest(releaseName, uniqueSuffix, client, logger);
return new GitHubReleaseTest(releaseName, uniqueSuffix, client, logger, deleteTagOnDispose);
}
public void Dispose()
@@ -224,6 +300,9 @@ This is just a _test_!
var finalRelease = Client.Repository.Release.GetAll(repoOwner, repoName).GetAwaiterResult().SingleOrDefault(s => s.Name == ReleaseName);
if (finalRelease != null) {
Client.Repository.Release.Delete(repoOwner, repoName, finalRelease.Id).GetAwaiterResult();
if (deleteTagOnDispose) {
Client.Git.Reference.Delete(repoOwner, repoName, $"tags/{finalRelease.TagName}").GetAwaiterResult();
}
Logger.Info($"Deleted final release '{ReleaseName}'");
}
}