static void PrintHeaders()
 {
     VcpkgMessage.NormalMessage("vcpkg port update alert\n");
     VcpkgMessage.NormalMessage("Version 1.0\n");
     VcpkgMessage.NormalMessage("By Ehsan Mohammadi\n\n");
     VcpkgMessage.NormalMessage("Press any key to start checking vcpkg ports...");
 }
        /// <summary>
        /// Get the vcpkg ports from github repo and store it in a list
        /// </summary>
        public async Task <IEnumerable <string> > GetPorts()
        {
            try
            {
                var response = await httpClient.GetAsync($"repos/{repoAddress}/contents/ports");

                var contentAsString = await response.Content.ReadAsStringAsync();

                var contentAsJson = JToken.Parse(contentAsString);

                return(contentAsJson.SelectTokens("$.[*].name").Select(token => token.Value <string>()));
            }
            catch (Exception)
            {
                VcpkgMessage.ErrorMessage("Error: Can't connect to the vcpkg GitHub repo :(\n");
                Console.ResetColor();
                return(null);
            }
        }
        static void SaveLog()
        {
            // Reset the color
            Console.ResetColor();

            Vcpkg vcpkg = new Vcpkg();

            // Check the length of log list
            if (vcpkg.LogLength() > 0)
            {
                while (true)
                {
                    VcpkgMessage.NormalMessage("> Do you want to save ports in a log file? (y/n) ");
                    string answer = Console.ReadLine();

                    if (answer.ToLower() == "y")
                    {
                        VcpkgMessage.NormalMessage("> Enter the destination file path: ");
                        string path = Console.ReadLine();

                        if (vcpkg.SaveLog(path))
                        {
                            VcpkgMessage.NormalMessage("\n> File successfully saved!\n\n");
                            break;
                        }
                        else
                        {
                            VcpkgMessage.ErrorMessage("\n> Can't save the file. try again... (See EXAMPLE: C:\\ports.log)\n\n");
                            Console.ResetColor();
                        }
                    }
                    else if (answer.ToLower() == "n")
                    {
                        break;
                    }
                }
            }
        }
        static void Main(string[] args)
        {
            Console.CancelKeyPress += delegate(object sender, ConsoleCancelEventArgs e)
            {
                e.Cancel          = true;
                Program.canceling = true;
            };

            // Set console title and Show the header
            Console.Title = "vcpkg-port-update-alert - version: 1.0";
            PrintHeaders();
            Console.ReadKey();

            // Start vcpkg-port-update-alert
            AsyncMain().Wait();

            // wait until you type "y" or "n"
            SaveLog();

            // Reset the color and quit
            VcpkgMessage.NormalMessage("Press any key to quit...");
            Console.ReadKey();
            Console.ResetColor();
        }
        static async Task AsyncMain()
        {
            // Initialize
            Vcpkg vcpkg = new Vcpkg();

            vcpkg.SetHttpClient();

            // Fetching ports
            VcpkgMessage.NormalMessage("\n\n> Fetching ports... (It may take a few seconds)\n");
            IEnumerable <string> ports = await vcpkg.GetPorts();

            if (ports != null)
            {
                VcpkgMessage.NormalMessage("> Ports successfully fetched\n");

                // Some settings for console output
                int currentLine = Console.CursorTop + 1;
                int clearLength = 0;
                int percent     = 0;
                int portsCount  = ports.ToList().Count;

                // Looking for need-to-be-updated ports
                foreach (string port in ports)
                {
                    if (Program.canceling)
                    {
                        break;
                    }

                    percent++;
                    Console.SetCursorPosition(0, currentLine - 1);
                    VcpkgMessage.NormalMessage($"> Looking for need-to-be-updated ports... ({100 * percent / portsCount}%)");

                    // Reset the line
                    Console.SetCursorPosition(0, currentLine);
                    VcpkgMessage.ClearLine(currentLine, clearLength);

                    // Show the current port
                    Console.SetCursorPosition(0, currentLine);
                    VcpkgMessage.NormalMessage($"> Current port: \"{port}\"");
                    clearLength = 18 + port.Length;

                    // Get the port REPO and REF
                    RepoRef portRepoRef = await vcpkg.GetRepoAndRef(port);

                    if (vcpkg.HasRepoAndRef(portRepoRef))
                    {
                        string latestRelease = await vcpkg.SearchLatestRelease(portRepoRef.Repo);

                        // Show need-to-be-update port
                        if (vcpkg.PortNeedToUpdate(portRepoRef.Ref, latestRelease))
                        {
                            Console.SetCursorPosition(0, currentLine - 1);
                            ++currentLine;

                            string updatePort = $"\"{port}\" need to update from \"{portRepoRef.Ref}\" to \"{latestRelease}\" version.";

                            VcpkgMessage.WarningMessage(updatePort);
                            VcpkgMessage.NormalMessage("");

                            // Add port to the log list
                            vcpkg.AddToLog(updatePort);
                        }
                    }
                }

                // Remove last port check in the currentLine
                Console.SetCursorPosition(0, currentLine);
                VcpkgMessage.ClearLine(currentLine, clearLength);
                Console.SetCursorPosition(0, currentLine);

                // Finish
                if (!Program.canceling)
                {
                    VcpkgMessage.NormalMessage("\n> All ports checked!\n\n");
                }
                else
                {
                    VcpkgMessage.NormalMessage("\n> Task cancelled by user\n\n");
                }
            }
        }