From 575ee444a9f90b10b55a4e2839520ed24821ded9 Mon Sep 17 00:00:00 2001 From: Delbert Matlock Date: Sun, 13 Nov 2016 17:45:09 -0500 Subject: [PATCH] Add project files. --- NuGetDependencyDownloader.sln | 22 ++ NugetDependencyDownloader/App.config | 6 + .../MainForm.Designer.cs | 170 +++++++++++++++ NugetDependencyDownloader/MainForm.cs | 204 ++++++++++++++++++ NugetDependencyDownloader/MainForm.resx | 120 +++++++++++ .../NuGetDependencyDownloader.csproj | 102 +++++++++ NugetDependencyDownloader/Program.cs | 19 ++ .../Properties/AssemblyInfo.cs | 36 ++++ .../Properties/Resources.Designer.cs | 63 ++++++ .../Properties/Resources.resx | 117 ++++++++++ .../Properties/Settings.Designer.cs | 26 +++ .../Properties/Settings.settings | 7 + NugetDependencyDownloader/SlidingBuffer.cs | 41 ++++ NugetDependencyDownloader/Utility.cs | 79 +++++++ NugetDependencyDownloader/packages.config | 5 + 15 files changed, 1017 insertions(+) create mode 100644 NuGetDependencyDownloader.sln create mode 100644 NugetDependencyDownloader/App.config create mode 100644 NugetDependencyDownloader/MainForm.Designer.cs create mode 100644 NugetDependencyDownloader/MainForm.cs create mode 100644 NugetDependencyDownloader/MainForm.resx create mode 100644 NugetDependencyDownloader/NuGetDependencyDownloader.csproj create mode 100644 NugetDependencyDownloader/Program.cs create mode 100644 NugetDependencyDownloader/Properties/AssemblyInfo.cs create mode 100644 NugetDependencyDownloader/Properties/Resources.Designer.cs create mode 100644 NugetDependencyDownloader/Properties/Resources.resx create mode 100644 NugetDependencyDownloader/Properties/Settings.Designer.cs create mode 100644 NugetDependencyDownloader/Properties/Settings.settings create mode 100644 NugetDependencyDownloader/SlidingBuffer.cs create mode 100644 NugetDependencyDownloader/Utility.cs create mode 100644 NugetDependencyDownloader/packages.config diff --git a/NuGetDependencyDownloader.sln b/NuGetDependencyDownloader.sln new file mode 100644 index 0000000..8610389 --- /dev/null +++ b/NuGetDependencyDownloader.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NuGetDependencyDownloader", "NugetDependencyDownloader\NuGetDependencyDownloader.csproj", "{7C83BCC2-32F4-469C-8094-0DFDD68D7D34}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7C83BCC2-32F4-469C-8094-0DFDD68D7D34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7C83BCC2-32F4-469C-8094-0DFDD68D7D34}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7C83BCC2-32F4-469C-8094-0DFDD68D7D34}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7C83BCC2-32F4-469C-8094-0DFDD68D7D34}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/NugetDependencyDownloader/App.config b/NugetDependencyDownloader/App.config new file mode 100644 index 0000000..88fa402 --- /dev/null +++ b/NugetDependencyDownloader/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/NugetDependencyDownloader/MainForm.Designer.cs b/NugetDependencyDownloader/MainForm.Designer.cs new file mode 100644 index 0000000..a83d3d9 --- /dev/null +++ b/NugetDependencyDownloader/MainForm.Designer.cs @@ -0,0 +1,170 @@ +namespace NuGetDependencyDownloader +{ + partial class MainForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.btnStart = new System.Windows.Forms.Button(); + this.btnStop = new System.Windows.Forms.Button(); + this.textBoxPackage = new System.Windows.Forms.TextBox(); + this.textBoxVersion = new System.Windows.Forms.TextBox(); + this.textBoxActivity = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.checkBoxPrerelease = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // btnStart + // + this.btnStart.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btnStart.Location = new System.Drawing.Point(498, 38); + this.btnStart.Name = "btnStart"; + this.btnStart.Size = new System.Drawing.Size(75, 23); + this.btnStart.TabIndex = 3; + this.btnStart.Text = "Start"; + this.btnStart.UseVisualStyleBackColor = true; + this.btnStart.Click += new System.EventHandler(this.btnStart_Click); + // + // btnStop + // + this.btnStop.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btnStop.Enabled = false; + this.btnStop.Location = new System.Drawing.Point(498, 67); + this.btnStop.Name = "btnStop"; + this.btnStop.Size = new System.Drawing.Size(75, 23); + this.btnStop.TabIndex = 4; + this.btnStop.Text = "Stop"; + this.btnStop.UseVisualStyleBackColor = true; + this.btnStop.EnabledChanged += new System.EventHandler(this.btnStop_EnabledChanged); + this.btnStop.Click += new System.EventHandler(this.btnStop_Click); + // + // textBoxPackage + // + this.textBoxPackage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxPackage.Location = new System.Drawing.Point(12, 48); + this.textBoxPackage.Name = "textBoxPackage"; + this.textBoxPackage.Size = new System.Drawing.Size(211, 20); + this.textBoxPackage.TabIndex = 1; + // + // textBoxVersion + // + this.textBoxVersion.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxVersion.Location = new System.Drawing.Point(257, 48); + this.textBoxVersion.Name = "textBoxVersion"; + this.textBoxVersion.Size = new System.Drawing.Size(136, 20); + this.textBoxVersion.TabIndex = 2; + // + // textBoxActivity + // + this.textBoxActivity.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxActivity.Location = new System.Drawing.Point(13, 109); + this.textBoxActivity.Multiline = true; + this.textBoxActivity.Name = "textBoxActivity"; + this.textBoxActivity.ReadOnly = true; + this.textBoxActivity.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.textBoxActivity.Size = new System.Drawing.Size(560, 339); + this.textBoxActivity.TabIndex = 4; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(13, 29); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(50, 13); + this.label1.TabIndex = 5; + this.label1.Text = "Package"; + // + // label2 + // + this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(257, 29); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(42, 13); + this.label2.TabIndex = 6; + this.label2.Text = "Version"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(12, 90); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(41, 13); + this.label3.TabIndex = 7; + this.label3.Text = "Activity"; + // + // checkBoxPrerelease + // + this.checkBoxPrerelease.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.checkBoxPrerelease.AutoSize = true; + this.checkBoxPrerelease.Location = new System.Drawing.Point(412, 48); + this.checkBoxPrerelease.Name = "checkBoxPrerelease"; + this.checkBoxPrerelease.Size = new System.Drawing.Size(76, 17); + this.checkBoxPrerelease.TabIndex = 8; + this.checkBoxPrerelease.Text = "Prerelease"; + this.checkBoxPrerelease.UseVisualStyleBackColor = true; + // + // MainForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(584, 461); + this.Controls.Add(this.checkBoxPrerelease); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.textBoxActivity); + this.Controls.Add(this.textBoxVersion); + this.Controls.Add(this.textBoxPackage); + this.Controls.Add(this.btnStop); + this.Controls.Add(this.btnStart); + this.MinimumSize = new System.Drawing.Size(600, 500); + this.Name = "MainForm"; + this.Text = "NuGet Dependency Scraper"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button btnStart; + private System.Windows.Forms.Button btnStop; + private System.Windows.Forms.TextBox textBoxPackage; + private System.Windows.Forms.TextBox textBoxVersion; + private System.Windows.Forms.TextBox textBoxActivity; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.CheckBox checkBoxPrerelease; + } +} + diff --git a/NugetDependencyDownloader/MainForm.cs b/NugetDependencyDownloader/MainForm.cs new file mode 100644 index 0000000..c11f17d --- /dev/null +++ b/NugetDependencyDownloader/MainForm.cs @@ -0,0 +1,204 @@ +using System; +using System.ComponentModel; +using System.Data; +using System.IO; +using System.Linq; +using System.Net; +using System.Windows.Forms; +using NuGet; + +namespace NuGetDependencyDownloader +{ + public partial class MainForm : Form + { + delegate void SetStopCallback(); + + private bool StopRequested { get { return !btnStop.Enabled; } } + + public MainForm() + { + InitializeComponent(); + } + + private void btnStart_Click(object sender, EventArgs e) + { + btnStart.Enabled = false; + btnStop.Enabled = true; + + LaunchThread(); + } + + private void btnStop_Click(object sender, EventArgs e) + { + EndWork(); + } + private void btnStop_EnabledChanged(object sender, EventArgs e) + { + if (btnStop.Enabled == false) + { + btnStart.Enabled = true; + } + } + + private void LaunchThread() + { + BackgroundWorker worker = new BackgroundWorker(); + worker.DoWork += new DoWorkEventHandler(bgWorker_DoWork); + worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted); + worker.RunWorkerAsync(); + } + + void bgWorker_DoWork(object sender, DoWorkEventArgs e) + { + ProcessPackage(); + } + + void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + EndWork(); + } + + private void EndWork() + { + // Shut off stop button in a thread safe way + if (btnStop.InvokeRequired) + { + SetStopCallback d = new SetStopCallback(EndWork); + Invoke(d, new object[] { }); + } + else + { + btnStop.Enabled = false; + btnStart.Enabled = true; + } + } + + private void ProcessPackage() + { + CollectPackages(); + + if (StopRequested) + { + ShowConsole("Stopped."); + return; + } + + ShowConsole(string.Format("{0} packages to download.", Utility.Packages.Count)); + + DownloadPackages(); + + if (StopRequested) + { + ShowConsole("Stopped."); + return; + } + + ShowConsole("Done."); + } + + private void CollectPackages() + { + Utility.Packages.Clear(); + + IPackage package; + if (string.IsNullOrWhiteSpace(textBoxVersion.Text)) + { + package = Utility.GetLatestPackage(textBoxPackage.Text, checkBoxPrerelease.Checked); + } + else + { + var version = SemanticVersion.Parse(textBoxVersion.Text); + package = Utility.GetPackages(textBoxPackage.Text, checkBoxPrerelease.Checked) + .Where(o => o.Version == version) + .FirstOrDefault(); + } + + if (package == null) + { + ShowConsole("Package not found."); + return; + } + + Utility.Packages.Add(package); + ShowConsole(package.GetFullName()); + LoadDependencies(package); + } + + private void LoadDependencies(IPackage package) + { + if (package.DependencySets != null) + { + var dependencies = package.DependencySets + .SelectMany(o => o.Dependencies.Select(x => new Dependency { Id = x.Id, VersionSpec = x.VersionSpec })) + .ToList(); + + foreach (var dependency in dependencies) + { + if (StopRequested) + return; + + IQueryable packages = Utility.GetPackages(dependency.Id, checkBoxPrerelease.Checked); + IPackage depPackage = Utility.GetRangedPackageVersion(packages, dependency.VersionSpec); + ShowConsole(string.Format("{0} -> {1}", package.GetFullName(), depPackage.GetFullName())); + + if (!Utility.IsPackageKnown(depPackage)) + { + Utility.Packages.Add(depPackage); + LoadDependencies(depPackage); + } + } + } + } + + private void DownloadPackages() + { + if (!Directory.Exists("download")) + Directory.CreateDirectory("download"); + + foreach (var package in Utility.Packages) + { + if (StopRequested) + return; + + string fileName = string.Format("{0}.{1}.nupkg", package.Id.ToLower(), package.Version); + if (File.Exists("download\\" + fileName)) + { + ShowConsole(string.Format("{0} already downloaded.", fileName)); + continue; + } + + ShowConsole(string.Format("downloading {0}", fileName)); + using (var client = new WebClient()) + { + var dsp = (DataServicePackage)package; + client.DownloadFile(dsp.DownloadUrl, "download\\" + fileName); + } + } + } + + SlidingBuffer _consoleBuffer = new SlidingBuffer(1000); + + private void ShowConsole(string text) + { + Invoke(new MethodInvoker( + delegate + { + _consoleBuffer.Add(text); + + textBoxActivity.Lines = _consoleBuffer.ToArray(); + textBoxActivity.Focus(); + textBoxActivity.SelectionStart = textBoxActivity.Text.Length; + textBoxActivity.SelectionLength = 0; + textBoxActivity.ScrollToCaret(); + textBoxActivity.Refresh(); + } + )); + } + + private class Dependency + { + public string Id { get; set; } + public IVersionSpec VersionSpec { get; set; } + } + } +} diff --git a/NugetDependencyDownloader/MainForm.resx b/NugetDependencyDownloader/MainForm.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/NugetDependencyDownloader/MainForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/NugetDependencyDownloader/NuGetDependencyDownloader.csproj b/NugetDependencyDownloader/NuGetDependencyDownloader.csproj new file mode 100644 index 0000000..e72d267 --- /dev/null +++ b/NugetDependencyDownloader/NuGetDependencyDownloader.csproj @@ -0,0 +1,102 @@ + + + + + Debug + AnyCPU + {7C83BCC2-32F4-469C-8094-0DFDD68D7D34} + WinExe + Properties + NuGetDependencyDownloader + NuGetDependencyScraper + v4.5.2 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Microsoft.Web.Xdt.2.1.1\lib\net40\Microsoft.Web.XmlTransform.dll + True + + + ..\packages\NuGet.Core.2.12.0\lib\net40-Client\NuGet.Core.dll + True + + + + + + + + + + + + + + + + Form + + + MainForm.cs + + + + + + + MainForm.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + \ No newline at end of file diff --git a/NugetDependencyDownloader/Program.cs b/NugetDependencyDownloader/Program.cs new file mode 100644 index 0000000..1b6e354 --- /dev/null +++ b/NugetDependencyDownloader/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Windows.Forms; + +namespace NuGetDependencyDownloader +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainForm()); + } + } +} diff --git a/NugetDependencyDownloader/Properties/AssemblyInfo.cs b/NugetDependencyDownloader/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..3eb611a --- /dev/null +++ b/NugetDependencyDownloader/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("NugetDependencyScraper")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("NugetDependencyScraper")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("7c83bcc2-32f4-469c-8094-0dfdd68d7d34")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/NugetDependencyDownloader/Properties/Resources.Designer.cs b/NugetDependencyDownloader/Properties/Resources.Designer.cs new file mode 100644 index 0000000..773b410 --- /dev/null +++ b/NugetDependencyDownloader/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace NuGetDependencyDownloader.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("NuGetDependencyDownloader.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/NugetDependencyDownloader/Properties/Resources.resx b/NugetDependencyDownloader/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/NugetDependencyDownloader/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/NugetDependencyDownloader/Properties/Settings.Designer.cs b/NugetDependencyDownloader/Properties/Settings.Designer.cs new file mode 100644 index 0000000..4856756 --- /dev/null +++ b/NugetDependencyDownloader/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace NuGetDependencyDownloader.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/NugetDependencyDownloader/Properties/Settings.settings b/NugetDependencyDownloader/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/NugetDependencyDownloader/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/NugetDependencyDownloader/SlidingBuffer.cs b/NugetDependencyDownloader/SlidingBuffer.cs new file mode 100644 index 0000000..019ecc9 --- /dev/null +++ b/NugetDependencyDownloader/SlidingBuffer.cs @@ -0,0 +1,41 @@ +using System.Collections; +using System.Collections.Generic; + +namespace NuGetDependencyDownloader +{ + // Taken from http://stackoverflow.com/questions/6392516 + + public class SlidingBuffer : IEnumerable + { + private readonly Queue _queue; + private readonly int _maxCount; + + public SlidingBuffer(int maxCount) + { + _maxCount = maxCount; + _queue = new Queue(maxCount); + } + + public void Add(T item) + { + if (_queue.Count == _maxCount) + _queue.Dequeue(); + _queue.Enqueue(item); + } + + public IEnumerator GetEnumerator() + { + return _queue.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public int Count + { + get { return _queue.Count; } + } + } +} diff --git a/NugetDependencyDownloader/Utility.cs b/NugetDependencyDownloader/Utility.cs new file mode 100644 index 0000000..dd6d406 --- /dev/null +++ b/NugetDependencyDownloader/Utility.cs @@ -0,0 +1,79 @@ +using System.Collections.Generic; +using System.Linq; +using NuGet; + +namespace NuGetDependencyDownloader +{ + // Good examples + // http://blog.nuget.org/20130520/Play-with-packages.html + + public class Utility + { + public static IList Packages { get; set; } = new List(); + + public static IQueryable GetPackages(string packageId, bool includePreRelease) + { + IPackageRepository repo = PackageRepositoryFactory.Default.CreateRepository("https://packages.nuget.org/api/v2"); + IQueryable packages = repo.FindPackagesById(packageId).AsQueryable(); + + if (!includePreRelease) + { + packages = packages.Where(item => (item.IsReleaseVersion() == true)); + } + + return packages; + } + + public static IPackage GetLatestPackage(string packageId, bool includePrerelease) + { + IQueryable packages = Utility.GetPackages(packageId, includePrerelease); + + if (!includePrerelease) + { + packages = packages + .Where(item => item.IsReleaseVersion() == true) + .Where(o => o.IsLatestVersion); + } + + var latest = packages.OrderByDescending(o => o.Version).FirstOrDefault(); + + return latest; + } + + public static IPackage GetRangedPackageVersion(IQueryable packages, IVersionSpec versionSpec) + { + if (versionSpec.MinVersion != null) + { + if (versionSpec.IsMinInclusive) + { + packages = packages.Where(o => o.Version >= versionSpec.MinVersion); + } + else + { + packages = packages.Where(o => o.Version > versionSpec.MinVersion); + } + } + + if (versionSpec.MaxVersion != null) + { + if (versionSpec.IsMaxInclusive) + { + packages = packages.Where(o => o.Version <= versionSpec.MaxVersion); + } + else + { + packages = packages.Where(o => o.Version < versionSpec.MaxVersion); + } + } + + return packages + .OrderByDescending(o => o.Version) + .FirstOrDefault(); + } + + public static bool IsPackageKnown(IPackage package) + { + return Packages.Any(o => o.Title == package.Title && o.Version == package.Version); + } + } +} diff --git a/NugetDependencyDownloader/packages.config b/NugetDependencyDownloader/packages.config new file mode 100644 index 0000000..4eb1f4b --- /dev/null +++ b/NugetDependencyDownloader/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file