-
-
Notifications
You must be signed in to change notification settings - Fork 18
Expand file tree
/
Copy pathProgram.Update.cs
More file actions
92 lines (76 loc) · 3.51 KB
/
Copy pathProgram.Update.cs
File metadata and controls
92 lines (76 loc) · 3.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// Copyright 2026 Maintainers of Fallout.
// Originally based on NUKE by Matthias Koch and contributors.
// Distributed under the MIT License.
// https://github.com/ChrisonSimtian/Fallout/blob/main/LICENSE
using System;
using System.IO;
using System.Linq;
using System.Text.Json.Nodes;
using Fallout.Common;
using Fallout.Common.Execution;
using Fallout.Common.IO;
using Fallout.Common.ProjectModel;
using Fallout.Common.Tools.DotNet;
using Fallout.Common.Utilities;
using static Fallout.Common.Constants;
namespace Fallout.GlobalTool;
partial class Program
{
public static int Update(string[] args, AbsolutePath rootDirectory, AbsolutePath buildScript)
{
PrintInfo();
Logging.Configure();
Assert.NotNull(rootDirectory);
if (buildScript != null)
{
ConfirmExecution("Update build scripts", () => UpdateBuildScripts(rootDirectory, buildScript));
ConfirmExecution("Update build project", () => UpdateBuildProject(buildScript));
}
ConfirmExecution("Update configuration file", () => UpdateConfigurationFile(rootDirectory));
ConfirmExecution("Update global.json", () => UpdateGlobalJsonFile(rootDirectory));
ShowCompletion("Updates");
return 0;
}
private static void UpdateBuildScripts(AbsolutePath rootDirectory, AbsolutePath buildScript)
{
var configuration = GetConfiguration(buildScript, evaluate: true);
var buildProjectFile = (AbsolutePath) configuration[BUILD_PROJECT_FILE];
WriteBuildScripts(
scriptDirectory: buildScript.Parent,
rootDirectory,
buildDirectory: buildProjectFile.NotNull().Parent,
buildProjectName: Path.GetFileNameWithoutExtension(buildProjectFile));
}
private static void UpdateBuildProject(AbsolutePath buildScript)
{
var configuration = GetConfiguration(buildScript, evaluate: true);
var projectFile = configuration[BUILD_PROJECT_FILE];
ProjectModelTasks.Initialize();
ProjectUpdater.Update(projectFile);
}
private static void UpdateConfigurationFile(AbsolutePath rootDirectory)
{
var configurationFile = rootDirectory / FalloutDirectoryName;
if (!configurationFile.Exists())
return;
var solutionFile = rootDirectory / configurationFile.ReadAllLines().FirstOrDefault(x => !x.IsNullOrEmpty());
configurationFile.DeleteFile();
WriteConfigurationFile(rootDirectory, solutionFile);
Host.Warning($"The previous {FalloutFileName} file was transformed to a {FalloutDirectoryName} directory.");
Host.Warning($"The .tmp directory can be cleared, as it is moved to {FalloutDirectoryName}/temp as well.");
if (solutionFile != null)
Host.Warning($"Verify the property referencing the solution has the same name as the member with the {nameof(SolutionAttribute)}.");
}
private static void UpdateGlobalJsonFile(AbsolutePath rootDirectory)
{
var latestInstalledSdk = DotNetTasks.DotNet("--list-sdks", logInvocation: false, logOutput: false)
.LastOrDefault().Text?.Split(" ").First();
if (latestInstalledSdk == null)
return;
var globalJsonFile = rootDirectory / "global.json";
var jobject = globalJsonFile.Existing()?.ReadJsonObject() ?? new JsonObject();
jobject["sdk"] ??= new JsonObject();
jobject["sdk"].NotNull()["version"] = latestInstalledSdk;
globalJsonFile.WriteJson(jobject, JsonExtensions.DefaultSerializerOptions);
}
}