Make 'eden config' print valid TOML

Summary:
The 'eden config' command prints output naively. This leads to confusing output when using the hg.extra_hgrc option. For example, in the following output, `mode = off` is part of hg.extra_hgrc's value, but it looks like it's a separate option in Eden's config:

```
$ eden config
[clone]
default-revision=master
[rage]
reporter=pastry --title "eden rage from $(hostname)"
[hg]
extra_hgrc=[fsmonitor]
mode = off

%include /etc/mercurial/repo-specific/eden.rc
[service]
experimental_systemd=True
```

Fix this issue by making 'eden config' output valid TOML:

```
[clone]
default-revision = "master"

[rage]
reporter = "pastry --title \"eden rage from $(hostname)\""

[hg]
extra_hgrc = "[fsmonitor]\nmode = off\n\n%include /etc/mercurial/repo-specific/eden.rc\n"

[service]
experimental_systemd = "True"
```

Reviewed By: simpkins

Differential Revision: D13661229

fbshipit-source-id: 76e4fa83ad186d04451623e3d8d87a78e4b821d8
This commit is contained in:
Matt Glazar 2019-01-18 11:54:13 -08:00 committed by Facebook Github Bot
parent 2ba72dc18e
commit 82e63507aa
3 changed files with 36 additions and 5 deletions

View File

@ -246,12 +246,12 @@ class EdenInstance:
pass
return False
def print_full_config(self) -> None:
def print_full_config(self, file: typing.TextIO) -> None:
parser = self._loadConfig()
data: Dict[str, Dict[str, str]] = {}
for section in parser.sections():
print("[%s]" % section)
for k, v in parser.items(section):
print("%s=%s" % (k, v))
data[section] = {k: v for k, v in parser.items(section)}
toml.dump(data, file) # pyre-ignore[T39129461]
def find_config_for_alias(self, alias: str) -> Optional[CheckoutConfig]:
"""Looks through the existing config files and searches for a

View File

@ -418,7 +418,7 @@ class ConfigCmd(Subcmd):
# mirrors `git config --get invalid`; just exit with code 1
return 1
else:
instance.print_full_config()
instance.print_full_config(file=sys.stdout)
return 0

View File

@ -9,6 +9,7 @@
import abc
import configparser
import io
import os
import unittest
from typing import Dict, List, Optional
@ -304,6 +305,36 @@ experimental_systemd = false
)
self.assertFalse(self.get_config().should_use_experimental_systemd_mode())
def test_printed_config_is_valid_toml(self) -> None:
self.write_user_config(
"""
[clone]
default-revision = "master"
"""
)
printed_config = io.StringIO()
self.get_config().print_full_config(file=printed_config)
printed_config.seek(0)
parsed_config = toml.load(printed_config)
self.assertIn("clone", parsed_config)
self.assertEqual(parsed_config["clone"].get("default-revision"), "master")
def test_printed_config_expands_variables(self) -> None:
self.write_user_config(
"""
["repository fbsource"]
type = "hg"
path = "/data/users/${USER}/fbsource"
"""
)
printed_config = io.StringIO()
self.get_config().print_full_config(file=printed_config)
self.assertIn("/data/users/bob/fbsource", printed_config.getvalue())
def get_config(self) -> EdenInstance:
return EdenInstance(
self._state_dir, self._etc_eden_dir, self._home_dir, self._interpolate_dict