Skip to content

Commit bccdc27

Browse files
committed
Merge remote-tracking branch 'origin/opensrc/main' into open-main
2 parents 829782d + 1558edf commit bccdc27

4 files changed

Lines changed: 67 additions & 23 deletions

File tree

src/Codex.Application/CodexProgram.cs

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,49 @@
11
using System.Reflection;
22
using Codex.Application.Verbs;
33
using Codex.Storage;
4+
using Codex.Utilities;
45

56
namespace Codex.Application;
67

7-
public record CodexProgram : OperationBase
8+
public sealed record CodexProgram : CodexProgramBase
9+
{
10+
public override async ValueTask<int?> TryRunSpecialAsync(string[] args)
11+
{
12+
if (CodexLegacyProgram.LegacyVerbNames.Contains(args.FirstOrDefault()))
13+
{
14+
var program = new CodexLegacyProgram();
15+
return await program.RunAsync(args);
16+
}
17+
18+
return null;
19+
}
20+
}
21+
22+
public record CodexProgramBase : OperationBase
823
{
924
public static Task<int> Main(params string[] args)
1025
{
1126
return new CodexProgram().RunAsync(args);
1227
}
1328

29+
public virtual ValueTask<int?> TryRunSpecialAsync(string[] args)
30+
{
31+
return ValueTask.FromResult<int?>(null);
32+
}
33+
1434
public async Task<int> RunAsync(params string[] args)
1535
{
1636
Arguments = args;
17-
Console.WriteLine(Environment.CommandLine);
18-
Console.WriteLine("Args");
19-
Console.WriteLine(String.Join("\n", args));
20-
if (CodexLegacyProgram.LegacyVerbNames.Contains(args.FirstOrDefault()))
37+
if (!MiscUtilities.TryGetEnvironmentVariable("CODEX_DISABLE_PRINT_ARGS", out _))
2138
{
22-
var program = new CodexLegacyProgram();
23-
return await program.RunAsync(args);
39+
Console.WriteLine(Environment.CommandLine);
40+
Console.WriteLine("Args");
41+
Console.WriteLine(String.Join("\n", args));
2442
}
2543

44+
var result = await TryRunSpecialAsync(args);
45+
if (result.HasValue) return result.Value;
46+
2647
ParserResult<object> parsedArgs = ParseArgs();
2748

2849
if (parsedArgs.Tag == ParserResultType.NotParsed)
Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,8 @@
1-
using System;
2-
using System.Collections;
3-
using System.Collections.ObjectModel;
41
using Codex.Application;
5-
using Codex.Utilities;
6-
using CommandLine;
72

83
namespace Codex.Automation.Workflow;
94

10-
public record CliProgram : CodexProgram
5+
public record CliProgram : CodexProgramBase
116
{
12-
7+
138
}

src/Codex.Integration.Tests/UtilitiesTests.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,17 @@ public partial record UtilitiesTests(ITestOutputHelper output) : CodexTestBase(o
3030
{
3131
private static ISpanSerializer<SmallIntArray> ValueArraySerializer = new BinaryItemSerializer<SmallIntArray>();
3232

33+
[Fact]
34+
public void UriCombine()
35+
{
36+
test("https://local:234?hello=world", "relative/index", "https://local:234/relative/index?hello=world");
37+
38+
void test(string baseUri, string relativeUri, string expected, bool preserveBaseQuery = true, bool forcePreserveBaseQuery = false)
39+
{
40+
var actual = PathUtilities.Combine(baseUri, relativeUri, preserveBaseQuery, forcePreserveBaseQuery);
41+
actual.ToString().Should().Be(expected);
42+
}
43+
}
3344

3445
[Fact]
3546
public void AsymmetricEncryptionRoundtrip()

src/Codex.ObjectModel/Utilities/PathUtilities.cs

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,23 +41,40 @@ public static bool ToUriOrPath(Uri candidateUri, out Uri uri, out string path, s
4141
}
4242
}
4343

44-
public static Url Combine(this Url uri, string relativeUri)
44+
public static Url Combine(this Url baseUri, string relativeUri, bool preserveBaseQuery = true, bool forcePreserveBaseQuery = false)
4545
{
46-
var builder = uri.UriBuilder;
47-
builder.Path = UriCombine(builder.Path, relativeUri);
48-
return builder.Uri;
46+
return baseUri.Uri.Combine(relativeUri, preserveBaseQuery, forcePreserveBaseQuery);
4947
}
5048

51-
public static Uri Combine(this Uri uri, string relativeUri)
49+
public static Uri Combine(this Uri baseUri, string relativeUri, bool preserveBaseQuery = true, bool forcePreserveBaseQuery = false)
5250
{
53-
var builder = new UriBuilder(uri);
54-
builder.Path = UriCombine(builder.Path, relativeUri);
55-
return builder.Uri;
51+
if ((!forcePreserveBaseQuery || string.IsNullOrEmpty(baseUri.Query))
52+
&& relativeUri?.Contains(":") == true)
53+
{
54+
return new Uri(relativeUri);
55+
}
56+
57+
var result = new Uri(baseUri.EnsureTrailingSlash(), relativeUri);
58+
if (preserveBaseQuery && !string.IsNullOrEmpty(baseUri.Query))
59+
{
60+
var builder = new UriBuilder(result);
61+
builder.Query = CombineQuery(baseUri.Query, builder.Query);
62+
return builder.Uri;
63+
}
64+
65+
return result;
66+
}
67+
68+
public static string CombineQuery(string query1, string query2)
69+
{
70+
if (string.IsNullOrEmpty(query1)) return query2;
71+
else if (string.IsNullOrEmpty(query2)) return query1;
72+
else return $"{query1}&{query2.AsSpan().TrimStart('?')}";
5673
}
5774

5875
public static Uri RemoveQuery(Url uri)
5976
{
60-
return new Uri(uri.Uri.GetLeftPart(UriPartial.Path));
77+
return new Uri(uri.UriString.AsSpan().SubstringBeforeFirstIndexOfAny("?").ToString());
6178
}
6279

6380
public static Uri WithoutQuery(this Uri uri)

0 commit comments

Comments
 (0)