mirror of https://github.com/abpframework/abp.git
committed by
GitHub
12 changed files with 201 additions and 34 deletions
@ -0,0 +1,93 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.IO; |
||||
|
using System.Linq; |
||||
|
using System.Net.Http; |
||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.Extensions.Logging; |
||||
|
using Microsoft.Extensions.Logging.Abstractions; |
||||
|
using Newtonsoft.Json; |
||||
|
using Volo.Abp.Cli.Args; |
||||
|
using Volo.Abp.Cli.ProjectBuilding.Github; |
||||
|
using Volo.Abp.Cli.ProjectModification; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
|
||||
|
namespace Volo.Abp.Cli.Commands |
||||
|
{ |
||||
|
public class UpdateCommand : IConsoleCommand, ITransientDependency |
||||
|
{ |
||||
|
public ILogger<UpdateCommand> Logger { get; set; } |
||||
|
|
||||
|
private readonly VoloPackagesVersionUpdater _packagesVersionUpdater; |
||||
|
|
||||
|
public UpdateCommand(VoloPackagesVersionUpdater packagesVersionUpdater) |
||||
|
{ |
||||
|
_packagesVersionUpdater = packagesVersionUpdater; |
||||
|
|
||||
|
Logger = NullLogger<UpdateCommand>.Instance; |
||||
|
} |
||||
|
|
||||
|
public async Task ExecuteAsync(CommandLineArgs commandLineArgs) |
||||
|
{ |
||||
|
var includePreviews = commandLineArgs.Options.GetOrNull(Options.IncludePreviews.Short, Options.IncludePreviews.Long) != null; |
||||
|
|
||||
|
var solution = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.sln").FirstOrDefault(); |
||||
|
|
||||
|
if (solution != null) |
||||
|
{ |
||||
|
var version = await GetLatestAbpVersion(includePreviews); |
||||
|
var solutionName = Path.GetFileName(solution).RemovePostFix(".sln"); |
||||
|
|
||||
|
_packagesVersionUpdater.UpdateSolution(solution, version); |
||||
|
|
||||
|
Logger.LogInformation($"Volo packages are updated to {version} in {solutionName} solution."); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
var project = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.csproj").FirstOrDefault(); |
||||
|
|
||||
|
if (project != null) |
||||
|
{ |
||||
|
var version = await GetLatestAbpVersion(includePreviews); |
||||
|
var projectName = Path.GetFileName(project).RemovePostFix(".csproj"); |
||||
|
|
||||
|
_packagesVersionUpdater.UpdateProject(project, version); |
||||
|
|
||||
|
Logger.LogInformation($"Volo packages are updated to {version} in {projectName} project."); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
Logger.LogError("No solution or project found in this directory."); |
||||
|
} |
||||
|
|
||||
|
protected virtual async Task<string> GetLatestAbpVersion(bool includePreviews) |
||||
|
{ |
||||
|
var url = "https://api.github.com/repos/abpframework/abp/releases"; |
||||
|
|
||||
|
using (var client = new HttpClient()) |
||||
|
{ |
||||
|
client.Timeout = TimeSpan.FromMinutes(30); |
||||
|
client.DefaultRequestHeaders.UserAgent.ParseAdd("MyAgent/1.0"); |
||||
|
var result = await client.GetStringAsync(url); |
||||
|
|
||||
|
var releases = JsonConvert.DeserializeObject<List<GithubRelease>>(result); |
||||
|
|
||||
|
if (!includePreviews) |
||||
|
{ |
||||
|
releases.RemoveAll(v => v.IsPrerelease); |
||||
|
} |
||||
|
|
||||
|
return releases.First().Name.RemovePreFix("v"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static class Options |
||||
|
{ |
||||
|
public static class IncludePreviews |
||||
|
{ |
||||
|
public const string Short = "p"; |
||||
|
public const string Long = "include-previews"; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,76 @@ |
|||||
|
using System; |
||||
|
using System.IO; |
||||
|
using System.Text; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
|
||||
|
namespace Volo.Abp.Cli.ProjectModification |
||||
|
{ |
||||
|
public class VoloPackagesVersionUpdater : ITransientDependency |
||||
|
{ |
||||
|
public void UpdateSolution(string solutionPath, string newVersion) |
||||
|
{ |
||||
|
var projectPaths = ProjectFinder.GetProjectFiles(solutionPath); |
||||
|
|
||||
|
foreach (var filePath in projectPaths) |
||||
|
{ |
||||
|
UpdateInternal(filePath, newVersion); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public void UpdateProject(string projectPath, string newVersion) |
||||
|
{ |
||||
|
UpdateInternal(projectPath, newVersion); |
||||
|
} |
||||
|
|
||||
|
protected virtual void UpdateInternal(string projectPath, string newVersion) |
||||
|
{ |
||||
|
var fileContent = File.ReadAllText(projectPath); |
||||
|
|
||||
|
var content = new StringBuilder(); |
||||
|
var index = 0; |
||||
|
|
||||
|
while (index >= 0) |
||||
|
{ |
||||
|
fileContent = fileContent.Substring(index); |
||||
|
content.Append(ReplaceAPackage(fileContent, newVersion, out index)); |
||||
|
} |
||||
|
|
||||
|
File.WriteAllText(projectPath, content.ToString()); |
||||
|
} |
||||
|
|
||||
|
private string ReplaceAPackage(string content, string version, out int index) |
||||
|
{ |
||||
|
var packageReferenceStartText = "nclude=\"Volo."; |
||||
|
var returningText = new StringBuilder(); |
||||
|
|
||||
|
var indexOfPackageReference = content.IndexOf(packageReferenceStartText, StringComparison.Ordinal); |
||||
|
|
||||
|
if (indexOfPackageReference < 0) |
||||
|
{ |
||||
|
index = -1; |
||||
|
return content; |
||||
|
} |
||||
|
|
||||
|
returningText.Append(content.Substring(0, indexOfPackageReference + packageReferenceStartText.Length)); |
||||
|
content = content.Substring(indexOfPackageReference + packageReferenceStartText.Length); |
||||
|
|
||||
|
var indexAfterQuote = content.IndexOf("\"", StringComparison.Ordinal) + 1; |
||||
|
|
||||
|
returningText.Append(content.Substring(0, indexAfterQuote)); |
||||
|
content = content.Substring(indexAfterQuote); |
||||
|
|
||||
|
var indexAfterSecondQuote = content.IndexOf("\"", StringComparison.Ordinal) + 1; |
||||
|
|
||||
|
returningText.Append(content.Substring(0, indexAfterSecondQuote)); |
||||
|
content = content.Substring(indexAfterSecondQuote); |
||||
|
|
||||
|
var indexOfThirdQuote = content.IndexOf("\"", StringComparison.Ordinal); |
||||
|
|
||||
|
returningText.Append(version); |
||||
|
|
||||
|
index = indexOfPackageReference + packageReferenceStartText.Length + indexAfterQuote + indexAfterSecondQuote + indexOfThirdQuote; |
||||
|
|
||||
|
return returningText.ToString(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue