Add a pack-info.txt file at the top of the BAT Pack

This file explains which blend file this pack was created for.
This commit is contained in:
Sybren A. Stüvel 2018-03-21 16:33:41 +01:00
parent 3a3dbb5042
commit e53470d898
2 changed files with 56 additions and 15 deletions

View File

@ -282,14 +282,32 @@ class Packer:
if not self.noop:
self._rewrite_paths()
self._copy_files_to_target()
self._start_file_transferrer()
self._perform_file_transfer()
self._progress_cb.pack_done(self.output_path, self.missing_files)
def _perform_file_transfer(self):
"""Use file transferrer to do the actual file transfer.
This is performed in a separate function, so that subclasses can
override this function to queue up copy/move actions first, and
then call this function.
"""
self._write_info_file()
self._copy_files_to_target()
def _create_file_transferer(self) -> transfer.FileTransferer:
"""Create a FileCopier(), can be overridden in a subclass."""
return filesystem.FileCopier()
def _start_file_transferrer(self):
"""Starts the file transferrer thread."""
self._file_transferer = self._create_file_transferer()
self._file_transferer.progress_cb = self._tscb
if not self.noop:
self._file_transferer.start()
def _copy_files_to_target(self) -> None:
"""Copy all assets to the target directoy.
@ -297,15 +315,10 @@ class Packer:
"""
log.debug('Executing %d copy actions', len(self._actions))
self._file_transferer = self._create_file_transferer()
self._file_transferer.progress_cb = self._tscb
if not self.noop:
self._file_transferer.start()
try:
for asset_path, action in self._actions.items():
self._check_aborted()
self._copy_asset_and_deps(asset_path, action, self._file_transferer)
self._copy_asset_and_deps(asset_path, action)
if self.noop:
log.info('Would copy %d files to %s', self._file_count, self.target)
@ -397,12 +410,11 @@ class Packer:
self._progress_cb.rewrite_blendfile(bfile_path)
bfile.close()
def _copy_asset_and_deps(self, asset_path: pathlib.Path, action: AssetAction,
ft: transfer.FileTransferer):
def _copy_asset_and_deps(self, asset_path: pathlib.Path, action: AssetAction):
# Copy the asset itself.
packed_path = action.new_path
read_path = action.read_from or asset_path
self._send_to_target(read_path, packed_path, ft,
self._send_to_target(read_path, packed_path,
may_move=action.read_from is not None)
# Copy its sequence dependencies.
@ -420,7 +432,7 @@ class Packer:
for file_path in usage.files():
packed_path = packed_base_dir / file_path.name
# Assumption: assets in a sequence are never blend files.
self._send_to_target(file_path, packed_path, ft)
self._send_to_target(file_path, packed_path)
# Assumption: all data blocks using this asset use it the same way.
break
@ -428,7 +440,6 @@ class Packer:
def _send_to_target(self,
asset_path: pathlib.Path,
target: pathlib.Path,
ft: transfer.FileTransferer,
may_move=False):
if self.noop:
print('%s%s' % (asset_path, target))
@ -440,6 +451,19 @@ class Packer:
self._tscb.flush()
if may_move:
ft.queue_move(asset_path, target)
self._file_transferer.queue_move(asset_path, target)
else:
ft.queue_copy(asset_path, target)
self._file_transferer.queue_copy(asset_path, target)
def _write_info_file(self):
"""Write a little text file with info at the top of the pack."""
infoname = 'pack-info.txt'
infopath = self._rewrite_in / infoname
log.debug('Writing info to %s', infopath)
with infopath.open('w') as infofile:
print('This is a Blender Asset Tracer pack.', file=infofile)
print('Start by opening the following blend file:', file=infofile)
print(' %s' % self._output_path.relative_to(self.target), file=infofile)
self._file_transferer.queue_move(infopath, self.target / infoname)

View File

@ -255,6 +255,19 @@ class PackTest(AbstractPackTest):
packer.output_path
)
def test_infofile(self):
blendname = 'subdir/doubly_linked_up.blend'
infile = self.blendfiles / blendname
packer = pack.Packer(infile, self.blendfiles, self.tpath)
packer.strategise()
packer.execute()
infopath = self.tpath / 'pack-info.txt'
self.assertTrue(infopath.exists())
info = infopath.open().read().splitlines(keepends=False)
self.assertEqual(blendname, info[-1].strip())
class ProgressTest(AbstractPackTest):
def test_strategise(self):
@ -313,6 +326,7 @@ class ProgressTest(AbstractPackTest):
extpath = self.outside_project()
expected_calls = [
mock.call(mock.ANY, self.tpath / 'doubly_linked_up.blend'),
mock.call(mock.ANY, self.tpath / 'pack-info.txt'),
mock.call(mock.ANY, extpath / 'linked_cube.blend'),
mock.call(mock.ANY, extpath / 'basic_file.blend'),
mock.call(mock.ANY, extpath / 'material_textures.blend'),
@ -341,7 +355,10 @@ class ProgressTest(AbstractPackTest):
self.assertEqual(1, cb.pack_done.call_count)
cb.rewrite_blendfile.assert_not_called()
cb.transfer_file.assert_called_with(infile, self.tpath / 'missing_textures.blend')
cb.transfer_file.assert_has_calls([
mock.call(infile, self.tpath / 'missing_textures.blend'),
mock.call(mock.ANY, self.tpath / 'pack-info.txt'),
], any_order=True)
self.assertEqual(0, cb.transfer_file_skipped.call_count)
self.assertGreaterEqual(cb.transfer_progress.call_count, 1,