Skip to content

Commit ec8f634

Browse files
committed
Adds command to update dependencies and tool version
1 parent 5efddde commit ec8f634

10 files changed

+155
-20
lines changed

.vscode/launch.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@
99
"program": "${workspaceRoot}\\src\\dotnet-frc\\bin\\Debug\\netcoreapp1.1\\win7-x64\\dotnet-frc.dll",
1010
"args": [
1111
"C:\\Users\\thadh\\Documents\\RobotTest",
12-
"deploy",
13-
"-v"
12+
"update",
13+
"-v",
14+
"-t"
1415
],
1516
"cwd": "${workspaceRoot}",
1617
"externalConsole": false,

src/FRC.CLI.Base/Interfaces/IProjectInformationProvider.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,5 @@ public interface IProjectInformationProvider
88
Task<string> GetProjectRootDirectoryAsync();
99
Task<string> GetProjectBuildDirectoryAsync();
1010
Task<string> GetProjectExecutableNameAsync();
11-
Task<List<string>> GetFrcDependenciesAsync();
12-
Task SetFrcDependenciesAsync(IList<(string dep, string version)> dependencies);
13-
Task SetFrcTooling((string tool, string version) tool);
1411
}
1512
}

src/dotnet-frc/AutoFacUtilites.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace dotnet_frc
1010
internal static class AutoFacUtilites
1111
{
1212
public static void AddCommonServicesToContainer(ContainerBuilder builder, string fileOrDirectory,
13-
FrcSubCommandBase command, bool debug)
13+
FrcSubCommandBase command, bool debug, bool useTeam = true)
1414
{
1515
builder.RegisterType<ConsoleWriter>().As<IOutputWriter>();
1616
builder.RegisterType<JsonFrcSettingsProvider>().As<IFrcSettingsProvider>();
@@ -29,8 +29,11 @@ public static void AddCommonServicesToContainer(ContainerBuilder builder, string
2929
MsBuildProject msBuild = MsBuildProject.FromFileOrDirectory(ProjectCollection.GlobalProjectCollection, fileOrDirectory);
3030
return new DotNetProjectInformationProvider(msBuild);
3131
}).As<IProjectInformationProvider>();
32-
builder.RegisterType<DotNetTeamNumberProvider>().As<ITeamNumberProvider>().WithParameter(new TypedParameter(typeof(int?),
33-
DotNetTeamNumberProvider.GetTeamNumberFromCommandOption(command._teamOption)));
32+
if (useTeam)
33+
{
34+
builder.RegisterType<DotNetTeamNumberProvider>().As<ITeamNumberProvider>().WithParameter(new TypedParameter(typeof(int?),
35+
DotNetTeamNumberProvider.GetTeamNumberFromCommandOption(command._teamOption)));
36+
}
3437
builder.Register(c => new DotNetBuildSettingsProvider(debug, command._verboseOption.HasValue())).As<IBuildSettingsProvider>();
3538
builder.RegisterType<DotNetWPILibUserFolderResolver>().As<IWPILibUserFolderResolver>();
3639
builder.RegisterType<HttpClientFileDownloadProvider>().As<IFileDownloadProvider>();

src/dotnet-frc/Commands/UpdateCommand.cs

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
using System.Collections.Generic;
12
using System.Threading.Tasks;
23
using Autofac;
34
using FRC.CLI.Base.Interfaces;
45
using FRC.CLI.Common.Implementations;
6+
using Microsoft.Build.Evaluation;
57
using Microsoft.DotNet.Cli;
68
using Microsoft.DotNet.Cli.CommandLine;
79

@@ -21,7 +23,7 @@ public static DotNetSubCommandBase Create()
2123
HandleRemainingArguments = false
2224
};
2325

24-
SetupBaseOptions(command);
26+
SetupBaseOptions(command, false);
2527

2628
command._toolsOption = command.Option(
2729
"-t|--tools",
@@ -42,7 +44,13 @@ public override async Task<int> RunAsync(string fileOrDirectory)
4244
{
4345
var builder = new ContainerBuilder();
4446
AutoFacUtilites.AddCommonServicesToContainer(builder, fileOrDirectory, this,
45-
false);
47+
false, false);
48+
builder.Register(c =>
49+
{
50+
MsBuildProject msBuild = MsBuildProject.FromFileOrDirectory(ProjectCollection.GlobalProjectCollection, fileOrDirectory);
51+
return new DotNetProjectInformationProvider(msBuild);
52+
}).As<DotNetProjectInformationProvider>();
53+
4654
var container = builder.Build();
4755

4856
using (var scope = container.BeginLifetimeScope())
@@ -53,6 +61,34 @@ public override async Task<int> RunAsync(string fileOrDirectory)
5361
"No argument specified. Must provide an argument to use"
5462
);
5563
}
64+
65+
var project = scope.Resolve<DotNetProjectInformationProvider>();
66+
67+
if (_dependenciesOption.HasValue())
68+
{
69+
List<(string, string)> packageVersions = new List<(string, string)>();
70+
var packages = await project.GetFrcDependenciesAsync();
71+
foreach(var package in packages)
72+
{
73+
var newest = await DotNetNugetVersionDetector.FindNewestPackageVersion(package, true);
74+
if (newest == null) continue;
75+
packageVersions.Add((package, newest));
76+
}
77+
await project.SetFrcDependenciesAsync(packageVersions);
78+
}
79+
80+
if (_toolsOption.HasValue())
81+
{
82+
string toolName = "FRC.DotNet.CLI";
83+
var newest = await DotNetNugetVersionDetector.FindNewestPackageVersion(toolName, true);
84+
if (newest != null)
85+
{
86+
await project.SetFrcTooling((toolName, newest));
87+
}
88+
}
89+
90+
var writer = scope.Resolve<IOutputWriter>();
91+
await writer.WriteLineAsync("Dependencies have been updated. Please run dotnet restore.");
5692
}
5793
return 0;
5894
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Threading;
4+
using System.Threading.Tasks;
5+
using NuGet.Common;
6+
using NuGet.Configuration;
7+
using NuGet.Protocol;
8+
using NuGet.Protocol.Core.Types;
9+
using NuGet.Versioning;
10+
11+
namespace dotnet_frc
12+
{
13+
public class DotNetNugetVersionDetector
14+
{
15+
public static async Task<string> FindNewestPackageVersion(string package, bool includePrerelease)
16+
{
17+
Logger logger = new Logger();
18+
List<Lazy<INuGetResourceProvider>> providers = new List<Lazy<INuGetResourceProvider>>();
19+
providers.AddRange(Repository.Provider.GetCoreV3()); // Add v3 API support
20+
//providers.AddRange(Repository.Provider.GetCoreV2()); // Add v2 API support
21+
PackageSource packageSource = new PackageSource("https://api.nuget.org/v3/index.json");
22+
SourceRepository sourceRepository = new SourceRepository(packageSource, providers);
23+
PackageMetadataResource packageMetadataResource = await sourceRepository.GetResourceAsync<PackageMetadataResource>();
24+
IEnumerable<IPackageSearchMetadata> searchMetadata = await packageMetadataResource.GetMetadataAsync(package, true, true, logger, CancellationToken.None);
25+
NuGetVersion newest = null;
26+
foreach(var item in searchMetadata)
27+
{
28+
if (item is PackageSearchMetadata itemMetadata)
29+
{
30+
var version = itemMetadata.Version;
31+
if (!itemMetadata.IsListed) continue;
32+
if (version.IsPrerelease && !includePrerelease) continue;
33+
if (newest == null)
34+
{
35+
newest = version;
36+
continue;
37+
}
38+
if (version.CompareTo(newest.Version) > 0)
39+
{
40+
newest = version;
41+
}
42+
}
43+
}
44+
if (newest == null) return null;
45+
return newest.ToNormalizedString();
46+
}
47+
}
48+
49+
public class Logger : ILogger
50+
{
51+
public void LogDebug(string data) => Console.WriteLine($"DEBUG: {data}");
52+
public void LogVerbose(string data) => Console.WriteLine($"VERBOSE: {data}");
53+
public void LogInformation(string data) => Console.WriteLine($"INFORMATION: {data}");
54+
public void LogMinimal(string data) => Console.WriteLine($"MINIMAL: {data}");
55+
public void LogWarning(string data) => Console.WriteLine($"WARNING: {data}");
56+
public void LogError(string data) => Console.WriteLine($"ERROR: {data}");
57+
public void LogSummary(string data) => Console.WriteLine($"SUMMARY: {data}");
58+
59+
public void LogInformationSummary(string data)
60+
{
61+
62+
}
63+
64+
public void LogErrorSummary(string data)
65+
{
66+
}
67+
}
68+
}

src/dotnet-frc/DotNetProjectInformationProvider.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ public Task SetFrcDependenciesAsync(IList<(string dep, string version)> dependen
8585

8686
public Task SetFrcTooling((string tool, string version) tool)
8787
{
88-
throw new NotImplementedException();
88+
BuildProject.SetDotNetToolingVersion(tool);
89+
return Task.CompletedTask;
8990
}
9091
}
9192
}

src/dotnet-frc/FrcCommand.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ public class FrcCommand : DotNetTopLevelCommandBase
2121
DeployCommand.Create,
2222
KillCommand.Create,
2323
SettingsCommand.Create,
24-
RuntimeCommand.Create
24+
RuntimeCommand.Create,
25+
UpdateCommand.Create
2526
};
2627

2728
public static int Run(string[] args)

src/dotnet-frc/FrcSubCommandBase.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,18 @@ internal abstract class FrcSubCommandBase : DotNetSubCommandBase
1010
internal CommandOption _teamOption;
1111
internal CommandOption _verboseOption;
1212

13-
public static void SetupBaseOptions(FrcSubCommandBase command)
13+
public static void SetupBaseOptions(FrcSubCommandBase command, bool useTeam = true)
1414
{
1515
command.HelpOption("-h|--help");
1616

17-
command._teamOption = command.Option(
18-
"-t|--team",
19-
"Force a team",
20-
CommandOptionType.SingleValue
21-
);
17+
if (useTeam)
18+
{
19+
command._teamOption = command.Option(
20+
"-t|--team",
21+
"Force a team",
22+
CommandOptionType.SingleValue
23+
);
24+
}
2225

2326
command._verboseOption = command.Option(
2427
"-v|--verbose <VERBOSE>",

src/dotnet-frc/Utilities/MsBuildProject.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,30 @@ public void SetWPILibPackages(IList<(string dep, string version)> dependencies)
9292
ProjectRoot.Save();
9393
}
9494

95+
public void SetDotNetToolingVersion((string tool, string version) tooling)
96+
{
97+
foreach (var item in ProjectRoot.Items)
98+
{
99+
if (item.ItemType == "DotNetCliToolReference")
100+
{
101+
if (item.Include == tooling.tool)
102+
{
103+
foreach(var child in item.Children)
104+
{
105+
if (child is ProjectMetadataElement childData)
106+
{
107+
if (childData.Name == "Version")
108+
{
109+
childData.Value = tooling.version;
110+
}
111+
}
112+
}
113+
}
114+
}
115+
}
116+
ProjectRoot.Save();
117+
}
118+
95119
public string GetProjectAssemblyName()
96120
{
97121
foreach(var item in ProjectRoot.Properties)

src/dotnet-frc/dotnet-frc.csproj

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
<PackageReference Include="autofac">
44
<Version>4.3.0</Version>
55
</PackageReference>
6-
<ProjectReference Include="..\FRC.CLI.Base\FRC.CLI.Base.csproj" >
6+
<PackageReference Include="NuGet.Protocol.Core.v3" Version="4.0.0" />
7+
<ProjectReference Include="..\FRC.CLI.Base\FRC.CLI.Base.csproj">
78
<PrivateAssets>all</PrivateAssets>
89
</ProjectReference>
9-
<ProjectReference Include="..\FRC.CLI.Common\FRC.CLI.Common.csproj" >
10+
<ProjectReference Include="..\FRC.CLI.Common\FRC.CLI.Common.csproj">
1011
<PrivateAssets>all</PrivateAssets>
1112
</ProjectReference>
1213
<PackageReference Include="Microsoft.DotNet.CLI.Utils">

0 commit comments

Comments
 (0)