Пример #1
0
        public static void ShowInvocationExamples(ListOrHelpTemplateListResolutionResult templateResolutionResult, IHostSpecificDataLoader hostDataLoader, string commandName)
        {
            const int ExamplesToShow = 2;
            IReadOnlyList <string> preferredNameList = new List <string>()
            {
                "mvc"
            };
            int numShown = 0;

            IReadOnlyCollection <ITemplateMatchInfo> bestMatchedTemplates = templateResolutionResult.ExactMatchedTemplates;

            if (bestMatchedTemplates.Count == 0)
            {
                return;
            }

            IList <ITemplateInfo> templateList = bestMatchedTemplates.Select(x => x.Info).ToList();

            Reporter.Output.WriteLine("Examples:");
            HashSet <string> usedGroupIds = new HashSet <string>(StringComparer.OrdinalIgnoreCase);

            foreach (string preferredName in preferredNameList)
            {
                ITemplateInfo template = templateList.FirstOrDefault(x => string.Equals(x.ShortName, preferredName, StringComparison.OrdinalIgnoreCase));

                if (template != null)
                {
                    string identity = string.IsNullOrWhiteSpace(template.GroupIdentity) ? string.IsNullOrWhiteSpace(template.Identity) ? string.Empty : template.Identity : template.GroupIdentity;
                    if (usedGroupIds.Add(identity))
                    {
                        GenerateUsageForTemplate(template, hostDataLoader, commandName);
                        numShown++;
                    }
                }

                templateList.Remove(template);  // remove it so it won't get chosen again
            }

            // show up to 2 examples (total, including the above)
            Random rnd = new Random();

            for (int i = numShown; i < ExamplesToShow && templateList.Count > 0; i++)
            {
                int           index    = rnd.Next(0, templateList.Count - 1);
                ITemplateInfo template = templateList[index];
                string        identity = string.IsNullOrWhiteSpace(template.GroupIdentity) ? string.IsNullOrWhiteSpace(template.Identity) ? string.Empty : template.Identity : template.GroupIdentity;
                if (usedGroupIds.Add(identity) && !GenerateUsageForTemplate(template, hostDataLoader, commandName))
                {
                    --i;
                }

                templateList.Remove(template);  // remove it so it won't get chosen again
            }

            // show a help example
            Reporter.Output.WriteLine($"    dotnet {commandName} --help");

            // show a help example for template
            Reporter.Output.WriteLine($"    {HelpForTemplateResolution.GetTemplateHelpCommand(commandName, bestMatchedTemplates.First().Info)}");
        }
Пример #2
0
        public void TestGetTemplateResolutionResult_UniqueNameMatchesCorrectly()
        {
            List <ITemplateInfo> templatesToSearch = new List <ITemplateInfo>();

            templatesToSearch.Add(new TemplateInfo()
            {
                ShortName       = "console1",
                Name            = "Long name for Console App",
                Identity        = "Console.App",
                CacheParameters = new Dictionary <string, ICacheParameter>(),
                Tags            = new Dictionary <string, ICacheTag>()
            });
            templatesToSearch.Add(new TemplateInfo()
            {
                ShortName       = "console2",
                Name            = "Long name for Console App #2",
                Identity        = "Console.App2",
                CacheParameters = new Dictionary <string, ICacheParameter>(),
                Tags            = new Dictionary <string, ICacheTag>()
            });

            INewCommandInput userInputs = new MockNewCommandInput()
            {
                TemplateName        = "console2",
                IsListFlagSpecified = true
            };

            ListOrHelpTemplateListResolutionResult matchResult = TemplateListResolver.GetTemplateResolutionResultForListOrHelp(templatesToSearch, new MockHostSpecificDataLoader(), userInputs, null);

            Assert.True(matchResult.HasExactMatches);
            Assert.True(matchResult.HasUnambiguousTemplateGroup);
            Assert.Equal("console2", matchResult.UnambiguousTemplateGroup.Single().Info.ShortName);
            Assert.Equal("Console.App2", matchResult.UnambiguousTemplateGroup.Single().Info.Identity);
            Assert.Equal(1, matchResult.UnambiguousTemplateGroup.Count);
        }
Пример #3
0
        public static CreationResultStatus CoordinateHelpAndUsageDisplay(ListOrHelpTemplateListResolutionResult templateResolutionResult, IEngineEnvironmentSettings environmentSettings, INewCommandInput commandInput, IHostSpecificDataLoader hostDataLoader, ITelemetryLogger telemetryLogger, TemplateCreator templateCreator, string defaultLanguage, bool showUsageHelp = true)
        {
            if (showUsageHelp)
            {
                ShowUsageHelp(commandInput, telemetryLogger);
            }

            //in case only --help option is specified we don't need to show templates list
            if (commandInput.IsHelpFlagSpecified && string.IsNullOrEmpty(commandInput.TemplateName))
            {
                return(CreationResultStatus.Success);
            }

            // in case list is specified we always need to list templates
            if (commandInput.IsListFlagSpecified)
            {
                return(DisplayListOrHelpForAmbiguousTemplateGroup(templateResolutionResult, environmentSettings, commandInput, hostDataLoader, telemetryLogger, defaultLanguage));
            }
            else // help flag specified or no flag specified
            {
                if (!string.IsNullOrEmpty(commandInput.TemplateName) &&
                    templateResolutionResult.HasUnambiguousTemplateGroup)
                {
                    // This will show detailed help on the template group, which only makes sense if there is a single template group adn all templates are the same language.
                    return(DisplayHelpForUnambiguousTemplateGroup(templateResolutionResult, environmentSettings, commandInput, hostDataLoader, templateCreator, telemetryLogger, defaultLanguage));
                }
                else
                {
                    return(DisplayListOrHelpForAmbiguousTemplateGroup(templateResolutionResult, environmentSettings, commandInput, hostDataLoader, telemetryLogger, defaultLanguage));
                }
            }
        }
Пример #4
0
        public async Task <CreationResultStatus> CoordinateInvocationOrAcquisitionAsync()
        {
            EnsureTemplateResolutionResult();

            if (_templateToInvoke != null)
            {
                // invoke and then check for updates
                CreationResultStatus creationResult = await InvokeTemplateAsync();

                // check for updates on this template (pack)
                await CheckForTemplateUpdateAsync();

                return(creationResult);
            }
            else
            {
                // The command didn't resolve to an installed template. Search for something that does.
                bool anySearchMatches = await SearchForTemplateMatchesAsync();

                if (!anySearchMatches)
                {
                    ListOrHelpTemplateListResolutionResult listingTemplateListResolutionResult = TemplateListResolver.GetTemplateResolutionResultForListOrHelp(_settingsLoader.UserTemplateCache.TemplateInfo, _hostDataLoader, _commandInput, _defaultLanguage);
                    return(HelpForTemplateResolution.CoordinateHelpAndUsageDisplay(listingTemplateListResolutionResult, _environment, _commandInput, _hostDataLoader, _telemetryLogger, _templateCreator, _defaultLanguage, false));
                }
                else
                {
                    return(CreationResultStatus.Success);
                }
            }
        }
Пример #5
0
        private static CreationResultStatus DisplayHelpForUnambiguousTemplateGroup(ListOrHelpTemplateListResolutionResult templateResolutionResult, IEngineEnvironmentSettings environmentSettings, INewCommandInput commandInput, IHostSpecificDataLoader hostDataLoader, TemplateCreator templateCreator, ITelemetryLogger telemetryLogger, string defaultLanguage)
        {
            // sanity check: should never happen; as condition for unambiguous template group is checked above
            if (!templateResolutionResult.UnambiguousTemplateGroup.Any())
            {
                return(DisplayListOrHelpForAmbiguousTemplateGroup(templateResolutionResult, environmentSettings, commandInput, hostDataLoader, telemetryLogger, defaultLanguage));
            }

            //if language is specified and all templates in unambigiuos group match the language show the help for that template
            if (templateResolutionResult.AllTemplatesInUnambiguousTemplateGroupAreSameLanguage)
            {
                IReadOnlyCollection <ITemplateMatchInfo> unambiguousTemplateGroupForDetailDisplay = templateResolutionResult.UnambiguousTemplateGroup;
                return(TemplateDetailedHelpForSingularTemplateGroup(unambiguousTemplateGroupForDetailDisplay, environmentSettings, commandInput, hostDataLoader, templateCreator));
            }
            //if language is not specified and group has template that matches the language show the help for that the template that matches the language
            if (string.IsNullOrEmpty(commandInput.Language) && !string.IsNullOrEmpty(defaultLanguage) && templateResolutionResult.HasUnambiguousTemplateGroupForDefaultLanguage)
            {
                IReadOnlyCollection <ITemplateMatchInfo> unambiguousTemplateGroupForDetailDisplay = templateResolutionResult.UnambiguousTemplatesForDefaultLanguage;
                return(TemplateDetailedHelpForSingularTemplateGroup(unambiguousTemplateGroupForDetailDisplay, environmentSettings, commandInput, hostDataLoader, templateCreator));
            }
            else
            {
                return(DisplayListOrHelpForAmbiguousTemplateGroup(templateResolutionResult, environmentSettings, commandInput, hostDataLoader, telemetryLogger, defaultLanguage));
            }
        }
 private static void ShowContextAndTemplateNameMismatchHelp(ListOrHelpTemplateListResolutionResult templateResolutionResult, string templateName, string templateLanguage, string context, string baselineName)
 {
     if (string.IsNullOrEmpty(templateName) && string.IsNullOrEmpty(templateLanguage) && string.IsNullOrEmpty(context) && string.IsNullOrEmpty(baselineName))
     {
         return;
     }
     DisplayPartialNameMatchLanguageAndContextProblems(templateName, templateLanguage, context, templateResolutionResult, baselineName);
 }
Пример #7
0
        private static string GetPartialMatchReason(ListOrHelpTemplateListResolutionResult templateResolutionResult, INewCommandInput commandInput)
        {
            string separator = ", ";

            return(string.Join(separator,
                               SupportedFilterOptions.SupportedListFilters
                               .OfType <TemplateFilterOption>()
                               .Where(filter => filter.IsFilterSet(commandInput) && filter.MismatchCriteria(templateResolutionResult))
                               .Select(filter => $"{filter.Name}='{filter.FilterValue(commandInput)}'")));
        }
Пример #8
0
        public void TestGetTemplateResolutionResult_UnambiguousGroupIsFound()
        {
            List <ITemplateInfo> templatesToSearch = new List <ITemplateInfo>();

            templatesToSearch.Add(new TemplateInfo()
            {
                ShortName       = "console",
                Name            = "Long name for Console App",
                Identity        = "Console.App.L1",
                GroupIdentity   = "Console.App.Test",
                CacheParameters = new Dictionary <string, ICacheParameter>(),
                Tags            = new Dictionary <string, ICacheTag>(StringComparer.OrdinalIgnoreCase)
                {
                    { "language", ResolutionTestHelper.CreateTestCacheTag("L1") }
                }
            });
            templatesToSearch.Add(new TemplateInfo()
            {
                ShortName       = "console",
                Name            = "Long name for Console App",
                Identity        = "Console.App.L2",
                GroupIdentity   = "Console.App.Test",
                CacheParameters = new Dictionary <string, ICacheParameter>(),
                Tags            = new Dictionary <string, ICacheTag>(StringComparer.OrdinalIgnoreCase)
                {
                    { "language", ResolutionTestHelper.CreateTestCacheTag("L2") }
                }
            });
            templatesToSearch.Add(new TemplateInfo()
            {
                ShortName       = "console",
                Name            = "Long name for Console App",
                Identity        = "Console.App.L3",
                GroupIdentity   = "Console.App.Test",
                CacheParameters = new Dictionary <string, ICacheParameter>(),
                Tags            = new Dictionary <string, ICacheTag>(StringComparer.OrdinalIgnoreCase)
                {
                    { "language", ResolutionTestHelper.CreateTestCacheTag("L3") }
                }
            });

            INewCommandInput userInputs = new MockNewCommandInput()
            {
                TemplateName        = "console",
                IsListFlagSpecified = true
            };

            ListOrHelpTemplateListResolutionResult matchResult = TemplateListResolver.GetTemplateResolutionResultForListOrHelp(templatesToSearch, new MockHostSpecificDataLoader(), userInputs, null);

            Assert.True(matchResult.HasExactMatches);
            Assert.Equal(1, matchResult.ExactMatchedTemplatesGrouped.Count);
            Assert.Equal(3, matchResult.ExactMatchedTemplates.Count);
            Assert.True(matchResult.HasUnambiguousTemplateGroup);
            Assert.Equal(3, matchResult.UnambiguousTemplateGroup.Count);
        }
Пример #9
0
        private async Task <CreationResultStatus> EnterTemplateManipulationFlowAsync()
        {
            if (_commandInput.IsListFlagSpecified || _commandInput.IsHelpFlagSpecified)
            {
                ListOrHelpTemplateListResolutionResult listingTemplateResolutionResult = TemplateListResolver.GetTemplateResolutionResultForListOrHelp(_settingsLoader.UserTemplateCache.TemplateInfo, _hostDataLoader, _commandInput, _defaultLanguage);
                return(HelpForTemplateResolution.CoordinateHelpAndUsageDisplay(listingTemplateResolutionResult, EnvironmentSettings, _commandInput, _hostDataLoader, _telemetryLogger, _templateCreator, _defaultLanguage, showUsageHelp: _commandInput.IsHelpFlagSpecified));
            }

            TemplateListResolutionResult templateResolutionResult             = TemplateListResolver.GetTemplateResolutionResult(_settingsLoader.UserTemplateCache.TemplateInfo, _hostDataLoader, _commandInput, _defaultLanguage);
            TemplateInvocationAndAcquisitionCoordinator invocationCoordinator = new TemplateInvocationAndAcquisitionCoordinator(_settingsLoader, _commandInput, _templateCreator, _hostDataLoader, _telemetryLogger, _defaultLanguage, CommandName, _inputGetter, _callbacks);

            return(await invocationCoordinator.CoordinateInvocationOrAcquisitionAsync());
        }
Пример #10
0
        public void TestGetTemplateResolutionResult_MatchByTagsAndMismatchByFilter()
        {
            List <ITemplateInfo> templatesToSearch = new List <ITemplateInfo>();

            templatesToSearch.Add(new TemplateInfo()
            {
                ShortName       = "console",
                Name            = "Long name for Console App",
                Identity        = "Console.App.T1",
                GroupIdentity   = "Console.App.Test",
                CacheParameters = new Dictionary <string, ICacheParameter>(),
                Classifications = new List <string> {
                    "Common", "Test"
                },
                Tags = new Dictionary <string, ICacheTag>(StringComparer.OrdinalIgnoreCase)
                {
                    { "language", ResolutionTestHelper.CreateTestCacheTag("L1") },
                    { "type", ResolutionTestHelper.CreateTestCacheTag("project") }
                },
                BaselineInfo = new Dictionary <string, IBaselineInfo>()
                {
                    { "app", new BaselineInfo() },
                    { "standard", new BaselineInfo() }
                }
            });


            INewCommandInput userInputs = new MockNewCommandInput()
            {
                TemplateName        = "Common",
                IsListFlagSpecified = true,
                Language            = "L2",
                TypeFilter          = "item",
            };

            ListOrHelpTemplateListResolutionResult matchResult = TemplateListResolver.GetTemplateResolutionResultForListOrHelp(templatesToSearch, new MockHostSpecificDataLoader(), userInputs, null);

            Assert.False(matchResult.HasExactMatches);
            Assert.Equal(0, matchResult.ExactMatchedTemplatesGrouped.Count);
            Assert.Equal(0, matchResult.ExactMatchedTemplates.Count);
            Assert.True(matchResult.HasPartialMatches);
            Assert.Equal(1, matchResult.PartiallyMatchedTemplates.Count);
            Assert.Equal(1, matchResult.PartiallyMatchedTemplatesGrouped.Count);
            Assert.True(matchResult.HasLanguageMismatch);
            Assert.True(matchResult.HasContextMismatch);
            Assert.False(matchResult.HasBaselineMismatch);
        }
Пример #11
0
        public void TestGetTemplateResolutionResult_InputLanguageIsPreferredOverDefault()
        {
            List <ITemplateInfo> templatesToSearch = new List <ITemplateInfo>();

            templatesToSearch.Add(new TemplateInfo()
            {
                ShortName       = "console",
                Name            = "Long name for Console App",
                Identity        = "Console.App.L1",
                GroupIdentity   = "Console.App.Test",
                CacheParameters = new Dictionary <string, ICacheParameter>(),
                Tags            = new Dictionary <string, ICacheTag>(StringComparer.OrdinalIgnoreCase)
                {
                    { "language", ResolutionTestHelper.CreateTestCacheTag("L1") }
                }
            });
            templatesToSearch.Add(new TemplateInfo()
            {
                ShortName       = "console",
                Name            = "Long name for Console App",
                Identity        = "Console.App.L2",
                GroupIdentity   = "Console.App.Test",
                CacheParameters = new Dictionary <string, ICacheParameter>(),
                Tags            = new Dictionary <string, ICacheTag>(StringComparer.OrdinalIgnoreCase)
                {
                    { "language", ResolutionTestHelper.CreateTestCacheTag("L2") }
                }
            });

            INewCommandInput userInputs = new MockNewCommandInput()
            {
                TemplateName        = "console",
                IsListFlagSpecified = true,
                Language            = "L2"
            };

            ListOrHelpTemplateListResolutionResult matchResult = TemplateListResolver.GetTemplateResolutionResultForListOrHelp(templatesToSearch, new MockHostSpecificDataLoader(), userInputs, "L1");

            Assert.True(matchResult.HasExactMatches);
            Assert.True(matchResult.HasUnambiguousTemplateGroup);
            Assert.Equal("console", matchResult.UnambiguousTemplateGroup.Single().Info.ShortName);
            Assert.Equal("Console.App.L2", matchResult.UnambiguousTemplateGroup.Single().Info.Identity);
            Assert.Equal("L2", matchResult.UnambiguousTemplateGroup.Single().Info.Tags["language"].ChoicesAndDescriptions.Keys.FirstOrDefault());
            Assert.Equal(1, matchResult.UnambiguousTemplateGroup.Count);
        }
Пример #12
0
        // TODO: make sure help / usage works right in these cases.
        private CreationResultStatus EnterMaintenanceFlow()
        {
            if (!TemplateListResolver.ValidateRemainingParameters(_commandInput, out IReadOnlyList <string> invalidParams))
            {
                HelpForTemplateResolution.DisplayInvalidParameters(invalidParams);
                if (_commandInput.IsHelpFlagSpecified)
                {
                    // this code path doesn't go through the full help & usage stack, so needs it's own call to ShowUsageHelp().
                    HelpForTemplateResolution.ShowUsageHelp(_commandInput, _telemetryLogger);
                }
                else
                {
                    Reporter.Error.WriteLine(string.Format(LocalizableStrings.RunHelpForInformationAboutAcceptedParameters, CommandName).Bold().Red());
                }

                return(CreationResultStatus.InvalidParamValues);
            }

            if (_commandInput.ToUninstallList != null)
            {
                return(EnterUninstallFlow());
            }

            if (_commandInput.ToInstallList != null && _commandInput.ToInstallList.Count > 0 && _commandInput.ToInstallList[0] != null)
            {
                CreationResultStatus installResult = EnterInstallFlow();

                if (installResult == CreationResultStatus.Success)
                {
                    _settingsLoader.Reload();
                    ListOrHelpTemplateListResolutionResult resolutionResult = TemplateListResolver.GetTemplateResolutionResultForListOrHelp(_settingsLoader.UserTemplateCache.TemplateInfo, _hostDataLoader, _commandInput, _defaultLanguage);
                    HelpForTemplateResolution.CoordinateHelpAndUsageDisplay(resolutionResult, EnvironmentSettings, _commandInput, _hostDataLoader, _telemetryLogger, _templateCreator, _defaultLanguage, showUsageHelp: false);
                }

                return(installResult);
            }

            // No other cases specified, we've fallen through to "Optional usage help + List"
            ListOrHelpTemplateListResolutionResult templateResolutionResult = TemplateListResolver.GetTemplateResolutionResultForListOrHelp(_settingsLoader.UserTemplateCache.TemplateInfo, _hostDataLoader, _commandInput, _defaultLanguage);

            HelpForTemplateResolution.CoordinateHelpAndUsageDisplay(templateResolutionResult, EnvironmentSettings, _commandInput, _hostDataLoader, _telemetryLogger, _templateCreator, _defaultLanguage, showUsageHelp: _commandInput.IsHelpFlagSpecified);

            return(CreationResultStatus.Success);
        }
        public async Task <CreationResultStatus> CoordinateInvocationOrAcquisitionAsync()
        {
            EnsureTemplateResolutionResult();

            if (_templateToInvoke != null)
            {
                // invoke and then check for updates
                CreationResultStatus creationResult = await InvokeTemplateAsync();

                // check for updates on this template (pack)
                await CheckForTemplateUpdateAsync();

                return(creationResult);
            }
            else
            {
                ListOrHelpTemplateListResolutionResult listingTemplateListResolutionResult = TemplateListResolver.GetTemplateResolutionResultForListOrHelp(_settingsLoader.UserTemplateCache.TemplateInfo, _hostDataLoader, _commandInput, _defaultLanguage);
                return(HelpForTemplateResolution.CoordinateHelpAndUsageDisplay(listingTemplateListResolutionResult, _environment, _commandInput, _hostDataLoader, _telemetryLogger, _templateCreator, _defaultLanguage, false));
            }
        }
        private static string GetPartialMatchReason(ListOrHelpTemplateListResolutionResult templateResolutionResult, string templateLanguage, string context, string baselineName)
        {
            StringBuilder reason    = new StringBuilder();
            string        separator = ", ";

            if (templateResolutionResult.HasLanguageMismatch)
            {
                reason.Append(separator).AppendFormat($"language='{templateLanguage}'");
            }
            if (templateResolutionResult.HasContextMismatch)
            {
                reason.Append(separator).AppendFormat($"type='{context}'");
            }
            if (templateResolutionResult.HasBaselineMismatch)
            {
                reason.Append(separator).AppendFormat($"baseline='{baselineName}'");
            }

            return(reason.Length != 0
                ? reason.ToString(separator.Length, reason.Length - separator.Length)
                : string.Empty);
        }
Пример #15
0
        public void TestGetTemplateResolutionResult_TemplateWithoutTypeShouldNotBeMatchedForContextFilter()
        {
            List <ITemplateInfo> templatesToSearch = new List <ITemplateInfo>();

            templatesToSearch.Add(new TemplateInfo()
            {
                ShortName       = "console",
                Name            = "Long name for Console App",
                Identity        = "Console.App.T1",
                GroupIdentity   = "Console.App.Test",
                CacheParameters = new Dictionary <string, ICacheParameter>(),
                Classifications = new List <string> {
                    "Common", "Test"
                },
                Tags = new Dictionary <string, ICacheTag>()
            });


            INewCommandInput userInputs = new MockNewCommandInput()
            {
                TemplateName        = "Common",
                IsListFlagSpecified = true,

                TypeFilter = "item",
            };

            ListOrHelpTemplateListResolutionResult matchResult = TemplateListResolver.GetTemplateResolutionResultForListOrHelp(templatesToSearch, new MockHostSpecificDataLoader(), userInputs, null);

            Assert.False(matchResult.HasExactMatches);
            Assert.Equal(0, matchResult.ExactMatchedTemplatesGrouped.Count);
            Assert.Equal(0, matchResult.ExactMatchedTemplates.Count);
            Assert.True(matchResult.HasPartialMatches);
            Assert.Equal(1, matchResult.PartiallyMatchedTemplates.Count);
            Assert.Equal(1, matchResult.PartiallyMatchedTemplatesGrouped.Count);
            Assert.False(matchResult.HasLanguageMismatch);
            Assert.True(matchResult.HasContextMismatch);
            Assert.False(matchResult.HasBaselineMismatch);
        }
Пример #16
0
        private static void ShowContextAndTemplateNameMismatchHelp(ListOrHelpTemplateListResolutionResult templateResolutionResult, INewCommandInput commandInput)
        {
            if (string.IsNullOrEmpty(commandInput.TemplateName) && SupportedFilterOptions.SupportedListFilters.All(filter => !filter.IsFilterSet(commandInput)))
            {
                return;
            }
            bool anythingReported = false;

            if (templateResolutionResult.HasExactMatches)
            {
                return;
            }
            else
            {
                ShowNoTemplatesFoundMessage(commandInput);
                anythingReported = true;
            }

            if (templateResolutionResult.HasPartialMatches)
            {
                // {0} template(s) partially matched, but failed on {1}.
                Reporter.Error.WriteLine(
                    string.Format(
                        LocalizableStrings.TemplatesNotValidGivenTheSpecifiedFilter,
                        templateResolutionResult.PartiallyMatchedTemplatesGrouped.Count,
                        GetPartialMatchReason(templateResolutionResult, commandInput))
                    .Bold().Red());

                anythingReported = true;
            }

            if (anythingReported)
            {
                Reporter.Error.WriteLine();
            }
        }
        private static void DisplayPartialNameMatchLanguageAndContextProblems(string templateName, string templateLanguage, string context, ListOrHelpTemplateListResolutionResult templateResolutionResult, string baselineName)
        {
            bool anythingReported = false;

            if (templateResolutionResult.HasExactMatches)
            {
                return;
            }
            else
            {
                //
                ShowNoTemplatesFoundMessage(templateName, templateLanguage, context, baselineName);
                anythingReported = true;
            }

            if (templateResolutionResult.HasPartialMatches)
            {
                // {0} template(s) partially matched, but failed on {1}.
                Reporter.Error.WriteLine(
                    string.Format(
                        LocalizableStrings.TemplatesNotValidGivenTheSpecifiedFilter,
                        templateResolutionResult.PartiallyMatchedTemplatesGrouped.Count,
                        GetPartialMatchReason(templateResolutionResult, templateLanguage, context, baselineName))
                    .Bold().Red());

                anythingReported = true;
            }

            if (anythingReported)
            {
                Reporter.Error.WriteLine();
            }
        }
Пример #18
0
        private static CreationResultStatus DisplayListOrHelpForAmbiguousTemplateGroup(ListOrHelpTemplateListResolutionResult templateResolutionResult, IEngineEnvironmentSettings environmentSettings, INewCommandInput commandInput, IHostSpecificDataLoader hostDataLoader, ITelemetryLogger telemetryLogger, string defaultLanguage)
        {
            // The following occurs when:
            //      --alias <value> is specifed
            //      --help is specified
            //      template (group) can't be resolved
            if (!string.IsNullOrWhiteSpace(commandInput.Alias))
            {
                Reporter.Error.WriteLine(LocalizableStrings.InvalidInputSwitch.Bold().Red());
                Reporter.Error.WriteLine("  " + commandInput.TemplateParamInputFormat("--alias").Bold().Red());
                return(CreationResultStatus.NotFound);
            }

            bool hasInvalidParameters = false;
            IReadOnlyCollection <ITemplateMatchInfo> templatesForDisplay = templateResolutionResult.ExactMatchedTemplates;

            GetParametersInvalidForTemplatesInList(templatesForDisplay, out IReadOnlyList <string> invalidForAllTemplates, out IReadOnlyList <string> invalidForSomeTemplates);
            if (invalidForAllTemplates.Any() || invalidForSomeTemplates.Any())
            {
                hasInvalidParameters = true;
                DisplayInvalidParameters(invalidForAllTemplates);
                DisplayParametersInvalidForSomeTemplates(invalidForSomeTemplates, LocalizableStrings.PartialTemplateMatchSwitchesNotValidForAllMatches);
            }


            if (templateResolutionResult.HasExactMatches)
            {
                IReadOnlyCollection <IGrouping <string, ITemplateMatchInfo> > groupedTemplatesForDisplay = templateResolutionResult.ExactMatchedTemplatesGrouped;
                ShowTemplatesFoundMessage(commandInput);
                DisplayTemplateList(groupedTemplatesForDisplay, environmentSettings, commandInput, defaultLanguage);
            }
            else
            {
                ShowContextAndTemplateNameMismatchHelp(templateResolutionResult, commandInput);
            }

            if (!commandInput.IsListFlagSpecified)
            {
                TemplateUsageHelp.ShowInvocationExamples(templateResolutionResult, hostDataLoader, commandInput.CommandName);
            }

            if (hasInvalidParameters)
            {
                return(CreationResultStatus.NotFound);
            }
            else if (commandInput.IsListFlagSpecified || commandInput.IsHelpFlagSpecified)
            {
                return(templateResolutionResult.HasExactMatches ? CreationResultStatus.Success : CreationResultStatus.NotFound);
            }
            else
            {
                return(CreationResultStatus.OperationNotSpecified);
            }
        }