static Package FindOrCreateExecutionPackage(RestClient client, Root root, Project project, Options options, SystemInfo systemInfo)
        {
            Package scriptPackage = client.GetExecutionPackageByProjectAndName(root, project.Id, options.ExecutionPackage);

            if (scriptPackage == null)
            {
                // let's try to create all the packages in the path

                string[] parts = options.ExecutionPackage.Split(new[] {systemInfo.PackagePathSeparator}, StringSplitOptions.RemoveEmptyEntries);

                Package parent = client.GetExecutionPackageByProjectAndName(root, project.Id, parts[0]) ?? client.CreateExecutionPackageForProject(root, project.Id, parts[0]);

                for (int i = 1; i < parts.Length; i++)
                {
                    Package match = client.GetExecutionPackageByParentPackageAndName(root, parent.Id, parts[i]) ?? client.CreateExecutionPackageForParentProject(root, parent.Id, parts[i]);

                    parent = match;
                }

                scriptPackage = parent;
            }

            return scriptPackage;
        }
        static AutomatedTest FindOrCreateAutomatedTest(RestClient client, Root root, Package scriptPackage, Options options)
        {
            AutomatedTest automatedTest = client.GetAutomatedTestByPackageAndTestName(root, scriptPackage.Id, options.TestName) ?? client.CreateAutomatedTest(root, scriptPackage.Id, options.TestName, options.Type, options.SubType);

            return automatedTest;
        }
        static void Main(string[] args)
        {
            ServicePointManager.UseNagleAlgorithm = false;

            Console.WriteLine(HeadingInfo);

            var options = new Options();

            var parser = new CommandLineParser(new CommandLineParserSettings(Console.Error));

            if (!parser.ParseArguments(args, options))
            {
                Environment.Exit(1);
            }

            var client = new RestClient
                {
                    Authenticator = new HttpBasicAuthenticator(options.UserName, options.Password)
                };

            Root root = client.GetRoot(options.Server);

            SystemInfo systemInfo = client.GetSystemInfo(root);

            Project project = GetProject(client, root, options);

            Package scriptPackage = FindOrCreateScriptPackage(client, root, project, options, systemInfo);

            AutomatedTest automatedTest = FindOrCreateAutomatedTest(client, root, scriptPackage, options);

            Package executionPackage = FindOrCreateExecutionPackage(client, root, project, options, systemInfo);

            AutomatedTestAssignment automatedTestAssignment = FindOrCreateAutomatedTestAssignment(client, root, executionPackage, automatedTest);

            IRestResponse<BackgroundTask> progress = StartUploadResults(automatedTestAssignment, options, client);

            PollTaskProgress(client, progress);

            Environment.Exit(0);
        }
        static IRestResponse<BackgroundTask> StartUploadResults(AutomatedTestAssignment automatedTestAssignment, Options options, RestClient client)
        {
            string fileToUpload = CreateFileToUpload(options.ResultFiles);

            try
            {
                if (options.SaveCopy)
                {
                    string copyPath = Path.Combine(Environment.CurrentDirectory, "report.zip");
                    File.Copy(fileToUpload, copyPath);
                }

                IRestRequest request = new RestRequest(automatedTestAssignment.GetLink("Runs"), Method.POST).AddHeader("Content-Type", "multipart/mixed");

                string path = Path.GetFullPath(fileToUpload);

                request.AddFile("report", path);

                IRestResponse<BackgroundTask> result = client.Execute<BackgroundTask>(request);

                if (result.ErrorMessage != null)
                {
                    Console.WriteLine("Error occured while uploading results: {0}", result.ErrorMessage);
                    Environment.Exit(3);
                }

                if (result.StatusCode != HttpStatusCode.Accepted)
                {
                    Console.WriteLine("Error occured while uploading results: {0}", result.Content);
                    Environment.Exit(4);
                }

                return result;
            }
            finally
            {
                File.Delete(fileToUpload);
            }
        }
        static Project GetProject(RestClient client, Root root, Options options)
        {
            Project project = client.GetProjectByName(root, options.Project);

            if (project == null)
            {
                Console.WriteLine("Project '{0}' does not exist.", options.Project);
                Environment.Exit(1);
            }
            return project;
        }