static void ExtractFromMSCab(string path, MiniYaml actionYaml, List<string> extractedFiles, Action<string> updateMessage)
        {
            var sourcePath = Path.Combine(path, actionYaml.Value);

            // Try as an absolute path
            if (!File.Exists(sourcePath))
                sourcePath = Platform.ResolvePath(actionYaml.Value);

            using (var source = File.OpenRead(sourcePath))
            {
                var reader = new MSCabCompression(source);
                foreach (var node in actionYaml.Nodes)
                {
                    var targetPath = Platform.ResolvePath(node.Key);

                    if (File.Exists(targetPath))
                    {
                        Log.Write("install", "Skipping installed file " + targetPath);
                        continue;
                    }

                    extractedFiles.Add(targetPath);
                    Directory.CreateDirectory(Path.GetDirectoryName(targetPath));
                    using (var target = File.OpenWrite(targetPath))
                    {
                        Log.Write("install", "Extracting {0} -> {1}".F(sourcePath, targetPath));
                        var displayFilename = Path.GetFileName(Path.GetFileName(targetPath));
                        Action<int> onProgress = percent => updateMessage("Extracting {0} ({1}%)".F(displayFilename, percent));
                        reader.ExtractFile(node.Value.Value, target, onProgress);
                    }
                }
            }
        }
 void IUtilityCommand.Run(Utility utility, string[] args)
 {
     var package = new MSCabCompression(File.OpenRead(args[1]));
     foreach (var file in package.Contents)
         Console.WriteLine("{0}", file);
 }