dependabot-nuget 0.283.0 → 0.285.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/CloneCommand.cs +40 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Program.cs +1 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Run.cs +0 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Clone/CloneWorker.cs +144 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Clone/IGitCommandHandler.cs +6 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Clone/ShellGitCommandHandler.cs +37 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/DependencyFileNotFound.cs +5 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Job.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/JobErrorBase.cs +9 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/JobRepoNotFound.cs +13 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/JobSource.cs +2 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/MarkAsProcessed.cs +6 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/PrivateSourceAuthenticationFailure.cs +5 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/UnknownError.cs +5 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/UpdateNotPossible.cs +5 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/HttpApiHandler.cs +8 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +73 -31
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/BindingRedirectManager.cs +30 -9
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackagesConfigUpdater.cs +3 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathHelper.cs +2 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Clone/CloneWorkerTests.cs +183 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Clone/TestGitCommandHandler.cs +16 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +640 -17
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs +10 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/UpdatedDependencyListTests.cs +53 -6
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/BindingRedirectsTests.cs +225 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +106 -0
- metadata +13 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d8dd6e625e132b28270ffbff6c1af11b0173e3a786a1f6518080c20adc028ac2
|
4
|
+
data.tar.gz: 7afe9afdd9b8ab5ae40372ac51fb292efce75ed4d4b5ba7fee96468e00e835bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d9b4fdc7ba52be531cb199699324e7be1a68ae6a698619e961535f0cdb993833cc06e6e4f0df7a88f5b12e3a8bb06627a5ba2233e24bcafa4ade1badcf6a2bf
|
7
|
+
data.tar.gz: e9619a91fc865a8aa45a812a923f089a10e67f0be0c8588908206726e4e2b6d95ee1626cc0897d3dad5c5aca1a2e89f1c657e25a9137d4f186e05a7813b3e34c
|
@@ -0,0 +1,40 @@
|
|
1
|
+
using System.CommandLine;
|
2
|
+
|
3
|
+
using NuGetUpdater.Core;
|
4
|
+
using NuGetUpdater.Core.Clone;
|
5
|
+
using NuGetUpdater.Core.Run;
|
6
|
+
|
7
|
+
namespace NuGetUpdater.Cli.Commands;
|
8
|
+
|
9
|
+
internal static class CloneCommand
|
10
|
+
{
|
11
|
+
internal static readonly Option<FileInfo> JobPathOption = new("--job-path") { IsRequired = true };
|
12
|
+
internal static readonly Option<DirectoryInfo> RepoContentsPathOption = new("--repo-contents-path") { IsRequired = true };
|
13
|
+
internal static readonly Option<Uri> ApiUrlOption = new("--api-url") { IsRequired = true };
|
14
|
+
internal static readonly Option<string> JobIdOption = new("--job-id") { IsRequired = true };
|
15
|
+
|
16
|
+
internal static Command GetCommand(Action<int> setExitCode)
|
17
|
+
{
|
18
|
+
var command = new Command("clone", "Clones a repository in preparation for a dependabot job.")
|
19
|
+
{
|
20
|
+
JobPathOption,
|
21
|
+
RepoContentsPathOption,
|
22
|
+
ApiUrlOption,
|
23
|
+
JobIdOption,
|
24
|
+
};
|
25
|
+
|
26
|
+
command.TreatUnmatchedTokensAsErrors = true;
|
27
|
+
|
28
|
+
command.SetHandler(async (jobPath, repoContentsPath, apiUrl, jobId) =>
|
29
|
+
{
|
30
|
+
var apiHandler = new HttpApiHandler(apiUrl.ToString(), jobId);
|
31
|
+
var logger = new ConsoleLogger();
|
32
|
+
var gitCommandHandler = new ShellGitCommandHandler(logger);
|
33
|
+
var worker = new CloneWorker(apiHandler, gitCommandHandler, logger);
|
34
|
+
var exitCode = await worker.RunAsync(jobPath, repoContentsPath);
|
35
|
+
setExitCode(exitCode);
|
36
|
+
}, JobPathOption, RepoContentsPathOption, ApiUrlOption, JobIdOption);
|
37
|
+
|
38
|
+
return command;
|
39
|
+
}
|
40
|
+
}
|
@@ -0,0 +1,144 @@
|
|
1
|
+
using System.Net;
|
2
|
+
|
3
|
+
using NuGetUpdater.Core.Run;
|
4
|
+
using NuGetUpdater.Core.Run.ApiModel;
|
5
|
+
|
6
|
+
using CommandArguments = (string[] Args, string? WorkingDirectory);
|
7
|
+
|
8
|
+
namespace NuGetUpdater.Core.Clone;
|
9
|
+
|
10
|
+
public class CloneWorker
|
11
|
+
{
|
12
|
+
private readonly IApiHandler _apiHandler;
|
13
|
+
private readonly IGitCommandHandler _gitCommandHandler;
|
14
|
+
private readonly ILogger _logger;
|
15
|
+
|
16
|
+
public CloneWorker(IApiHandler apiHandler, IGitCommandHandler gitCommandHandler, ILogger logger)
|
17
|
+
{
|
18
|
+
_apiHandler = apiHandler;
|
19
|
+
_gitCommandHandler = gitCommandHandler;
|
20
|
+
_logger = logger;
|
21
|
+
}
|
22
|
+
|
23
|
+
// entrypoint for cli
|
24
|
+
public async Task<int> RunAsync(FileInfo jobFilePath, DirectoryInfo repoContentsPath)
|
25
|
+
{
|
26
|
+
var jobFileContent = await File.ReadAllTextAsync(jobFilePath.FullName);
|
27
|
+
var jobWrapper = RunWorker.Deserialize(jobFileContent);
|
28
|
+
var result = await RunAsync(jobWrapper.Job, repoContentsPath.FullName);
|
29
|
+
return result;
|
30
|
+
}
|
31
|
+
|
32
|
+
// object model entry point
|
33
|
+
public async Task<int> RunAsync(Job job, string repoContentsPath)
|
34
|
+
{
|
35
|
+
JobErrorBase? error = null;
|
36
|
+
try
|
37
|
+
{
|
38
|
+
var commandArgs = GetAllCommandArgs(job, repoContentsPath);
|
39
|
+
foreach (var (args, workingDirectory) in commandArgs)
|
40
|
+
{
|
41
|
+
await _gitCommandHandler.RunGitCommandAsync(args, workingDirectory);
|
42
|
+
}
|
43
|
+
}
|
44
|
+
catch (HttpRequestException ex)
|
45
|
+
when (ex.StatusCode == HttpStatusCode.Unauthorized || ex.StatusCode == HttpStatusCode.Forbidden)
|
46
|
+
{
|
47
|
+
error = new JobRepoNotFound(ex.Message);
|
48
|
+
}
|
49
|
+
catch (Exception ex)
|
50
|
+
{
|
51
|
+
error = new UnknownError(ex.ToString());
|
52
|
+
}
|
53
|
+
|
54
|
+
if (error is not null)
|
55
|
+
{
|
56
|
+
await _apiHandler.RecordUpdateJobError(error);
|
57
|
+
await _apiHandler.MarkAsProcessed(new("unknown"));
|
58
|
+
return 1;
|
59
|
+
}
|
60
|
+
|
61
|
+
return 0;
|
62
|
+
}
|
63
|
+
|
64
|
+
internal static CommandArguments[] GetAllCommandArgs(Job job, string repoContentsPath)
|
65
|
+
{
|
66
|
+
var commandArgs = new List<CommandArguments>()
|
67
|
+
{
|
68
|
+
GetCloneArgs(job, repoContentsPath)
|
69
|
+
};
|
70
|
+
|
71
|
+
if (job.Source.Commit is { } commit)
|
72
|
+
{
|
73
|
+
commandArgs.Add(GetFetchArgs(commit, repoContentsPath));
|
74
|
+
commandArgs.Add(GetResetArgs(commit, repoContentsPath));
|
75
|
+
}
|
76
|
+
|
77
|
+
return commandArgs.ToArray();
|
78
|
+
}
|
79
|
+
|
80
|
+
internal static CommandArguments GetCloneArgs(Job job, string repoContentsPath)
|
81
|
+
{
|
82
|
+
var url = GetRepoUrl(job);
|
83
|
+
var args = new List<string>()
|
84
|
+
{
|
85
|
+
"clone",
|
86
|
+
"--no-tags",
|
87
|
+
"--depth",
|
88
|
+
"1",
|
89
|
+
"--recurse-submodules",
|
90
|
+
"--shallow-submodules",
|
91
|
+
};
|
92
|
+
|
93
|
+
if (job.Source.Branch is { } branch)
|
94
|
+
{
|
95
|
+
args.Add("--branch");
|
96
|
+
args.Add(branch);
|
97
|
+
args.Add("--single-branch");
|
98
|
+
}
|
99
|
+
|
100
|
+
args.Add(url);
|
101
|
+
args.Add(repoContentsPath);
|
102
|
+
return (args.ToArray(), null);
|
103
|
+
}
|
104
|
+
|
105
|
+
internal static CommandArguments GetFetchArgs(string commit, string repoContentsPath)
|
106
|
+
{
|
107
|
+
return
|
108
|
+
(
|
109
|
+
[
|
110
|
+
"fetch",
|
111
|
+
"--depth",
|
112
|
+
"1",
|
113
|
+
"--recurse-submodules=on-demand",
|
114
|
+
"origin",
|
115
|
+
commit
|
116
|
+
],
|
117
|
+
repoContentsPath
|
118
|
+
);
|
119
|
+
}
|
120
|
+
|
121
|
+
internal static CommandArguments GetResetArgs(string commit, string repoContentsPath)
|
122
|
+
{
|
123
|
+
return
|
124
|
+
(
|
125
|
+
[
|
126
|
+
"reset",
|
127
|
+
"--hard",
|
128
|
+
"--recurse-submodules",
|
129
|
+
commit
|
130
|
+
],
|
131
|
+
repoContentsPath
|
132
|
+
);
|
133
|
+
}
|
134
|
+
|
135
|
+
private static string GetRepoUrl(Job job)
|
136
|
+
{
|
137
|
+
return job.Source.Provider switch
|
138
|
+
{
|
139
|
+
"azure" => $"https://dev.azure.com/{job.Source.Repo}",
|
140
|
+
"github" => $"https://github.com/{job.Source.Repo}",
|
141
|
+
_ => throw new ArgumentException($"Unknown provider: {job.Source.Provider}")
|
142
|
+
};
|
143
|
+
}
|
144
|
+
}
|
@@ -0,0 +1,37 @@
|
|
1
|
+
using System.Net;
|
2
|
+
|
3
|
+
namespace NuGetUpdater.Core.Clone;
|
4
|
+
|
5
|
+
public class ShellGitCommandHandler : IGitCommandHandler
|
6
|
+
{
|
7
|
+
private readonly ILogger _logger;
|
8
|
+
|
9
|
+
public ShellGitCommandHandler(ILogger logger)
|
10
|
+
{
|
11
|
+
_logger = logger;
|
12
|
+
}
|
13
|
+
|
14
|
+
public async Task RunGitCommandAsync(IReadOnlyCollection<string> args, string? workingDirectory = null)
|
15
|
+
{
|
16
|
+
_logger.Log($"Running command: git {string.Join(" ", args)}{(workingDirectory is null ? "" : $" in directory {workingDirectory}")}");
|
17
|
+
var (exitCode, stdout, stderr) = await ProcessEx.RunAsync("git", args, workingDirectory);
|
18
|
+
HandleErrorsFromOutput(stdout, stderr);
|
19
|
+
}
|
20
|
+
|
21
|
+
internal static void HandleErrorsFromOutput(string stdout, string stderr)
|
22
|
+
{
|
23
|
+
foreach (var output in new[] { stdout, stderr })
|
24
|
+
{
|
25
|
+
ThrowOnUnauthenticated(output);
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
private static void ThrowOnUnauthenticated(string output)
|
30
|
+
{
|
31
|
+
if (output.Contains("Authentication failed for") ||
|
32
|
+
output.Contains("could not read Username for"))
|
33
|
+
{
|
34
|
+
throw new HttpRequestException(output, inner: null, statusCode: HttpStatusCode.Unauthorized);
|
35
|
+
}
|
36
|
+
}
|
37
|
+
}
|
@@ -2,5 +2,9 @@ namespace NuGetUpdater.Core.Run.ApiModel;
|
|
2
2
|
|
3
3
|
public record DependencyFileNotFound : JobErrorBase
|
4
4
|
{
|
5
|
-
public
|
5
|
+
public DependencyFileNotFound(string filePath)
|
6
|
+
: base("dependency_file_not_found")
|
7
|
+
{
|
8
|
+
Details = filePath;
|
9
|
+
}
|
6
10
|
}
|
@@ -2,7 +2,7 @@ namespace NuGetUpdater.Core.Run.ApiModel;
|
|
2
2
|
|
3
3
|
public sealed record Job
|
4
4
|
{
|
5
|
-
public
|
5
|
+
public string PackageManager { get; init; } = "nuget";
|
6
6
|
public AllowedUpdate[]? AllowedUpdates { get; init; } = null;
|
7
7
|
public bool Debug { get; init; } = false;
|
8
8
|
public object[]? DependencyGroups { get; init; } = null;
|
@@ -4,8 +4,15 @@ namespace NuGetUpdater.Core.Run.ApiModel;
|
|
4
4
|
|
5
5
|
public abstract record JobErrorBase
|
6
6
|
{
|
7
|
+
public JobErrorBase(string type)
|
8
|
+
{
|
9
|
+
Type = type;
|
10
|
+
}
|
11
|
+
|
7
12
|
[JsonPropertyName("error-type")]
|
8
|
-
public
|
13
|
+
public string Type { get; }
|
14
|
+
|
9
15
|
[JsonPropertyName("error-details")]
|
10
|
-
|
16
|
+
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
17
|
+
public object? Details { get; init; } = null;
|
11
18
|
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
namespace NuGetUpdater.Core.Run.ApiModel;
|
2
|
+
|
3
|
+
public record JobRepoNotFound : JobErrorBase
|
4
|
+
{
|
5
|
+
public JobRepoNotFound(string message)
|
6
|
+
: base("job_repo_not_found")
|
7
|
+
{
|
8
|
+
Details = new Dictionary<string, string>()
|
9
|
+
{
|
10
|
+
["message"] = message
|
11
|
+
};
|
12
|
+
}
|
13
|
+
}
|
@@ -4,6 +4,8 @@ public sealed class JobSource
|
|
4
4
|
{
|
5
5
|
public required string Provider { get; init; }
|
6
6
|
public required string Repo { get; init; }
|
7
|
+
public string? Branch { get; init; } = null;
|
8
|
+
public string? Commit { get; init; } = null;
|
7
9
|
public string? Directory { get; init; } = null;
|
8
10
|
public string[]? Directories { get; init; } = null;
|
9
11
|
public string? Hostname { get; init; } = null;
|
@@ -4,6 +4,11 @@ namespace NuGetUpdater.Core.Run.ApiModel;
|
|
4
4
|
|
5
5
|
public sealed record MarkAsProcessed
|
6
6
|
{
|
7
|
+
public MarkAsProcessed(string baseCommitSha)
|
8
|
+
{
|
9
|
+
BaseCommitSha = baseCommitSha;
|
10
|
+
}
|
11
|
+
|
7
12
|
[JsonPropertyName("base-commit-sha")]
|
8
|
-
public
|
13
|
+
public string BaseCommitSha { get; }
|
9
14
|
}
|
data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/PrivateSourceAuthenticationFailure.cs
CHANGED
@@ -2,5 +2,9 @@ namespace NuGetUpdater.Core.Run.ApiModel;
|
|
2
2
|
|
3
3
|
public record PrivateSourceAuthenticationFailure : JobErrorBase
|
4
4
|
{
|
5
|
-
public
|
5
|
+
public PrivateSourceAuthenticationFailure(string[] urls)
|
6
|
+
: base("private_source_authentication_failure")
|
7
|
+
{
|
8
|
+
Details = $"({string.Join("|", urls)})";
|
9
|
+
}
|
6
10
|
}
|
@@ -2,5 +2,9 @@ namespace NuGetUpdater.Core.Run.ApiModel;
|
|
2
2
|
|
3
3
|
public record UpdateNotPossible : JobErrorBase
|
4
4
|
{
|
5
|
-
public
|
5
|
+
public UpdateNotPossible(string[] dependencies)
|
6
|
+
: base("update_not_possible")
|
7
|
+
{
|
8
|
+
Details = dependencies;
|
9
|
+
}
|
6
10
|
}
|
@@ -50,13 +50,19 @@ public class HttpApiHandler : IApiHandler
|
|
50
50
|
await PostAsJson("mark_as_processed", markAsProcessed);
|
51
51
|
}
|
52
52
|
|
53
|
-
|
53
|
+
internal static string Serialize(object body)
|
54
54
|
{
|
55
55
|
var wrappedBody = new
|
56
56
|
{
|
57
|
-
Data = body
|
57
|
+
Data = body
|
58
58
|
};
|
59
59
|
var payload = JsonSerializer.Serialize(wrappedBody, SerializerOptions);
|
60
|
+
return payload;
|
61
|
+
}
|
62
|
+
|
63
|
+
private async Task PostAsJson(string endpoint, object body)
|
64
|
+
{
|
65
|
+
var payload = Serialize(body);
|
60
66
|
var content = new StringContent(payload, Encoding.UTF8, "application/json");
|
61
67
|
var response = await HttpClient.PostAsync($"{_apiUrl}/update_jobs/{_jobId}/{endpoint}", content);
|
62
68
|
var _ = response.EnsureSuccessStatusCode();
|
@@ -63,7 +63,8 @@ public class RunWorker
|
|
63
63
|
var result = await RunForDirectory(job, repoContentsPath, directory, baseCommitSha);
|
64
64
|
foreach (var dependencyFile in result.Base64DependencyFiles)
|
65
65
|
{
|
66
|
-
|
66
|
+
var uniqueKey = Path.GetFullPath(Path.Join(dependencyFile.Directory, dependencyFile.Name)).NormalizePathToUnix().EnsurePrefix("/");
|
67
|
+
allDependencyFiles[uniqueKey] = dependencyFile;
|
67
68
|
}
|
68
69
|
}
|
69
70
|
|
@@ -76,31 +77,19 @@ public class RunWorker
|
|
76
77
|
catch (HttpRequestException ex)
|
77
78
|
when (ex.StatusCode == HttpStatusCode.Unauthorized || ex.StatusCode == HttpStatusCode.Forbidden)
|
78
79
|
{
|
79
|
-
error = new PrivateSourceAuthenticationFailure()
|
80
|
-
{
|
81
|
-
Details = $"({string.Join("|", lastUsedPackageSourceUrls)})",
|
82
|
-
};
|
80
|
+
error = new PrivateSourceAuthenticationFailure(lastUsedPackageSourceUrls);
|
83
81
|
}
|
84
82
|
catch (MissingFileException ex)
|
85
83
|
{
|
86
|
-
error = new DependencyFileNotFound()
|
87
|
-
{
|
88
|
-
Details = ex.FilePath,
|
89
|
-
};
|
84
|
+
error = new DependencyFileNotFound(ex.FilePath);
|
90
85
|
}
|
91
86
|
catch (UpdateNotPossibleException ex)
|
92
87
|
{
|
93
|
-
error = new UpdateNotPossible()
|
94
|
-
{
|
95
|
-
Details = ex.Dependencies,
|
96
|
-
};
|
88
|
+
error = new UpdateNotPossible(ex.Dependencies);
|
97
89
|
}
|
98
90
|
catch (Exception ex)
|
99
91
|
{
|
100
|
-
error = new UnknownError()
|
101
|
-
{
|
102
|
-
Details = ex.ToString(),
|
103
|
-
};
|
92
|
+
error = new UnknownError(ex.ToString());
|
104
93
|
}
|
105
94
|
|
106
95
|
if (error is not null)
|
@@ -108,7 +97,7 @@ public class RunWorker
|
|
108
97
|
await _apiHandler.RecordUpdateJobError(error);
|
109
98
|
}
|
110
99
|
|
111
|
-
await _apiHandler.MarkAsProcessed(new(
|
100
|
+
await _apiHandler.MarkAsProcessed(new(baseCommitSha));
|
112
101
|
|
113
102
|
return runResult;
|
114
103
|
}
|
@@ -122,7 +111,7 @@ public class RunWorker
|
|
122
111
|
_logger.Log(JsonSerializer.Serialize(discoveryResult, DiscoveryWorker.SerializerOptions));
|
123
112
|
|
124
113
|
// report dependencies
|
125
|
-
var discoveredUpdatedDependencies = GetUpdatedDependencyListFromDiscovery(discoveryResult);
|
114
|
+
var discoveredUpdatedDependencies = GetUpdatedDependencyListFromDiscovery(discoveryResult, repoContentsPath.FullName);
|
126
115
|
await _apiHandler.UpdateDependencyList(discoveredUpdatedDependencies);
|
127
116
|
|
128
117
|
// TODO: pull out relevant dependencies, then check each for updates and track the changes
|
@@ -146,6 +135,16 @@ public class RunWorker
|
|
146
135
|
var localPath = Path.Join(repoContentsPath.FullName, discoveryResult.Path, project.FilePath);
|
147
136
|
var content = await File.ReadAllTextAsync(localPath);
|
148
137
|
originalDependencyFileContents[path] = content;
|
138
|
+
|
139
|
+
// track packages.config if it exists
|
140
|
+
var projectDirectory = Path.GetDirectoryName(project.FilePath);
|
141
|
+
var packagesConfigPath = Path.Join(repoContentsPath.FullName, discoveryResult.Path, projectDirectory, "packages.config");
|
142
|
+
var normalizedPackagesConfigPath = Path.Join(discoveryResult.Path, projectDirectory, "packages.config").NormalizePathToUnix().EnsurePrefix("/");
|
143
|
+
if (File.Exists(packagesConfigPath))
|
144
|
+
{
|
145
|
+
var packagesConfigContent = await File.ReadAllTextAsync(packagesConfigPath);
|
146
|
+
originalDependencyFileContents[normalizedPackagesConfigPath] = packagesConfigContent;
|
147
|
+
}
|
149
148
|
}
|
150
149
|
|
151
150
|
// do update
|
@@ -180,9 +179,15 @@ public class RunWorker
|
|
180
179
|
// TODO: log analysisResult
|
181
180
|
if (analysisResult.CanUpdate)
|
182
181
|
{
|
182
|
+
var dependencyLocation = Path.GetFullPath(Path.Join(discoveryResult.Path, project.FilePath).NormalizePathToUnix().EnsurePrefix("/"));
|
183
|
+
if (dependency.Type == DependencyType.PackagesConfig)
|
184
|
+
{
|
185
|
+
dependencyLocation = Path.Combine(Path.GetDirectoryName(dependencyLocation)!, "packages.config");
|
186
|
+
}
|
187
|
+
|
183
188
|
// TODO: this is inefficient, but not likely causing a bottleneck
|
184
189
|
var previousDependency = discoveredUpdatedDependencies.Dependencies
|
185
|
-
.Single(d => d.Name == dependency.Name && d.Requirements.Single().File ==
|
190
|
+
.Single(d => d.Name == dependency.Name && d.Requirements.Single().File == dependencyLocation);
|
186
191
|
var updatedDependency = new ReportedDependency()
|
187
192
|
{
|
188
193
|
Name = dependency.Name,
|
@@ -191,7 +196,7 @@ public class RunWorker
|
|
191
196
|
[
|
192
197
|
new ReportedRequirement()
|
193
198
|
{
|
194
|
-
File =
|
199
|
+
File = dependencyLocation,
|
195
200
|
Requirement = analysisResult.UpdatedVersion,
|
196
201
|
Groups = previousDependency.Requirements.Single().Groups,
|
197
202
|
Source = new RequirementSource()
|
@@ -210,6 +215,11 @@ public class RunWorker
|
|
210
215
|
// TODO: need to report if anything was actually updated
|
211
216
|
if (updateResult.ErrorType is null || updateResult.ErrorType == ErrorType.None)
|
212
217
|
{
|
218
|
+
if (dependencyLocation != dependencyFilePath)
|
219
|
+
{
|
220
|
+
updatedDependency.Requirements.All(r => r.File == dependencyFilePath);
|
221
|
+
}
|
222
|
+
|
213
223
|
actualUpdatedDependencies.Add(updatedDependency);
|
214
224
|
}
|
215
225
|
}
|
@@ -220,19 +230,40 @@ public class RunWorker
|
|
220
230
|
var updatedDependencyFiles = new List<DependencyFile>();
|
221
231
|
foreach (var project in discoveryResult.Projects)
|
222
232
|
{
|
223
|
-
var
|
224
|
-
var
|
225
|
-
var
|
226
|
-
var
|
227
|
-
|
233
|
+
var projectPath = Path.Join(discoveryResult.Path, project.FilePath).NormalizePathToUnix().EnsurePrefix("/");
|
234
|
+
var localProjectPath = Path.Join(repoContentsPath.FullName, discoveryResult.Path, project.FilePath);
|
235
|
+
var updatedProjectContent = await File.ReadAllTextAsync(localProjectPath);
|
236
|
+
var originalProjectContent = originalDependencyFileContents[projectPath];
|
237
|
+
|
238
|
+
if (updatedProjectContent != originalProjectContent)
|
228
239
|
{
|
229
240
|
updatedDependencyFiles.Add(new DependencyFile()
|
230
241
|
{
|
231
242
|
Name = project.FilePath,
|
232
|
-
Content =
|
233
|
-
Directory =
|
243
|
+
Content = updatedProjectContent,
|
244
|
+
Directory = Path.GetDirectoryName(projectPath)!.NormalizeUnixPathParts(),
|
234
245
|
});
|
235
246
|
}
|
247
|
+
|
248
|
+
var projectDirectory = Path.GetDirectoryName(project.FilePath);
|
249
|
+
var packagesConfigPath = Path.Join(repoContentsPath.FullName, discoveryResult.Path, projectDirectory, "packages.config");
|
250
|
+
var normalizedPackagesConfigPath = Path.Join(discoveryResult.Path, projectDirectory, "packages.config").NormalizePathToUnix().EnsurePrefix("/");
|
251
|
+
|
252
|
+
if (File.Exists(packagesConfigPath))
|
253
|
+
{
|
254
|
+
var updatedPackagesConfigContent = await File.ReadAllTextAsync(packagesConfigPath);
|
255
|
+
var originalPackagesConfigContent = originalDependencyFileContents[normalizedPackagesConfigPath];
|
256
|
+
|
257
|
+
if (updatedPackagesConfigContent != originalPackagesConfigContent)
|
258
|
+
{
|
259
|
+
updatedDependencyFiles.Add(new DependencyFile()
|
260
|
+
{
|
261
|
+
Name = Path.Join(projectDirectory!, "packages.config"),
|
262
|
+
Content = updatedPackagesConfigContent,
|
263
|
+
Directory = Path.GetDirectoryName(normalizedPackagesConfigPath)!.NormalizeUnixPathParts(),
|
264
|
+
});
|
265
|
+
}
|
266
|
+
}
|
236
267
|
}
|
237
268
|
|
238
269
|
if (updatedDependencyFiles.Count > 0)
|
@@ -265,14 +296,14 @@ public class RunWorker
|
|
265
296
|
{
|
266
297
|
Name = Path.GetFileName(kvp.Key),
|
267
298
|
Content = Convert.ToBase64String(Encoding.UTF8.GetBytes(kvp.Value)),
|
268
|
-
Directory = Path.GetDirectoryName(kvp.Key)
|
299
|
+
Directory = Path.GetFullPath(Path.GetDirectoryName(kvp.Key)!).NormalizePathToUnix(),
|
269
300
|
}).ToArray(),
|
270
301
|
BaseCommitSha = baseCommitSha,
|
271
302
|
};
|
272
303
|
return result;
|
273
304
|
}
|
274
305
|
|
275
|
-
internal static UpdatedDependencyList GetUpdatedDependencyListFromDiscovery(WorkspaceDiscoveryResult discoveryResult)
|
306
|
+
internal static UpdatedDependencyList GetUpdatedDependencyListFromDiscovery(WorkspaceDiscoveryResult discoveryResult, string pathToContents)
|
276
307
|
{
|
277
308
|
string GetFullRepoPath(string path)
|
278
309
|
{
|
@@ -294,6 +325,17 @@ public class RunWorker
|
|
294
325
|
auxiliaryFiles.Add(GetFullRepoPath(discoveryResult.DirectoryPackagesProps.FilePath));
|
295
326
|
}
|
296
327
|
|
328
|
+
foreach (var project in discoveryResult.Projects)
|
329
|
+
{
|
330
|
+
var projectDirectory = Path.GetDirectoryName(project.FilePath);
|
331
|
+
var pathToPackagesConfig = Path.Join(pathToContents, discoveryResult.Path, projectDirectory, "packages.config").NormalizePathToUnix().EnsurePrefix("/");
|
332
|
+
|
333
|
+
if (File.Exists(pathToPackagesConfig))
|
334
|
+
{
|
335
|
+
auxiliaryFiles.Add(GetFullRepoPath(Path.Join(projectDirectory, "packages.config")));
|
336
|
+
}
|
337
|
+
}
|
338
|
+
|
297
339
|
var updatedDependencyList = new UpdatedDependencyList()
|
298
340
|
{
|
299
341
|
Dependencies = discoveryResult.Projects.SelectMany(p =>
|
@@ -304,7 +346,7 @@ public class RunWorker
|
|
304
346
|
Name = d.Name,
|
305
347
|
Requirements = d.IsTransitive ? [] : [new ReportedRequirement()
|
306
348
|
{
|
307
|
-
File = GetFullRepoPath(p.FilePath),
|
349
|
+
File = d.Type == DependencyType.PackagesConfig ? Path.Combine(Path.GetDirectoryName(GetFullRepoPath(p.FilePath))!, "packages.config"): GetFullRepoPath(p.FilePath),
|
308
350
|
Requirement = d.Version!,
|
309
351
|
Groups = ["dependencies"],
|
310
352
|
}],
|