Skip to content

Commit fff4250

Browse files
authored
Merge pull request #8167 from michaelnebel/csharp/extractor-option-compress
C# Extractor Option for specifying compression.
2 parents 3681a1b + a0a2cde commit fff4250

File tree

6 files changed

+71
-5
lines changed

6 files changed

+71
-5
lines changed

csharp/codeql-extractor.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,16 @@ file_types:
1616
extensions:
1717
- .cs
1818
legacy_qltest_extraction: true
19+
options:
20+
trap:
21+
title: Options pertaining to TRAP.
22+
type: object
23+
properties:
24+
compression:
25+
title: Controls compression for the TRAP files written by the extractor.
26+
description: >
27+
This option is only intended for use in debugging the extractor. Accepted
28+
values are 'brotli' (the default, to write brotli-compressed TRAP), 'gzip', and 'none'
29+
(to write uncompressed TRAP).
30+
type: string
31+
pattern: "^(none|gzip|brotli)$"

csharp/extractor/Semmle.Extraction.CSharp/Extractor/Options.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ public static Options CreateWithEnvironment(string[] arguments)
4646
var argsList = new List<string>(arguments);
4747

4848
if (!string.IsNullOrEmpty(extractionOptions))
49+
{
4950
argsList.AddRange(extractionOptions.Split(' '));
51+
}
5052

5153
options.ParseArguments(argsList);
5254
return options;

csharp/extractor/Semmle.Extraction.Tests/Options.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public void DefaultOptions()
3333
Assert.False(options.ClrTracer);
3434
Assert.False(options.PDB);
3535
Assert.False(options.Fast);
36+
Assert.Equal(TrapWriter.CompressionMode.Brotli, options.TrapCompression);
3637
}
3738

3839
[Fact]
@@ -205,5 +206,25 @@ public void ArchiveArguments()
205206
File.Delete(file);
206207
}
207208
}
209+
210+
[Fact]
211+
public void CompressionTests()
212+
{
213+
Environment.SetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_OPTION_TRAP_COMPRESSION", "gzip");
214+
options = CSharp.Options.CreateWithEnvironment(Array.Empty<string>());
215+
Assert.Equal(TrapWriter.CompressionMode.Gzip, options.TrapCompression);
216+
217+
Environment.SetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_OPTION_TRAP_COMPRESSION", "brotli");
218+
options = CSharp.Options.CreateWithEnvironment(Array.Empty<string>());
219+
Assert.Equal(TrapWriter.CompressionMode.Brotli, options.TrapCompression);
220+
221+
Environment.SetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_OPTION_TRAP_COMPRESSION", "none");
222+
options = CSharp.Options.CreateWithEnvironment(Array.Empty<string>());
223+
Assert.Equal(TrapWriter.CompressionMode.None, options.TrapCompression);
224+
225+
Environment.SetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_OPTION_TRAP_COMPRESSION", null);
226+
options = CSharp.Options.CreateWithEnvironment(Array.Empty<string>());
227+
Assert.Equal(TrapWriter.CompressionMode.Brotli, options.TrapCompression);
228+
}
208229
}
209230
}

csharp/extractor/Semmle.Extraction/Options.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using Semmle.Util.Logging;
23
using Semmle.Util;
34

@@ -49,10 +50,11 @@ public abstract class CommonOptions : ICommandLineOptions
4950
/// </summary>
5051
public bool QlTest { get; private set; } = false;
5152

53+
5254
/// <summary>
5355
/// The compression algorithm used for trap files.
5456
/// </summary>
55-
public TrapWriter.CompressionMode TrapCompression { get; set; } = TrapWriter.CompressionMode.Brotli;
57+
public TrapWriter.CompressionMode TrapCompression { get; private set; } = TrapWriter.CompressionMode.Brotli;
5658

5759
public virtual bool HandleOption(string key, string value)
5860
{
@@ -64,6 +66,13 @@ public virtual bool HandleOption(string key, string value)
6466
case "verbosity":
6567
Verbosity = (Verbosity)int.Parse(value);
6668
return true;
69+
case "trap_compression":
70+
if (Enum.TryParse<TrapWriter.CompressionMode>(value, true, out var mode))
71+
{
72+
TrapCompression = mode;
73+
return true;
74+
}
75+
return false;
6776
default:
6877
return false;
6978
}
@@ -102,9 +111,6 @@ public virtual bool HandleFlag(string flag, bool value)
102111
case "qltest":
103112
QlTest = value;
104113
return true;
105-
case "brotli":
106-
TrapCompression = value ? TrapWriter.CompressionMode.Brotli : TrapWriter.CompressionMode.Gzip;
107-
return true;
108114
default:
109115
return false;
110116
}

csharp/extractor/Semmle.Util/CommandLineOptions.cs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using System.Collections.Generic;
23

34
namespace Semmle.Util
@@ -39,8 +40,26 @@ public interface ICommandLineOptions
3940

4041
public static class OptionsExtensions
4142
{
42-
public static void ParseArguments(this ICommandLineOptions options, IReadOnlyList<string> arguments)
43+
private static string? GetExtractorOption(string name) =>
44+
Environment.GetEnvironmentVariable($"CODEQL_EXTRACTOR_CSHARP_OPTION_{name.ToUpper()}");
45+
46+
private static List<string> GetExtractorOptions()
47+
{
48+
var extractorOptions = new List<string>();
49+
50+
var trapCompression = GetExtractorOption("trap_compression");
51+
if (!string.IsNullOrEmpty(trapCompression))
52+
{
53+
extractorOptions.Add($"--trap_compression:{trapCompression}");
54+
}
55+
56+
return extractorOptions;
57+
}
58+
59+
public static void ParseArguments(this ICommandLineOptions options, IReadOnlyList<string> providedArguments)
4360
{
61+
var arguments = GetExtractorOptions();
62+
arguments.AddRange(providedArguments);
4463
for (var i = 0; i < arguments.Count; ++i)
4564
{
4665
var arg = arguments[i];
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* The C# extractor now accepts an extractor option `trap.compression`, which is used to decide the compression format for TRAP files. The legal values are `brotli` (default), `gzip` or `none`.
5+
The option is added via `codeql database create --language=csharp -Otrap.compression=value ...`.

0 commit comments

Comments
 (0)