+ BTRFS support
+ Refactoring of `disk.py` into `lib/disk/*.py`
+ `get_mount_info()` was reworked to support traverse backwards until mountpoint information is found (reverse-recursiveness)
+ `suggest_single_disk_layout()` was added/fixed to support BTRFS options
+ - `suggest_multi_disk_layout()` does not yet support BTRFS subvolumes in suggestive mode
+ `Installer()` now calls `create_subvolume()` and `mount_subvolume()` during loading of file structure on `mount_ordered_layout()`
File: lib/user_interaction.py
When function manage_new_and_existing_partitions() is used, and
'Suggest partition layout' is selected, the installer crashes.
REASON
Bug was introduced in commit 9e67ce3, when partition layout was
changed to use device.path as keys (instead of device).
It seems all necessary changes were made for this, except this one.
File: lib/disk.py
When installing on a loopback device (a.k.a loop device), function
Filesystem.partuuid_to_index() crashes with a JSON parsing error.
REASON
1) For loop devices, the property BlockDevice.device returns the
actual image file (back-file) of the loop device instead of the
/dev/X device.
2) Function Filesystem.partuuid_to_index() executes `lsblk --json`
against BlockDevice.device .
3) `lsblk` fails and prints the error "not a block device" to stderr.
This causes the output to not be valid JSON.
4) Code crashes when JSON parser tries to parse the output.
SOLUTION
- Make sure property BlockDevice.device only returns a valid block
device.
- Create new function BlockDevice.device_or_backfile that mimics
the present behaviour of BlockDevice.device.
- Use BlockDevice.device_or_backfile in function
BlockDevice.__repr__().
SOLUTION REASONING
I can only see one reason behind BlockDevice.device returning
the back-file of a loop device, and that is to show the back-file
to the user (instead of /dev/X) when printing the string
representation of a BlockDevice.
All other parts of the code can use the /dev/X file just fine.
And IMO it makes more sense that a property named `device` only
returns devices, and not normal files.
File: lib/user_interaction.py
When function manage_new_and_existing_partitions() is used, and
no partitions are configured, and 'Set desired filesystem for a
partition' is selected, the installer crashes.