cmds.secrets.CompileTemplates: Fix conf line handling
All checks were successful
CI / Packaging - Kali Linux (pull_request) Successful in 4m23s
CI / Packaging - OpenSUSE Tumbleweed (pull_request) Successful in 5m46s
CI / Packaging test (pull_request) Successful in 0s
CI / Packaging - Kali Linux (push) Successful in 5m30s
CI / Packaging - OpenSUSE Tumbleweed (push) Successful in 5m35s
CI / Packaging test (push) Successful in 0s
All checks were successful
CI / Packaging - Kali Linux (pull_request) Successful in 4m23s
CI / Packaging - OpenSUSE Tumbleweed (pull_request) Successful in 5m46s
CI / Packaging test (pull_request) Successful in 0s
CI / Packaging - Kali Linux (push) Successful in 5m30s
CI / Packaging - OpenSUSE Tumbleweed (push) Successful in 5m35s
CI / Packaging test (push) Successful in 0s
File attributes of the compiled output of "jw-pkg secrets compile-templates" can be specified via the # conf line atop a .jw-tmpl file, the parsing of that line is buggy, however. Its mode is parsed as a decimal number unless it carries a leading zero, so "mode=640" yields 640 decimal, 1200 octal, and the output file ends up without usable permissions. The same decimal parse applies to a conf line atop the .jw-secret of a target, whose attributes are honored the same way, and the --mode option of compile-templates passes its string value through to Attrs, whose mode is typed int, so a target without a conf line of its own crashes in _format_metadata(). Other than that, the # conf line itself should be removed from the compiled output, but isn't. This commit makes the conf line handling correct: - _parse_attributes() parses the mode as octal, with or without a leading zero - _compile_one_template_file() drops the conf line from the compiled content - the --mode option is converted to an octal int by octal_mode() at the argument boundary The integration test writes its conf line modes without leading zeros, expects the conf line gone from the compiled output, takes one target's mode from a conf line atop its .jw-secret, and passes a --mode that the conf lines override. Assisted-by: unsloth/Qwen3.8-27B-GGUF:Q4_K_M with pi.dev v1.1.0 Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
parent
79ec79eb9a
commit
141dd0ac3c
2 changed files with 38 additions and 22 deletions
|
|
@ -1,12 +1,16 @@
|
|||
from __future__ import annotations
|
||||
|
||||
from typing import TYPE_CHECKING, override
|
||||
from argparse import ArgumentParser, ArgumentTypeError, Namespace
|
||||
from typing import override
|
||||
|
||||
from .Cmd import Cmd, Parent
|
||||
from .lib.base import Attrs
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from argparse import ArgumentParser, Namespace
|
||||
def octal_mode(s: str) -> int:
|
||||
try:
|
||||
return int(s, 8)
|
||||
except ValueError:
|
||||
raise ArgumentTypeError(f'Not an octal mode: {s}')
|
||||
|
||||
class CmdCompileTemplates(Cmd): # export
|
||||
|
||||
|
|
@ -30,5 +34,9 @@ class CmdCompileTemplates(Cmd): # export
|
|||
'--group', '-g', default = None, help = 'Default output file group'
|
||||
)
|
||||
parser.add_argument(
|
||||
'--mode', '-m', default = None, help = 'Default output file mode'
|
||||
'--mode',
|
||||
'-m',
|
||||
default = None,
|
||||
type = octal_mode,
|
||||
help = 'Default output file mode (octal)',
|
||||
)
|
||||
|
|
|
|||
|
|
@ -76,12 +76,10 @@ class FilesContext:
|
|||
elif key == 'group':
|
||||
ret.group = val or None
|
||||
elif key == 'mode':
|
||||
# -- octal, with or without a leading zero
|
||||
if val:
|
||||
try:
|
||||
if re.fullmatch(r'0[0-7]+', val):
|
||||
ret.mode = int(val, 8)
|
||||
else:
|
||||
ret.mode = int(val, 0)
|
||||
ret.mode = int(val, 8)
|
||||
except ValueError:
|
||||
ret.mode = None
|
||||
|
||||
|
|
@ -126,6 +124,11 @@ class FilesContext:
|
|||
attrs = self._parse_attributes(new_content)
|
||||
if attrs is None:
|
||||
attrs = default_attrs
|
||||
else:
|
||||
# -- A conf line is the attribute spec of the output
|
||||
# file, not part of its content
|
||||
lines = new_content.splitlines(keepends = True)
|
||||
new_content = ''.join(lines[1:])
|
||||
|
||||
if attrs is not None:
|
||||
if attrs.owner is not None:
|
||||
|
|
|
|||
Loading…
Reference in a new issue