2016-03-07 14:24:36 -06:00
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
2016-07-15 19:09:38 -05:00
using Microsoft.DotNet.VersionTools ;
using Microsoft.DotNet.VersionTools.Automation ;
using Microsoft.DotNet.VersionTools.Dependencies ;
2018-01-29 21:20:07 -08:00
using Microsoft.DotNet.VersionTools.Dependencies.BuildOutput ;
2016-07-15 19:09:38 -05:00
using System ;
using System.Collections.Generic ;
2017-05-11 10:15:05 -05:00
using System.Diagnostics ;
2016-07-15 19:09:38 -05:00
using System.IO ;
using System.Linq ;
using System.Text.RegularExpressions ;
2016-03-07 14:24:36 -06:00
namespace Microsoft.DotNet.Scripts
{
public class Program
{
2016-07-15 19:09:38 -05:00
private static readonly Config s_config = Config . Instance ;
public static void Main ( string [ ] args )
2016-03-07 14:24:36 -06:00
{
2017-05-11 10:15:05 -05:00
HandleDebugSwitch ( ref args ) ;
2016-03-07 14:24:36 -06:00
2017-02-09 16:25:48 -06:00
bool onlyUpdate = args . Length > 0 & & string . Equals ( "--Update" , args [ 0 ] , StringComparison . OrdinalIgnoreCase ) ;
2018-03-29 14:43:38 -07:00
List < BuildInfo > buildInfos = new List < BuildInfo > ( s_config . VersionFragments . Select < KeyValuePair < string , string > , BuildInfo > ( fragment = >
GetBuildInfo ( fragment . Key , fragment . Value , fetchLatestReleaseFile : false ) ) ) ;
2018-08-13 16:57:30 -05:00
IEnumerable < IDependencyUpdater > updaters = GetUpdaters ( ) . ToArray ( ) ;
2017-02-10 11:32:22 -06:00
var dependencyBuildInfos = buildInfos . Select ( buildInfo = >
2018-01-29 21:20:07 -08:00
new BuildDependencyInfo (
2017-02-10 11:32:22 -06:00
buildInfo ,
2017-02-09 16:25:48 -06:00
upgradeStableVersions : true ,
2018-08-13 16:57:30 -05:00
disabledPackages : Enumerable . Empty < string > ( ) ) ) . ToArray ( ) ;
2017-02-09 16:25:48 -06:00
DependencyUpdateResults updateResults = DependencyUpdateUtils . Update ( updaters , dependencyBuildInfos ) ;
2017-02-28 11:33:37 -08:00
if ( ! onlyUpdate & & updateResults . ChangesDetected ( ) )
2016-07-15 19:09:38 -05:00
{
2017-02-09 16:25:48 -06:00
GitHubAuth gitHubAuth = new GitHubAuth ( s_config . Password , s_config . UserName , s_config . Email ) ;
GitHubProject origin = new GitHubProject ( s_config . GitHubProject , s_config . UserName ) ;
GitHubBranch upstreamBranch = new GitHubBranch (
s_config . GitHubUpstreamBranch ,
new GitHubProject ( s_config . GitHubProject , s_config . GitHubUpstreamOwner ) ) ;
string suggestedMessage = updateResults . GetSuggestedCommitMessage ( ) ;
string body = string . Empty ;
2017-02-10 11:32:22 -06:00
if ( s_config . GitHubPullRequestNotifications . Any ( ) )
2017-02-09 16:25:48 -06:00
{
body + = PullRequestCreator . NotificationString ( s_config . GitHubPullRequestNotifications ) ;
}
2018-01-29 21:20:07 -08:00
new PullRequestCreator ( gitHubAuth )
2017-02-09 16:25:48 -06:00
. CreateOrUpdateAsync (
suggestedMessage ,
suggestedMessage + $" ({upstreamBranch.Name})" ,
2018-01-29 21:20:07 -08:00
body ,
upstreamBranch ,
origin ,
new PullRequestOptions ( ) )
2017-02-09 16:25:48 -06:00
. Wait ( ) ;
2016-07-15 19:09:38 -05:00
}
}
2017-02-20 14:20:27 -08:00
private static BuildInfo GetBuildInfo ( string name , string buildInfoFragment , bool fetchLatestReleaseFile = true )
{
const string FileUrlProtocol = "file://" ;
if ( s_config . DotNetVersionUrl . StartsWith ( FileUrlProtocol , StringComparison . Ordinal ) )
{
return BuildInfo . LocalFileGetAsync (
name ,
s_config . DotNetVersionUrl . Substring ( FileUrlProtocol . Length ) ,
buildInfoFragment . Replace ( '/' , Path . DirectorySeparatorChar ) ,
fetchLatestReleaseFile )
. Result ;
}
else
{
return BuildInfo . Get ( name , $"{s_config.DotNetVersionUrl}/{buildInfoFragment}" , fetchLatestReleaseFile ) ;
}
}
2016-07-15 19:09:38 -05:00
private static IEnumerable < IDependencyUpdater > GetUpdaters ( )
{
2017-04-21 13:04:19 -05:00
string dependencyVersionsPath = Path . Combine ( "build" , "DependencyVersions.props" ) ;
2018-07-31 18:31:02 -07:00
string testDependencyVersionsPath = Path . Combine ( "build" , "TestDependencyVersions.props" ) ;
2018-03-29 14:43:38 -07:00
if ( s_config . HasVersionFragment ( "aspnet" ) )
{
yield return CreateRegexUpdater ( dependencyVersionsPath , "MicrosoftAspNetCoreAppPackageVersion" , "Microsoft.AspNetCore.App" ) ;
}
if ( s_config . HasVersionFragment ( "coresetup" ) )
{
yield return CreateRegexUpdater ( dependencyVersionsPath , "MicrosoftNETCoreAppPackageVersion" , "Microsoft.NETCore.App" ) ;
2018-07-31 18:31:02 -07:00
yield return CreateRegexUpdater ( testDependencyVersionsPath , "MicrosoftDotNetPlatformAbstractionsPackageVersion" , "Microsoft.DotNet.PlatformAbstractions" ) ;
2018-03-29 14:43:38 -07:00
}
if ( s_config . HasVersionFragment ( "templating" ) )
{
yield return CreateRegexUpdater ( dependencyVersionsPath , "MicrosoftDotNetCommonItemTemplatesPackageVersion" , "Microsoft.DotNet.Common.ItemTemplates" ) ;
yield return CreateRegexUpdater ( dependencyVersionsPath , "MicrosoftDotNetTestProjectTemplates20PackageVersion" , "Microsoft.DotNet.Test.ProjectTemplates.2.0" ) ;
}
2016-07-15 19:09:38 -05:00
}
2017-02-09 16:25:48 -06:00
private static IDependencyUpdater CreateRegexUpdater ( string repoRelativePath , string propertyName , string packageId )
2016-07-15 19:09:38 -05:00
{
return new FileRegexPackageUpdater ( )
{
Path = Path . Combine ( Dirs . RepoRoot , repoRelativePath ) ,
PackageId = packageId ,
2017-02-09 16:25:48 -06:00
Regex = new Regex ( $@"<{propertyName}>(?<version>.*)</{propertyName}>" ) ,
2016-07-15 19:09:38 -05:00
VersionGroupName = "version"
} ;
2016-03-07 14:24:36 -06:00
}
2017-05-11 10:15:05 -05:00
private static void HandleDebugSwitch ( ref string [ ] args )
{
if ( args . Length > 0 & & string . Equals ( "--debug" , args [ 0 ] , StringComparison . OrdinalIgnoreCase ) )
{
args = args . Skip ( 1 ) . ToArray ( ) ;
WaitForDebugger ( ) ;
}
}
private static void WaitForDebugger ( )
{
Console . WriteLine ( "Waiting for debugger to attach. Press ENTER to continue" ) ;
Console . WriteLine ( $"Process ID: {Process.GetCurrentProcess().Id}" ) ;
Console . ReadLine ( ) ;
}
2016-03-07 14:24:36 -06:00
}
}