Skip to content
This repository has been archived by the owner on Jul 12, 2022. It is now read-only.

Localfoldersupport for gitea #925

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion NuKeeper.Gitea.Tests/GiteaSettingsReaderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using NSubstitute;
using NuKeeper.Abstractions.CollaborationPlatform;
using NuKeeper.Abstractions.Configuration;
using NuKeeper.Abstractions.Git;
using NuKeeper.Gitea;
using NUnit.Framework;

Expand All @@ -13,12 +14,14 @@ public class GiteaSettingsReaderTests
{
private GiteaSettingsReader _giteaSettingsReader;
private IEnvironmentVariablesProvider _environmentVariablesProvider;
private IGitDiscoveryDriver _gitDiscovery;

[SetUp]
public void Setup()
{
_environmentVariablesProvider = Substitute.For<IEnvironmentVariablesProvider>();
_giteaSettingsReader = new GiteaSettingsReader(_environmentVariablesProvider);
_gitDiscovery = Substitute.For<IGitDiscoveryDriver>();
_giteaSettingsReader = new GiteaSettingsReader(_gitDiscovery, _environmentVariablesProvider);
}

[Test]
Expand Down
67 changes: 62 additions & 5 deletions NuKeeper.Gitea/GiteaSettingsReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using NuKeeper.Abstractions;
using NuKeeper.Abstractions.CollaborationPlatform;
using NuKeeper.Abstractions.Configuration;
using NuKeeper.Abstractions.Git;

namespace NuKeeper.Gitea
{
Expand All @@ -15,10 +16,12 @@ public class GiteaSettingsReader : ISettingsReader
private const string GiteaTokenEnvironmentVariableName = "NuKeeper_gitea_token";
private const string UrlPattern = "https://yourgiteaserver/{owner}/{repo}.git";
private const string ApiBaseAdress = "api/v1/";
private readonly IGitDiscoveryDriver _gitDriver;

public GiteaSettingsReader(IEnvironmentVariablesProvider environmentVariablesProvider)
public GiteaSettingsReader(IGitDiscoveryDriver gitDiscoveryDriver, IEnvironmentVariablesProvider environmentVariablesProvider)
{
_environmentVariablesProvider = environmentVariablesProvider;
_gitDriver = gitDiscoveryDriver;
}

public Platform Platform => Platform.Gitea;
Expand Down Expand Up @@ -60,14 +63,23 @@ public void UpdateCollaborationPlatformSettings(CollaborationPlatformSettings se
settings.Token = Concat.FirstValue(envToken, settings.Token);
}

public Task<RepositorySettings> RepositorySettings(Uri repositoryUri, string targetBranch = null)
public async Task<RepositorySettings> RepositorySettings(Uri repositoryUri, string targetBranch = null)
{
if (repositoryUri == null)
{
throw new NuKeeperException(
$"The provided uri was is not in the correct format. Provided null and format should be {UrlPattern}");
}

var settings = repositoryUri.IsFile
? await CreateSettingsFromLocal(repositoryUri, targetBranch)
: await CreateSettingsFromRemote(repositoryUri, targetBranch);

return settings;
}

private static Task<RepositorySettings> CreateSettingsFromRemote(Uri repositoryUri, string targetBranch)
{
// Assumption - url should look like https://yourgiteaUrl/{username}/{projectname}.git";
var path = repositoryUri.AbsolutePath;
var pathParts = path.Split('/')
Expand All @@ -87,15 +99,60 @@ public Task<RepositorySettings> RepositorySettings(Uri repositoryUri, string tar
var baseAddress = GetBaseAddress(repositoryUri);
var apiUri = new Uri(baseAddress, ApiBaseAdress);

return InternalCreateRepositorySettings(apiUri, repositoryUri, repoName, repoOwner, targetBranch == null ? null : new RemoteInfo { BranchName = targetBranch });
}

private async Task<RepositorySettings> CreateSettingsFromLocal(Uri repositoryUri, string targetBranch)
{
var remoteInfo = new RemoteInfo();

var localFolder = repositoryUri;
if (await _gitDriver.IsGitRepo(repositoryUri))
{
// Check the origin remotes
var origin = (await _gitDriver.GetRemotes(repositoryUri)).FirstOrDefault();

if (origin != null)
{
var repo = await _gitDriver.DiscoverRepo(repositoryUri); // Set to the folder, because we found a remote git repository
if (repo != null && (repo.Segments.Last() == @".git/"))
{
var newSegments = repo.Segments.Take(repo.Segments.Length - 1).ToArray();
newSegments[newSegments.Length - 1] =
newSegments[newSegments.Length - 1].TrimEnd('/');
var ub = new UriBuilder(repo);
ub.Path = string.Concat(newSegments);
//ub.Query=string.Empty; //maybe?
repo = ub.Uri;
}

remoteInfo.LocalRepositoryUri = repo;
repositoryUri = origin.Url;
remoteInfo.BranchName = targetBranch ?? await _gitDriver.GetCurrentHead(remoteInfo.LocalRepositoryUri);
remoteInfo.RemoteName = origin.Name;
remoteInfo.WorkingFolder = localFolder;
}
}
else
{
throw new NuKeeperException("No git repository found");
}

var remoteSettings = await CreateSettingsFromRemote(repositoryUri, targetBranch);


return await InternalCreateRepositorySettings(remoteSettings.ApiUri, remoteSettings.RepositoryUri, remoteSettings.RepositoryName, remoteSettings.RepositoryOwner, remoteInfo);
}

private static Task<RepositorySettings> InternalCreateRepositorySettings(Uri apiUri, Uri repositoryUri, string repoName, string repoOwner, RemoteInfo remoteInfo = null)
{
return Task.FromResult(new RepositorySettings
{
ApiUri = apiUri,
RepositoryUri = repositoryUri,
RepositoryName = repoName,
RepositoryOwner = repoOwner,
RemoteInfo = targetBranch == null
? null
: new RemoteInfo { BranchName = targetBranch }
RemoteInfo = remoteInfo
});
}

Expand Down
1 change: 1 addition & 0 deletions NuKeeper/Commands/CollaborationPlatformCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ internal abstract class CollaborationPlatformCommand : CommandBase
_platformsSupportingDeleteBranchAfterMerge.Add(Abstractions.CollaborationPlatform.Platform.AzureDevOps);
_platformsSupportingDeleteBranchAfterMerge.Add(Abstractions.CollaborationPlatform.Platform.Bitbucket);
_platformsSupportingDeleteBranchAfterMerge.Add(Abstractions.CollaborationPlatform.Platform.GitLab);
_platformsSupportingDeleteBranchAfterMerge.Add(Abstractions.CollaborationPlatform.Platform.Gitea);
}

protected override async Task<ValidationResult> PopulateSettings(SettingsContainer settings)
Expand Down