public void GitNotInstalledIfUpToDate()
        {
            using (var test = StartTest(withHttpServer: true))
            {
                var manifestFeed   = $"http://localhost:{test.HttpServer.Port}/git/{GitInstaller.GitInstallDetails.ManifestName}";
                var installDetails = new GitInstaller.GitInstallDetails(test.TestPath, test.Environment)
                {
                    GitManifestFeed = manifestFeed
                };
                var gitInstaller = new GitInstaller(test.Platform, installDetails: installDetails);
                var result       = gitInstaller.RunSynchronously();
                result.Should().NotBeNull();

                var expectedInstallationPath = test.TestPath.Combine("Git");
                Assert.AreEqual(expectedInstallationPath, result.GitInstallationPath);
                result.GitExecutablePath.Should().Be(expectedInstallationPath.Combine("cmd", "git" + test.Environment.ExecutableExtension));

                test.Environment.GitInstallationState = result;

                gitInstaller = new GitInstaller(test.Platform, installDetails: installDetails);
                var state = gitInstaller.VerifyGitSettings();
                Assert.True(state.GitIsValid);
                Assert.True(state.GitLfsIsValid);
            }
        }
Exemple #2
0
        public void GitInstallTest()
        {
            var gitInstallationPath = TestBasePath.Combine("GitInstall").CreateDirectory();

            var installDetails = new GitInstaller.GitInstallDetails(gitInstallationPath, DefaultEnvironment.OnWindows)
            {
                GitZipMd5Url    = $"http://localhost:{server.Port}/{new UriString(GitInstaller.GitInstallDetails.DefaultGitZipMd5Url).Filename}",
                GitZipUrl       = $"http://localhost:{server.Port}/{new UriString(GitInstaller.GitInstallDetails.DefaultGitZipUrl).Filename}",
                GitLfsZipMd5Url = $"http://localhost:{server.Port}/{new UriString(GitInstaller.GitInstallDetails.DefaultGitLfsZipMd5Url).Filename}",
                GitLfsZipUrl    = $"http://localhost:{server.Port}/{new UriString(GitInstaller.GitInstallDetails.DefaultGitLfsZipUrl).Filename}",
            };

            TestBasePath.Combine("git").CreateDirectory();

            var gitInstaller = new GitInstaller(Environment, ProcessManager, TaskManager, installDetails);
            var startTask    = gitInstaller.SetupGitIfNeeded();
            var endTask      = new FuncTask <NPath, NPath>(TaskManager.Token, (s, path) => path);

            startTask.OnEnd += (thisTask, path, success, exception) => thisTask.GetEndOfChain().Then(endTask);
            startTask.Start();
            NPath?resultPath = null;

            Assert.DoesNotThrow(async() => resultPath = await endTask.Task);
            resultPath.Should().NotBeNull();
        }
Exemple #3
0
        public IntegrationTestEnvironment(ICacheContainer cacheContainer,
                                          NPath repoPath,
                                          NPath solutionDirectory,
                                          CreateEnvironmentOptions options = null,
                                          bool enableTrace          = false,
                                          bool initializeRepository = true)
        {
            this.enableTrace = enableTrace;

            options = options ?? new CreateEnvironmentOptions(NPath.SystemTemp.Combine(ApplicationInfo.ApplicationName, "IntegrationTests"));

            defaultEnvironment = new DefaultEnvironment(cacheContainer);
            defaultEnvironment.FileSystem.SetCurrentDirectory(repoPath);

            var environmentPath = options.UserProfilePath;

            LocalAppData    = environmentPath.Combine("User");
            UserCachePath   = LocalAppData.Combine("Cache");
            CommonAppData   = environmentPath.Combine("System");
            SystemCachePath = CommonAppData.Combine("Cache");

            var installPath = solutionDirectory.Parent.Parent.Parent.Combine("src", "com.unity.git.api", "Api");

            Initialize(UnityVersion, installPath, solutionDirectory, NPath.Default, repoPath.Combine("Assets"));

            InitializeRepository(initializeRepository ? (NPath?)repoPath : null);

            GitDefaultInstallation = new GitInstaller.GitInstallDetails(UserCachePath, this);

            if (enableTrace)
            {
                logger.Trace("EnvironmentPath: \"{0}\" SolutionDirectory: \"{1}\" ExtensionInstallPath: \"{2}\"",
                             environmentPath, solutionDirectory, ExtensionInstallPath);
            }
        }
        public void GitLfsIsInstalledIfMissingWithCustomGitPath()
        {
            var tempZipExtractPath = TestBasePath.Combine("Temp", "git_zip_extract_zip_paths");
            var customGitInstall   = TestBasePath.Combine("CustomGitInstall").Combine(GitInstaller.GitInstallDetails.GitDirectory);

            var gitZipUri  = new UriString($"http://localhost:{server.Port}/unity/git/windows/git-slim.zip");
            var downloader = new Downloader(Environment.FileSystem);

            downloader.QueueDownload(gitZipUri, tempZipExtractPath);
            downloader.RunSynchronously();

            var gitExtractPath = tempZipExtractPath.Combine("git").CreateDirectory();

            ZipHelper.Instance.Extract(tempZipExtractPath.Combine(gitZipUri.Filename), gitExtractPath, TaskManager.Token, null);
            var source = gitExtractPath;
            var target = customGitInstall;

            target.DeleteIfExists();
            target.EnsureParentDirectoryExists();
            source.Move(target);
            var gitExec = customGitInstall.Combine("cmd/git.exe");

            var state = new GitInstaller.GitInstallationState();

            state.GitExecutablePath          = gitExec;
            Environment.GitInstallationState = state;

            var defaultGitInstall = TestBasePath.Combine("DefaultInstall");

            var installDetails = new GitInstaller.GitInstallDetails(defaultGitInstall, DefaultEnvironment.OnWindows)
            {
                GitPackageFeed    = "http://nope",
                GitLfsPackageFeed = $"http://localhost:{server.Port}/unity/git/windows/{GitInstaller.GitInstallDetails.GitLfsPackageName}",
            };

            var gitInstaller = new GitInstaller(Environment, ProcessManager, TaskManager.Token, installDetails: installDetails);

            state = gitInstaller.SetupGitIfNeeded();
            state.Should().NotBeNull();

            var gitLfsBasePath = defaultGitInstall.Combine(GitInstaller.GitInstallDetails.GitLfsDirectory);
            var gitLfsExec     = gitLfsBasePath.Combine("git-lfs.exe");

            state.GitInstallationPath.Should().Be(customGitInstall);
            state.GitExecutablePath.Should().Be(gitExec);
            state.GitLfsInstallationPath.Should().Be(gitLfsExec.Parent);
            state.GitLfsExecutablePath.Should().Be(gitLfsExec);
            gitLfsExec.FileExists().Should().BeTrue();

            Environment.GitInstallationState = state;

            var procTask = new SimpleProcessTask(TaskManager.Token, "something")
                           .Configure(ProcessManager);
            var pathList = procTask.Process.StartInfo.EnvironmentVariables["PATH"].ToNPathList(Environment).TakeWhile(x => x != "END");

            pathList.First().Should().Be(gitLfsExec.Parent);
            pathList.Skip(1).First().Should().Be(gitExec.Parent);
        }
Exemple #5
0
        public void GitInstallWindows()
        {
            var gitInstallationPath = TestBasePath.Combine("GitInstall").CreateDirectory();

            var installDetails = new GitInstaller.GitInstallDetails(gitInstallationPath, DefaultEnvironment.OnWindows)
            {
                GitZipMd5Url    = $"http://localhost:{server.Port}/{new UriString(GitInstaller.GitInstallDetails.DefaultGitZipMd5Url).Filename}",
                GitZipUrl       = $"http://localhost:{server.Port}/{new UriString(GitInstaller.GitInstallDetails.DefaultGitZipUrl).Filename}",
                GitLfsZipMd5Url = $"http://localhost:{server.Port}/{new UriString(GitInstaller.GitInstallDetails.DefaultGitLfsZipMd5Url).Filename}",
                GitLfsZipUrl    = $"http://localhost:{server.Port}/{new UriString(GitInstaller.GitInstallDetails.DefaultGitLfsZipUrl).Filename}",
            };

            TestBasePath.Combine("git").CreateDirectory();

            var zipHelper = Substitute.For <IZipHelper>();

            zipHelper.Extract(Arg.Any <string>(), Arg.Do <string>(x =>
            {
                var n = x.ToNPath();
                n.EnsureDirectoryExists();
                if (n.FileName == "git-lfs")
                {
                    n.Combine("git-lfs" + Environment.ExecutableExtension).WriteAllText("");
                }
            }), Arg.Any <CancellationToken>(), Arg.Any <Func <long, long, bool> >()).Returns(true);
            ZipHelper.Instance = zipHelper;
            var gitInstaller = new GitInstaller(Environment, ProcessManager, TaskManager, installDetails);

            TaskCompletionSource <GitInstaller.GitInstallationState> end = new TaskCompletionSource <GitInstaller.GitInstallationState>();
            var startTask = gitInstaller.SetupGitIfNeeded().Finally((_, state) => end.TrySetResult(state));

            startTask.Start();
            GitInstaller.GitInstallationState result = null;
            Assert.DoesNotThrow(async() => result = await end.Task);
            result.Should().NotBeNull();

            Assert.AreEqual(gitInstallationPath.Combine(installDetails.PackageNameWithVersion), result.GitInstallationPath);
            result.GitExecutablePath.Should().Be(gitInstallationPath.Combine(installDetails.PackageNameWithVersion, "cmd", "git" + Environment.ExecutableExtension));
            result.GitLfsExecutablePath.Should().Be(gitInstallationPath.Combine(installDetails.PackageNameWithVersion, "mingw32", "libexec", "git-core", "git-lfs" + Environment.ExecutableExtension));

            var isCustomGitExec = result.GitExecutablePath != result.GitExecutablePath;

            Environment.GitExecutablePath    = result.GitExecutablePath;
            Environment.GitLfsExecutablePath = result.GitLfsExecutablePath;

            Environment.IsCustomGitExecutable = isCustomGitExec;

            var procTask = new SimpleProcessTask(TaskManager.Token, "something")
                           .Configure(ProcessManager);

            procTask.Process.StartInfo.EnvironmentVariables["PATH"].Should().StartWith(gitInstallationPath.ToString());
        }
        public void GitIsInstalledIfMissing()
        {
            GitInstaller.GitInstallDetails.GitPackageFeed = $"http://localhost:{server.Port}/{GitInstaller.GitInstallDetails.GitPackageName}";
            var installDetails = new GitInstaller.GitInstallDetails(TestBasePath, Environment);
            var gitInstaller   = new GitInstaller(Environment, ProcessManager, TaskManager.Token, installDetails: installDetails);
            var result         = gitInstaller.RunSynchronously();

            result.Should().NotBeNull();

            var expectedInstallationPath = TestBasePath.Combine("Git");

            Assert.AreEqual(expectedInstallationPath, result.GitInstallationPath);
            result.GitExecutablePath.Should().Be(expectedInstallationPath.Combine("cmd", "git" + Environment.ExecutableExtension));
        }
        public void GitInstallWindows()
        {
            using (var test = StartTest(withHttpServer: true))
            {
                var gitInstallationPath = test.TestPath.Combine("GitInstall").CreateDirectory();

                var manifestFeed   = $"http://localhost:{test.HttpServer.Port}/git/{GitInstaller.GitInstallDetails.ManifestName}";
                var installDetails = new GitInstaller.GitInstallDetails(gitInstallationPath, test.Environment)
                {
                    GitManifestFeed = manifestFeed
                };

                test.TestPath.Combine("git").CreateDirectory();

                var gitInstaller = new GitInstaller(test.Platform, installDetails: installDetails);

                var zipHelper = Substitute.For <IZipHelper>();
                zipHelper.Extract(Arg.Any <string>(), Arg.Do <string>(x =>
                {
                    var n = x.ToSPath();
                    n.EnsureDirectoryExists();
                    if (n.FileName == "git")
                    {
                        n.Combine("git" + test.Environment.ExecutableExtension).WriteAllText("");
                    }
                }), Arg.Any <Action <string, long> >(), Arg.Any <Func <long, long, string, bool> >(), Arg.Any <Func <string, bool> >(), Arg.Any <CancellationToken>()).Returns(true);

                GitInstaller.GitInstallationState state = null;
                try
                {
                    ZipHelper.Instance = zipHelper;
                    state = gitInstaller.RunSynchronously();
                }
                finally
                {
                    ZipHelper.Instance = null;
                }

                state.Should().NotBeNull();

                Assert.AreEqual(gitInstallationPath.Combine(GitInstaller.GitInstallDetails.GitDirectory), state.GitInstallationPath);
                state.GitExecutablePath.Should().Be(gitInstallationPath.Combine(GitInstaller.GitInstallDetails.GitDirectory,
                                                                                "cmd", "git" + test.Environment.ExecutableExtension));

                test.Environment.GitInstallationState = state;

                var procTask = new NativeProcessTask(test.TaskManager, test.ProcessManager, test.GitProcessEnvironment, "something", null);
                procTask.Wrapper.StartInfo.EnvironmentVariables["PATH"].Should().StartWith(gitInstallationPath.ToString());
            }
        }
Exemple #8
0
        protected void SetupGit(NPath pathToSetupGitInto, string testName)
        {
            var autoResetEvent = new AutoResetEvent(false);

            var installDetails = new GitInstaller.GitInstallDetails(pathToSetupGitInto, true);

            var zipArchivesPath = pathToSetupGitInto.Combine("downloads").CreateDirectory();

            Logger.Trace($"Saving git zips into {zipArchivesPath} and unzipping to {pathToSetupGitInto}");

            AssemblyResources.ToFile(ResourceType.Platform, "git.zip", zipArchivesPath, Environment);
            AssemblyResources.ToFile(ResourceType.Platform, "git.zip.md5", zipArchivesPath, Environment);
            AssemblyResources.ToFile(ResourceType.Platform, "git-lfs.zip", zipArchivesPath, Environment);
            AssemblyResources.ToFile(ResourceType.Platform, "git-lfs.zip.md5", zipArchivesPath, Environment);

            var gitInstaller = new GitInstaller(Environment, ProcessManager, TaskManager, installDetails);

            NPath?    result = null;
            Exception ex     = null;

            var setupTask = gitInstaller.SetupGitIfNeeded();

            setupTask.OnEnd += (thisTask, _, __, ___) => {
                ((ITask <NPath>)thisTask.GetEndOfChain()).OnEnd += (t, path, success, exception) =>
                {
                    result = path;
                    ex     = exception;
                    autoResetEvent.Set();
                };
            };
            setupTask.Start();
            if (!autoResetEvent.WaitOne(TimeSpan.FromMinutes(5)))
            {
                throw new TimeoutException($"Test setup unzipping {zipArchivesPath} to {pathToSetupGitInto} timed out");
            }

            if (result == null)
            {
                if (ex != null)
                {
                    throw ex;
                }

                throw new Exception("Did not install git");
            }

            Environment.GitExecutablePath = result.Value;
            GitClient = new GitClient(Environment, ProcessManager, TaskManager.Token);
        }
    public static void Menu_DownloadLatestDugite()
    {
        LogHelper.LogAdapter = new UnityLogAdapter();

        var extensionInstallPath = Application.dataPath.ToSPath().Parent;

        var unityEnv = TheEnvironment.instance.Environment;
        var env      = new ApplicationEnvironment(unityEnv);

        env.Initialize(extensionInstallPath, unityEnv);
        var platform = new Platform(env);

        platform.Initialize();

        env.InitializeRepository();

        var installer = new GitInstaller.GitInstallDetails(env.RepositoryPath, env);
        var manifest  = DugiteReleaseManifest.Load(platform.TaskManager, installer.GitManifest, installer.GitManifestFeed, platform.Environment);

        var cts          = new CancellationTokenSource();
        var downloader   = new Downloader(platform.TaskManager, cts.Token);
        var downloadPath = env.RepositoryPath.Combine("downloads");

        foreach (var asset in manifest.Assets)
        {
            downloadPath.Combine(asset.Url.Filename).DeleteIfExists();
            downloader.QueueDownload(asset.Url, downloadPath, retryCount: 3);
        }

        downloader.Progress(p => {
            platform.TaskManager.RunInUI(() => {
                if (EditorUtility.DisplayCancelableProgressBar(p.Message, p.InnerProgress?.InnerProgress?.Message ?? p.InnerProgress?.Message ?? p.Message,
                                                               p.Percentage))
                {
                    cts.Cancel();
                }
            });
        }).FinallyInUI((success, ex) => {
            EditorUtility.ClearProgressBar();
            if (success)
            {
                EditorUtility.DisplayDialog("Download done", downloadPath, "Ok");
            }
            else
            {
                EditorUtility.DisplayDialog("Error!", ex.GetExceptionMessageShort(), "Ok");
            }
        }).Start();
    }
    public static void Menu_DownloadLatestDugite()
    {
        LogHelper.LogAdapter = new UnityLogAdapter();

        var unityAssetsPath          = Application.dataPath;
        var unityApplication         = EditorApplication.applicationPath;
        var unityApplicationContents = EditorApplication.applicationContentsPath;
        var extensionInstallPath     = Application.dataPath.ToNPath().Parent;
        var unityVersion             = Application.unityVersion;
        var env = new DefaultEnvironment();

        env.Initialize(unityVersion, extensionInstallPath, unityApplication.ToNPath(),
                       unityApplicationContents.ToNPath(), unityAssetsPath.ToNPath());
        env.InitializeRepository();
        TaskManager.Instance.Initialize(new UnityUIThreadSynchronizationContext());

        var installer = new GitInstaller.GitInstallDetails(env.RepositoryPath, env);
        var manifest  = DugiteReleaseManifest.Load(installer.GitManifest, GitInstaller.GitInstallDetails.GitPackageFeed, env);

        var downloader   = new Downloader();
        var downloadPath = env.RepositoryPath.Combine("downloads");

        foreach (var asset in manifest.Assets)
        {
            downloadPath.Combine(asset.Url.Filename).DeleteIfExists();
            downloader.QueueDownload(asset.Url, downloadPath, retryCount: 3);
        }

        downloader.Progress(p => {
            TaskManager.Instance.RunInUI(() => {
                if (EditorUtility.DisplayCancelableProgressBar(p.Message, p.InnerProgress?.InnerProgress?.Message ?? p.InnerProgress?.Message ?? p.Message,
                                                               p.Percentage))
                {
                    downloader.Cancel();
                }
            });
        }).FinallyInUI((success, ex) => {
            EditorUtility.ClearProgressBar();
            if (success)
            {
                EditorUtility.DisplayDialog("Download done", downloadPath, "Ok");
            }
            else
            {
                EditorUtility.DisplayDialog("Error!", ex.GetExceptionMessageOnly(), "Ok");
            }
        }).Start();
    }
Exemple #11
0
        //[Test]
        public void GitInstallMac()
        {
            var filesystem = Substitute.For <IFileSystem>();

            DefaultEnvironment.OnMac     = true;
            DefaultEnvironment.OnWindows = false;

            var gitInstallationPath = TestBasePath.Combine("GitInstall").CreateDirectory();

            var installDetails = new GitInstaller.GitInstallDetails(gitInstallationPath, Environment.IsWindows)
            {
                GitZipMd5Url    = $"http://localhost:{server.Port}/{new Uri(GitInstaller.GitInstallDetails.DefaultGitZipMd5Url).AbsolutePath}",
                GitZipUrl       = $"http://localhost:{server.Port}/{new Uri(GitInstaller.GitInstallDetails.DefaultGitZipUrl).AbsolutePath}",
                GitLfsZipMd5Url = $"http://localhost:{server.Port}/{new Uri(GitInstaller.GitInstallDetails.DefaultGitLfsZipMd5Url).AbsolutePath}",
                GitLfsZipUrl    = $"http://localhost:{server.Port}/{new Uri(GitInstaller.GitInstallDetails.DefaultGitLfsZipUrl).AbsolutePath}",
            };

            TestBasePath.Combine("git").CreateDirectory();

            var gitInstaller = new GitInstaller(Environment, ProcessManager, TaskManager, installDetails);
            var startTask    = gitInstaller.SetupGitIfNeeded();
            var endTask      = new FuncTask <GitInstaller.GitInstallationState, GitInstaller.GitInstallationState>(TaskManager.Token, (s, state) => state);

            startTask.OnEnd += (thisTask, path, success, exception) => thisTask.GetEndOfChain().Then(endTask);
            startTask.Start();
            GitInstaller.GitInstallationState result = null;
            Assert.DoesNotThrow(async() => result = await endTask.Task);
            result.Should().NotBeNull();

            Assert.AreEqual(gitInstallationPath.Combine(installDetails.PackageNameWithVersion), result.GitInstallationPath);
            result.GitExecutablePath.Should().Be(gitInstallationPath.Combine("bin", "git" + Environment.ExecutableExtension));
            result.GitLfsExecutablePath.Should().Be(gitInstallationPath.Combine(installDetails.PackageNameWithVersion, "libexec", "git-core", "git-lfs" + Environment.ExecutableExtension));

            var isCustomGitExec = result.GitExecutablePath != result.GitExecutablePath;

            Environment.GitExecutablePath    = result.GitExecutablePath;
            Environment.GitLfsExecutablePath = result.GitLfsExecutablePath;

            Environment.IsCustomGitExecutable = isCustomGitExec;

            var procTask = new SimpleProcessTask(TaskManager.Token, "something")
                           .Configure(ProcessManager);

            procTask.Process.StartInfo.EnvironmentVariables["PATH"].Should().StartWith(gitInstallationPath.ToString());
        }
        public IntegrationTestEnvironment(SPath testPath, SPath sharedTestPath, string applicationName)
        {
            Guard.ArgumentNotNull(applicationName, nameof(applicationName));

            ApplicationName = applicationName;

            this.sharedTestEnvironmentPath = sharedTestPath.Combine("git-unity-test-environment").EnsureDirectoryExists();
            this.testPath = testPath.Combine("SystemData").EnsureDirectoryExists();

            LocalAppData  = GetFolder(Folders.LocalApplicationData);
            CommonAppData = GetFolder(Folders.CommonApplicationData);

            UserCachePath   = LocalAppData.Combine(applicationName).EnsureDirectoryExists();
            SystemCachePath = CommonAppData.Combine(applicationName).EnsureDirectoryExists();

            LogPath = GetFolder(Folders.Logs).Combine(applicationName).EnsureDirectoryExists().Combine(logFile);
            GitDefaultInstallation = new GitInstaller.GitInstallDetails(sharedTestEnvironmentPath, this);
        }
Exemple #13
0
        protected void SetupGit(NPath pathToSetupGitInto, string testName)
        {
            var installDetails = new GitInstaller.GitInstallDetails(pathToSetupGitInto, Environment.IsWindows);
            var gitInstaller   = new GitInstaller(Environment, ProcessManager, TaskManager.Token, installDetails);
            var state          = gitInstaller.SetDefaultPaths(new GitInstaller.GitInstallationState());

            Environment.GitInstallationState = state;
            GitClient = new GitClient(Environment, ProcessManager, TaskManager.Token);

            if (installDetails.GitExecutablePath.FileExists() && installDetails.GitLfsExecutablePath.FileExists())
            {
                return;
            }

            installDetails.GitInstallationPath.DeleteIfExists();

            installDetails.GitZipPath.EnsureParentDirectoryExists();
            installDetails.GitLfsZipPath.EnsureParentDirectoryExists();

            AssemblyResources.ToFile(ResourceType.Platform, "git.zip", installDetails.GitZipPath.Parent, Environment);
            AssemblyResources.ToFile(ResourceType.Platform, "git.json", installDetails.GitZipPath.Parent, Environment);
            AssemblyResources.ToFile(ResourceType.Platform, "git-lfs.zip", installDetails.GitZipPath.Parent, Environment);
            AssemblyResources.ToFile(ResourceType.Platform, "git-lfs.json", installDetails.GitZipPath.Parent, Environment);

            var tempZipExtractPath = TestBasePath.Combine("setup", "git_zip_extract_zip_paths").EnsureDirectoryExists();
            var extractPath        = tempZipExtractPath.Combine("git").CreateDirectory();
            var path = new UnzipTask(TaskManager.Token, installDetails.GitZipPath, extractPath, null, Environment.FileSystem)
                       .Catch(e => true)
                       .RunSynchronously();
            var source = path;

            installDetails.GitInstallationPath.EnsureParentDirectoryExists();
            source.Move(installDetails.GitInstallationPath);

            extractPath = tempZipExtractPath.Combine("git-lfs").CreateDirectory();
            path        = new UnzipTask(TaskManager.Token, installDetails.GitLfsZipPath, extractPath, null, Environment.FileSystem)
                          .Catch(e => true)
                          .RunSynchronously();
            installDetails.GitLfsInstallationPath.EnsureParentDirectoryExists();
            path.Move(installDetails.GitLfsInstallationPath);
        }
        //[Test]
        public void MacSkipsInstallWhenSettingsGitExists()
        {
            DefaultEnvironment.OnMac     = true;
            DefaultEnvironment.OnWindows = false;

            var filesystem = Substitute.For <IFileSystem>();

            filesystem.FileExists(Arg.Any <string>()).Returns(true);
            filesystem.DirectoryExists(Arg.Any <string>()).Returns(true);
            filesystem.DirectorySeparatorChar.Returns('/');
            Environment.FileSystem = filesystem;

            var gitInstallationPath    = "/usr/local".ToNPath();
            var gitExecutablePath      = gitInstallationPath.Combine("bin/git");
            var gitLfsInstallationPath = gitInstallationPath;
            var gitLfsExecutablePath   = gitLfsInstallationPath.Combine("bin/git-lfs");

            var installDetails = new GitInstaller.GitInstallDetails(gitInstallationPath, Environment.IsWindows)
            {
                GitPackageFeed    = $"http://localhost:{server.Port}/unity/git/mac/{GitInstaller.GitInstallDetails.GitPackageName}",
                GitLfsPackageFeed = $"http://localhost:{server.Port}/unity/git/mac/{GitInstaller.GitInstallDetails.GitLfsPackageName}",
            };

            var ret = new string[] { gitLfsExecutablePath };

            filesystem.GetFiles(Arg.Any <string>(), Arg.Is <string>(installDetails.GitLfsExecutablePath.FileName), Arg.Any <SearchOption>())
            .Returns(ret);

            var settings    = Substitute.For <ISettings>();
            var settingsRet = gitExecutablePath.ToString();

            settings.Get(Arg.Is <string>(Constants.GitInstallPathKey), Arg.Any <string>()).Returns(settingsRet);
            var installer = new GitInstaller(Environment, ProcessManager, TaskManager.Token, installDetails);

            var result = installer.SetupGitIfNeeded();

            Assert.AreEqual(gitInstallationPath, result.GitInstallationPath);
            Assert.AreEqual(gitLfsInstallationPath, result.GitLfsInstallationPath);
            Assert.AreEqual(gitExecutablePath, result.GitExecutablePath);
            Assert.AreEqual(gitLfsExecutablePath, result.GitLfsExecutablePath);
        }
        public void GitInstallWindows()
        {
            var gitInstallationPath = TestBasePath.Combine("GitInstall").CreateDirectory();

            var installDetails = new GitInstaller.GitInstallDetails(gitInstallationPath, DefaultEnvironment.OnWindows)
            {
                GitPackageFeed    = $"http://localhost:{server.Port}/unity/git/windows/{GitInstaller.GitInstallDetails.GitPackageName}",
                GitLfsPackageFeed = $"http://localhost:{server.Port}/unity/git/windows/{GitInstaller.GitInstallDetails.GitLfsPackageName}",
            };

            TestBasePath.Combine("git").CreateDirectory();

            var zipHelper = Substitute.For <IZipHelper>();

            zipHelper.Extract(Arg.Any <string>(), Arg.Do <string>(x =>
            {
                var n = x.ToNPath();
                n.EnsureDirectoryExists();
                if (n.FileName == "git-lfs")
                {
                    n.Combine("git-lfs" + Environment.ExecutableExtension).WriteAllText("");
                }
            }), Arg.Any <CancellationToken>(), Arg.Any <Func <long, long, bool> >()).Returns(true);
            ZipHelper.Instance = zipHelper;
            var gitInstaller = new GitInstaller(Environment, ProcessManager, TaskManager.Token, installDetails: installDetails);

            var state = gitInstaller.SetupGitIfNeeded();

            state.Should().NotBeNull();

            Assert.AreEqual(gitInstallationPath.Combine(GitInstaller.GitInstallDetails.GitDirectory), state.GitInstallationPath);
            state.GitExecutablePath.Should().Be(gitInstallationPath.Combine(GitInstaller.GitInstallDetails.GitDirectory, "cmd", "git" + Environment.ExecutableExtension));
            state.GitLfsExecutablePath.Should().Be(gitInstallationPath.Combine(GitInstaller.GitInstallDetails.GitLfsDirectory, "git-lfs" + Environment.ExecutableExtension));

            Environment.GitInstallationState = state;

            var procTask = new SimpleProcessTask(TaskManager.Token, "something")
                           .Configure(ProcessManager);

            procTask.Process.StartInfo.EnvironmentVariables["PATH"].Should().StartWith(gitInstallationPath.ToString());
        }
Exemple #16
0
        protected void SetupGit(NPath pathToSetupGitInto, string testName)
        {
            var installDetails = new GitInstaller.GitInstallDetails(pathToSetupGitInto, Environment);
            var state          = installDetails.GetDefaults();

            Environment.GitInstallationState = state;
            GitClient = new GitClient(Environment, ProcessManager, TaskManager.Token);

            if (installDetails.GitExecutablePath.FileExists() && installDetails.GitLfsExecutablePath.FileExists())
            {
                return;
            }

            var key = installDetails.GitManifest.FileNameWithoutExtension + "_updatelastCheckTime";

            Environment.UserSettings.Set(key, DateTimeOffset.Now);

            var localCache = TestLocation.Combine("Resources");

            localCache.CopyFiles(pathToSetupGitInto, true);
            // skip checking for updates

            state.GitPackage = DugiteReleaseManifest.Load(installDetails.GitManifest, GitInstaller.GitInstallDetails.GitPackageFeed, Environment);
            var asset = state.GitPackage.DugitePackage;

            state.GitZipPath = installDetails.ZipPath.Combine(asset.Name);

            installDetails.GitInstallationPath.DeleteIfExists();

            state.GitZipPath.EnsureParentDirectoryExists();

            var gitExtractPath = TestBasePath.Combine("setup", "git_zip_extract_zip_paths").EnsureDirectoryExists();
            var source         = new UnzipTask(TaskManager.Token, state.GitZipPath, gitExtractPath, null, Environment.FileSystem)
                                 .RunSynchronously();

            installDetails.GitInstallationPath.EnsureParentDirectoryExists();
            source.Move(installDetails.GitInstallationPath);
        }
        public void GitLfsIsInstalledIfMissing()
        {
            var tempZipExtractPath     = TestBasePath.Combine("Temp", "git_zip_extract_zip_paths");
            var gitInstallationPath    = TestBasePath.Combine("GitInstall").Combine(GitInstaller.GitInstallDetails.GitDirectory);
            var gitLfsInstallationPath = TestBasePath.Combine("GitInstall").Combine(GitInstaller.GitInstallDetails.GitLfsDirectory);

            var gitZipUri  = new UriString($"http://localhost:{server.Port}/unity/git/windows/git-slim.zip");
            var downloader = new Downloader(Environment.FileSystem);

            downloader.QueueDownload(gitZipUri, tempZipExtractPath);
            downloader.RunSynchronously();

            var gitExtractPath = tempZipExtractPath.Combine("git").CreateDirectory();

            ZipHelper.Instance.Extract(tempZipExtractPath.Combine(gitZipUri.Filename), gitExtractPath, TaskManager.Token, null);
            var source = gitExtractPath;
            var target = gitInstallationPath;

            target.DeleteIfExists();
            target.EnsureParentDirectoryExists();
            source.Move(target);

            var installDetails = new GitInstaller.GitInstallDetails(gitInstallationPath.Parent, DefaultEnvironment.OnWindows)
            {
                GitPackageFeed    = "http://nope",
                GitLfsPackageFeed = $"http://localhost:{server.Port}/unity/git/windows/{GitInstaller.GitInstallDetails.GitLfsPackageName}",
            };

            var gitInstaller = new GitInstaller(Environment, ProcessManager, TaskManager.Token, installDetails: installDetails);

            var result = gitInstaller.SetupGitIfNeeded();

            result.Should().NotBeNull();

            Assert.AreEqual(gitInstallationPath, result.GitInstallationPath);
            result.GitExecutablePath.Should().Be(gitInstallationPath.Combine("cmd", "git" + Environment.ExecutableExtension));
            result.GitLfsExecutablePath.Should().Be(gitLfsInstallationPath.Combine("git-lfs" + Environment.ExecutableExtension));
        }