Skip to content

Commit a325d88

Browse files
committed
fixups
1 parent 839e1e7 commit a325d88

File tree

5 files changed

+64
-13
lines changed

5 files changed

+64
-13
lines changed

src/System.CommandLine.Suggest.Tests/DotnetSuggestEndToEndTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ await Process.ExecuteAsync(
155155

156156
stdOut.ToString()
157157
.Should()
158-
.Be($"--apple{NewLine}--banana{NewLine}--cherry{NewLine}--durian{NewLine}--version{NewLine}");
158+
.Be($"/?{NewLine}/h{NewLine}-?{NewLine}--apple{NewLine}--banana{NewLine}--cherry{NewLine}--durian{NewLine}-h{NewLine}--help{NewLine}--version{NewLine}");
159159
}
160160
}
161161
}

src/System.CommandLine.Tests/Help/HelpBuilderTests.cs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1118,7 +1118,37 @@ public void Help_option_is_shown_in_help()
11181118
var help = _console.Out.ToString();
11191119

11201120
help.Should()
1121-
.Contain($"--help{_columnPadding}Show help and usage information");
1121+
.Contain($"-?, -h, --help{_columnPadding}Show help and usage information");
1122+
}
1123+
1124+
[Fact]
1125+
public void Options_aliases_differing_only_by_prefix_are_deduplicated_favoring_dashed_prefixes()
1126+
{
1127+
var command = new RootCommand
1128+
{
1129+
new Option(new[] { "-x", "/x" })
1130+
};
1131+
1132+
_helpBuilder.Write(command);
1133+
1134+
var help = _console.Out.ToString();
1135+
1136+
help.Should().NotContain("/x");
1137+
}
1138+
1139+
[Fact]
1140+
public void Options_aliases_differing_only_by_prefix_are_deduplicated_favoring_double_dashed_prefixes()
1141+
{
1142+
var command = new RootCommand
1143+
{
1144+
new Option(new[] { "--long", "/long" })
1145+
};
1146+
1147+
_helpBuilder.Write(command);
1148+
1149+
var help = _console.Out.ToString();
1150+
1151+
help.Should().NotContain("/long");
11221152
}
11231153

11241154
#endregion Options

src/System.CommandLine.Tests/UseHelpTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public async Task UseHelp_does_not_display_when_option_defined_with_same_alias()
110110
public void There_are_no_parse_errors_when_help_is_invoked_on_root_command()
111111
{
112112
var parser = new CommandLineBuilder()
113-
.UseDefaults()
113+
.UseHelp()
114114
.Build();
115115

116116
var result = parser.Parse("-h");
@@ -129,7 +129,7 @@ public void There_are_no_parse_errors_when_help_is_invoked_on_subcommand()
129129
};
130130

131131
var parser = new CommandLineBuilder(command)
132-
.UseDefaults()
132+
.UseHelp()
133133
.Build();
134134

135135
var result = parser.Parse("subcommand -h");

src/System.CommandLine/Help/HelpBuilder.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System.Collections.Generic;
55
using System.CommandLine.IO;
6+
using System.CommandLine.Parsing;
67
using System.Linq;
78
using System.Text;
89
using System.Text.RegularExpressions;
@@ -331,8 +332,14 @@ protected virtual string ArgumentDescriptor(IArgument argument)
331332
/// <returns>A new <see cref="HelpItem"/></returns>
332333
private IEnumerable<HelpItem> GetOptionHelpItems(ISymbol symbol)
333334
{
334-
var rawAliases = symbol.RawAliases
335-
.OrderBy(alias => alias.Length);
335+
var rawAliases = symbol
336+
.RawAliases
337+
.Select(r => r.SplitPrefix())
338+
.OrderBy(r => r.alias)
339+
.ThenBy(r => r.prefix)
340+
.GroupBy(t => t.alias)
341+
.Select(t => t.First())
342+
.Select(t => $"{t.prefix}{t.alias}");
336343

337344
var invocation = string.Join(", ", rawAliases);
338345

src/System.CommandLine/Parsing/StringExtensions.cs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,30 @@ internal static bool ContainsCaseInsensitive(
2323
value ?? "",
2424
CompareOptions.OrdinalIgnoreCase) >= 0;
2525

26-
internal static string RemovePrefix(this string option)
26+
internal static string RemovePrefix(this string rawAlias)
2727
{
2828
foreach (var prefix in _optionPrefixStrings)
2929
{
30-
if (option.StartsWith(prefix))
30+
if (rawAlias.StartsWith(prefix))
3131
{
32-
return option.Substring(prefix.Length);
32+
return rawAlias.Substring(prefix.Length);
3333
}
3434
}
3535

36-
return option;
36+
return rawAlias;
37+
}
38+
39+
internal static (string prefix, string alias) SplitPrefix(this string rawAlias)
40+
{
41+
foreach (var prefix in _optionPrefixStrings)
42+
{
43+
if (rawAlias.StartsWith(prefix))
44+
{
45+
return (prefix, rawAlias.Substring(prefix.Length));
46+
}
47+
}
48+
49+
return (null, rawAlias);
3750
}
3851

3952
internal static TokenizeResult Tokenize(
@@ -171,9 +184,10 @@ bool CanBeUnbundled(string arg, out IEnumerable<string> replacement)
171184
return false;
172185
}
173186

174-
return arg.StartsWith("-") &&
175-
!arg.StartsWith("--") &&
176-
TryUnbundle(arg.RemovePrefix(), out replacement);
187+
var (prefix, alias) = arg.SplitPrefix();
188+
189+
return prefix == "-" &&
190+
TryUnbundle(alias, out replacement);
177191

178192
Token TokenForOptionAlias(char c) =>
179193
argumentDelimiters.Contains(c)

0 commit comments

Comments
 (0)