Skip to content

Commit

Permalink
Added more verbose logging and output to console
Browse files Browse the repository at this point in the history
  • Loading branch information
garrettpauls committed Dec 15, 2015
1 parent d223692 commit 280c486
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 35 deletions.
55 changes: 37 additions & 18 deletions VSGallery.AtomGenerator/FeedBuilder.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.ServiceModel.Syndication;
using System.Text;
using System.Xml;
Expand All @@ -12,36 +13,36 @@ namespace VSGallery.AtomGenerator
{
public sealed class FeedBuilder
{
public void WriteFeed(string feedFile, IEnumerable<IVsixPackage> packages)
public void WriteFeed(string feedFile, IEnumerable<IVsixPackage> packages, Logger log)
{
var rootDirectory = new Uri(Path.GetDirectoryName(feedFile) + "\\");

var imageRoot = Path.Combine(rootDirectory.AbsolutePath, "VSIXImages");
Directory.CreateDirectory(imageRoot);

var feed = _ConfigureFromExistingFeed(feedFile);
var feed = _ConfigureFromExistingFeed(feedFile, log);
feed.LastUpdatedTime = DateTimeOffset.Now;

_AddPackages(rootDirectory, imageRoot, packages, feed);
_WriteAtomFeed(feedFile, feed);
_AddPackages(rootDirectory, imageRoot, packages, feed, log);
_WriteAtomFeed(feedFile, feed, log);
}

private static void _AddPackages(Uri root, string imageRoot, IEnumerable<IVsixPackage> packages, SyndicationFeed feed)
private static void _AddPackages(Uri root, string imageRoot, IEnumerable<IVsixPackage> packages, SyndicationFeed feed, Logger log)
{
// See https://msdn.microsoft.com/en-us/library/hh266717.aspx

var items = new List<SyndicationItem>();
feed.Items = items;

foreach (var pkg in packages)
var orderedPackages = packages
.OrderBy(pkg => pkg.DisplayName)
.ThenBy(pkg => pkg.Id);

foreach (var pkg in orderedPackages)
{
var item = new SyndicationItem(
pkg.DisplayName,
pkg.Description,
new Uri(pkg.File),
pkg.Id,
new DateTimeOffset(File.GetLastWriteTimeUtc(pkg.File)));
item = new SyndicationItem();
log.Info($"Adding package {pkg.DisplayName} ({pkg.Id}) to feed");

var item = new SyndicationItem();
item.Id = pkg.Id;
item.Title = new TextSyndicationContent(pkg.DisplayName);
item.Summary = new TextSyndicationContent(pkg.Description);
Expand All @@ -50,7 +51,7 @@ private static void _AddPackages(Uri root, string imageRoot, IEnumerable<IVsixPa
item.Authors.Add(new SyndicationPerson { Name = pkg.Publisher });
item.Content = SyndicationContent.CreateUrlContent(root.MakeRelativeUri(new Uri(pkg.File)), "application/octet-stream");

_AddPreviewImages(root, imageRoot, item, pkg);
_AddPreviewImages(root, imageRoot, item, pkg, log);

var ns = XNamespace.Get("http://schemas.microsoft.com/developer/vsx-syndication-schema/2010");
var xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance");
Expand Down Expand Up @@ -80,30 +81,44 @@ private static void _AddPackages(Uri root, string imageRoot, IEnumerable<IVsixPa
}
}

private static void _AddPreviewImages(Uri root, string imageRoot, SyndicationItem item, IVsixPackage pkg)
private static void _AddPreviewImages(Uri root, string imageRoot, SyndicationItem item, IVsixPackage pkg, Logger log)
{
var icon = pkg.TrySaveIcon(imageRoot);
var preview = pkg.TrySavePreviewImage(imageRoot);

if (icon != null)
{
log.Info($"Extracted icon to {icon}");
item.Links.Add(new SyndicationLink(root.MakeRelativeUri(icon), "icon", "", "", 0));
}
else
{
log.Info("No icon found");
}

if (preview != null)
{
log.Info($"Extracted preview image to {preview}");
item.Links.Add(new SyndicationLink(root.MakeRelativeUri(preview), "previewimage", "", "", 0));
}
else
{
log.Info("No preview image found");
}
}

private static SyndicationFeed _ConfigureFromExistingFeed(string file)
private static SyndicationFeed _ConfigureFromExistingFeed(string file, Logger log)
{
try
{
using (var stream = File.OpenRead(file))
using (var reader = XmlReader.Create(stream))
{
return SyndicationFeed.Load(reader);
var feed = SyndicationFeed.Load(reader);

log.Info($"Configured base feed information from {file}");

return feed;
}
}
catch
Expand All @@ -112,11 +127,14 @@ private static SyndicationFeed _ConfigureFromExistingFeed(string file)
feed.Id = Guid.NewGuid().ToString("D").ToUpper();
feed.Title = new TextSyndicationContent("");
feed.Generator = "VSGallery.AtomGenerator";

log.Info($"Existing feed file {file} not found, generating a new feed id");

return feed;
}
}

private static void _WriteAtomFeed(string file, SyndicationFeed feed)
private static void _WriteAtomFeed(string file, SyndicationFeed feed, Logger log)
{
var sb = new StringBuilder();
using (var stringStream = new StringWriter(sb))
Expand All @@ -126,6 +144,7 @@ private static void _WriteAtomFeed(string file, SyndicationFeed feed)
formatter.WriteTo(writer);
}

log.Info($"Writing updated feed to {file}");
File.WriteAllText(file, XElement.Parse(sb.ToString()).ToString());
}
}
Expand Down
22 changes: 16 additions & 6 deletions VSGallery.AtomGenerator/Logger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,29 +30,39 @@ public void Error(string message)

public void Error(string message, Exception ex)
{
_WriteLine($"ERROR: {message}");
if (ex != null)
{
_WriteLine($@"
message += $@"
--------------------------------------------------
{_ToString(ex)}
--------------------------------------------------");
--------------------------------------------------";
}

_WriteLine(true, message);
}

public void Info(string message)
{
_WriteLine($"INFO: {message}");
_WriteLine(false, message);
}

private static string _ToString(Exception exception)
{
return exception.ToString();
}

private void _WriteLine(string value)
private void _WriteLine(bool isError, string value)
{
File.AppendAllText(mFile, value + "\r\n");
var color = Console.ForegroundColor;
if (isError)
{
Console.ForegroundColor = ConsoleColor.DarkRed;
}
Console.WriteLine(value);
Console.ForegroundColor = color;

var header = isError ? "ERROR" : "INFO";
File.AppendAllText(mFile, $"{header}: {value}\r\n");
}
}
}
33 changes: 24 additions & 9 deletions VSGallery.AtomGenerator/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,33 +28,48 @@ public static void Main(string[] args)
}
catch (Exception ex)
{
log.Error("Application level exception", ex);
log.Error("Unhandled exception", ex);
}
}

private static void _GenerateAtomFeed(string rootDirectory, Logger log)
{
log.Info("Loading vsix files");
var packageFactory = new VsixPackageFactory();
var packages = Directory
.EnumerateFiles(rootDirectory, "*.vsix", SearchOption.AllDirectories)
.Select(file => packageFactory.LoadFromFile(file, log))
.Do(result => result.IfError(log.Error))
.TakeSuccess();
.TakeSuccess()
.ToArray();

packages = _OnlyMostRecentVersions(packages);
packages = _OnlyMostRecentVersions(packages, log).ToArray();

var feedFile = Path.Combine(rootDirectory, "atom.xml");

var feedBuilder = new FeedBuilder();
feedBuilder.WriteFeed(feedFile, packages);
feedBuilder.WriteFeed(feedFile, packages, log);

log.Info("Feed generated successfully");
}

private static IEnumerable<IVsixPackage> _OnlyMostRecentVersions(IEnumerable<IVsixPackage> packages)
private static IEnumerable<IVsixPackage> _OnlyMostRecentVersions(IEnumerable<IVsixPackage> packages, Logger log)
{
return packages
.GroupBy(pkg => pkg.Id)
.Select(grp => grp.OrderByDescending(pkg => pkg.Version, new VersionComparer())
.First());
var groups = packages.GroupBy(pkg => pkg.Id);
var versionComparer = new VersionComparer();

foreach (var grp in groups)
{
if (grp.Count() > 1)
{
var package = grp.OrderByDescending(pkg => pkg.Version, versionComparer).First();
log.Info($"Multiple versions of {grp.Key} detected, using version {package.Version}");
}
else
{
yield return grp.First();
}
}
}

private static void _ShowUsage()
Expand Down
8 changes: 6 additions & 2 deletions VSGallery.AtomGenerator/Vsix/VsixPackageFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +28,20 @@ public ErrorSuccess<IVsixPackage, string> LoadFromFile(string file, Logger log)
}
}

private ErrorSuccess<IVsixPackage, string> _CreateFromZipManifest(string file, ZipArchiveEntry manifestEntry, ErrorSuccessFactory<IVsixPackage, string> ef)
private ErrorSuccess<IVsixPackage, string> _CreateFromZipManifest(string file, ZipArchiveEntry manifestEntry, Logger log, ErrorSuccessFactory<IVsixPackage, string> ef)
{
var packageManifest = _TryGetPackageManifest(manifestEntry);
var vsixManifest = _TryGetVsixManifest(manifestEntry);

if (packageManifest != null)
{
log.Info("Loaded PackageManifest based manifest");
return ef.Success(new VsixWithPackageManifest(file, packageManifest));
}

if (vsixManifest != null)
{
log.Info("Loaded Vsix based manifest");
return ef.Success(new VsixWithVsixManifest(file, vsixManifest));
}

Expand All @@ -48,6 +50,8 @@ private ErrorSuccess<IVsixPackage, string> _CreateFromZipManifest(string file, Z

private ErrorSuccess<IVsixPackage, string> _LoadFromFile(string file, Logger log, ErrorSuccessFactory<IVsixPackage, string> ef)
{
log.Info($"Reading {file}");

ZipArchive zipFile;
try
{
Expand All @@ -67,7 +71,7 @@ private ErrorSuccess<IVsixPackage, string> _LoadFromFile(string file, Logger log
return ef.Error($"{file} does not contain a {Entry.Manifest} entry.");
}

return _CreateFromZipManifest(file, manifestEntry, ef);
return _CreateFromZipManifest(file, manifestEntry, log, ef);
}
}

Expand Down

0 comments on commit 280c486

Please sign in to comment.