예제 #1
0
        public async Task InstallsRevisionCorrectly()
        {
            var configFile      = new ConfigFile(Dir);
            var fs              = new MockFileSystem();
            var revisionManager = new RevisionManager(configFile, fs);

            Util.CreateSFMDirectory(fs);
            var revision = Util.CreateFakeTempRevision(fs);

            await revisionManager.InstallRevision(revision, "C:\\tmp", null);

            Assert.IsTrue(revisionManager.VerifyInstalled(revision, null));
        }
        public async Task ExecutesCorrectly()
        {
            var configFile      = new ConfigFile("C:\\SFM");
            var fs              = new MockFileSystem();
            var revisionManager = new RevisionManager(configFile, fs);

            fs.CreateDirectory("C:\\SFM");
            fs.CreateDirectory("C:\\SFM\\ponysfm");

            fs.CreateDirectory("C:\\tmp");
            fs.CreateDirectory("C:\\tmp\\models");
            fs.CreateFile("C:\\tmp\\models\\pony.vtf");

            fs.CreateDirectory("C:\\tmp\\materials");
            fs.CreateFile("C:\\tmp\\materials\\pony.vmt");

            var files = new List <RevisionFileEntry>
            {
                RevisionFileEntry.FromFile("C:\\tmp\\models\\pony.vtf", fs),
                RevisionFileEntry.FromFile("C:\\tmp\\materials\\pony.vmt", fs)
            };

            var revision = new Revision(1, files);

            await revisionManager.InstallRevision(revision, "C:\\tmp", null);

            Assert.IsTrue(revisionManager.VerifyInstalled(revision, null));

            var list = new List <int> {
                1
            };

            var deinstallationPresenter = new DeinstallationPresenter(revisionManager, list);

            await deinstallationPresenter.Execute();

            Assert.IsFalse(revisionManager.VerifyInstalled(revision, null));

            foreach (var file in revision.Files)
            {
                Assert.IsFalse(fs.FileExists(file.Path));
            }
        }
예제 #3
0
        public async Task UninstallsRevisionCorrectly()
        {
            var configFile      = new ConfigFile(Dir);
            var fs              = new MockFileSystem();
            var revisionManager = new RevisionManager(configFile, fs);

            Util.CreateSFMDirectory(fs);
            var revision = Util.CreateFakeTempRevision(fs);

            await revisionManager.InstallRevision(revision, "C:\\tmp", null);

            Assert.IsTrue(revisionManager.VerifyInstalled(revision, null));

            await revisionManager.UninstallRevision(revision.ID, null);

            Assert.IsFalse(revisionManager.VerifyInstalled(revision, null));

            foreach (var file in revision.Files)
            {
                Assert.IsFalse(fs.FileExists(file.Path));
            }
        }
예제 #4
0
        public async Task ExecuteInstallation(int id)
        {
            var      zipTmp  = _fs.GetTempPath();
            var      tempDir = _fs.GetTempPath();
            IZipFile zip     = null;

            var progress = new Progress <int>(i => SetProgress(_currentProgressState, i));

            _revisionMgr.OnFileExists += (s, e) => OnFileExists?.Invoke(s, e);

            if (!_fs.DirectoryExists(tempDir))
            {
                _fs.CreateDirectory(tempDir);
            }

            LogInstallation("Installing revision " + id + "\n");

            _currentProgressState = ProgressState.Download;
            LogInstallation("Downloading file...\n");

            Action cleanup = delegate
            {
                if (zip != null)
                {
                    if (zip is MockZipFile)
                    {
                        _fs.DeleteDirectory(zipTmp);
                    }
                    else
                    {
                        _fs.DeleteFile(zipTmp);
                    }
                }
                _fs.DeleteDirectory(tempDir);
            };

            try
            {
                await _api.DownloadRevisionZip(id, zipTmp, progress);
            }
            catch (WebException e)
            {
                MessageBox.Show("Failed to download: " + e.Message);
                cleanup();
                return;
            }

            _currentProgressState = ProgressState.Extraction;
            LogInstallation("Extracting zip file...\n");
            zip = _fs.OpenZip(zipTmp);
            await zip.Extract(tempDir, progress);

            var parser = new TempRevisionParser(tempDir, _fs);
            var modDir = parser.FindModFolder();

            if (string.IsNullOrWhiteSpace(modDir))
            {
                const string s = "This mod cannot be installed because it does not have the appropriate file-structure.";
                LogInstallation(s);
                MessageBox.Show(s);
                cleanup();
                return;
            }

            _currentProgressState = ProgressState.Installation;
            LogInstallation("Installing files to SFM...\n");
            var tmpRev = Revision.CreateTemporaryRevisionFromFolder(id, modDir, _fs);
            await _api.FetchMetadata(tmpRev);

            var result = await _revisionMgr.InstallRevision(tmpRev, modDir, progress, CancellationSource.Token);

            /* If we don't do this the directory deletion crashes because the handle created in zip.Extract is not released properly? */
            GC.Collect();
            GC.WaitForPendingFinalizers();

            LogInstallation("Cleaning up...\n");
            cleanup();

            switch (result)
            {
            case InstallationResult.Success:
                LogInstallation("Installation cancelled by user\n");
                break;

            case InstallationResult.Cancelled:
                LogInstallation("Installation successful\n");
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            LogInstallation("Done!\n");
        }