Skip to content

Commit f2bb24e

Browse files
committed
fix reading of dirs, let dir path ovveride be set with name
Signed-off-by: Zen <[email protected]>
1 parent baabf21 commit f2bb24e

File tree

8 files changed

+44
-13
lines changed

8 files changed

+44
-13
lines changed

src/pycpio/cpio/chardev.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,7 @@ def __init__(self, *args, **kwargs):
2121
if int(self.header.mode, 16) & 0o777 == 0:
2222
self.logger.debug("Setting mode to 644")
2323
self.header.mode = (int(self.header.mode, 16) & 0o7777000) | (0o644)
24+
25+
def __bytes__(self):
26+
""" Just return the header """
27+
return bytes(self.header)

src/pycpio/cpio/data.py

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,20 @@ def from_dir(path: Path, parent=None, relative=None, *args, **kwargs):
2323
if not path.is_dir():
2424
raise ValueError("Path is not a directory: %s" % path)
2525

26-
if relative:
26+
if relative is True:
27+
relative = path
28+
elif relative:
2729
relative = Path(relative).resolve()
2830

31+
if relative:
32+
kwargs['name'] = str(path.relative_to(relative))
33+
else:
34+
kwargs['name'] = str(path)
35+
2936
data = []
37+
data.append(CPIOData.from_path(path=path, relative=relative, *args, **kwargs))
38+
if logger := kwargs.get('logger'):
39+
logger.warning(data[0])
3040
for child in path.iterdir():
3141
if parent:
3242
child_path = parent / child
@@ -42,7 +52,6 @@ def from_dir(path: Path, parent=None, relative=None, *args, **kwargs):
4252
data.extend(CPIOData.from_dir(path=child_path, parent=parent, relative=relative, *args, **kwargs))
4353
else:
4454
data.append(CPIOData.from_path(path=child_path, relative=relative, *args, **kwargs))
45-
4655
return data
4756

4857
@staticmethod
@@ -55,10 +64,19 @@ def from_path(path: Path, relative: None, *args, **kwargs):
5564
"""
5665
from pycpio.header import CPIOHeader
5766

58-
path = Path(path).resolve()
67+
path = Path(path)
5968
if logger := kwargs.get('logger'):
6069
logger.debug(f"Creating CPIO entry from path: {path}")
6170

71+
relative = Path(relative).resolve() if relative else None
72+
if logger := kwargs.get('logger'):
73+
logger.debug("Creating CPIO entry relative to path: %s", relative)
74+
75+
if not path.is_symlink():
76+
path = path.resolve()
77+
if not path.exists():
78+
raise ValueError("Path does not exist: %s" % path)
79+
6280
kwargs['path'] = path
6381
if name := kwargs.pop('name', None):
6482
kwargs['name'] = name
@@ -70,11 +88,13 @@ def from_path(path: Path, relative: None, *args, **kwargs):
7088

7189
kwargs['mode'] = mode_bytes_from_path(path)
7290

91+
data = b''
92+
7393
header = CPIOHeader(*args, **kwargs)
74-
data = CPIOData.get_subtype(b'', header, *args, **kwargs)
94+
data = CPIOData.get_subtype(data, header, *args, **kwargs)
7595

7696
if logger := kwargs.get('logger'):
77-
logger.info(f"Created CPIO entry from path: {data}")
97+
logger.debug(f"Created CPIO entry from path: {data}")
7898

7999
return data
80100

src/pycpio/cpio/dir.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,6 @@ def __init__(self, *args, **kwargs):
1717
self.header.mtime = path.resolve().stat().st_mtime
1818
if path.is_absolute():
1919
self.header.name = str(path.relative_to(path.anchor))
20+
21+
if name := kwargs.pop('name', None):
22+
self.header.name = name

src/pycpio/cpio/symlink.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def __setattr__(self, key, value):
1818
else:
1919
raise ValueError("data must be a string or bytes")
2020

21-
if value[-1] != b'\0':
21+
if value and value[-1] != b'\0':
2222
value += b'\0'
2323
self.header.filesize = format(len(value), '08x').encode('ascii')
2424

@@ -28,6 +28,9 @@ def __init__(self, *args, **kwargs):
2828
super().__init__(*args, **kwargs)
2929
if path := kwargs.pop('path', None):
3030
self.data = str(path.readlink()).encode('ascii')
31+
self.header.mtime = path.stat().st_mtime
32+
elif self.data is None:
33+
raise ValueError("path must be specified for symlinks")
3134

3235
self.header.mode = 0o120777 # symlink mode
3336

src/pycpio/header/cpioheader.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def __init__(self, header_data=b'', overrides={}, *args, **kwargs):
1818
self.logger.debug("Creating CPIOEntry from header data: %s", header_data)
1919
self.from_bytes(header_data)
2020
elif kwargs.get('name'):
21-
self.logger.info("Creating CPIO Header with name: %s", kwargs['name'])
21+
self.logger.debug("Creating CPIO Header with name: %s", kwargs['name'])
2222
self.from_args(*args, **kwargs)
2323
else:
2424
raise NotImplementedError("CPIOEntry must be initialized with header data or a name")

src/pycpio/main.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ def main():
2929
parser.add_argument('-s', '--symlink', action='store', help='create symlink')
3030
parser.add_argument('-c', '--chardev', action='store', help='create character device')
3131

32-
parser.add_argument('--rdevmajor', action='store', help='major number for character/block device')
33-
parser.add_argument('--rdevminor', action='store', help='minor number for character/block device')
32+
parser.add_argument('--major', action='store', help='major number for character/block device')
33+
parser.add_argument('--minor', action='store', help='minor number for character/block device')
3434

3535
parser.add_argument('-u', '--set-owner', action='store', help='set UID on all files')
3636
parser.add_argument('-g', '--set-group', action='store', help='set GID on all files')
@@ -86,9 +86,9 @@ def main():
8686
c.add_symlink(args.name, args.symlink)
8787

8888
if args.chardev:
89-
if not args.rdevmajor or not args.rdevminor:
89+
if not args.major or not args.minor:
9090
raise ValueError('Character device requires major and minor numbers')
91-
c.add_chardev(args.chardev, int(args.rdevmajor), int(args.rdevminor))
91+
c.add_chardev(args.chardev, int(args.major), int(args.minor))
9292

9393
if args.append:
9494
relative = args.relative if args.relative else None

src/pycpio/masks/modes.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ def mode_bytes_from_path(file_path: Path) -> CPIOModes:
4141
"""
4242
if file_path.is_dir():
4343
return CPIOModes.Dir.value
44-
elif file_path.is_file():
45-
return CPIOModes.File.value
4644
elif file_path.is_symlink():
4745
return CPIOModes.Symlink.value
4846
elif file_path.is_block_device():
@@ -51,6 +49,8 @@ def mode_bytes_from_path(file_path: Path) -> CPIOModes:
5149
return CPIOModes.CharDev.value
5250
elif file_path.is_fifo():
5351
return CPIOModes.FIFO.value
52+
elif file_path.is_file():
53+
return CPIOModes.File.value
5454

5555
raise ValueError(f"Invalid mode: {file_path}")
5656

src/pycpio/writer/writer.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ def write(self):
2525
"""
2626
inodes = set()
2727
offset = 0
28+
self.logger.debug("Writing to: %s" % self.output_file)
2829
with open(self.output_file, "wb") as f:
2930
for entry in self.cpio_entries.values():
3031
self.logger.log(5, "Writing entry: %s" % entry)

0 commit comments

Comments
 (0)