subsequent_indent=subindent) for line in lines)
+def parse_chdir(path: str) -> Optional[Path]:
+ if not path:
+ # The current directory should be ignored
+ return None
+
+ # Immediately change the current directory so that it's taken into
+ # account when parsing the following options that take a relative path
+ try:
+ os.chdir(path)
+ except (FileNotFoundError, NotADirectoryError):
+ die(f"{path} is not a directory!")
+ except OSError as e:
+ die(f"Cannot change the directory to {path}: {e}")
+ # Keep track of the current directory
+ return Path.cwd()
+
+
def config_make_action(settings: Sequence[MkosiConfigSetting]) -> type[argparse.Action]:
lookup = {s.dest: s for s in settings}
)
-def create_argument_parser(*, settings: bool) -> argparse.ArgumentParser:
+def create_argument_parser() -> argparse.ArgumentParser:
action = config_make_action(SETTINGS)
parser = argparse.ArgumentParser(
)
parser.add_argument(
"-C", "--directory",
+ type=parse_chdir,
+ default=Path.cwd(),
help="Change to specified directory before doing anything",
metavar="PATH",
- default=None,
)
parser.add_argument(
"--debug",
help=argparse.SUPPRESS,
)
- if not settings:
- return parser
-
parser.add_argument(
"verb",
type=Verb,
else:
argv += ["--", "build"]
- # Don't parse the settings just yet so we can take --directory into account when parsing settings that
- # take relative paths.
- argparser = create_argument_parser(settings=False)
- argparser.parse_known_args(argv, namespace)
-
- if namespace.directory and not Path(namespace.directory).is_dir():
- die(f"{namespace.directory} is not a directory!")
-
- if namespace.directory:
- os.chdir(namespace.directory)
-
namespace = argparse.Namespace()
- argparser = create_argument_parser(settings=True)
+ argparser = create_argument_parser()
argparser.parse_args(argv, namespace)
args = load_args(namespace)
include = ()
- if args.directory != "":
+ if args.directory is not None:
parse_config(Path("."), namespace, defaults)
include = getattr(namespace, "presets", ())
}
d = Path("mkosi.credentials")
- if args.directory != "" and d.is_dir():
+ if args.directory is not None and d.is_dir():
for e in d.iterdir():
if os.access(e, os.X_OK):
creds[e.name] = run([e], stdout=subprocess.PIPE, env=os.environ).stdout