Esempio n. 1
0
        IEnumerable <ShortcutCreationRequest> uninstallAppVersion(IAppSetup app, Version ver)
        {
            try {
                app.OnVersionUninstalling(ver);
            } catch (Exception ex) {
                log.ErrorException("App threw exception on uninstall:  " + app.GetType().FullName, ex);
            }

            var shortcuts = Enumerable.Empty <ShortcutCreationRequest>();

            try {
                shortcuts = app.GetAppShortcutList();
            } catch (Exception ex) {
                log.ErrorException("App threw exception on shortcut uninstall:  " + app.GetType().FullName, ex);
            }

            // Get the list of shortcuts that *should've* been there, but aren't;
            // this means that the user deleted them by hand and that they should
            // stay dead
            return(shortcuts.Aggregate(new List <ShortcutCreationRequest>(), (acc, x) => {
                var path = x.GetLinkTarget(applicationName);
                var fi = fileSystem.GetFileInfo(path);

                if (fi.Exists)
                {
                    fi.Delete();
                }
                else
                {
                    acc.Add(x);
                }

                return acc;
            }));
        }
Esempio n. 2
0
        public static void BuildReleasesFile(string releasePackagesDir, IFileSystemFactory fileSystemFactory = null)
        {
            fileSystemFactory = fileSystemFactory ?? AnonFileSystem.Default;
            var packagesDir = fileSystemFactory.GetDirectoryInfo(releasePackagesDir);

            // Generate release entries for all of the local packages
            var entries = packagesDir.GetFiles("*.nupkg").MapReduce(x => Observable.Start(() => {
                using (var file = x.OpenRead()) {
                    return(GenerateFromFile(file, x.Name));
                }
            }, RxApp.TaskpoolScheduler)).First();

            // Write the new RELEASES file to a temp file then move it into
            // place
            var tempFile = fileSystemFactory.CreateTempFile();

            try {
                if (entries.Count > 0)
                {
                    WriteReleaseFile(entries, tempFile.Item2);
                }
            } finally {
                tempFile.Item2.Dispose();
            }

            var target = Path.Combine(packagesDir.FullName, "RELEASES");

            if (File.Exists(target))
            {
                File.Delete(target);
            }

            fileSystemFactory.GetFileInfo(tempFile.Item1).MoveTo(target);
        }
Esempio n. 3
0
        public IObservable <Unit> QueueBackgroundDownloads(IEnumerable <string> urls, IEnumerable <string> localPaths, IObserver <int> progress = null)
        {
            var    fileCount   = urls.Count();
            double toIncrement = 100.0 / fileCount;

            progress = progress ?? new Subject <int>();

            var ret = urls.Zip(localPaths, (u, p) => new { Url = u, Path = p }).ToObservable()
                      .Select(x => Http.DownloadUrl(x.Url).Select(Content => new { x.Url, x.Path, Content }))
                      .Merge(4)
                      .SelectMany(x => Observable.Start(() => {
                var fi = fileSystem.GetFileInfo(x.Path);
                if (fi.Exists)
                {
                    fi.Delete();
                }

                using (var of = fi.OpenWrite()) {
                    of.Write(x.Content, 0, x.Content.Length);
                }
            }, RxApp.TaskpoolScheduler))
                      .Multicast(new ReplaySubject <Unit>());

            ret.Scan(0.0, (acc, _) => acc + toIncrement).Select(x => (int)x).Subscribe(progress);

            ret.Connect();
            return(ret.TakeLast(1).Select(_ => Unit.Default));
        }
Esempio n. 4
0
        IObservable <UpdateInfo> checkForUpdate(bool ignoreDeltaUpdates = false, IObserver <int> progress = null)
        {
            IEnumerable <ReleaseEntry> localReleases = Enumerable.Empty <ReleaseEntry>();

            progress = progress ?? new Subject <int>();

            try {
                var file = fileSystem.GetFileInfo(LocalReleaseFile).OpenRead();

                // NB: sr disposes file
                using (var sr = new StreamReader(file, Encoding.UTF8)) {
                    localReleases = ReleaseEntry.ParseReleaseFile(sr.ReadToEnd());
                }
            } catch (Exception ex) {
                // Something has gone wrong, we'll start from scratch.
                log.WarnException("Failed to load local release list", ex);
                initializeClientAppDirectory();
            }

            IObservable <string> releaseFile;

            // Fetch the remote RELEASES file, whether it's a local dir or an
            // HTTP URL
            try {
                if (isHttpUrl(updateUrlOrPath))
                {
                    releaseFile = urlDownloader.DownloadUrl(String.Format("{0}/{1}", updateUrlOrPath, "RELEASES"), progress);
                }
                else
                {
                    var fi = fileSystem.GetFileInfo(Path.Combine(updateUrlOrPath, "RELEASES"));

                    using (var sr = new StreamReader(fi.OpenRead(), Encoding.UTF8)) {
                        var text = sr.ReadToEnd();
                        releaseFile = Observable.Return(text);
                    }

                    progress.OnNext(100);
                    progress.OnCompleted();
                }
            } catch (Exception ex) {
                progress.OnCompleted();
                return(Observable.Throw <UpdateInfo>(ex));
            }

            var ret = releaseFile
                      .Select(ReleaseEntry.ParseReleaseFile)
                      .SelectMany(releases => determineUpdateInfo(localReleases, releases, ignoreDeltaUpdates))
                      .PublishLast();

            ret.Connect();
            return(ret);
        }
Esempio n. 5
0
        IPackage openBundledPackage()
        {
            var fi = fileSystem.GetFileInfo(Path.Combine(currentAssemblyDir, BundledRelease.Filename));

            if (!fi.Exists)
            {
                this.Log().Error("The expected file '{0}' could not be found...", BundledRelease.Filename);
                var directoryInfo = fileSystem.GetDirectoryInfo(currentAssemblyDir);
                foreach (var f in directoryInfo.GetFiles("*.nupkg"))
                {
                    this.Log().Info("Directory contains file: {0}", f.Name);
                }

                UserError.Throw("This installer is incorrectly configured, please contact the author",
                                new FileNotFoundException(fi.FullName));
                return(null);
            }

            return(new ZipPackage(fi.FullName));
        }
Esempio n. 6
0
        public IObservable <UpdateInfo> CheckForUpdate(bool ignoreDeltaUpdates = false)
        {
            IEnumerable <ReleaseEntry> localReleases = Enumerable.Empty <ReleaseEntry>();

            var noLock = checkForLock <UpdateInfo>();

            if (noLock != null)
            {
                return(noLock);
            }

            try {
                var file = fileSystem.GetFileInfo(LocalReleaseFile).OpenRead();

                // NB: sr disposes file
                using (var sr = new StreamReader(file, Encoding.UTF8)) {
                    localReleases = ReleaseEntry.ParseReleaseFile(sr.ReadToEnd());
                }
            } catch (Exception ex) {
                // Something has gone wrong, we'll start from scratch.
                this.Log().WarnException("Failed to load local release list", ex);
                initializeClientAppDirectory();
            }

            IObservable <string> releaseFile;

            // Fetch the remote RELEASES file, whether it's a local dir or an
            // HTTP URL
            if (isHttpUrl(updateUrlOrPath))
            {
                releaseFile = urlDownloader.DownloadUrl(String.Format("{0}/{1}", updateUrlOrPath, "RELEASES"));
            }
            else
            {
                var fi = fileSystem.GetFileInfo(Path.Combine(updateUrlOrPath, "RELEASES"));

                using (var sr = new StreamReader(fi.OpenRead(), Encoding.UTF8)) {
                    var text = sr.ReadToEnd();
                    releaseFile = Observable.Return(text);
                }
            }

            var ret = releaseFile
                      .Select(ReleaseEntry.ParseReleaseFile)
                      .SelectMany(releases => determineUpdateInfo(localReleases, releases, ignoreDeltaUpdates))
                      .Multicast(new AsyncSubject <UpdateInfo>());

            ret.Connect();
            return(ret);
        }
Esempio n. 7
0
        public IObservable <int> QueueBackgroundDownloads(IEnumerable <string> urls, IEnumerable <string> localPaths)
        {
            var    fileCount   = urls.Count();
            double toIncrement = 100.0 / fileCount;

            return(urls.Zip(localPaths, (u, p) => new { Url = u, Path = p }).ToObservable()
                   .Select(x => Http.DownloadUrl(x.Url).Select(Content => new { x.Url, x.Path, Content })).Merge(4)
                   .SelectMany(x => Observable.Start(() => {
                var fi = fileSystem.GetFileInfo(x.Path);
                if (fi.Exists)
                {
                    fi.Delete();
                }

                using (var of = fi.OpenWrite()) {
                    of.Write(x.Content, 0, x.Content.Length);
                }
            }, RxApp.TaskpoolScheduler))
                   .Scan(0.0, (acc, _) => acc + toIncrement)
                   .Select(x => (int)x));
        }
Esempio n. 8
0
        IObservable <UpdateInfo> checkForUpdate(bool ignoreDeltaUpdates = false, IObserver <int> progress = null)
        {
            var localReleases = Enumerable.Empty <ReleaseEntry>();

            progress = progress ?? new Subject <int>();

            try {
                var file = fileSystem.GetFileInfo(LocalReleaseFile).OpenRead();

                // NB: sr disposes file
                using (var sr = new StreamReader(file, Encoding.UTF8)) {
                    localReleases = ReleaseEntry.ParseReleaseFile(sr.ReadToEnd());
                }
            } catch (Exception ex) {
                // Something has gone wrong, we'll start from scratch.
                log.WarnException("Failed to load local release list", ex);
                initializeClientAppDirectory();
            }

            IObservable <string> releaseFile;

            // Fetch the remote RELEASES file, whether it's a local dir or an
            // HTTP URL
            try {
                if (isHttpUrl(updateUrlOrPath))
                {
                    log.Info("Downloading RELEASES file from {0}", updateUrlOrPath);
                    releaseFile = urlDownloader.DownloadUrl(String.Format("{0}/{1}", updateUrlOrPath, "RELEASES"), progress)
                                  .Catch <string, TimeoutException>(ex => {
                        log.Info("Download timed out (returning blank release list)");
                        return(Observable.Return(String.Empty));
                    })
                                  .Catch <string, WebException>(ex => {
                        log.InfoException("Download resulted in WebException (returning blank release list)", ex);
                        return(Observable.Return(String.Empty));
                    });
                }
                else
                {
                    log.Info("Reading RELEASES file from {0}", updateUrlOrPath);

                    if (!fileSystem.GetDirectoryInfo(updateUrlOrPath).Exists)
                    {
                        var message =
                            String.Format(
                                "The directory {0} does not exist, something is probably broken with your application", updateUrlOrPath);
                        var ex = new SquirrelConfigurationException(message);
                        return(Observable.Throw <UpdateInfo>(ex));
                    }

                    var fi = fileSystem.GetFileInfo(Path.Combine(updateUrlOrPath, "RELEASES"));
                    if (!fi.Exists)
                    {
                        var message = String.Format(
                            "The file {0} does not exist, something is probably broken with your application", fi.FullName);

                        log.Warn(message);

                        var packages = fileSystem.GetDirectoryInfo(updateUrlOrPath).GetFiles("*.nupkg");
                        if (packages.Length == 0)
                        {
                            var ex = new SquirrelConfigurationException(message);
                            return(Observable.Throw <UpdateInfo>(ex));
                        }

                        // NB: Create a new RELEASES file since we've got a directory of packages
                        ReleaseEntry.WriteReleaseFile(
                            packages.Select(x => ReleaseEntry.GenerateFromFile(x.FullName)), fi.FullName);
                    }

                    using (var sr = new StreamReader(fi.OpenRead(), Encoding.UTF8)) {
                        var text = sr.ReadToEnd();
                        releaseFile = Observable.Return(text);
                    }

                    progress.OnNext(100);
                    progress.OnCompleted();
                }
            } catch (Exception ex) {
                progress.OnCompleted();
                return(Observable.Throw <UpdateInfo>(ex));
            }

            // Return null if no updates found
            var ret = releaseFile
                      .Select(ReleaseEntry.ParseReleaseFile)
                      .SelectMany(releases =>
                                  releases.Any() ? determineUpdateInfo(localReleases, releases, ignoreDeltaUpdates)
                        : Observable.Return <UpdateInfo>(null))
                      .PublishLast();

            ret.Connect();
            return(ret);
        }
Esempio n. 9
0
        public static void BuildReleasesFile(string releasePackagesDir, IFileSystemFactory fileSystemFactory = null)
        {
            fileSystemFactory = fileSystemFactory ?? AnonFileSystem.Default;
            var packagesDir = fileSystemFactory.GetDirectoryInfo(releasePackagesDir);

            // Generate release entries for all of the local packages
            var entries = packagesDir.GetFiles("*.nupkg").MapReduce(x => Observable.Start(() => {
                using (var file = x.OpenRead()) {
                    return GenerateFromFile(file, x.Name);
                }
            }, RxApp.TaskpoolScheduler)).First();

            // Write the new RELEASES file to a temp file then move it into
            // place
            var tempFile = fileSystemFactory.CreateTempFile();
            try {
                if (entries.Count > 0) WriteReleaseFile(entries, tempFile.Item2);
            } finally {
                tempFile.Item2.Dispose();
            }

            var target = Path.Combine(packagesDir.FullName, "RELEASES");
            if (File.Exists(target)) {
                File.Delete(target);
            }

            fileSystemFactory.GetFileInfo(tempFile.Item1).MoveTo(target);
        }
Esempio n. 10
0
        IPackage openBundledPackage()
        {
            var fi = fileSystem.GetFileInfo(Path.Combine(currentAssemblyDir, BundledRelease.Filename));

            return(new ZipPackage(fi.FullName));
        }