Created
September 22, 2017 16:03
-
-
Save Xiaoy312/dac4bdd89f2ad7da390f8d20de01b14f to your computer and use it in GitHub Desktop.
Manage LinqPad packages version
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<Query Kind="Program"> | |
<Reference><RuntimeDirectory>\System.IO.Compression.dll</Reference> | |
<Reference><RuntimeDirectory>\System.IO.Compression.FileSystem.dll</Reference> | |
<Reference><RuntimeDirectory>\WPF\PresentationFramework.dll</Reference> | |
<Reference><RuntimeDirectory>\System.Xaml.dll</Reference> | |
<Reference><RuntimeDirectory>\wpf\WindowsBase.dll</Reference> | |
<Reference><RuntimeDirectory>\wpf\PresentationCore.dll</Reference> | |
<Reference><RuntimeDirectory>\System.Configuration.dll</Reference> | |
<Reference><RuntimeDirectory>\wpf\UIAutomationProvider.dll</Reference> | |
<Reference><RuntimeDirectory>\wpf\UIAutomationTypes.dll</Reference> | |
<Reference><RuntimeDirectory>\wpf\ReachFramework.dll</Reference> | |
<Reference><RuntimeDirectory>\wpf\PresentationUI.dll</Reference> | |
<Reference><RuntimeDirectory>\wpf\System.Printing.dll</Reference> | |
<Reference><RuntimeDirectory>\Accessibility.dll</Reference> | |
<Reference><RuntimeDirectory>\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"); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<Query Kind="Program"> | |
<Reference><RuntimeDirectory>\System.IO.Compression.dll</Reference> | |
<Reference><RuntimeDirectory>\System.IO.Compression.FileSystem.dll</Reference> | |
<Reference><RuntimeDirectory>\WPF\PresentationFramework.dll</Reference> | |
<Reference><RuntimeDirectory>\System.Xaml.dll</Reference> | |
<Reference><RuntimeDirectory>\wpf\WindowsBase.dll</Reference> | |
<Reference><RuntimeDirectory>\wpf\PresentationCore.dll</Reference> | |
<Reference><RuntimeDirectory>\System.Configuration.dll</Reference> | |
<Reference><RuntimeDirectory>\wpf\UIAutomationProvider.dll</Reference> | |
<Reference><RuntimeDirectory>\wpf\UIAutomationTypes.dll</Reference> | |
<Reference><RuntimeDirectory>\wpf\ReachFramework.dll</Reference> | |
<Reference><RuntimeDirectory>\wpf\PresentationUI.dll</Reference> | |
<Reference><RuntimeDirectory>\wpf\System.Printing.dll</Reference> | |
<Reference><RuntimeDirectory>\Accessibility.dll</Reference> | |
<Reference><RuntimeDirectory>\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