public void DownloadVersion(string latestVersion, string target)
        {
            var url = String.Format(Constants.PaketExeDownloadUrlTemplate, latestVersion);

            ConsoleImpl.WriteDebug("Starting download from {0}", url);

            var tmpFile = BootstrapperHelper.GetTempFile("paket");

            using (var fileStream = FileProxy.Create(tmpFile))
            {
                WebRequestProxy.DownloadFile(url, fileStream, HttpBufferSize);
            }

            FileProxy.Copy(tmpFile, target, true);
            FileProxy.Delete(tmpFile);
        }
        public void SelfUpdate(string latestVersion)
        {
            var    executingAssembly = Assembly.GetExecutingAssembly();
            string exePath           = executingAssembly.Location;
            var    localVersion      = FileProxy.GetLocalFileVersion(exePath);

            if (localVersion.StartsWith(latestVersion))
            {
                ConsoleImpl.WriteDebug("Bootstrapper is up to date. Nothing to do.");
                return;
            }

            var url = String.Format("https://github.com/fsprojects/Paket/releases/download/{0}/paket.bootstrapper.exe", latestVersion);

            ConsoleImpl.WriteDebug("Starting download of bootstrapper from {0}", url);

            string renamedPath     = BootstrapperHelper.GetTempFile("oldBootstrapper");
            string tmpDownloadPath = BootstrapperHelper.GetTempFile("newBootstrapper");

            using (var toStream = FileProxy.Create(tmpDownloadPath))
            {
                WebRequestProxy.DownloadFile(url, toStream, HttpBufferSize);
            }
            try
            {
                FileProxy.FileMove(exePath, renamedPath);
                FileProxy.FileMove(tmpDownloadPath, exePath);
                ConsoleImpl.WriteDebug("Self update of bootstrapper was successful.");
            }
            catch (Exception)
            {
                ConsoleImpl.WriteDebug("Self update failed. Resetting bootstrapper.");
                FileProxy.FileMove(renamedPath, exePath);
                throw;
            }
        }