Пример #1
0
        /// <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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        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}");
            }
        }
Пример #6
0
        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}");
            }
        }
Пример #7
0
        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)
                                                     ));
            }
        }
Пример #8
0
 public void Init()
 {
     instance = new ArtifactsApi();
 }