Development guide

From postmarketOS
Jump to: navigation, search

Tips

If happens often that we commit changes and then we realize that we forgot to regenerate APKBUILD checksums. This is noticed by Travis (example) but you might want to avoid it.

You can install the following git hook that is run every time before you commit.

Copy the following code to .git/hooks/pre-commit inside your pmbootstrap repository:

#!/bin/sh
#
# postmarketOS pre-commit hook
# Checks for bad checksums

./test/check_checksums.py

Now this is what happens when you forgot to regenerate checksums for some aport and try to commit

$ git commit -a
Checking device-qemu-aarch64 for correct checksums
[13:45:23] (native) generate checksums for device-qemu-aarch64
[13:45:23] Done
MM aports/device/device-qemu-aarch64/APKBUILD

diff --git a/aports/device/device-qemu-aarch64/APKBUILD b/aports/device/device-qemu-aarch64/APKBUILD
index 99b811b..c4cee6c 100644
--- a/aports/device/device-qemu-aarch64/APKBUILD
+++ b/aports/device/device-qemu-aarch64/APKBUILD
@@ -21,4 +21,4 @@ package() {
                "$pkgdir"/etc/deviceinfo
 }
 
-sha512sums="a18ab789c19d8802be6a9e9c842f4c304f267bd78f46b096b4ba6609430d1544e0a9eca9bc22db67a0728efae3aad6c2def9f7e64157d31aeb31b4bb839076d5  deviceinfo"
+sha512sums="8df46383685a40a96b7c604c29d413ecdd4b4a9b92cb61f452283042f189b1ca01cb70632fec0711dd67229e0501729762c6841359ac7ea455f516b512abce9c  deviceinfo"

** The checksums are not correct

After that, simply do git commit -a --amend -n (-n is necessary so that this time the hook is not triggered).

Code

pmb.helpers.run

Use pmb.helpers.run.root() and pmb.helpers.run.user() instead of subprocess because these logs to the log file.

Shell commands

See also: #1316 Properly escape commands in pmb.chroot.user()

The passed commands gets interpreted as single command, and not executed in a shell. This means something like the following will not work:

pmb.chroot.root(args, ["echo", "test", ">", "/tmp/test"])

Instead, if you need shell functionality in the call, you can wrap the call with sh -c. Here's one example with the parameters correctly escaped (you don't need to do that for the strings in this example, but if you pass variables then they should be escaped properly):

shell_cmd = "echo " + shutil.quote("test") + " > " + shutil.quote("/tmp/test")
pmb.chroot.root(args, ["sh", "-c", shell_cmd])

Another technique (especially if you need to run many commands in the shell at once) is writing all commands down into a temporary file and executing it with the shell, see for example pmb/chroot/initfs.py.

Writing files to the chroot

The users in the chroots (root and pmos) have different user IDs than the user of the host system. Therefore we can't just write a file to anywhere in the chroot. But we can write to /tmp and move the file afterwards:

with open("tmp/somefile", "w") as handle:
    handle.write("It works")
pmb.chroot.root(args, ["mv", "/tmp/somefile", "/etc/somefile"])

pmb.install

Whenever you change the installation process, also adjust the recovery zip installer (which performs a good part of the installation procedure directly on the Android device with a shell script).

See also