Add dotnet-archive application
This commit is contained in:
parent
4949cedcc2
commit
8db7c1c4fb
2 changed files with 174 additions and 0 deletions
151
src/dotnet-archive/Program.cs
Normal file
151
src/dotnet-archive/Program.cs
Normal file
|
@ -0,0 +1,151 @@
|
|||
using Microsoft.DotNet.Cli.CommandLine;
|
||||
//using Microsoft.DotNet.Cli.Utils;
|
||||
using Microsoft.DotNet.Archive;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Microsoft.DotNet.Tools.Archive
|
||||
{
|
||||
|
||||
public partial class ArchiveCommand
|
||||
{
|
||||
public static int Main(string[] args)
|
||||
{
|
||||
//DebugHelper.HandleDebugSwitch(ref args);
|
||||
|
||||
var app = new CommandLineApplication();
|
||||
app.Name = "archive";
|
||||
app.FullName = ".NET archiver";
|
||||
app.Description = "Archives and expands sets of files";
|
||||
app.HelpOption("-h|--help");
|
||||
|
||||
var extract = app.Option("-x|--extract <outputDirectory>", "Directory to extract to", CommandOptionType.SingleValue);
|
||||
var archiveFile = app.Option("-a|--archive <file>", "Archive to operate on", CommandOptionType.SingleValue);
|
||||
var externals = app.Option("--external <external>...", "External files and directories to consider for extraction", CommandOptionType.MultipleValue);
|
||||
var sources = app.Argument("<sources>...", "Files & directory to include in the archive", multipleValues:true);
|
||||
|
||||
var dotnetNew = new ArchiveCommand();
|
||||
app.OnExecute(() => {
|
||||
|
||||
if (extract.HasValue() && sources.Values.Any())
|
||||
{
|
||||
Console.WriteLine("Extract '-x' can only be specified when no '<sources>' are specified to add to the archive.");
|
||||
return 1;
|
||||
}
|
||||
else if (!extract.HasValue() && !sources.Values.Any())
|
||||
{
|
||||
Console.WriteLine("Either extract '-x' or '<sources>' must be specified.");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (!archiveFile.HasValue())
|
||||
{
|
||||
Console.WriteLine("Archive '-a' must be specified.");
|
||||
return 1;
|
||||
}
|
||||
|
||||
var progress = new ConsoleProgressReport();
|
||||
|
||||
var archive = new IndexedArchive();
|
||||
foreach (var external in externals.Values)
|
||||
{
|
||||
if (Directory.Exists(external))
|
||||
{
|
||||
archive.AddExternalDirectory(external);
|
||||
}
|
||||
else
|
||||
{
|
||||
archive.AddExternalFile(external);
|
||||
}
|
||||
}
|
||||
|
||||
if (sources.Values.Any())
|
||||
{
|
||||
foreach(var source in sources.Values)
|
||||
{
|
||||
if (Directory.Exists(source))
|
||||
{
|
||||
archive.AddDirectory(source, progress);
|
||||
}
|
||||
else
|
||||
{
|
||||
archive.AddFile(source, Path.GetFileName(source));
|
||||
}
|
||||
}
|
||||
|
||||
archive.Save(archiveFile.Value(), progress);
|
||||
}
|
||||
else // extract.HasValue()
|
||||
{
|
||||
archive.Extract(archiveFile.Value(), extract.Value(), progress);
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
});
|
||||
|
||||
try
|
||||
{
|
||||
return app.Execute(args);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
#if DEBUG
|
||||
//Reporter.Error.WriteLine(ex.ToString());
|
||||
Console.WriteLine(ex.ToString());
|
||||
#else
|
||||
// Reporter.Error.WriteLine(ex.Message);
|
||||
Console.WriteLine(ex.Message);
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
public class ConsoleProgressReport : IProgress<ProgressReport>
|
||||
{
|
||||
string currentPhase;
|
||||
int lastLineLength = 0;
|
||||
double lastProgress = -1;
|
||||
Stopwatch stopwatch;
|
||||
|
||||
public void Report(ProgressReport value)
|
||||
{
|
||||
long progress = (long)(100 * ((double)value.Ticks / value.Total));
|
||||
|
||||
if (progress == lastProgress && value.Phase == currentPhase)
|
||||
{
|
||||
return;
|
||||
}
|
||||
lastProgress = progress;
|
||||
|
||||
lock (this)
|
||||
{
|
||||
string line = $"{value.Phase} {progress}%";
|
||||
if (value.Phase == currentPhase)
|
||||
{
|
||||
Console.Write(new string('\b', lastLineLength));
|
||||
|
||||
Console.Write(line);
|
||||
lastLineLength = line.Length;
|
||||
|
||||
if (progress == 100)
|
||||
{
|
||||
Console.WriteLine($" {stopwatch.ElapsedMilliseconds} ms");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.Write(line);
|
||||
currentPhase = value.Phase;
|
||||
lastLineLength = line.Length;
|
||||
stopwatch = Stopwatch.StartNew();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
23
src/dotnet-archive/project.json
Normal file
23
src/dotnet-archive/project.json
Normal file
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"buildOptions": {
|
||||
"emitEntryPoint": true,
|
||||
"compile": {
|
||||
"include": [
|
||||
"**/*.cs",
|
||||
"../dotnet/CommandLine/*.cs"
|
||||
]
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"Microsoft.DotNet.Archive": {
|
||||
"target": "project"
|
||||
},
|
||||
"Microsoft.NETCore.App": {
|
||||
"type": "platform",
|
||||
"version": "1.0.0-rc3-004391"
|
||||
}
|
||||
},
|
||||
"frameworks": {
|
||||
"netcoreapp1.0": {}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue