/// <summary> /// /// </summary> /// <param name="fullPath">something like: "C:\Users\mingo\Downloads\Compressed\project_folder\project_folder\model\grid\room.pts"</param> /// <param name="relativePath">"model\grid\room.pts"</param> public static async Task <bool> UploadArtifaceAsync(ProjectDto project, string fullPath, string relativePath) { var filePath = fullPath; var fileRelativePath = "project_folder" + relativePath.Replace('\\', '/'); var api = new ArtifactsApi(); var artf = await api.CreateArtifactAsync(project.Owner.Name, project.Name, new KeyRequest(fileRelativePath)); var url = artf.Url; //Use RestSharp RestClient restClient = new RestClient(url); RestRequest restRequest = new RestRequest(); restRequest.RequestFormat = DataFormat.Json; restRequest.Method = Method.POST; restRequest.AddHeader("Content-Type", "multipart/form-data"); restRequest.AddParameter("AWSAccessKeyId", artf.Fields["AWSAccessKeyId"]); restRequest.AddParameter("policy", artf.Fields["policy"]); restRequest.AddParameter("signature", artf.Fields["signature"]); restRequest.AddParameter("key", artf.Fields["key"]); restRequest.AddFile("file", filePath); var response = restClient.Execute(restRequest); if (response.StatusCode == HttpStatusCode.NoContent) { Console.WriteLine($"Done uploading: {relativePath}"); return(true); } return(false); }
public static async Task <string> DownloadArtifact(Project proj, FileMeta file, string saveAsFolder, Action <int> reportProgressAction = default) { var api = new ArtifactsApi(); var task = api.DownloadArtifactAsync(proj.Owner.Name, proj.Name, file.Key); var result = await task; var downlaodTask = DownloadUrlAsync(result.ToString(), saveAsFolder, reportProgressAction); var saved = await downlaodTask; return(saved); }
public static async Task <bool> UploadDirectoryAsync(Project project, string directory, Action <int> reportProgressAction = default, CancellationToken cancellationToken = default) { Helper.Logger.Information($"Uploading a directory {directory}"); Helper.Logger.Information($"Timeout: {Configuration.Default.Timeout}"); var files = Directory.GetFiles(directory, "*", SearchOption.AllDirectories); var api = new ArtifactsApi(); var tasks = files.Select(_ => UploadArtifaceAsync(api, project, _, _.Replace(directory, ""))).ToList(); var total = files.Count(); Helper.Logger.Information($"UploadDirectoryAsync: Uploading {total} assets for project {project.Name}"); var finishedPercent = 0; reportProgressAction?.Invoke(finishedPercent); while (tasks.Count() > 0) { // canceled by user if (cancellationToken.IsCancellationRequested) { Helper.Logger.Information($"Canceled uploading by user"); break; } var finishedTask = await Task.WhenAny(tasks); if (finishedTask.IsFaulted || finishedTask.Exception != null) { Helper.Logger.Error($"Upload exception: {finishedTask.Exception}"); throw finishedTask.Exception; } tasks.Remove(finishedTask); var unfinishedUploadTasksCount = tasks.Count(); finishedPercent = (int)((total - unfinishedUploadTasksCount) / (double)total * 100); reportProgressAction?.Invoke(finishedPercent); } Helper.Logger.Information($"UploadDirectoryAsync: Finished uploading assets for project {project.Name}"); // canceled by user if (cancellationToken.IsCancellationRequested) { return(false); } return(true); }
/// <summary> /// /// </summary> /// <param name="fullPath">something like: "C:\Users\mingo\Downloads\Compressed\project_folder\project_folder\model\grid\room.pts"</param> /// <param name="relativePath">"model\grid\room.pts"</param> public static async Task <bool> UploadArtifaceAsync(ArtifactsApi api, Project project, string fullPath, string relativePath) { var filePath = fullPath; var fileRelativePath = relativePath.Replace('\\', '/'); if (fileRelativePath.StartsWith("/")) { fileRelativePath = fileRelativePath.Substring(1); } var artf = await api.CreateArtifactAsync(project.Owner.Name, project.Name, new KeyRequest(fileRelativePath)); //Use RestSharp RestClient restClient = new RestClient { BaseUrl = new Uri(artf.Url), Timeout = Configuration.Default.Timeout }; RestRequest restRequest = new RestRequest { RequestFormat = DataFormat.Json, Method = Method.POST }; restRequest.AddHeader("Content-Type", "multipart/form-data"); artf.Fields.Keys.ToList().ForEach(f => restRequest.AddParameter(f, artf.Fields[f])); restRequest.AddFile("file", filePath); Helper.Logger.Information($"Started upload of {relativePath}"); var response = await restClient.ExecuteAsync(restRequest); if (response.StatusCode == HttpStatusCode.NoContent) { Helper.Logger.Information($"UploadArtifaceAsync: Done uploading {fileRelativePath}"); return(true); } else { Helper.Logger.Information($"UploadArtifaceAsync: Received response code: {response.StatusCode}"); Helper.Logger.Information($"{response.Content}"); } return(false); }
public static async Task RunAsync(BuildContext ctx) { var cmd = ctx.GetCommand(); bool forceSwitch = (cmd as ISupportForceSwitch)?.ForceSwitch ?? false; var ap = ctx.GetArtifactPackage(); var(wasAlreadyPresent, localPath) = await ArtifactsApi.FetchArtifact(ctx, ap, forceSwitch); if (wasAlreadyPresent) { await Console.Out.WriteLineAsync("Download skipped, file exists: " + localPath); } else { var fileSize = new FileInfo(localPath).Length; await Console.Out.WriteLineAsync($"Saved: ({fileSize.Bytes().Humanize("MB")}) {localPath}"); } }
public static async Task RunAsync(BuildContext ctx) { var cmd = ctx.GetCommand(); bool forceSwitch = (cmd as ISupportForceSwitch)?.ForceSwitch ?? false; var ap = ctx.GetArtifactPackage(); long reportThreshold = 0; var(wasAlreadyPresent, localPath) = await ArtifactsApi.FetchArtifact( ctx, ap, forceSwitch, (bytesRead, bytesReadTotal) => { reportThreshold += bytesRead; // Throttle reporting if (reportThreshold >= (1024 * 1024 * 5)) { reportThreshold = 0; Console.Out.WriteAsync("."); } }, bytesReadTotal => { Console.Out.WriteLineAsync(); }); if (wasAlreadyPresent) { Console.WriteLine("Download skipped, file exists: " + localPath); } else { var fileSize = new FileInfo(localPath).Length; Console.WriteLine($"Saved: ({fileSize.Bytes().Humanize("MB")}) {localPath}"); } }
public async Task RunAsync() { if (Targets.Any(t => t.ToLower() == "containers")) { var items = await ArtifactsApi.ListNamedContainers(); await Console.Out.WriteLineAsync(Environment.NewLine + "Branches:"); await Console.Out.WriteLineAsync(string.Join( Environment.NewLine, items .Where(itm => itm.IsBranch) .Select(itm => " " + itm.Name) )); await Console.Out.WriteLineAsync(Environment.NewLine + "Versions:"); await Console.Out.WriteLineAsync(string.Join( Environment.NewLine, items .Where(itm => itm.IsVersion) .Select(itm => " " + itm.Name) )); await Console.Out.WriteLineAsync(Environment.NewLine + "Aliases:"); await Console.Out.WriteLineAsync(string.Join( Environment.NewLine, items .Where(itm => itm.IsAlias) .Select(itm => " " + itm.Name) )); return; } if (string.IsNullOrWhiteSpace(ContainerId)) { await Console.Out.WriteLineAsync( $"ERROR(s):{Environment.NewLine}" + MagicStrings.Errors.NeedCidWhenTargetSpecified); return; } if (Targets.Any(t => t.ToLower() == "all")) { Targets = BuildContext.Default.Config.ProductNames; } foreach (var target in Targets) { if (!ForceSwitch && !BuildContext.Default.Config.ProductNames.Any(t => t.ToLower() == target)) { throw new InvalidDataException($"Invalid product '{target}'"); } await Console.Out.WriteLineAsync(Environment.NewLine + $"Discovering '{target}' in '{ContainerId}' ..."); var items = await ArtifactsApi.FindArtifact(target, filter => { filter.ContainerId = ContainerId; filter.Bitness = Bitness; }); await Console.Out.WriteLineAsync(string.Join( Environment.NewLine, items.Select(itm => " " + itm.FileName + Environment.NewLine + " " + itm.Url + Environment.NewLine) )); } }
public void Init() { instance = new ArtifactsApi(); }