protected GitAuthentication.Result TryAuthenticate(ITracer tracer, ScalarEnlistment enlistment, out string authErrorMessage) { string authError = null; GitAuthentication.Result result = GitAuthentication.Result.UnableToDetermine; bool runResult = this.ShowStatusWhileRunning( () => { result = enlistment.Authentication.TryInitialize(tracer, enlistment, out authError); return(true); }, "Authenticating"); authErrorMessage = authError; return(result); }
private Result DoClone(string fullEnlistmentRootPathParameter, string normalizedEnlistmentRootPath) { Result cloneResult = null; cloneResult = this.TryCreateEnlistment(fullEnlistmentRootPathParameter, normalizedEnlistmentRootPath, out this.enlistment); if (!cloneResult.Success) { this.tracer.RelatedError($"Error while creating enlistment: {cloneResult.ErrorMessage}"); return(cloneResult); } this.tracer.AddLogFileEventListener( ScalarEnlistment.GetNewScalarLogFileName(this.enlistment.ScalarLogsRoot, ScalarConstants.LogFileTypes.Clone), EventLevel.Informational, Keywords.Any); this.tracer.WriteStartEvent( this.enlistment.EnlistmentRoot, this.enlistment.RepoUrl, this.CacheServerUrl, this.AddVerbDataToMetadata(new EventMetadata { { nameof(this.Branch), this.Branch }, { nameof(this.LocalCacheRoot), this.LocalCacheRoot }, { nameof(this.SingleBranch), this.SingleBranch }, { nameof(this.FullClone), this.FullClone }, { nameof(this.NoFetchCommitsAndTrees), this.NoFetchCommitsAndTrees }, { nameof(this.Unattended), this.Unattended }, { nameof(ScalarPlatform.Instance.IsElevated), ScalarPlatform.Instance.IsElevated() }, { "ProcessID", Process.GetCurrentProcess().Id }, { nameof(this.EnlistmentRootPathParameter), this.EnlistmentRootPathParameter }, { nameof(fullEnlistmentRootPathParameter), fullEnlistmentRootPathParameter }, })); this.cacheServerResolver = new CacheServerResolver(this.tracer, this.enlistment); this.cacheServer = this.cacheServerResolver.ParseUrlOrFriendlyName(this.CacheServerUrl); string resolvedLocalCacheRoot; if (string.IsNullOrWhiteSpace(this.LocalCacheRoot)) { if (!LocalCacheResolver.TryGetDefaultLocalCacheRoot(this.enlistment, out resolvedLocalCacheRoot, out string localCacheRootError)) { this.ReportErrorAndExit( this.tracer, $"Failed to determine the default location for the local Scalar cache: `{localCacheRootError}`"); } } else { resolvedLocalCacheRoot = Path.GetFullPath(this.LocalCacheRoot); } string authErrorMessage = null; GitAuthentication.Result authResult = GitAuthentication.Result.UnableToDetermine; // Do not try authentication on SSH URLs. if (this.enlistment.RepoUrl.StartsWith("https://")) { authResult = this.TryAuthenticate(this.tracer, this.enlistment, out authErrorMessage); } if (authResult == GitAuthentication.Result.UnableToDetermine) { // We can't tell, because we don't have the right endpoint! return(this.GitClone()); } if (authResult == GitAuthentication.Result.Failed) { this.ReportErrorAndExit(this.tracer, "Cannot clone because authentication failed: " + authErrorMessage); } this.retryConfig = this.GetRetryConfig(this.tracer, this.enlistment, TimeSpan.FromMinutes(RetryConfig.FetchAndCloneTimeoutMinutes)); this.serverScalarConfig = this.QueryScalarConfig(this.tracer, this.enlistment, this.retryConfig); this.cacheServer = this.ResolveCacheServer(this.tracer, this.cacheServer, this.cacheServerResolver, this.serverScalarConfig); this.ValidateClientVersions(this.tracer, this.enlistment, this.serverScalarConfig, showWarnings: true); using (this.objectRequestor = new GitObjectsHttpRequestor(this.tracer, this.enlistment, this.cacheServer, this.retryConfig)) { cloneResult = this.CreateScalarDirctories(resolvedLocalCacheRoot); if (!cloneResult.Success) { this.tracer.RelatedError(cloneResult.ErrorMessage); return(cloneResult); } this.ShowStatusWhileRunning( () => { cloneResult = this.CreateClone(); return(cloneResult.Success); }, "Cloning"); if (!cloneResult.Success) { this.tracer.RelatedError(cloneResult.ErrorMessage); return(cloneResult); } if (!this.NoFetchCommitsAndTrees) { ReturnCode result = this.Execute <RunVerb>( this.enlistment, verb => { verb.MaintenanceTask = ScalarConstants.VerbParameters.Maintenance.FetchTaskName; verb.SkipVersionCheck = true; verb.ResolvedCacheServer = this.cacheServer; verb.ServerScalarConfig = this.serverScalarConfig; }); if (result != ReturnCode.Success) { this.Output.WriteLine("\r\nError while fetching commits and trees @ {0}", fullEnlistmentRootPathParameter); return(cloneResult); } } this.ShowStatusWhileRunning( () => { cloneResult = this.CheckoutRepo(); return(cloneResult.Success); }, "Populating working directory"); } if (cloneResult.Success) { cloneResult = this.TryRegisterRepo(); } return(cloneResult); }