ln.build/ln.build/pipeline/ReleaseCommand.cs

60 lines
2.3 KiB
C#

using System;
using System.IO;
using Jint.Native.Function;
using ln.build.repositories;
using ln.logging;
namespace ln.build.pipeline
{
public class ReleaseCommand : StageCommand
{
public string[] Arguments { get; }
public ReleaseCommand(string args) :base("RELEASE")
{
Arguments = args.Split();
}
public override void Run(Stage stage)
{
if (stage.CommandEnvironment.Get("REPO_EVENT","").Equals("release"))
{
Repository repository = stage.CommandEnvironment.CIJob?.Repository;
if (repository != null)
{
Release release = repository.GetRelease(int.Parse(stage.CommandEnvironment.Get("RELEASE_ID")));
foreach (string arg in Arguments)
{
string localPath, remoteFileName;
int ie = arg.IndexOf('=');
if (ie == -1)
{
localPath = Path.Combine(stage.CommandEnvironment.WorkingDirectory, arg);
remoteFileName = Path.GetFileName(arg);
} else {
localPath = Path.Combine(stage.CommandEnvironment.WorkingDirectory, arg.Substring(0, ie));
remoteFileName = arg.Substring(ie + 1);
}
stage.CommandEnvironment.Logger.Log(LogLevel.INFO, "Adding {0} to release as {1}", localPath, remoteFileName);
Attachment attachment = release.CreateOrReplaceAttachment( localPath, remoteFileName );
// Cleanup attachments
foreach (Attachment b in release.GetAttachments())
{
if (!b.Equals(attachment) && b.Name.Equals(attachment.Name))
b.Delete();
}
}
} else {
stage.CommandEnvironment.Logger.Log(LogLevel.ERROR, "RELEASE: no repository interface found!");
throw new Exception("Respository needed!");
}
} else {
stage.CommandEnvironment.Logger.Log(LogLevel.INFO, "RELEASE: build is no release build. Ignoring.");
}
}
}
}