This is an archive of the discontinued LLVM Phabricator instance.

[clang-format] Add option to explicitly specify a config file
ClosedPublic

Authored by zwliew on Jan 7 2020, 5:39 AM.
Tokens
"Yellow Medal" token, awarded by fdwr.

Details

Summary

This diff extends the -style=file option to allow a config file to be specified explicitly. This is useful (for instance) when adding IDE commands to reformat code to a personal style.

Usage: clang-format -style=file:<path/to/config/file> ...

Diff Detail

Event Timeline

There are a very large number of changes, so older changes are hidden. Show Older Changes
tnorth retitled this revision from Rebased on master: Add option to specify explicit config file to [clang-format] Rebased on master: Add option to specify explicit config file.Jan 7 2020, 5:41 AM
tnorth edited the summary of this revision. (Show Details)
tnorth added reviewers: djasper, ioeric, krasimir.

In principle, I think this is something that might help a lot of people as I've seen people asking for a better mechanism to be able to load a centrally stored .clang-format file.

but maybe wait a couple of days for others to comment @klimek , @mitchell-stellar , @sammccall ...

Also you need to make full context diffs, plus please add a release note, and because I can't check the full diff, I'm unsure if your Format.h change means we need to regenerate anything in the ClangFormatStyleOptions.rst

In this patch, relative paths are relative to the working directory (or at least the current directory of the VFS).

This makes sense for command-line args, but if I understand correctly this patch will also allow BasedOnStyle: file:some/path. Is that the case?
In that case, interpreting paths relative to the working directory seems suspicious. I'd suggest one of:

  • BasedOnStyle: file:... is not allowed
  • BasedOnStyle: file:... must be an absolute path (note this probably means it's not portable across OSs)
  • BasedOnStyle: file:relative/path is relative to the current config file, or working directory if the current config file is inline in command line args.
include/clang/Format/Format.h
2329 ↗(On Diff #236561)

Please upload using full context (e.g. with arc diff)

2332 ↗(On Diff #236561)

why does this need to be a public API?

2343 ↗(On Diff #236561)

this function isn't implemented - LoadConfigFile vs loadConfigFile

lib/Format/Format.cpp
2573 ↗(On Diff #236561)

Expected<FormatStyle> or ErrorOr<FormatStyle> would be a better return type for this function I think.
Read isn't going to return unsuitable, so plumbing through multiple error codes doesn't seem worthwhile.

2613 ↗(On Diff #236561)

just slice the stringref rather than copy here?

2615 ↗(On Diff #236561)

why stat the file and check, rather than just try to read it?

unittests/Format/FormatTest.cpp
14370 ↗(On Diff #236561)

Can you add this via a real absolute path, to show this is actually relative path handling (and not just naive string manipulation by memory file system etc)

tnorth updated this revision to Diff 238513.Jan 16 2020, 8:46 AM

Thanks for your time and feedback.

  • Update diff with context,
  • remove public declaration of LoadConfigFile,
  • change prototype of LoadConfigFile and simplify it,
  • avoid string copy to ConfigFile, use StringRef directly,
  • don't stat the file before attempting to read it.

Regarding the tests, I am unsure how to do this currenlty (I'd need to read some docs/other examples).
I didn't have in mind the use case of BasedOnStyle: file:some/path.

Herald added a project: Restricted Project. · View Herald TranscriptJan 16 2020, 8:46 AM
Herald added a subscriber: cfe-commits. · View Herald Transcript
MyDeveloperDay added a project: Restricted Project.Jan 19 2020, 8:04 AM
tnorth updated this revision to Diff 240888.Jan 28 2020, 7:40 AM
  • Add a unit-test loading a format and test file from temporary files.
tnorth marked 7 inline comments as done.Jan 28 2020, 7:46 AM

This makes sense for command-line args, but if I understand correctly this patch will also allow BasedOnStyle: file:some/path. Is that the case?

No, it should not, and I also think it's better not to.

I think that all points are addressed now. Looking forward to have your feedback.

Nit: please add a release note and regenerate the ClangFormatStyleOptions.rst (if there are any changes because you modified Format.h).

tnorth updated this revision to Diff 241155.Jan 29 2020, 7:14 AM
  • Add release notes
  • Update ClangFormat.rst and ClangFormatStyleOption.rst

Nit: please add a release note and regenerate the ClangFormatStyleOptions.rst (if there are any changes because you modified Format.h).

Hmm, I tried to run docs/tools/dump_format_style.py, but it fails at two locations (once because a comment in Format.h has two slashes instead of 3, one because of an empty line). After fixing those, it seems that the generated file contains less information than the commited one. This file was probably updated manually as well. Therefore I also did in the updated diff... one should probably fix this separately.
Release note + ClangFormat.rst files update in the diff as well.

MyDeveloperDay accepted this revision.Feb 5 2020, 12:11 PM

In the absence of any other comments, This LGTM, this may help to resolve D68569: [clang-format] Also look for .{ext}.clang-format file, I think I prefer this solution.

This revision is now accepted and ready to land.Feb 5 2020, 12:11 PM

Ping. I guess we need more approval to go forward?

lebedev.ri added inline comments.
include/clang/Format/Format.h
2341 ↗(On Diff #241155)

So is it : or =?

tnorth updated this revision to Diff 245592.Feb 20 2020, 12:15 AM

Fix comment to file:<configfile> instead of the incorrect file=<configfile>

tnorth marked 2 inline comments as done.Feb 20 2020, 12:16 AM
tnorth added inline comments.
include/clang/Format/Format.h
2341 ↗(On Diff #241155)

: is correct, fixed.

tnorth marked an inline comment as done.Feb 20 2020, 12:43 AM
tnorth added a comment.Mar 6 2020, 6:52 AM

Thanks @MyDeveloperDay . I guess more approvals are needed at this point?

It's not more approval that is needed, it's just that someone with commit access (assuming you do not) needs to find the time to commit this. For what it's worth, I'm getting a patch rejection for the 4th block in lib/Format/Format.cpp. It seems the contents of LoadConfigFile need to be updated to reflect the most recent changes, so please rebase against master when you can.

tnorth updated this revision to Diff 249616.Mar 11 2020, 7:19 AM

Rebased on master (6d5603e2). Some refactoring was indeed needed.

This revision was automatically updated to reflect the committed changes.
mitchell-stellar reopened this revision.Mar 11 2020, 1:18 PM

Reverted this commit due to an unexpected test failure:

******************** TEST 'Clang :: Format/dump-config-objc.h' FAILED ********************
Script:
--
: 'RUN: at line 1';   /b/1/clang-x86_64-debian-fast/llvm.obj/bin/clang-format -dump-config /b/1/clang-x86_64-debian-fast/llvm.src/clang/test/Format/dump-config-objc.h | /b/1/clang-x86_64-debian-fast/llvm.obj/bin/FileCheck /b/1/clang-x86_64-debian-fast/llvm.src/clang/test/Format/dump-config-objc.h
--
Exit Code: 1

Command Output (stderr):
--
/b/1/clang-x86_64-debian-fast/llvm.src/clang/test/Format/dump-config-objc.h:3:11: error: CHECK: expected string not found in input
// CHECK: Language: ObjC
          ^
<stdin>:1:1: note: scanning from here
---
^
<stdin>:2:1: note: possible intended match here
Language: Cpp
^

--

********************

I don't know enough about this patch in order to determine what the issue is, or how to proceed further. Perhaps @MyDeveloperDay will chime in.

This revision is now accepted and ready to land.Mar 11 2020, 1:18 PM

Ping @MyDeveloperDay , any clue about what's going on here?

MyDeveloperDay added inline comments.Apr 7 2020, 7:05 AM
clang/lib/Format/Format.cpp
3244

if you return here IsSuitable will be true..

3251

again here you need to set IsSutable to false

3253

maybe its better just to set this to true here *IsSuitable = true; and set it to false on line @2695

3365

this could then mean you return with something wrong here..

MyDeveloperDay added inline comments.Apr 16 2020, 2:14 AM
clang/lib/Format/Format.cpp
3248

I think this isn't needed won't it already be false from line @2695

tnorth updated this revision to Diff 258029.Apr 16 2020, 5:56 AM

Were you able to rerun these tests?

MyDeveloperDay added a comment.EditedApr 30 2020, 4:41 AM

These tests still fail

running the following in the build directory (if your build directory is side-by-side with the llvm-project directory):

c:/Python37/python ./bin/llvm-lit.py -v ./tools/clang/test/Format

$ ./run_format_lit_tests.sh
llvm-lit.py: C:\cygwin64\buildareas\clang\build\bin\..\..\llvm-project\llvm\utils\lit\lit\llvm\config.py:343: note: using clang: c:\cygwin64\buildareas\clang\build\bin\clang.exe
-- Testing: 21 tests, 12 workers --
PASS: Clang :: Format/cursor.cpp (1 of 21)
FAIL: Clang :: Format/dump-config-objc.h (2 of 21)
******************** TEST 'Clang :: Format/dump-config-objc.h' FAILED ********************
Script:
--
: 'RUN: at line 1';   c:\cygwin64\buildareas\clang\build\bin\clang-format.exe -dump-config C:\cygwin64\buildareas\clang\llvm-project\clang\test\Format\dump-config-objc.h | c:\cygwin64\buildareas\clang\build\bin\filecheck.exe C:\cygwin64\buildareas\clang\llvm-project\clang\test\Format\dump-config-objc.h
--
Exit Code: 1

Command Output (stdout):
--
$ ":" "RUN: at line 1"
$ "c:\cygwin64\buildareas\clang\build\bin\clang-format.exe" "-dump-config" "C:\cygwin64\buildareas\clang\llvm-project\clang\test\Format\dump-config-objc.h"
$ "c:\cygwin64\buildareas\clang\build\bin\filecheck.exe" "C:\cygwin64\buildareas\clang\llvm-project\clang\test\Format\dump-config-objc.h"
# command stderr:
C:\cygwin64\buildareas\clang\llvm-project\clang\test\Format\dump-config-objc.h:3:11: error: CHECK: expected string not found in input
// CHECK: Language: ObjC
          ^
<stdin>:1:1: note: scanning from here
---
^
<stdin>:2:1: note: possible intended match here
Language: Cpp
^

error: command failed with exit status: 1

--

********************
MyDeveloperDay requested changes to this revision.Apr 30 2020, 5:15 AM
MyDeveloperDay added inline comments.
clang/lib/Format/Format.cpp
3237

pass Style in, don't keep assuming LLVM

3238

You cannot keep assuming the style is LLVM, Style needs to be passed in

/// Attempts to load a format file
llvm::Expected<FormatStyle> LoadConfigFile(StringRef ConfigFile,
                                           llvm::vfs::FileSystem *FS,
                                           bool *IsSuitable,
                                           FormatStyle Style) {
  *IsSuitable = false;

  llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Text =
      FS->getBufferForFile(ConfigFile.str());
  if (std::error_code EC = Text.getError())
    return make_string_error(EC.message());
  std::error_code ParserErrorCode =
      parseConfiguration(Text.get()->getBuffer(), &Style);
  if (ParserErrorCode == ParseError::Unsuitable) {
    return Style;
  } else if (ParserErrorCode != ParseError::Success) {
    return make_string_error("Error reading " + ConfigFile + ": " +
                             ParserErrorCode.message());
  }
  *IsSuitable = true;
  return Style;
}

Now your code will read
// User provided clang-format file using -style=file:/path/to/format/file
// Check for explicit config filename
if (StyleName.startswith_lower("file:")) {
  auto StyleNameFile = StyleName.substr(5);
  bool IsSuitable = true;
  auto FileStyle = LoadConfigFile(StyleNameFile, FS, &IsSuitable, Style);
  if (FileStyle && !IsSuitable) {
    return make_string_error("Configuration file(s) do(es) not support " +
                             getLanguageName((*FileStyle).Language) + ": " +
                             StyleNameFile);
  }
  return FileStyle;
}
`

And then in the loop of files you pass the Style in too
if (auto ConfigStyle =

LoadConfigFile(ConfigFile, FS, &IsSuitable, Style)) {
3286

pass Style in and rename return value

3336

We should probably keep something like this so we know which config file we are loading

3358

Pass current Style in

This revision now requires changes to proceed.Apr 30 2020, 5:15 AM

ping @tnorth are you planning on fixing this as its currently reverted.

@tnorth Are you planning on working on this or do you mind if one of us fixes the issues enough to get it over the line. (this was previously accepted and landed but the unit tests fail, for what looks like a fairly minor issue)

MyDeveloperDay edited reviewers, added: HazardyKnusperkeks, curdeius, owenpan; removed: Restricted Project, djasper.Nov 24 2021, 3:30 AM

After rebasing these tests seem to work (on Windows)

-- Testing: 24 tests, 16 workers --
PASS: Clang :: Format/dry-run-alias.cpp (1 of 24)
PASS: Clang :: Format/remove-duplicate-includes.cpp (2 of 24)
PASS: Clang :: Format/disable-format.cpp (3 of 24)
PASS: Clang :: Format/cursor.cpp (4 of 24)
PASS: Clang :: Format/multiple-inputs.cpp (5 of 24)
PASS: Clang :: Format/basic.cpp (6 of 24)
PASS: Clang :: Format/incomplete.cpp (7 of 24)
PASS: Clang :: Format/line-ranges.cpp (8 of 24)
PASS: Clang :: Format/adjust-indent.cpp (9 of 24)
UNSUPPORTED: Clang :: Format/style-on-command-line.cpp (10 of 24)
PASS: Clang :: Format/ranges.cpp (11 of 24)
PASS: Clang :: Format/access-modifiers.cpp (12 of 24)
PASS: Clang :: Format/multiple-inputs-error.cpp (13 of 24)
PASS: Clang :: Format/dump-config-objc.h (14 of 24)
PASS: Clang :: Format/xmloutput.cpp (15 of 24)
PASS: Clang :: Format/dump-config-cxx.h (16 of 24)
PASS: Clang :: Format/multiple-inputs-inplace.cpp (17 of 24)
PASS: Clang :: Format/error-config.cpp (18 of 24)
PASS: Clang :: Format/dry-run.cpp (19 of 24)
PASS: Clang :: Format/inplace.cpp (20 of 24)
PASS: Clang :: Format/dump-config-list-override.cpp (21 of 24)
PASS: Clang :: Format/disable-include-sorting.cpp (22 of 24)
PASS: Clang :: Format/language-detection.cpp (23 of 24)
PASS: Clang :: Format/verbose.cpp (24 of 24)

I'm going to Commandeer this revision and see if we can't get this relanded.

MyDeveloperDay commandeered this revision.Nov 24 2021, 6:32 AM
MyDeveloperDay edited reviewers, added: tnorth; removed: MyDeveloperDay.
This revision now requires review to proceed.Nov 24 2021, 6:32 AM

Rebasing previously landed but reverted commit

clang/lib/Format/Format.cpp
3281

part of me wonders if this format should be

file://<path> rather than file:<path>

User provided clang-format file using -style=file:///path/to/format/file

vs

User provided clang-format file using -style=file:/path/to/format/file

This would leave the way open to other protocols http:// or https:// or anything else.

clang/lib/Format/Format.cpp
3281

Maybe, but I doubt we want http. And if we use file:// a windows path D:\Path\ would not be valid, would it?

MyDeveloperDay added a comment.EditedNov 25 2021, 7:40 AM

The reason I have picked this us was because of:

https://twitter.com/bruxisma/status/1462987809879257101

This slightly annoys me because :

a) What they were talking about was in my view is disrespectful and inaccurate.
b) I thought we'd already landed this (which we had)

I went looking for this review which had previously been accepted and landed, but got reverted because it seemed to fail the tests

The original author and the original-original-author has both obviously moved on and dropped it and so it didn't get fixed.

I don't like wasting all that effort, especailly if we are going to get grief for it. So I rebased the review so we can land it again, (and checked both the unit tests and lit tests)

I hope we don't have to go around the houses on this too much.

clang/lib/Format/Format.cpp
3281

yes file://C:\Windows\Kernel32.dll is a valid file url.

but I on reflection I think file: will be ok.

Hi there,
Yes, sorry for the long silence, I ended up not having time to come back to this anymore for personal reasons. I also lack familiarity with the codebase and tests, and I couldn't invest more time into it; I had the impression that this last failing test would require major changes.
I'm happy if this ends up being merged. Thanks for your time and guidance again.

Ping! Could we see this previously approved patch over the line I’d like to use it to build a regression suit of code and format files without the need for every test to be in its own directory

clang/lib/Format/Format.cpp
3249

else after return

But I prefer a switch on ParseErrorCode.

3280

Why move that, it it's not used here?

3286

Why did you not follow your own comment?

zwliew added a subscriber: zwliew.Dec 23 2021, 10:13 PM

Hi, I'd like to help to get this patch accepted and merged. I have a few suggestions/questions below, and I can help make any changes to the patch if needed!

clang/docs/ClangFormatStyleOptions.rst
35

I think two backticks are missing here.

clang/include/clang/Format/Format.h
4069

To be consistent with the ClangFormatOptions.rst docs, I think configfile should be changed to format_file_path.

clang/lib/Format/Format.cpp
3184

Similar to above, configfile should be changed to format_file_path.

3237

I think it's still a good idea to pass Style into the function instead.

3237

I think LoadConfigFile could be refactored to return std::error_code instead, similar to parseConfiguration(), like so:

// note I renamed LoadConfigFile to loadConfigFile to follow the existing function naming style.
std::error_code loadConfigFile(StringRef ConfigFile, llvm::vfs::FileSystem *FS, FormatStyle *Style) {
    llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Text = FS->getBufferForFile(ConfigFile.str());
    if (auto ec = Text.getError()) {
        return ec;
    }
    return parseConfiguration(Text.get()->getBuffer(), Style);
}

And the part in getStyle() would look like this:

// Check for explicit config filename
if (StyleName.startswith_insensitive("file:")) {
    auto StyleFileName = StyleName.substr(5);
    if (auto ec = loadConfigFile(StyleFileName, FS, &Style)) {
        return make_string_error(ec.message());
    }
    LLVM_DEBUG(llvm::dbgs() << "Using configuration file " << StyleFileName << '\n');
    return Style;
}

What do you think?

3280

Yup, I think this shouldn't be moved.

3283

Following my code suggestion above, I think this code block could be refactored to this:

// Check for explicit config filename
if (StyleName.startswith_insensitive("file:")) {
    auto StyleFileName = StyleName.substr(5);
    if (auto ec = loadConfigFile(StyleFileName, FS, &Style)) {
        return make_string_error(ec.message());
    }
    LLVM_DEBUG(llvm::dbgs() << "Using configuration file " << StyleFileName << '\n');
    return Style;
}

What do you think?

Also, on another note, I feel like the -style option is too overloaded. Would it be better to use a separate option like -style-file instead?

zwliew added a comment.EditedDec 24 2021, 12:40 AM

On further thought, the logic for loadConfigFile() looks incomplete. It does not properly handle BasedOnStyle: InheritParentConfig. In fact, the logic for -style=file can be pulled out and merged into loadConfigFile().

I'll look into making this change, and possibly refactoring the code to reduce code duplication.

MyDeveloperDay marked 4 inline comments as done.Dec 24 2021, 5:59 AM

Please go ahead

zwliew commandeered this revision.Dec 26 2021, 10:12 PM
zwliew added a reviewer: MyDeveloperDay.
zwliew updated this revision to Diff 396273.EditedDec 26 2021, 10:20 PM

Support inheritance from parent configs via BasedOnStyle: InheritParentConfig

I made the following changes:

  1. Don't return early when BasedOnStyle: InheritParentConfig is set. Also search for parent configs starting from the parent directory of the specified config file.
  1. Remove the LoadConfigFile() function. There isn't a clean way to refactor the --style=file logic to use it and The function is small and only used in 1/2 places, so I don't think is much of a reason to keep it.

Please have a look and let me know your thoughts, thanks! Also, this is my first time using Phabricator, so let me know if I did anything wrong.

Side question: Is there a reason that the number of children configs in the fallback case is limited to 1 (that is, when all the configs have BasedOnStyle: InheritParentConfig set)?

zwliew added inline comments.Dec 26 2021, 10:30 PM
clang/lib/Format/Format.cpp
3401–3402

Is there a reason for this to be limited to 1? I came across this case during testing, but I can't think of why this should be so.

zwliew updated this revision to Diff 396274.Dec 26 2021, 10:45 PM

Add a test for inheritance from parent config with base

clang/lib/Format/Format.cpp
3283

You can certainly refactor code.

What happens with -style="Google" -style-file="Foo/Bar" is it different from -style-file="Foo/Bar" -style="Google"?
I do not perse disagree, but I think it makes stuff clearer if there is only one option.

3401–3402

See comment on D93844.

zwliew added inline comments.Dec 27 2021, 7:35 AM
clang/lib/Format/Format.cpp
3283

Fair enough. Some ideas off the top of my head that resolve the ambiguity sound needlessly complicated. Thanks!

Do you plan to refactor something for this review, or do you think you are done? Then I will look at it again as a whole.

Do you plan to refactor something for this review, or do you think you are done? Then I will look at it again as a whole.

I'm going to try refactoring the code for loading and parsing the config file into a separate function. I'll update the diff in no longer than a day.

zwliew updated this revision to Diff 396458.EditedDec 28 2021, 7:51 PM

I am done. Please review the latest changes. Thanks!

I made the following changes:

  1. Refactor the code for loading and parsing configs into a separate function
  1. Add a new test case (9.1.2) to test the case mentioned in https://reviews.llvm.org/D93844#inline-1112285.
  1. Fix the test case failure for the newly added test 9.1.2.
zwliew added inline comments.Dec 28 2021, 7:54 PM
clang/lib/Format/Format.cpp
3283

I've refactored the code in the latest revision (under loadAndParseConfigFile().

3401–3402

I've added a new test case (9.1.2) to illustrate the test failure, and also fixed the code to fix the test case.

curdeius accepted this revision.Dec 29 2021, 2:51 AM

LGTM but please wait for the green light from other involved reviewers.
Also, as noted in a comment, I'd like to see unrelated changes in a different patch (unless you convince me that it's overly complicated or too much dependent on this patch).

clang/lib/Format/Format.cpp
3298

Here and elsewhere: please end the comments with a full stop.

clang/unittests/Format/FormatTest.cpp
21466–21467

?

21483

Can we split changes unrelated to the specific configuration file (fixing/testing the inherited config) to another patch?

This revision is now accepted and ready to land.Dec 29 2021, 2:51 AM

Oh, and please rename the patch before landing.

zwliew updated this revision to Diff 396519.Dec 29 2021, 5:29 AM
zwliew retitled this revision from [clang-format] Rebased on master: Add option to specify explicit config file to [clang-format] Add option to explicitly specify a config file.
zwliew edited the summary of this revision. (Show Details)

Addressed the comments on the previous diff:

  1. Adjusted some comments; suffixed each comment with a period.
  2. Removed the changes unrelated to this revision (the ones the issue mentioned in the latest comments in https://reviews.llvm.org/D93844)
zwliew edited the summary of this revision. (Show Details)Dec 29 2021, 5:29 AM

Thanks for the review. I've moved the unrelated change to https://reviews.llvm.org/D116371 instead.

Although there is no context. Maybe still update the uploaded diff for the archive.

zwliew updated this revision to Diff 396578.Dec 29 2021, 5:00 PM

Rebased on master for context

Herald added a reviewer: andreadb. · View Herald Transcript
Herald added a reviewer: sstefan1. · View Herald Transcript
Herald added a reviewer: aartbik. · View Herald Transcript
Herald added a reviewer: MaskRay. · View Herald Transcript
Herald added a reviewer: ftynse. · View Herald Transcript
Herald added a reviewer: baziotis. · View Herald Transcript
Herald added a reviewer: aartbik. · View Herald Transcript
Herald added a reviewer: sjarus. · View Herald Transcript
Herald added projects: Restricted Project, Restricted Project, Restricted Project, Restricted Project, Restricted Project, Restricted Project, Restricted Project. · View Herald Transcript
Herald added a reviewer: Restricted Project. · View Herald Transcript
Herald added a reviewer: Restricted Project. · View Herald Transcript
This revision now requires review to proceed.Dec 29 2021, 5:00 PM

Oh no...I'm so sorry. Didn't mean to cause this large diff. Trying to fix it now.

zwliew updated this revision to Diff 396579.EditedDec 29 2021, 5:07 PM

Fixed rebase and diff, and tried to restore the reviewers and subscribers.

zwliew removed projects: Restricted Project, Restricted Project, Restricted Project, Restricted Project, Restricted Project, Restricted Project, Restricted Project.
zwliew removed subscribers: JDevlieghere, arsenm, dschuff and 98 others.
This revision is now accepted and ready to land.Dec 29 2021, 5:11 PM

Do you have commit access, or do you need someone to commit this and your other changes? If the latter we need a name and an email for the commit. Then someone will come along and commit it.

zwliew accepted this revision.Dec 30 2021, 6:39 PM

Do you have commit access, or do you need someone to commit this and your other changes? If the latter we need a name and an email for the commit. Then someone will come along and commit it.

I don't think I have commit access, so I would be grateful if someone helps me do it.

Name:
Zhao Wei Liew

Email:
zhaoweiliew@gmail.com

This revision was landed with ongoing or failed builds.Jan 3 2022, 2:43 AM
This revision was automatically updated to reflect the committed changes.
fdwr awarded a token.Jan 25 2022, 9:59 PM