94 Commits

Author SHA1 Message Date
Sybren A. Stüvel
b3fb7845c3 Cleanup: Reformat with black
No functional changes.
2023-11-02 14:40:27 +01:00
William Harrell
6bfa4062d7 Support for int, float types in BlendFileBlock.set
---

The blendfile module within BAT supports reading data from structs, such
as the Count property on an array modifier. However, blendfile only
supports modifying structs with type "char". This patch adds support for
writing structs of more types in blendfile blocks. Now, writing is
supported for ushort, short, uint, int, float, and ulong types.

The use case that inspired this patch was an instance where a file had
several array modifiers that prevented the file from being opened in
Blender on machines without large amounts of RAM. A solution using the
blendfile module may look like:

```
from blender_asset_tracer import blendfile
from pathlib import Path

b = blendfile.open_cached(Path('flag.blend'), mode='rb+')

for block in b.blocks:
    if 'ArrayModifierData' in block.__str__():
        try:
            print('previous:', block.get(b'count'))
            block.set(b'count', 1)
            print('current:', block.get(b'count'))
        except KeyError:
            continue

b.close()
```

This would fail with the exception
`blender_asset_tracer.blendfile.exceptions.NoWriterImplemented: Setting
type Struct(b'int') is not supported for ArrayModifierData.count`. With
this patch, the above code succeeds and the count struct can be set to
a lower number that allows the file to be opened.

This solution implements missing functionality without adding any new
interfaces. A few details are:
* When deciding what type to write to the struct, the value is inferred
from what is given by the caller. If the caller gives a Python int, the
exact type is inferred from the DNA type ID. If they give a float, a
float is written. Otherwise, the existing logic is used to determine
whether to write a string or byte sequence.
* A \_write method was added to dna\_io.py that takes a Python struct
object and a value to write a byte sequence to the file object. This
method is used by public methods appropriately named to indicate what
type they will write.
* The check for whether the caller is trying to write an unsupported
type is left in place, but it has been changed to include types which
are now supported.
* Tests have been added that provide a mock file object, call the new
methods, and confirm that the correct bytes were written.

Reviewed By: sybren

Differential Revision: https://developer.blender.org/D14374
2022-03-25 12:07:06 +01:00
Sybren A. Stüvel
843c34c3c0 Support UDIM images 2022-02-18 16:12:41 +01:00
Sybren A. Stüvel
4ebd535b5f Add missing test blend file 2022-02-04 10:48:49 +01:00
Sybren A. Stüvel
e5c7e38b44 Avoid doubly-compressing zstandard files 2022-02-03 17:54:03 +01:00
Ethan Simon
608a7bdac9 Compatibility with packing read-only source files
File permissions are no longer copied when packing. This means that
read-only source files can still be packed without errors, even when
they have to be rewritten (due to changed paths).

Reviewed by: sybren

Differential Revision: https://developer.blender.org/D13128
2021-11-09 11:15:20 +01:00
Sybren A. Stüvel
c61d5ee7ab Skip ZStandard tests if the module is not installed 2021-10-05 18:34:44 +02:00
Sybren A. Stüvel
8a06bf5903 Add optional support for ZStandard compression
BAT now can take advantage of the `zstandard` module to handle Blender
3.0+ compressed blend files.

If the module is not installed, the blend files cannot be opened but
GZip-compressed and uncompressed files can still be handled.
2021-10-05 18:24:44 +02:00
Sybren A. Stüvel
24c0206e89 Support datablocks used as default values in nodes
Follow pointers of input sockets of nodes that can reference ID datablocks.
2021-07-27 16:42:25 +02:00
Sybren A. Stüvel
0bd18594f6 Support linked collections used as input in a Geometry Nodes modifier
Add support for linked collections that are used as input in a Geometry
Nodes modifier. This requires iterating over the geometry nodes modifier
settings, which consists of ID properties. If such an ID property is of
type `IDP_ID`, its pointer is followed and the pointed-to datablock +
its library are visited.

This following of pointers happens in the 'expand' phase, which was only
done for linked library blend files. Since this commit, the old
behaviour of simply looping over all non-`DATA` datablocks of the
to-be-packed blend file is not enough, and datablock expansion is done
for all local datablocks as well.
2021-07-27 16:42:25 +02:00
Sybren A. Stüvel
087ff25c76 Add 'strict pointer mode' to BlendFile
Add a 'strict pointer mode' to the `BlendFile` class, which is enabled
by default. This allows users of the `BlendFile` class to decide whether
a bad pointer (i.e. one that points to a non-existing datablock) returns
`None` or raises a `SegmentationFault` exception.
2021-07-22 10:28:48 +02:00
Sybren A. Stüvel
803c38dac1 Cleanup: reformat with Black 2021-07-22 10:14:43 +02:00
Sybren A. Stüvel
23dea91572 Add support for indirectly linked Geometry Nodes node trees 2021-02-02 13:41:39 +01:00
Sybren A. Stüvel
e4bf2e8e35 Improved path handling
This commit fixes a bunch of issues at the same time, as they are all
related to path handling:

- `pathlib.Path.resolve()` or `.absolute()` are replaced by
  `bpathlib.make_absolute()`. The latter does NOT follow symlinks and does
  NOT network mounts from a drive letter to UNC notation. This also has
  advantages on non-Windows sytems, as it allows BAT-packing a directory
  structure with symlinked files (such as a Shaman checkout).
- Better handling of drive letters, and of paths that cross drive
  boundaries.
- Better testing of Windows-specific cases when running the tests on
  Windows, and of POSIX-specific cases on other platforms.

Thanks to @wisaac for starting this patch in D6676.

Thanks to @jbakker for pointing out the drive letter issue. This fixes
T70655.
2020-03-17 17:15:19 +01:00
Sybren A. Stüvel
782293b360 MyPy test fix
Newer versions of MyPy aren't silent any more when they complete succesfully,
so test for 'Success' in the message before failing the test.
2020-03-17 12:29:40 +01:00
Sybren A. Stüvel
b48978f067 Moved from Pipenv to Poetry
All the Blender Institute Python webprojects are moving to Poetry; it works
better than Pipenv in various regards.
2019-06-07 12:49:59 +02:00
Sybren A. Stüvel
4964745dee Support Alembic files from linked library
We already supported Alembic files in the top-level blend file, but now we
also support finding Alembic files in linked-in libraries.
2019-03-20 13:57:44 +01:00
Sybren A. Stüvel
a2f9a7b484 Shaman changed response does-not-existfile-unknown
Instead of 'does-not-exist' we'll now receive 'file-unknown' (see Shaman
commit 44efa6b39bddc703a14aa68316b092866813c38a)
2019-03-01 14:07:24 +01:00
Sybren A. Stüvel
b22b9da5d0 Shaman: Moved URL parsing into a separate function
This allows other code to just call that function, rather than copying
the behaviour.
2019-03-01 14:07:24 +01:00
Sybren A. Stüvel
6104bd6078 Shaman: Make checkout location available to the Packer 2019-03-01 14:07:24 +01:00
Sybren A. Stüvel
9074421ec3 Shaman server support
The Shaman server is a file storage system that identifies files by
SHA256sum and file length. BAT can send packs there by only uploading
changed/new files. The BAT pack is reproduced at the Shaman server's
checkout directory by creating symlinks to the files in its file
storage.

Retrying sending files:

When we can defer uploading a file (that is, when we have other files to
upload as well, and we could send the current file at a later moment) we
send an `X-Shaman-Can-Defer-Upload: true` header in the file upload
request. In that case, when someone else is already uploading that file,
a `208 Already Reported` response is sent and the connection is closed.
Python's Requests library unfortunately won't give us that response if
we're still streaming the request, and raise a ConnectionError exception
instead. This exception can mean two things:

- If the `X-Shaman-Can-Defer-Upload: true` header was sent: someone else
  is currently uploading that file, so defer it.
- If that header was not sent: that file is already completely uploaded
  and does not need to be uploaded again.

Instead of retrying each failed file, after a few failures we now just
resend the definition file to get a new list of files to upload, then
send those. This should considerably reduce the number of HTTP calls
when multiple clients are uploading the same set of files.
2019-03-01 14:07:24 +01:00
Sybren A. Stüvel
03fb4da583 Convert target path from Path to str & PurePath
The target path is just read as string from the CLI now, to allow more
complex targets (such as URLs) that don't directly map to a path.

The Packer subclass now handles the conversion from that string to a
`pathlib.PurePath`, and specific subclasses & transfer classes can convert
those to a `pathlib.Path` to perform actual filesystem operations when
necessary.
2019-02-26 16:35:08 +01:00
Sybren A. Stüvel
bf7d2b1e27 Added some more unit tests for BlendPath 2019-02-04 15:42:40 +01:00
Sybren A. Stüvel
f7fb4b13ca Test packing a blend file with Windows relative paths 2019-01-02 15:41:56 +01:00
Sybren A. Stüvel
b79a5dc491 Avoid repeating/constructing the same path 2019-01-02 15:39:09 +01:00
Sybren A. Stüvel
7df73d6c69 Configure test logging at import time (rather than at setup time) 2019-01-02 15:38:34 +01:00
Sybren A. Stüvel
5a41167a09 Missing test teardowns
This kept a file pointer open while trying to delete the file.
2019-01-02 15:14:50 +01:00
Sybren A. Stüvel
d81fe590db BlendPath: don't use os.path.join() for slash notations
The BlendPath should just use forward slashes, and not be depending on the
current platform.
2019-01-02 15:14:50 +01:00
Sybren A. Stüvel
5635895d0c Attempt at making BAT work on Windows
All BlendPath instances will use forward slashes, and there should be
more use of PurePosixPath instead of Path.
2019-01-02 15:14:50 +01:00
Sybren A. Stüvel
c331b99dc6 Fixed leaking file descriptors in unit tests
These weren't any issue in Linux, but Windows doesn't like it when you
try to delete a still-opened file.
2018-12-20 14:04:23 +01:00
Sybren A. Stüvel
37ad8f8dfc Added --relative-only option to bat pack command
This makes BAT skip assets that are referred to with an absolute path.
It is assumed that the receiver of the BAT pack can access those assets
at the same path.
2018-12-06 10:02:14 +01:00
Sybren A. Stüvel
521c7e1916 Added --compress option for 'bat pack' command
This compresses all packed Blend files. Other files, as well as already-
compressed Blend files, are left as-is.
2018-11-27 14:29:37 +01:00
Sybren A. Stüvel
0b5e034a92 Fix MyPy errors when running without boto3 installed 2018-11-07 13:03:07 +01:00
Philipp Oeser
4e1c2d1bbb Fix T55542: BAT doesn't pack smoke cache 2018-07-06 11:01:44 +02:00
Sybren A. Stüvel
0b96635953 Fix T55539: BAT doesn't pack particle caches 2018-07-03 15:05:15 +02:00
Sybren A. Stüvel
aa8e2a8cdd Tracer fix for T55539
This only fixes the tracer; the problem with the packer still exists.
2018-07-03 15:05:15 +02:00
Sybren A. Stüvel
f75f35ae77 Swap 'expected' and 'actual' arguments
Python itself doesn't make any distinction (it just logs 'a != b') but
PyCharm does.
2018-07-03 14:30:59 +02:00
Sybren A. Stüvel
dfa07e19cc Fix T55007: Support fluid simulation cache files
This also adds support for entire directory paths to be assets, in
addition to globs and numbered file sequences.
2018-06-05 15:12:10 +02:00
Sybren A. Stüvel
8d1bd89583 Allow packing to ZIP files 2018-03-22 10:06:48 +01:00
Sybren A. Stüvel
e53470d898 Add a pack-info.txt file at the top of the BAT Pack
This file explains which blend file this pack was created for.
2018-03-21 16:33:41 +01:00
Sybren A. Stüvel
f7150c0d29 Allow aborting a pack operation.
For this to work well I also had to remove the sorting of blocks in
trace.deps(). The sorting caused the first `yield` to be executed only
after each blend file was opened, which means that the consuming for-loop
takes a long time to hit its first iteration. As a result, it would respond
slowly to abort requests. By not sorting the first `yield` is much sooner,
resolving this issue.
2018-03-16 12:12:15 +01:00
Sybren A. Stüvel
889f3abd25 Implemented reporting callbacks.
Both the dependency Tracer class and the Packer class now support a
callback object, where the latter is a subclass of the former.

For file transfers running in a separate thread, there is a thread-safe
wrapper for progress callbacks. This wrapper can be called from any thread,
and calls the wrapped callback object from the main thread. This way the
callback implementation itself doesn't have to worry about threading
issues.
2018-03-15 17:59:55 +01:00
Sybren A. Stüvel
59189aab5f Removed unused imports 2018-03-15 14:30:46 +01:00
Sybren A. Stüvel
6b51183095 Packer: store the output path of the blend file in the target directory
This allows the Flamenco Add-on to get the final path of the blend file.
2018-03-14 16:06:21 +01:00
Sybren A. Stüvel
8340df129d BAT Pack can now exclude files based on glob patterns 2018-03-14 16:06:21 +01:00
Sybren A. Stüvel
0e9de7753c Allow Packer to be used as context manager + test for rewriting img seqs 2018-03-14 12:50:27 +01:00
Sybren A. Stüvel
d2ac0fa919 Added test for Packer.close() 2018-03-14 12:30:18 +01:00
Sybren A. Stüvel
c9664ca045 Report missing files in Packer.strategise() 2018-03-14 12:24:26 +01:00
Sybren A. Stüvel
ef5c46eba5 Some mypy & test tweaks 2018-03-09 16:29:30 +01:00
Sybren A. Stüvel
4c3d288be9 Add mypy invocation to unit test
This way it's easy to run both the tests and mypy.
2018-03-09 14:24:06 +01:00