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

Commit

Permalink
add local folder support for gitea
Browse files Browse the repository at this point in the history
  • Loading branch information
Stefan Kneidl authored and sharpSteff committed May 13, 2020
1 parent 84b6016 commit 01e944e
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 17 deletions.
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
87 changes: 71 additions & 16 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,32 @@ 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 Uri GetBaseAddress(Uri repoUri)
{
var newSegments = repoUri.Segments.Take(repoUri.Segments.Length - 2).ToArray();
var ub = new UriBuilder(repoUri);
ub.Path = string.Concat(newSegments);

return ub.Uri;
}

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,27 +108,61 @@ 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
});
}

private static Uri GetBaseAddress(Uri repoUri)
{
var newSegments = repoUri.Segments.Take(repoUri.Segments.Length - 2).ToArray();
var ub = new UriBuilder(repoUri)
{
Path = string.Concat(newSegments)
};

return ub.Uri;
}
}
}
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 @@ protected CollaborationPlatformCommand(ICollaborationEngine engine, IConfigureLo
_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

0 comments on commit 01e944e

Please sign in to comment.