Browse Source
Allow picking the profile (set of target frameworks) in project upgrade view.pull/24/merge
13 changed files with 352 additions and 56 deletions
@ -0,0 +1,34 @@
@@ -0,0 +1,34 @@
|
||||
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||
|
||||
using System; |
||||
using System.Collections; |
||||
using System.Collections.Generic; |
||||
using System.IO; |
||||
using ICSharpCode.Core; |
||||
using ICSharpCode.SharpDevelop.Gui; |
||||
|
||||
namespace ICSharpCode.SharpDevelop.Project.PortableLibrary |
||||
{ |
||||
/// <summary>
|
||||
/// Shows a message box if the portable library is not installed.
|
||||
/// </summary>
|
||||
public class CheckPortableLibraryInstalled : AbstractCommand |
||||
{ |
||||
public override void Run() |
||||
{ |
||||
if (!ProfileList.IsPortableLibraryInstalled()) { |
||||
using (ToolNotFoundDialog dlg = new ToolNotFoundDialog( |
||||
"Could not find Portable Class Library Tools." + Environment.NewLine + Environment.NewLine + |
||||
"To install the Portable Class Library Tools without installing Visual Studio, save the download file (PortableLibraryTools.exe) on your computer, and run the installation program from a Command Prompt window. Include the /buildmachine switch on the command line.", |
||||
"http://go.microsoft.com/fwlink/?LinkId=210823" |
||||
)) { |
||||
// our message is long, so make the window bigger than usual
|
||||
dlg.Width += 70; |
||||
dlg.Height += 70; |
||||
dlg.ShowDialog(); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,48 @@
@@ -0,0 +1,48 @@
|
||||
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||
|
||||
using System; |
||||
using System.Collections; |
||||
using System.Collections.Generic; |
||||
using System.IO; |
||||
using System.Linq; |
||||
using System.Xml; |
||||
using System.Xml.Linq; |
||||
|
||||
namespace ICSharpCode.SharpDevelop.Project.PortableLibrary |
||||
{ |
||||
public class PortableTargetFramework : TargetFramework |
||||
{ |
||||
public readonly string TargetFrameworkVersion; |
||||
public readonly string TargetFrameworkProfile; |
||||
|
||||
public PortableTargetFramework(string targetFrameworkVersion, string targetFrameworkProfile) |
||||
: base(targetFrameworkVersion + "-" + targetFrameworkProfile, ".NET Portable Subset (" + targetFrameworkVersion + "-" + targetFrameworkProfile + ")") |
||||
{ |
||||
this.TargetFrameworkVersion = targetFrameworkVersion; |
||||
this.TargetFrameworkProfile = targetFrameworkProfile; |
||||
this.MinimumMSBuildVersion = new Version(4, 0); |
||||
} |
||||
|
||||
public PortableTargetFramework(Profile profile) |
||||
: base(profile.TargetFrameworkVersion + "-" + profile.TargetFrameworkProfile, profile.DisplayName) |
||||
{ |
||||
this.TargetFrameworkVersion = profile.TargetFrameworkVersion; |
||||
this.TargetFrameworkProfile = profile.TargetFrameworkProfile; |
||||
this.MinimumMSBuildVersion = new Version(4, 0); |
||||
} |
||||
|
||||
public override bool Equals(object obj) |
||||
{ |
||||
PortableTargetFramework other = obj as PortableTargetFramework; |
||||
if (other == null) |
||||
return false; |
||||
return this.TargetFrameworkVersion == other.TargetFrameworkVersion && this.TargetFrameworkProfile == other.TargetFrameworkProfile; |
||||
} |
||||
|
||||
public override int GetHashCode() |
||||
{ |
||||
return this.TargetFrameworkVersion.GetHashCode() ^ this.TargetFrameworkProfile.GetHashCode(); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,105 @@
@@ -0,0 +1,105 @@
|
||||
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||
|
||||
using System; |
||||
using System.Collections; |
||||
using System.Collections.Generic; |
||||
using System.IO; |
||||
using System.Linq; |
||||
using System.Xml; |
||||
using System.Xml.Linq; |
||||
|
||||
namespace ICSharpCode.SharpDevelop.Project.PortableLibrary |
||||
{ |
||||
public class ProfileList |
||||
{ |
||||
internal static string GetPortableLibraryPath() |
||||
{ |
||||
string programFiles = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86); |
||||
return Path.Combine(programFiles, @"Reference Assemblies\Microsoft\Framework\.NETPortable"); |
||||
} |
||||
|
||||
public static bool IsPortableLibraryInstalled() |
||||
{ |
||||
return Directory.Exists(GetPortableLibraryPath()); |
||||
} |
||||
|
||||
#region LoadProfiles
|
||||
static readonly Lazy<ProfileList> instance = new Lazy<ProfileList>(LoadProfiles); |
||||
|
||||
public static ProfileList Instance { |
||||
get { return instance.Value; } |
||||
} |
||||
|
||||
internal static ProfileList LoadProfiles() |
||||
{ |
||||
ProfileList result = new ProfileList(); |
||||
string path = GetPortableLibraryPath(); |
||||
result.LoadProfiles("v4.0", Path.Combine(path, @"v4.0\Profile")); |
||||
result.LoadProfiles("v4.5", Path.Combine(path, @"v4.5\Profile")); |
||||
return result; |
||||
} |
||||
|
||||
List<Profile> list = new List<Profile>(); |
||||
|
||||
void LoadProfiles(string targetFrameworkVersion, string profilesDir) |
||||
{ |
||||
string[] profileDirs; |
||||
try { |
||||
profileDirs = Directory.GetDirectories(profilesDir); |
||||
} catch (IOException) { |
||||
return; |
||||
} catch (UnauthorizedAccessException) { |
||||
return; |
||||
} |
||||
foreach (string profileDir in profileDirs) { |
||||
string targetFrameworkProfile = Path.GetFileName(profileDir); |
||||
var profile = Profile.LoadProfile(targetFrameworkVersion, targetFrameworkProfile, profileDir); |
||||
if (profile != null) |
||||
list.Add(profile); |
||||
} |
||||
} |
||||
#endregion
|
||||
|
||||
public IEnumerable<Profile> AllProfiles { |
||||
get { return list; } |
||||
} |
||||
|
||||
public IEnumerable<SupportedFramework> AllFrameworks { |
||||
get { return list.SelectMany(p => p.SupportedFrameworks).Distinct(); } |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Retrieves all profiles that support all of the given frameworks.
|
||||
/// </summary>
|
||||
public IEnumerable<Profile> GetProfiles(IList<SupportedFramework> frameworks) |
||||
{ |
||||
if (frameworks == null) |
||||
throw new ArgumentNullException("frameworks"); |
||||
return list.Where(p => p.Supports(frameworks)); |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Retrieves the most specific profile that supports all of the given frameworks.
|
||||
/// Returns null if no profile supports the given frameworks.
|
||||
/// </summary>
|
||||
public Profile GetBestProfile(IList<SupportedFramework> frameworks) |
||||
{ |
||||
var candidates = GetProfiles(frameworks).ToList(); |
||||
for (int i = candidates.Count - 1; i >= 0; i--) { |
||||
for (int j = 0; j < candidates.Count; j++) { |
||||
if (i != j) { |
||||
if (candidates[i].Supports(candidates[j].SupportedFrameworks)) { |
||||
// i is less specific than j, so remove it
|
||||
candidates.RemoveAt(i); |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
// If the portable library profiles are specified properly, there should be at most one result,
|
||||
// so we'll just return that.
|
||||
return candidates.FirstOrDefault(); |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue