Skip to content

Commit 74708e0

Browse files
committed
Add config files feature.
The allows to have a local config to customize defaults for CL options. Closes #22. stack-info: PR: #32, branch: ZolotukhinM/stack/2
1 parent f6aa5ae commit 74708e0

File tree

2 files changed

+53
-9
lines changed

2 files changed

+53
-9
lines changed

README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,3 +237,25 @@ stack-pr view -B HEAD~5 -H HEAD~2
237237
# Land first three PRs from the stack
238238
stack-pr land -B HEAD~5 -H HEAD~2
239239
```
240+
241+
## Command Line Options Reference
242+
The section is not added yet, contributions are welcome!
243+
244+
### Config files
245+
Default values for command line options can be specified via a config file.
246+
Path to the config file can be specified via `STACKPR_CONFIG` envvar, and by
247+
default it's assumed to be `.stack-pr.cfg` in the current folder.
248+
249+
An example of a config file:
250+
251+
```cfg
252+
[common]
253+
verbose=True
254+
hyperlinks=True
255+
draft=False
256+
keep_body=False
257+
[repo]
258+
remote=origin
259+
target=main
260+
reviewer=GithubHandle1,GithubHandle2
261+
```

src/stack_pr/cli.py

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
# ===----------------------------------------------------------------------=== #
4949

5050
import argparse
51+
import configparser
5152
import json
5253
import os
5354
import re
@@ -1230,33 +1231,41 @@ def command_view(args: CommonArgs):
12301231
# ===----------------------------------------------------------------------=== #
12311232

12321233

1233-
def create_argparser() -> argparse.ArgumentParser:
1234+
def create_argparser(
1235+
config: configparser.ConfigParser,
1236+
) -> argparse.ArgumentParser:
12341237
"""Helper for CL option definition and parsing logic."""
12351238
parser = argparse.ArgumentParser()
12361239
subparsers = parser.add_subparsers(help="sub-command help", dest="command")
12371240

12381241
common_parser = argparse.ArgumentParser(add_help=False)
12391242
common_parser.add_argument(
1240-
"-R", "--remote", default="origin", help="Remote name"
1243+
"-R",
1244+
"--remote",
1245+
default=config.get("repo", "remote", fallback="origin"),
1246+
help="Remote name",
12411247
)
12421248
common_parser.add_argument("-B", "--base", help="Local base branch")
12431249
common_parser.add_argument(
12441250
"-H", "--head", default="HEAD", help="Local head branch"
12451251
)
12461252
common_parser.add_argument(
1247-
"-T", "--target", default="main", help="Remote target branch"
1253+
"-T",
1254+
"--target",
1255+
default=config.get("repo", "target", fallback="main"),
1256+
help="Remote target branch",
12481257
)
12491258
common_parser.add_argument(
12501259
"--hyperlinks",
12511260
action=argparse.BooleanOptionalAction,
1252-
default=True,
1261+
default=config.getboolean("common", "hyperlinks", fallback=True),
12531262
help="Enable or disable hyperlink support.",
12541263
)
12551264
common_parser.add_argument(
12561265
"-V",
12571266
"--verbose",
12581267
action="store_true",
1259-
default=False,
1268+
default=config.getboolean("common", "verbose", fallback=False),
12601269
help="Enable verbose output from Git subcommands.",
12611270
)
12621271

@@ -1269,14 +1278,14 @@ def create_argparser() -> argparse.ArgumentParser:
12691278
parser_submit.add_argument(
12701279
"--keep-body",
12711280
action="store_true",
1272-
default=False,
1281+
default=config.getboolean("common", "keep_body", fallback=False),
12731282
help="Keep current PR body and only add/update cross links",
12741283
)
12751284
parser_submit.add_argument(
12761285
"-d",
12771286
"--draft",
12781287
action="store_true",
1279-
default=False,
1288+
default=config.getboolean("common", "draft", fallback=False),
12801289
help="Submit PRs in draft mode",
12811290
)
12821291
parser_submit.add_argument(
@@ -1287,7 +1296,10 @@ def create_argparser() -> argparse.ArgumentParser:
12871296
)
12881297
parser_submit.add_argument(
12891298
"--reviewer",
1290-
default=os.getenv("STACK_PR_DEFAULT_REVIEWER", default=""),
1299+
default=os.getenv(
1300+
"STACK_PR_DEFAULT_REVIEWER",
1301+
default=config.get("repo", "reviewer", fallback=""),
1302+
),
12911303
help="List of reviewers for the PR",
12921304
)
12931305

@@ -1310,8 +1322,18 @@ def create_argparser() -> argparse.ArgumentParser:
13101322
return parser
13111323

13121324

1325+
def load_config(config_file):
1326+
config = configparser.ConfigParser()
1327+
if os.path.isfile(config_file):
1328+
config.read(config_file)
1329+
return config
1330+
1331+
13131332
def main():
1314-
parser = create_argparser()
1333+
config_file = os.getenv("STACKPR_CONFIG", ".stack-pr.cfg")
1334+
config = load_config(config_file)
1335+
1336+
parser = create_argparser(config)
13151337
args = parser.parse_args()
13161338

13171339
if not args.command:

0 commit comments

Comments
 (0)