Skip to content

Instantly share code, notes, and snippets.

@Xiaoy312
Created September 22, 2017 16:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Xiaoy312/dac4bdd89f2ad7da390f8d20de01b14f to your computer and use it in GitHub Desktop.
Save Xiaoy312/dac4bdd89f2ad7da390f8d20de01b14f to your computer and use it in GitHub Desktop.
Manage LinqPad packages version
<Query Kind="Program">
<Reference>&lt;RuntimeDirectory&gt;\System.IO.Compression.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\System.IO.Compression.FileSystem.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\WPF\PresentationFramework.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\System.Xaml.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\wpf\WindowsBase.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\wpf\PresentationCore.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\System.Configuration.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\wpf\UIAutomationProvider.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\wpf\UIAutomationTypes.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\wpf\ReachFramework.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\wpf\PresentationUI.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\wpf\System.Printing.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\Accessibility.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\System.Deployment.dll</Reference>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Windows.Forms</Namespace>
<Namespace>Microsoft.Win32</Namespace>
</Query>
const string PackageArchiveFilter = "Zip Archives (*.zip)|*.zip";
const string NuGetCacheStore = @"O:\partage\CARA\STATISTIQUES\Xiaotian Gu\Code\Linq\Library\NuGet Cache";
readonly string NugetCacheDirectory = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
"LINQPad", "NuGet");
void Main()
{
Util.AutoScrollResults = false;
new Hyperlinq(NugetCacheDirectory).Dump();
CreateImportCommand().Dump();
if (!Directory.Exists(NugetCacheDirectory))
Directory.CreateDirectory(NugetCacheDirectory);
new DirectoryInfo(NugetCacheDirectory).GetDirectories()
.Select(x => new
{
Package = x.Name,
Version = GetPackageVersion(x),
Delete = CreateDeleteCommand(x),
Archive = CreateArchiveCommand(x)
})
.Dump("Local Nuget Cache");
}
// Define other methods and classes here
string GetPackageVersion(DirectoryInfo directory)
{
try
{
return directory.GetFiles("LINQPadPackageInfo.xml")
.Select(x => XElement.Load(x.FullName))
.Select(x => x.Element("MainPackageVersion").Value)
.FirstOrDefault();
}
catch (Exception)
{
return null;
}
}
Hyperlinq CreateDeleteCommand(DirectoryInfo directory)
{
return new Hyperlinq(() =>
{
try
{
if (!ConfirmAction(string.Format("Do you want to delete package `{0}`", directory.Name)))
return;
directory.Delete(true);
Console.WriteLine("Packge `{0}` has been succcessfully deleted.", directory.Name);
}
catch (UnauthorizedAccessException e)
{
DumpException(e,
Util.Metatext("Close other scripts and try again. Alternatively, close LINQPad and try again.")
);
}
catch (Exception e)
{
DumpException(e);
}
}, "Delete");
}
Hyperlinq CreateArchiveCommand(DirectoryInfo directory)
{
return new Hyperlinq(() =>
{
try
{
var version = GetPackageVersion(directory);
var name = directory.Name + (version == null? null : "." + version);
var dialog = new SaveFileDialog()
{
InitialDirectory = NugetCacheDirectory,
FileName = name,
Filter = PackageArchiveFilter
};
if (dialog.ShowDialog() != true)
{
Console.WriteLine("Operation Canceled.");
return;
}
ZipFile.CreateFromDirectory(directory.FullName, dialog.FileName);
new Hyperlinq(dialog.FileName).Dump("Package archive has been successfully created:");
}
catch (Exception e)
{
DumpException(e);
}
}, "Export");
}
Hyperlinq CreateImportCommand()
{
return new Hyperlinq(() =>
{
try
{
var dialog = new OpenFileDialog()
{
InitialDirectory = NuGetCacheStore,
Filter = PackageArchiveFilter,
Multiselect = true,
};
if (dialog.ShowDialog() != true)
{
Console.WriteLine("Operation Canceled.");
return;
}
foreach (var package in dialog.FileNames)
{
using (var archive = ZipFile.OpenRead(package))
{
var entry = archive.GetEntry("LINQPadPackageInfo.xml");
if (entry == null)
throw new FileNotFoundException("LINQPadPackageInfo.xml");
string destination;
using (var stream = entry.Open())
{
var info = XElement.Load(stream);
var version = info.Element("MainPackageVersion").Value;
var name = Regex.Replace(
Path.GetFileName(package),
"(." + version +")?(.zip)?$",
string.Empty);
destination = Path.Combine(NugetCacheDirectory, name);
if (Directory.Exists(destination))
{
var oldVersion = GetPackageVersion(new DirectoryInfo(destination));
var prompt = string.Format("Replace exist package?(y/n) [{0}->{1}]", oldVersion, version);
if (oldVersion != null && Util.ReadLine(prompt).Trim().ToUpper() != "Y")
{
Console.WriteLine("Operation canceled.");
return;
}
Directory.Delete(destination, true);
}
}
archive.ExtractToDirectory(destination);
Console.WriteLine("Successfully imported package: " + Path.GetFileNameWithoutExtension(package));
}
}
}
catch (Exception e)
{
DumpException(e);
}
}, "Click here to import/update package");
}
bool ConfirmAction(string prompt)
{
var random = new Random();
var a = random.Next(1, 10);
var b = random.Next(1, 10);
var answer = Util.ReadLine(string.Format("{0}? {1} + {2} =", prompt, a, b));
if (string.IsNullOrWhiteSpace(answer))
{
Console.WriteLine("Operation Canceled.");
return false;
}
int value;
if (!int.TryParse(answer, out value) || value != a + b)
{
Console.WriteLine("Invalid answer! Operation Canceled.");
return false;
}
return true;
}
void DumpException(Exception e, params object[] infos)
{
Util.VerticalRun
(
infos.Concat(new object[]
{
e.Message,
Util.OnDemand(e.GetType().Name, () => e)
})
).Dump("An error has occured");
}
<Query Kind="Program">
<Reference>&lt;RuntimeDirectory&gt;\System.IO.Compression.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\System.IO.Compression.FileSystem.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\WPF\PresentationFramework.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\System.Xaml.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\wpf\WindowsBase.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\wpf\PresentationCore.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\System.Configuration.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\wpf\UIAutomationProvider.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\wpf\UIAutomationTypes.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\wpf\ReachFramework.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\wpf\PresentationUI.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\wpf\System.Printing.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\Accessibility.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\System.Deployment.dll</Reference>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Windows.Forms</Namespace>
<Namespace>Microsoft.Win32</Namespace>
</Query>
const string PackageArchiveFilter = "Zip Archives (*.zip)|*.zip";
const string NuGetCacheStore = @"O:\partage\CARA\STATISTIQUES\Xiaotian Gu\Code\Linq\Library\NuGet Cache";
readonly string NugetCacheDirectory = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
"LINQPad", "NuGet");
void Main()
{
CleanupCacheFolder();
InstallDefaultPackages();
}
// Define other methods and classes here
void CleanupCacheFolder()
{
if (!Directory.Exists(NugetCacheDirectory))
{
Console.WriteLine("Creating NuGet cache directory: " + NugetCacheDirectory);
Directory.CreateDirectory(NugetCacheDirectory);
return;
}
Console.WriteLine("Deleting cached NuGet packages...");
foreach(var directory in new DirectoryInfo(NugetCacheDirectory).GetDirectories())
{
Util.Metatext("Removed: " + directory.Name).Dump();
directory.Delete(true);
}
}
void InstallDefaultPackages()
{
foreach (var package in Directory.GetFiles(NuGetCacheStore, "*.zip"))
{
InstallPackage(package);
}
}
void InstallPackage(string package)
{
using (var archive = ZipFile.OpenRead(package))
{
var entry = archive.GetEntry("LINQPadPackageInfo.xml");
if (entry == null)
throw new FileNotFoundException("Couldn't find `LINQPadPackageInfo.xml` in the package: " + package);
string destination;
using (var stream = entry.Open())
{
var info = XElement.Load(stream);
var version = info.Element("MainPackageVersion").Value;
var name = Regex.Replace(
Path.GetFileName(package),
"(." + version +")?(.zip)?$",
string.Empty);
destination = Path.Combine(NugetCacheDirectory, name);
}
archive.ExtractToDirectory(destination);
Console.WriteLine("Successfully imported package: " + Path.GetFileNameWithoutExtension(package));
}
}
string GetPackageVersion(DirectoryInfo directory)
{
try
{
return directory.GetFiles("LINQPadPackageInfo.xml")
.Select(x => XElement.Load(x.FullName))
.Select(x => x.Element("MainPackageVersion").Value)
.FirstOrDefault();
}
catch (Exception)
{
return null;
}
}
Hyperlinq CreateDeleteCommand(DirectoryInfo directory)
{
return new Hyperlinq(() =>
{
try
{
if (!ConfirmAction(string.Format("Do you want to delete package `{0}`", directory.Name)))
return;
directory.Delete(true);
Console.WriteLine("Packge `{0}` has been succcessfully deleted.", directory.Name);
}
catch (UnauthorizedAccessException e)
{
DumpException(e,
Util.Metatext("Close other scripts and try again. Alternatively, close LINQPad and try again.")
);
}
catch (Exception e)
{
DumpException(e);
}
}, "Delete");
}
Hyperlinq CreateArchiveCommand(DirectoryInfo directory)
{
return new Hyperlinq(() =>
{
try
{
var version = GetPackageVersion(directory);
var name = directory.Name + (version == null? null : "." + version);
var dialog = new SaveFileDialog()
{
InitialDirectory = NugetCacheDirectory,
FileName = name,
Filter = PackageArchiveFilter
};
if (dialog.ShowDialog() != true)
{
Console.WriteLine("Operation Canceled.");
return;
}
ZipFile.CreateFromDirectory(directory.FullName, dialog.FileName);
new Hyperlinq(dialog.FileName).Dump("Package archive has been successfully created:");
}
catch (Exception e)
{
DumpException(e);
}
}, "Export");
}
Hyperlinq CreateImportCommand()
{
return new Hyperlinq(() =>
{
try
{
var dialog = new OpenFileDialog()
{
InitialDirectory = NuGetCacheStore,
Filter = PackageArchiveFilter,
Multiselect = true,
};
if (dialog.ShowDialog() != true)
{
Console.WriteLine("Operation Canceled.");
return;
}
foreach (var package in dialog.FileNames)
{
using (var archive = ZipFile.OpenRead(package))
{
var entry = archive.GetEntry("LINQPadPackageInfo.xml");
if (entry == null)
throw new FileNotFoundException("LINQPadPackageInfo.xml");
string destination;
using (var stream = entry.Open())
{
var info = XElement.Load(stream);
var version = info.Element("MainPackageVersion").Value;
var name = Regex.Replace(
Path.GetFileName(package),
"(." + version +")?(.zip)?$",
string.Empty);
destination = Path.Combine(NugetCacheDirectory, name);
if (Directory.Exists(destination))
{
var oldVersion = GetPackageVersion(new DirectoryInfo(destination));
var prompt = string.Format("Replace exist package?(y/n) [{0}->{1}]", oldVersion, version);
if (oldVersion != null && Util.ReadLine(prompt).Trim().ToUpper() != "Y")
{
Console.WriteLine("Operation canceled.");
return;
}
Directory.Delete(destination, true);
}
}
archive.ExtractToDirectory(destination);
Console.WriteLine("Successfully imported package: " + Path.GetFileNameWithoutExtension(package));
}
}
}
catch (Exception e)
{
DumpException(e);
}
}, "Click here to import/update package");
}
Hyperlinq CreateRestoreCommand()
{
return new Hyperlinq(() =>
{
try
{
}
catch (Exception e)
{
DumpException(e);
}
}, "Restore all packages");
}
bool ConfirmAction(string prompt)
{
var random = new Random();
var a = random.Next(1, 10);
var b = random.Next(1, 10);
var answer = Util.ReadLine(string.Format("{0}? {1} + {2} =", prompt, a, b));
if (string.IsNullOrWhiteSpace(answer))
{
Console.WriteLine("Operation Canceled.");
return false;
}
int value;
if (!int.TryParse(answer, out value) || value != a + b)
{
Console.WriteLine("Invalid answer! Operation Canceled.");
return false;
}
return true;
}
void DumpException(Exception e, params object[] infos)
{
Util.VerticalRun
(
infos.Concat(new object[]
{
e.Message,
Util.OnDemand(e.GetType().Name, () => e)
})
).Dump("An error has occured");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment