mirror of
https://github.com/tgstation/tgstation-server.git
synced 2026-08-28 15:40:56 +01:00
Update to LibGit2Sharp 0.29.0
This commit is contained in:
@@ -247,20 +247,16 @@ namespace Tgstation.Server.Host.Components.Repository
|
||||
libGitRepo,
|
||||
refSpecList,
|
||||
remote,
|
||||
new FetchOptions
|
||||
{
|
||||
Prune = true,
|
||||
OnProgress = (a) => !cancellationToken.IsCancellationRequested,
|
||||
OnTransferProgress = TransferProgressHandler(
|
||||
progressReporter.CreateSection($"Fetch {refSpec}", progressFactor),
|
||||
cancellationToken),
|
||||
OnUpdateTips = (a, b, c) => !cancellationToken.IsCancellationRequested,
|
||||
CredentialsProvider = credentialsProvider.GenerateCredentialsHandler(username, password),
|
||||
},
|
||||
new FetchOptions().Hydrate(
|
||||
logger,
|
||||
progressReporter.CreateSection($"Fetch {refSpec}", progressFactor),
|
||||
credentialsProvider.GenerateCredentialsHandler(username, password),
|
||||
cancellationToken),
|
||||
logMessage);
|
||||
}
|
||||
catch (UserCancelledException)
|
||||
catch (UserCancelledException ex)
|
||||
{
|
||||
logger.LogTrace(ex, "Suppressing fetch cancel exception");
|
||||
}
|
||||
catch (LibGit2SharpException ex)
|
||||
{
|
||||
@@ -439,14 +435,12 @@ namespace Tgstation.Server.Host.Components.Repository
|
||||
var fetchOptions = new FetchOptions
|
||||
{
|
||||
Prune = true,
|
||||
OnProgress = (a) => !cancellationToken.IsCancellationRequested,
|
||||
OnUpdateTips = (a, b, c) => !cancellationToken.IsCancellationRequested,
|
||||
CredentialsProvider = credentialsProvider.GenerateCredentialsHandler(username, password),
|
||||
TagFetchMode = TagFetchMode.All,
|
||||
};
|
||||
|
||||
if (progressReporter != null)
|
||||
fetchOptions.OnTransferProgress = TransferProgressHandler(progressReporter.CreateSection("Fetch Origin", 1.0), cancellationToken);
|
||||
}.Hydrate(
|
||||
logger,
|
||||
progressReporter?.CreateSection("Fetch Origin", 1.0),
|
||||
credentialsProvider.GenerateCredentialsHandler(username, password),
|
||||
cancellationToken);
|
||||
|
||||
commands.Fetch(
|
||||
libGitRepo,
|
||||
@@ -1041,19 +1035,18 @@ namespace Tgstation.Server.Host.Components.Repository
|
||||
var submoduleUpdateOptions = new SubmoduleUpdateOptions
|
||||
{
|
||||
Init = true,
|
||||
OnProgress = output => !cancellationToken.IsCancellationRequested,
|
||||
OnUpdateTips = (a, b, c) => !cancellationToken.IsCancellationRequested,
|
||||
CredentialsProvider = credentialsProvider.GenerateCredentialsHandler(username, password),
|
||||
OnCheckoutNotify = (_, _) => !cancellationToken.IsCancellationRequested,
|
||||
};
|
||||
|
||||
submoduleUpdateOptions.FetchOptions.Hydrate(
|
||||
logger,
|
||||
progressReporter?.CreateSection($"Fetch submodule {submodule.Name}", factor),
|
||||
credentialsProvider.GenerateCredentialsHandler(username, password),
|
||||
cancellationToken);
|
||||
|
||||
if (progressReporter != null)
|
||||
{
|
||||
submoduleUpdateOptions.OnTransferProgress = TransferProgressHandler(
|
||||
progressReporter.CreateSection($"Fetch submodule {submodule.Name}", factor),
|
||||
cancellationToken);
|
||||
submoduleUpdateOptions.OnCheckoutProgress = CheckoutProgressHandler(
|
||||
progressReporter.CreateSection($"Checkout submodule {submodule.Name}", factor));
|
||||
}
|
||||
|
||||
logger.LogDebug("Updating submodule {submoduleName}...", submodule.Name);
|
||||
Task RawSubModuleUpdate() => Task.Factory.StartNew(
|
||||
@@ -1131,37 +1124,6 @@ namespace Tgstation.Server.Host.Components.Repository
|
||||
|
||||
progressReporter.ReportProgress(percentage);
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Generate a <see cref="LibGit2Sharp.Handlers.TransferProgressHandler"/> from a given <paramref name="progressReporter"/> and <paramref name="cancellationToken"/>.
|
||||
/// </summary>
|
||||
/// <param name="progressReporter">The <see cref="JobProgressReporter"/> of the operation.</param>
|
||||
/// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation.</param>
|
||||
/// <returns>A new <see cref="LibGit2Sharp.Handlers.TransferProgressHandler"/> based on <paramref name="progressReporter"/>.</returns>
|
||||
TransferProgressHandler TransferProgressHandler(JobProgressReporter progressReporter, CancellationToken cancellationToken) => (transferProgress) =>
|
||||
{
|
||||
double? percentage;
|
||||
var totalObjectsToProcess = transferProgress.TotalObjects * 2;
|
||||
var processedObjects = transferProgress.IndexedObjects + transferProgress.ReceivedObjects;
|
||||
if (totalObjectsToProcess < processedObjects || totalObjectsToProcess == 0)
|
||||
percentage = null;
|
||||
else
|
||||
{
|
||||
percentage = (double)processedObjects / totalObjectsToProcess;
|
||||
if (percentage < 0)
|
||||
percentage = null;
|
||||
}
|
||||
|
||||
if (percentage == null)
|
||||
logger.LogDebug(
|
||||
"Bad transfer progress values (Please tell Cyberboss)! Indexed: {indexed}, Received: {received}, Total: {total}",
|
||||
transferProgress.IndexedObjects,
|
||||
transferProgress.ReceivedObjects,
|
||||
transferProgress.TotalObjects);
|
||||
|
||||
progressReporter.ReportProgress(percentage);
|
||||
return !cancellationToken.IsCancellationRequested;
|
||||
};
|
||||
}
|
||||
#pragma warning restore CA1506
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ using Microsoft.Extensions.Logging;
|
||||
using Tgstation.Server.Api.Models;
|
||||
using Tgstation.Server.Host.Components.Events;
|
||||
using Tgstation.Server.Host.Configuration;
|
||||
using Tgstation.Server.Host.Extensions;
|
||||
using Tgstation.Server.Host.IO;
|
||||
using Tgstation.Server.Host.Jobs;
|
||||
using Tgstation.Server.Host.Utils;
|
||||
@@ -149,20 +150,7 @@ namespace Tgstation.Server.Host.Components.Repository
|
||||
var checkoutProgressReporter = progressReporter?.CreateSection(null, 0.25f);
|
||||
var cloneOptions = new CloneOptions
|
||||
{
|
||||
OnProgress = (a) => !cancellationToken.IsCancellationRequested,
|
||||
OnTransferProgress = (a) =>
|
||||
{
|
||||
if (cloneProgressReporter != null)
|
||||
{
|
||||
var percentage = ((double)a.IndexedObjects + a.ReceivedObjects) / (a.TotalObjects * 2);
|
||||
cloneProgressReporter.ReportProgress(percentage);
|
||||
}
|
||||
|
||||
return !cancellationToken.IsCancellationRequested;
|
||||
},
|
||||
RecurseSubmodules = recurseSubmodules,
|
||||
OnUpdateTips = (a, b, c) => !cancellationToken.IsCancellationRequested,
|
||||
RepositoryOperationStarting = (a) => !cancellationToken.IsCancellationRequested,
|
||||
OnCheckoutProgress = (path, completed, remaining) =>
|
||||
{
|
||||
if (checkoutProgressReporter == null)
|
||||
@@ -172,9 +160,14 @@ namespace Tgstation.Server.Host.Components.Repository
|
||||
checkoutProgressReporter.ReportProgress(percentage);
|
||||
},
|
||||
BranchName = initialBranch,
|
||||
CredentialsProvider = repositoryFactory.GenerateCredentialsHandler(username, password),
|
||||
};
|
||||
|
||||
cloneOptions.FetchOptions.Hydrate(
|
||||
logger,
|
||||
cloneProgressReporter,
|
||||
repositoryFactory.GenerateCredentialsHandler(username, password),
|
||||
cancellationToken);
|
||||
|
||||
await repositoryFactory.Clone(
|
||||
url,
|
||||
cloneOptions,
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
using System;
|
||||
using System.Threading;
|
||||
|
||||
using LibGit2Sharp;
|
||||
using LibGit2Sharp.Handlers;
|
||||
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
using Tgstation.Server.Host.Jobs;
|
||||
|
||||
namespace Tgstation.Server.Host.Extensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Extension methods for <see cref="FetchOptions"/>.
|
||||
/// </summary>
|
||||
static class FetchOptionsExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Hydrate a given set of <paramref name="fetchOptions"/>.
|
||||
/// </summary>
|
||||
/// <param name="fetchOptions">The <see cref="FetchOptions"/> to hydrate.</param>
|
||||
/// <param name="logger">The <see cref="ILogger"/> for the operation.</param>
|
||||
/// <param name="progressReporter">The optional <see cref="JobProgressReporter"/>.</param>
|
||||
/// <param name="credentialsHandler">The optional <see cref="CredentialsHandler"/>.</param>
|
||||
/// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation.</param>
|
||||
/// <returns>The hydrated <paramref name="fetchOptions"/>.</returns>
|
||||
public static FetchOptions Hydrate(
|
||||
this FetchOptions fetchOptions,
|
||||
ILogger logger,
|
||||
JobProgressReporter progressReporter,
|
||||
CredentialsHandler credentialsHandler,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(fetchOptions);
|
||||
ArgumentNullException.ThrowIfNull(logger);
|
||||
|
||||
fetchOptions.OnProgress = _ => !cancellationToken.IsCancellationRequested;
|
||||
fetchOptions.OnTransferProgress = transferProgress =>
|
||||
{
|
||||
if (progressReporter != null)
|
||||
{
|
||||
var percentage = ((double)transferProgress.IndexedObjects + transferProgress.ReceivedObjects) / (transferProgress.TotalObjects * 2);
|
||||
progressReporter.ReportProgress(percentage);
|
||||
}
|
||||
|
||||
return !cancellationToken.IsCancellationRequested;
|
||||
};
|
||||
fetchOptions.OnUpdateTips = (_, _, _) => !cancellationToken.IsCancellationRequested;
|
||||
fetchOptions.CredentialsProvider = credentialsHandler;
|
||||
fetchOptions.RepositoryOperationStarting = _ => !cancellationToken.IsCancellationRequested;
|
||||
fetchOptions.OnTransferProgress = TransferProgressHandler(
|
||||
logger,
|
||||
progressReporter,
|
||||
cancellationToken);
|
||||
|
||||
return fetchOptions;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Generate a <see cref="LibGit2Sharp.Handlers.TransferProgressHandler"/> from a given <paramref name="progressReporter"/> and <paramref name="cancellationToken"/>.
|
||||
/// </summary>
|
||||
/// <param name="logger">The <see cref="ILogger"/> for the operation.</param>
|
||||
/// <param name="progressReporter">The optional <see cref="JobProgressReporter"/> of the operation.</param>
|
||||
/// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation.</param>
|
||||
/// <returns>A new <see cref="LibGit2Sharp.Handlers.TransferProgressHandler"/> based on <paramref name="progressReporter"/>.</returns>
|
||||
static TransferProgressHandler TransferProgressHandler(ILogger logger, JobProgressReporter progressReporter, CancellationToken cancellationToken) => transferProgress =>
|
||||
{
|
||||
double? percentage;
|
||||
var totalObjectsToProcess = transferProgress.TotalObjects * 2;
|
||||
var processedObjects = transferProgress.IndexedObjects + transferProgress.ReceivedObjects;
|
||||
if (totalObjectsToProcess < processedObjects || totalObjectsToProcess == 0)
|
||||
percentage = null;
|
||||
else
|
||||
{
|
||||
percentage = (double)processedObjects / totalObjectsToProcess;
|
||||
if (percentage < 0)
|
||||
percentage = null;
|
||||
}
|
||||
|
||||
if (percentage == null)
|
||||
logger.LogDebug(
|
||||
"Bad transfer progress values (Please tell Cyberboss)! Indexed: {indexed}, Received: {received}, Total: {total}",
|
||||
transferProgress.IndexedObjects,
|
||||
transferProgress.ReceivedObjects,
|
||||
transferProgress.TotalObjects);
|
||||
|
||||
progressReporter?.ReportProgress(percentage);
|
||||
return !cancellationToken.IsCancellationRequested;
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -73,7 +73,7 @@
|
||||
<!-- Usage: GitLab interop -->
|
||||
<PackageReference Include="GitLabApiClient" Version="1.8.0" />
|
||||
<!-- Usage: git interop -->
|
||||
<PackageReference Include="LibGit2Sharp" Version="0.28.0" />
|
||||
<PackageReference Include="LibGit2Sharp" Version="0.29.0" />
|
||||
<!-- Usage: JWT injection into HTTP pipeline -->
|
||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.0" />
|
||||
<!-- Usage: Support ""legacy"" Newotonsoft.Json in HTTP pipeline. The rest of our codebase uses Newtonsoft. -->
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using LibGit2Sharp;
|
||||
using LibGit2Sharp;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Moq;
|
||||
@@ -39,12 +39,11 @@ namespace Tgstation.Server.Host.Components.Repository.Tests
|
||||
try
|
||||
{
|
||||
var factory = CreateFactory();
|
||||
var cloneOpts = new CloneOptions();
|
||||
cloneOpts.FetchOptions.CredentialsProvider = factory.GenerateCredentialsHandler(null, null);
|
||||
await factory.Clone(
|
||||
new Uri("https://github.com/Cyberboss/Test"),
|
||||
new CloneOptions
|
||||
{
|
||||
CredentialsProvider = factory.GenerateCredentialsHandler(null, null)
|
||||
},
|
||||
cloneOpts,
|
||||
tempDir,
|
||||
default);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user