tgstation-server 6.8.0
The /tg/station 13 server suite
Loading...
Searching...
No Matches
GitRemoteFeaturesBase.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.Threading;
4using System.Threading.Tasks;
5
6using Microsoft.Extensions.Logging;
7
10
12{
17 {
19 public abstract string TestMergeRefSpecFormatter { get; }
20
22 public abstract string TestMergeLocalBranchNameFormatter { get; }
23
25 public abstract RemoteGitProvider? RemoteGitProvider { get; }
26
28 public string RemoteRepositoryOwner { get; }
29
31 public string RemoteRepositoryName { get; }
32
36 protected ILogger<GitRemoteFeaturesBase> Logger { get; }
37
41 readonly Dictionary<TestMergeParameters, Models.TestMerge> cachedLookups;
42
48 public GitRemoteFeaturesBase(ILogger<GitRemoteFeaturesBase> logger, Uri remoteUrl)
49 {
50 Logger = logger ?? throw new ArgumentNullException(nameof(logger));
51 ArgumentNullException.ThrowIfNull(remoteUrl);
52
53 RemoteRepositoryOwner = remoteUrl.Segments[1].TrimEnd('/');
54 RemoteRepositoryName = remoteUrl.Segments[2].TrimEnd('/');
55 if (RemoteRepositoryName.EndsWith(".git", StringComparison.OrdinalIgnoreCase))
57
58 cachedLookups = new Dictionary<TestMergeParameters, Models.TestMerge>();
59 }
60
62 public async ValueTask<Models.TestMerge> GetTestMerge(
63 TestMergeParameters parameters,
64 RepositorySettings repositorySettings,
65 CancellationToken cancellationToken)
66 {
67 ArgumentNullException.ThrowIfNull(parameters);
68 ArgumentNullException.ThrowIfNull(repositorySettings);
69
70 Models.TestMerge? result;
71 lock (cachedLookups)
72 if (cachedLookups.TryGetValue(parameters, out result))
73 Logger.LogTrace("Using cache for test merge #{testMergeNumber}", parameters.Number);
74
75 if (result == null)
76 {
77 Logger.LogTrace("Retrieving metadata for test merge #{testMergeNumber}...", parameters.Number);
78 result = await GetTestMergeImpl(parameters, repositorySettings, cancellationToken);
79 lock (cachedLookups)
80 if (!cachedLookups.TryAdd(parameters, result))
81 Logger.LogError("Race condition on adding test merge #{testMergeNumber}!", parameters.Number);
82 }
83
84 return result;
85 }
86
94 protected abstract ValueTask<Models.TestMerge> GetTestMergeImpl(
95 TestMergeParameters parameters,
96 RepositorySettings repositorySettings,
97 CancellationToken cancellationToken);
98 }
99}
Represents configurable settings for a git repository.
Parameters for creating a TestMerge.
int Number
The number of the test merge source.
abstract ValueTask< Models.TestMerge > GetTestMergeImpl(TestMergeParameters parameters, RepositorySettings repositorySettings, CancellationToken cancellationToken)
Implementation of GetTestMerge(TestMergeParameters, RepositorySettings, CancellationToken).
readonly Dictionary< TestMergeParameters, Models.TestMerge > cachedLookups
Cache of created Models.TestMerges.
string RemoteRepositoryOwner
If RemoteGitProvider is not RemoteGitProvider.Unknown this will be set with the owner of the reposito...
async ValueTask< Models.TestMerge > GetTestMerge(TestMergeParameters parameters, RepositorySettings repositorySettings, CancellationToken cancellationToken)
Retrieve the Models.TestMerge representation of given test merge parameters . A ValueTask<TResult> re...
GitRemoteFeaturesBase(ILogger< GitRemoteFeaturesBase > logger, Uri remoteUrl)
Initializes a new instance of the GitRemoteFeaturesBase class.
ILogger< GitRemoteFeaturesBase > Logger
The ILogger for the GitRemoteFeaturesBase.
string RemoteRepositoryName
If RemoteGitProvider is not RemoteGitProvider.Unknown this will be set with the name of the repositor...
abstract string TestMergeRefSpecFormatter
Gets a formatter string which creates the remote refspec for fetching the HEAD of passed in test merg...
RemoteGitProvider
Indicates the remote git host.