No packets exchange between Wireguard and IOS 18 connected to mobile network

In raising this issue I confirm that

[x] I have read the documentation
[X] I have read and understood the PiVPN General Guidelines
[X] I have read and understood the PiVPN Troubleshooting Guidelines
[X] The issue I am reporting isn't a duplicate, see closed issues and open issues.
[X] I have searched for similar issues and solutions
[ ] I can replicate the issue even after a clean OS installation

Describe the issue
The issue is that no packets are exchanged between IOS 18 and my RaspberryPi 5 when it is connected to the mobile network. When I am connected to a wifi I have no issues with my VPN connection and there is no problem with an Android phone on mobile network nor wifi.
Expected behavior
I expect to be able to connect to internet through my vpn connection when I am on my mobile network.
Please describe the steps to replicate the issue

Disable wifi on your Iphone
Connect to mobile network
Start Wireguard VPN
Search anything on Internet

Have you taken any steps towards solving your issue?
I tried different values for the MTU and finally set it up to 1420.
Screenshots
No response
Where did you run pivpn?
RaspberryPi
Please provide your output from uname -a
Linux raspberrypi 6.6.51+rpt-rpi-2712 #1 SMP PREEMPT Debian 1:6.6.51-1+rpt3 (2024-10-08) aarch64 GNU/Linux
Details about Operative System
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
Installation
No response
Profile / Client creation
[2024-10-28T16:48:14+0100]: ::: Error: Got an unexpected argument 'nopass'
::: Create a client conf profile
:::
::: Usage: pivpn <-a|add> [-n|--name ] [-h|--help]
:::
::: Commands:
:::  [none]               Interactive mode
:::  -n,--name            Name for the Client (default: 'raspberrypi')
:::  -h,--help            Show this help dialog
Debug output
::::  Server configuration shown below   ::::
[Interface]
PrivateKey = server_priv
Address = <IP_ADDRESS>/24,fd11:5ee:bad:c0de::a7c:8a01/64
MTU = 1420
ListenPort = PORT
### begin polocto@phone ###
[Peer]
PublicKey = polocto@phone_pub
PresharedKey = polocto@phone_psk
AllowedIPs = <IP_ADDRESS>/32,fd11:5ee:bad:c0de::a7c:8a03/128
### end polocto@phone ###
### begin polocto@macos ###
[Peer]
PublicKey = polocto@macos_pub
PresharedKey = polocto@macos_psk
AllowedIPs = <IP_ADDRESS>/32,fd11:5ee:bad:c0de::a7c:8a04/128
### end polocto@macos ###
### begin laurent@phone ###
[Peer]
PublicKey = laurent@phone_pub
PresharedKey = laurent@phone_psk
AllowedIPs = <IP_ADDRESS>/32,fd11:5ee:bad:c0de::a7c:8a05/128
### end laurent@phone ###
### begin raph@phone ###
[Peer]
PublicKey = raph@phone_pub
PresharedKey = raph@phone_psk
AllowedIPs = <IP_ADDRESS>/32,fd11:5ee:bad:c0de::a7c:8a06/128
### end raph@phone ###
### begin raph@laptop ###
[Peer]
PublicKey = raph@laptop_pub
PresharedKey = raph@laptop_psk
AllowedIPs = <IP_ADDRESS>/32,fd11:5ee:bad:c0de::a7c:8a07/128
### end raph@laptop ###
=============================================
::::  Client configuration shown below   ::::
[Interface]
PrivateKey = polocto@phone_priv
Address = <IP_ADDRESS>/24,fd11:5ee:bad:c0de::a7c:8a03/64
DNS = <IP_ADDRESS>, IP

[Peer]
PublicKey = server_pub
PresharedKey = polocto@phone_psk
Endpoint = REDACTED:PORT
AllowedIPs = <IP_ADDRESS>/0, ::0/0
=============================================
:::: 	Recursive list of files in	 ::::
::::	/etc/wireguard shown below	 ::::
/etc/wireguard:
configs
keys
wg0.conf

/etc/wireguard/configs:
clients.txt
<EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS>
/etc/wireguard/keys:
laurent@phone_priv
laurent@phone_psk
laurent@phone_pub
polocto@macos_priv
polocto@macos_psk
polocto@macos_pub
polocto@phone_priv
polocto@phone_psk
polocto@phone_pub
raph@laptop_priv
raph@laptop_psk
raph@laptop_pub
raph@phone_priv
raph@phone_psk
raph@phone_pub
server_priv
server_pub
=============================================
::::		Self check		 ::::
:: [OK] IP forwarding is enabled
:: [OK] Iptables MASQUERADE rule set
:: [OK] Iptables FORWARD rule set
:: [OK] WireGuard is running
:: [OK] WireGuard is enabled
(it will automatically start on reboot)
:: [OK] WireGuard is listening on port PORT/udp
=============================================
:::: Having trouble connecting? Take a look at the FAQ:
:::: https://docs.pivpn.io/faq
=============================================
:::: WARNING: This script should have automatically masked sensitive       ::::
:::: information, however, still make sure that PrivateKey, PublicKey      ::::
:::: and PresharedKey are masked before reporting an issue. An example key ::::
:::: that you should NOT see in this log looks like this:                  ::::
:::: YIAoJVsdIeyvXfGGDDadHh6AxsMRymZTnnzZoAb9cxRe                          ::::
=============================================
::::		Debug complete		 ::::
:::
::: Debug output completed above.
::: Copy saved to /tmp/debug.log

Sorry do you mean that the VPN works on mobile on Android but non on mobile on iOS?

It is working with iOS when I use wifi but not when I use mobile data.
The output while using my VPN through wifi with iOS is
::: Generating Debug Output
::::            PiVPN debug              ::::
=============================================
::::            Latest commit            ::::
Branch: master
Commit: ececd4ed96b7e16493655131ae734b479aadd117
Author: 4s3ti
Date: Sat Apr 13 16:00:00 2024 +0200
Summary: build: Add automated release actions
=============================================
::::        Installation settings        ::::
PLAT=Debian
OSCN=bookworm
USING_UFW=0
IPv4dev=eth0
IPv6dev=eth0
dhcpReserv=1
IPv4addr=<IP_ADDRESS>/24
IPv4gw=<IP_ADDRESS>
install_user=polocto
install_home=/home/polocto
VPN=wireguard
pivpnPORT=51820
pivpnDNS1=<IP_ADDRESS>
pivpnDNS2=<IP_ADDRESS>
pivpnHOST=REDACTED
INPUT_CHAIN_EDITED=0
FORWARD_CHAIN_EDITED=1
INPUT_CHAIN_EDITEDv6=0
FORWARD_CHAIN_EDITEDv6=0
pivpnPROTO=udp
pivpnMTU=1420
pivpnDEV=wg0
pivpnNET=<IP_ADDRESS>
subnetClass=24
pivpnenableipv6=1
pivpnNETv6="fd11:5ee:bad:c0de::"
subnetClassv6=64
ALLOWED_IPS="<IP_ADDRESS>/0, ::0/0"
UNATTUPG=1
INSTALLED_PACKAGES=(dnsutils grepcidr bsdmainutils iptables-persistent wireguard-tools qrencode)
=============================================
::::  Server configuration shown below   ::::
[Interface]
PrivateKey = server_priv
Address = <IP_ADDRESS>/24,fd11:5ee:bad:c0de::a7c:8a01/64
MTU = 1420
ListenPort = 51820
### begin polocto@phone ###
[Peer]
PublicKey = polocto@phone_pub
PresharedKey = polocto@phone_psk
AllowedIPs = <IP_ADDRESS>/32,fd11:5ee:bad:c0de::a7c:8a03/128
### end polocto@phone ###
### begin polocto@macos ###
[Peer]
PublicKey = polocto@macos_pub
PresharedKey = polocto@macos_psk
AllowedIPs = <IP_ADDRESS>/32,fd11:5ee:bad:c0de::a7c:8a04/128
### end polocto@macos ###
### begin laurent@phone ###
[Peer]
PublicKey = laurent@phone_pub
PresharedKey = laurent@phone_psk
AllowedIPs = <IP_ADDRESS>/32,fd11:5ee:bad:c0de::a7c:8a05/128
### end laurent@phone ###
### begin raph@phone ###
[Peer]
PublicKey = raph@phone_pub
PresharedKey = raph@phone_psk
AllowedIPs = <IP_ADDRESS>/32,fd11:5ee:bad:c0de::a7c:8a06/128
### end raph@phone ###
### begin raph@laptop ###
[Peer]
PublicKey = raph@laptop_pub
PresharedKey = raph@laptop_psk
AllowedIPs = <IP_ADDRESS>/32,fd11:5ee:bad:c0de::a7c:8a07/128
### end raph@laptop ###
=============================================
::::  Client configuration shown below   ::::
[Interface]
PrivateKey = polocto@phone_priv
Address = <IP_ADDRESS>/24,fd11:5ee:bad:c0de::a7c:8a03/64
DNS = <IP_ADDRESS>, <IP_ADDRESS>

[Peer]
PublicKey = server_pub
PresharedKey = polocto@phone_psk
Endpoint = REDACTED:51820
AllowedIPs = <IP_ADDRESS>/0, ::0/0
=============================================
::::    Recursive list of files in       ::::
::::    /etc/wireguard shown below       ::::
/etc/wireguard:
configs
keys
wg0.conf

/etc/wireguard/configs:
clients.txt
<EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS>
/etc/wireguard/keys:
laurent@phone_priv
laurent@phone_psk
laurent@phone_pub
polocto@macos_priv
polocto@macos_psk
polocto@macos_pub
polocto@phone_priv
polocto@phone_psk
polocto@phone_pub
raph@laptop_priv
raph@laptop_psk
raph@laptop_pub
raph@phone_priv
raph@phone_psk
raph@phone_pub
server_priv
server_pub
=============================================
::::            Self check               ::::
:: [OK] IP forwarding is enabled
:: [OK] Iptables MASQUERADE rule set
:: [OK] Iptables FORWARD rule set
:: [OK] WireGuard is running
:: [OK] WireGuard is enabled
(it will automatically start on reboot)
:: [OK] WireGuard is listening on port 51820/udp
=============================================
:::: Having trouble connecting? Take a look at the FAQ:
:::: https://docs.pivpn.io/faq
=============================================
:::: WARNING: This script should have automatically masked sensitive       ::::
:::: information, however, still make sure that PrivateKey, PublicKey      ::::
:::: and PresharedKey are masked before reporting an issue. An example key ::::
:::: that you should NOT see in this log looks like this:                  ::::
:::: YIAoJVsdIeyvXfGGDDadHh6AxsMRymZTnnzZoAb9cxRe                          ::::
=============================================
::::            Debug complete           ::::
:::
::: Debug output completed above.
::: Copy saved to /tmp/debug.log
:::

IPv6 should also be running :
$ lsmod | grep wireguard
wireguard             114688  0
libchacha20poly1305    49152  1 wireguard
ip6_udp_tunnel         49152  1 wireguard
udp_tunnel             49152  1 wireguard
libcurve25519_generic    65536  1 wireguard
ipv6                  589824  78 bridge,wireguard

While I am on mobile data the handshake does not seem to happen. On the mobile app no "dernier établissement de liaison" appear while I am using mobile data but appear when I am connected to wifi.

Sorry do you mean that the VPN works on mobile on Android but non on mobile on iOS? You could try the troubleshooting while attempting to connect with iOS https://docs.pivpn.io/faq/#how-do-i-troubleshoot-connection-issues

It is working with iOS when I use wifi but not when I use mobile data.
The output while using my VPN through wifi with iOS is
::: Generating Debug Output
::::            PiVPN debug              ::::
=============================================
::::            Latest commit            ::::
Branch: master
Commit: ececd4ed96b7e16493655131ae734b479aadd117
Author: 4s3ti
Date: Sat Apr 13 16:00:00 2024 +0200
Summary: build: Add automated release actions
=============================================
::::        Installation settings        ::::
PLAT=Debian
OSCN=bookworm
USING_UFW=0
IPv4dev=eth0
IPv6dev=eth0
dhcpReserv=1
IPv4addr=<IP_ADDRESS>/24
IPv4gw=<IP_ADDRESS>
install_user=polocto
install_home=/home/polocto
VPN=wireguard
pivpnPORT=51820
pivpnDNS1=<IP_ADDRESS>
pivpnDNS2=<IP_ADDRESS>
pivpnHOST=REDACTED
INPUT_CHAIN_EDITED=0
FORWARD_CHAIN_EDITED=1
INPUT_CHAIN_EDITEDv6=0
FORWARD_CHAIN_EDITEDv6=0
pivpnPROTO=udp
pivpnMTU=1420
pivpnDEV=wg0
pivpnNET=<IP_ADDRESS>
subnetClass=24
pivpnenableipv6=1
pivpnNETv6="fd11:5ee:bad:c0de::"
subnetClassv6=64
ALLOWED_IPS="<IP_ADDRESS>/0, ::0/0"
UNATTUPG=1
INSTALLED_PACKAGES=(dnsutils grepcidr bsdmainutils iptables-persistent wireguard-tools qrencode)
=============================================
::::  Server configuration shown below   ::::
[Interface]
PrivateKey = server_priv
Address = <IP_ADDRESS>/24,fd11:5ee:bad:c0de::a7c:8a01/64
MTU = 1420
ListenPort = 51820
### begin polocto@phone ###
[Peer]
PublicKey = polocto@phone_pub
PresharedKey = polocto@phone_psk
AllowedIPs = <IP_ADDRESS>/32,fd11:5ee:bad:c0de::a7c:8a03/128
### end polocto@phone ###
### begin polocto@macos ###
[Peer]
PublicKey = polocto@macos_pub
PresharedKey = polocto@macos_psk
AllowedIPs = <IP_ADDRESS>/32,fd11:5ee:bad:c0de::a7c:8a04/128
### end polocto@macos ###
### begin laurent@phone ###
[Peer]
PublicKey = laurent@phone_pub
PresharedKey = laurent@phone_psk
AllowedIPs = <IP_ADDRESS>/32,fd11:5ee:bad:c0de::a7c:8a05/128
### end laurent@phone ###
### begin raph@phone ###
[Peer]
PublicKey = raph@phone_pub
PresharedKey = raph@phone_psk
AllowedIPs = <IP_ADDRESS>/32,fd11:5ee:bad:c0de::a7c:8a06/128
### end raph@phone ###
### begin raph@laptop ###
[Peer]
PublicKey = raph@laptop_pub
PresharedKey = raph@laptop_psk
AllowedIPs = <IP_ADDRESS>/32,fd11:5ee:bad:c0de::a7c:8a07/128
### end raph@laptop ###
=============================================
::::  Client configuration shown below   ::::
[Interface]
PrivateKey = polocto@phone_priv
Address = <IP_ADDRESS>/24,fd11:5ee:bad:c0de::a7c:8a03/64
DNS = <IP_ADDRESS>, <IP_ADDRESS>

[Peer]
PublicKey = server_pub
PresharedKey = polocto@phone_psk
Endpoint = REDACTED:51820
AllowedIPs = <IP_ADDRESS>/0, ::0/0
=============================================
::::    Recursive list of files in       ::::
::::    /etc/wireguard shown below       ::::
/etc/wireguard:
configs
keys
wg0.conf

/etc/wireguard/configs:
clients.txt
<EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS>
/etc/wireguard/keys:
laurent@phone_priv
laurent@phone_psk
laurent@phone_pub
polocto@macos_priv
polocto@macos_psk
polocto@macos_pub
polocto@phone_priv
polocto@phone_psk
polocto@phone_pub
raph@laptop_priv
raph@laptop_psk
raph@laptop_pub
raph@phone_priv
raph@phone_psk
raph@phone_pub
server_priv
server_pub
=============================================
::::            Self check               ::::
:: [OK] IP forwarding is enabled
:: [OK] Iptables MASQUERADE rule set
:: [OK] Iptables FORWARD rule set
:: [OK] WireGuard is running
:: [OK] WireGuard is enabled
(it will automatically start on reboot)
:: [OK] WireGuard is listening on port 51820/udp
=============================================
:::: Having trouble connecting? Take a look at the FAQ:
:::: https://docs.pivpn.io/faq
=============================================
:::: WARNING: This script should have automatically masked sensitive       ::::
:::: information, however, still make sure that PrivateKey, PublicKey      ::::
:::: and PresharedKey are masked before reporting an issue. An example key ::::
:::: that you should NOT see in this log looks like this:                  ::::
:::: YIAoJVsdIeyvXfGGDDadHh6AxsMRymZTnnzZoAb9cxRe                          ::::
=============================================
::::            Debug complete           ::::
:::
::: Debug output completed above.
::: Copy saved to /tmp/debug.log
:::

IPv6 should also be running :
$ lsmod | grep wireguard
wireguard             114688  0
libchacha20poly1305    49152  1 wireguard
ip6_udp_tunnel         49152  1 wireguard
udp_tunnel             49152  1 wireguard
libcurve25519_generic    65536  1 wireguard
ipv6                  589824  78 bridge,wireguard

While I am on mobile data the handshake does not seem to happen. On the mobile app no "dernier établissement de liaison" appear while I am using mobile data but appear when I am connected to wifi.

You have already posted the debug log, you don't need to post it again, but there are more steps to follow in my link above.

Here are the other steps
lsmod | grep wireguard
wireguard             114688  0
libchacha20poly1305    49152  1 wireguard
ip6_udp_tunnel         49152  1 wireguard
udp_tunnel             49152  1 wireguard
libcurve25519_generic    65536  1 wireguard
ipv6                  589824  62 bridge,wireguard

For the setupvar.conf I got the good values
sudo tcpdump -n -i eth0 udp port 51820
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
01:03:30.895533 IP <IP_ADDRESS>.51820 > <IP_ADDRESS>.64888: UDP, length 272
01:03:30.899707 IP <IP_ADDRESS>.64888 > <IP_ADDRESS>.51820: UDP, length 96
01:03:30.979099 IP <IP_ADDRESS>.51820 > <IP_ADDRESS>.64888: UDP, length 288
01:03:30.985114 IP <IP_ADDRESS>.64888 > <IP_ADDRESS>.51820: UDP, length 96
01:03:31.083024 IP <IP_ADDRESS>.51820 > <IP_ADDRESS>.64888: UDP, length 288
01:03:31.088320 IP <IP_ADDRESS>.64888 > <IP_ADDRESS>.51820: UDP, length 96
01:03:31.187027 IP <IP_ADDRESS>.51820 > <IP_ADDRESS>.64888: UDP, length 288
01:03:31.192983 IP <IP_ADDRESS>.64888 > <IP_ADDRESS>.51820: UDP, length 96
01:03:31.291003 IP <IP_ADDRESS>.51820 > <IP_ADDRESS>.64888: UDP, length 288
01:03:31.298535 IP <IP_ADDRESS>.64888 > <IP_ADDRESS>.51820: UDP, length 96
01:03:31.389838 IP <IP_ADDRESS>.64888 > <IP_ADDRESS>.51820: UDP, length 128
01:03:31.394998 IP <IP_ADDRESS>.51820 > <IP_ADDRESS>.64888: UDP, length 368
01:03:31.401923 IP <IP_ADDRESS>.64888 > <IP_ADDRESS>.51820: UDP, length 96
...
496 packets captured
499 packets received by filter
``
0 packets dropped by kernel

Here is my logs from my iphone connected to cellular network

2024-11-04 13:42:58.272
[APP] startActivation: Entering (tunnel: Maison)
2024-11-04 13:42:58.281
[APP] startActivation: Starting tunnel
2024-11-04 13:42:58.282
[APP] startActivation: Success
2024-11-04 13:42:58.286
[APP] Tunnel 'Maison' connection status changed to 'connecting'
2024-11-04 13:42:58.384
[NET] App version: 1.0.16 (27)
2024-11-04 13:42:58.384
[NET] Starting tunnel from the app
2024-11-04 13:42:58.508
[NET] DNS64: mapped  to itself.
2024-11-04 13:42:58.510
[NET] Attaching to interface
2024-11-04 13:42:58.510
[NET] UAPI: Updating private key
2024-11-04 13:42:58.511
[NET] Routine: encryption worker 2 - started
2024-11-04 13:42:58.511
[NET] Routine: handshake worker 3 - started
2024-11-04 13:42:58.511
[NET] Routine: encryption worker 1 - started
2024-11-04 13:42:58.511
[NET] Routine: decryption worker 1 - started
2024-11-04 13:42:58.511
[NET] Routine: decryption worker 5 - started
2024-11-04 13:42:58.511
[NET] UAPI: Removing all peers
2024-11-04 13:42:58.511
[NET] Routine: handshake worker 1 - started
2024-11-04 13:42:58.511
[NET] Routine: decryption worker 2 - started
2024-11-04 13:42:58.511
[NET] Routine: handshake worker 4 - started
2024-11-04 13:42:58.511
[NET] Routine: decryption worker 4 - started
2024-11-04 13:42:58.511
[NET] Routine: encryption worker 5 - started
2024-11-04 13:42:58.511
[NET] Routine: encryption worker 4 - started
2024-11-04 13:42:58.511
[NET] Routine: handshake worker 2 - started
2024-11-04 13:42:58.511
[NET] Routine: encryption worker 3 - started
2024-11-04 13:42:58.511
[NET] Routine: handshake worker 6 - started
2024-11-04 13:42:58.511
[NET] Routine: decryption worker 3 - started
2024-11-04 13:42:58.511
[NET] Routine: TUN reader - started
2024-11-04 13:42:58.511
[NET] Routine: encryption worker 6 - started
2024-11-04 13:42:58.511
[NET] Routine: decryption worker 6 - started
2024-11-04 13:42:58.511
[NET] Routine: handshake worker 5 - started
2024-11-04 13:42:58.511
[NET] Routine: event worker - started
2024-11-04 13:42:58.511
[NET] peer(zscN…l1ng) - UAPI: Created
2024-11-04 13:42:58.512
[NET] peer(zscN…l1ng) - UAPI: Updating preshared key
2024-11-04 13:42:58.512
[NET] peer(zscN…l1ng) - UAPI: Updating endpoint
2024-11-04 13:42:58.512
[NET] peer(zscN…l1ng) - UAPI: Updating persistent keepalive interval
2024-11-04 13:42:58.512
[NET] peer(zscN…l1ng) - UAPI: Removing all allowedips
2024-11-04 13:42:58.512
[NET] peer(zscN…l1ng) - UAPI: Adding allowedip
2024-11-04 13:42:58.512
[NET] peer(zscN…l1ng) - UAPI: Adding allowedip
2024-11-04 13:42:58.513
[NET] UDP bind has been updated
2024-11-04 13:42:58.513
[NET] peer(zscN…l1ng) - Starting
2024-11-04 13:42:58.513
[NET] Routine: receive incoming v6 - started
2024-11-04 13:42:58.513
[NET] Routine: receive incoming v4 - started
2024-11-04 13:42:58.513
[NET] Interface state was Down, requested Up, now Up
2024-11-04 13:42:58.513
[NET] Device started
2024-11-04 13:42:58.513
[NET] Tunnel interface is utun7
2024-11-04 13:42:58.514
[NET] peer(zscN…l1ng) - Routine: sequential receiver - started
2024-11-04 13:42:58.514
[NET] peer(zscN…l1ng) - Routine: sequential sender - started
2024-11-04 13:42:58.514
[NET] Network change detected with unsatisfied route and interface order [pdp_ip0]
2024-11-04 13:42:58.514
[NET] Connectivity offline, pausing backend.
2024-11-04 13:42:58.514
[NET] Device closing
2024-11-04 13:42:58.514
[NET] Routine: TUN reader - stopped
2024-11-04 13:42:58.515
[NET] Routine: event worker - stopped
2024-11-04 13:42:58.515
[NET] Routine: receive incoming v4 - stopped
2024-11-04 13:42:58.515
[NET] Routine: receive incoming v6 - stopped
2024-11-04 13:42:58.515
[NET] peer(zscN…l1ng) - Stopping
2024-11-04 13:42:58.515
[NET] peer(zscN…l1ng) - Routine: sequential receiver - stopped
2024-11-04 13:42:58.515
[NET] peer(zscN…l1ng) - Routine: sequential sender - stopped
2024-11-04 13:42:58.515
[NET] Device closed
2024-11-04 13:42:58.515
[NET] Routine: decryption worker 1 - stopped
2024-11-04 13:42:58.515
[NET] Routine: decryption worker 6 - stopped
2024-11-04 13:42:58.515
[NET] Routine: decryption worker 3 - stopped
2024-11-04 13:42:58.515
[NET] Routine: handshake worker 3 - stopped
2024-11-04 13:42:58.515
[NET] Routine: decryption worker 2 - stopped
2024-11-04 13:42:58.515
[APP] Tunnel 'Maison' connection status changed to 'connected'
2024-11-04 13:42:58.515
[NET] Routine: handshake worker 5 - stopped
2024-11-04 13:42:58.515
[NET] Routine: handshake worker 1 - stopped
2024-11-04 13:42:58.515
[NET] Routine: decryption worker 4 - stopped
2024-11-04 13:42:58.515
[NET] Routine: decryption worker 5 - stopped
2024-11-04 13:42:58.515
[NET] Routine: handshake worker 2 - stopped
2024-11-04 13:42:58.515
[NET] Routine: handshake worker 4 - stopped
2024-11-04 13:42:58.515
[NET] Routine: handshake worker 6 - stopped
2024-11-04 13:42:58.516
[NET] Routine: encryption worker 2 - stopped
2024-11-04 13:42:58.516
[NET] Routine: encryption worker 5 - stopped
2024-11-04 13:42:58.516
[NET] Routine: encryption worker 4 - stopped
2024-11-04 13:42:58.516
[NET] Routine: encryption worker 1 - stopped
2024-11-04 13:42:58.516
[NET] Routine: encryption worker 3 - stopped
2024-11-04 13:42:58.516
[NET] Routine: encryption worker 6 - stopped
2024-11-04 13:42:58.566
[NET] Network change detected with unsatisfied route and interface order [pdp_ip0, utun7]
2024-11-04 13:43:03.282
[APP] Status update notification timeout for tunnel 'Maison'. Tunnel status is now 'connected'.
2024-11-04 13:43:05.609
[APP] startDeactivation: Tunnel: Maison
2024-11-04 13:43:05.614
[APP] Tunnel 'Maison' connection status changed to 'disconnecting'
2024-11-04 13:43:05.724
[NET] Network change detected with unsatisfied route and interface order [pdp_ip0]
2024-11-04 13:43:05.935
[NET] Stopping tunnel

The tcpdump log only shows connection from the local network, can you try while connecting over mobile data?

I got no packets while using mobile data
sudo tcpdump -n -i eth0 udp port 51820
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes

I got no packets while using mobile data

With both iOS as well as Android?

No only for IOS, for Android I got this
14:25:13.614234 IP <IP_ADDRESS>.48116 > <IP_ADDRESS>.51820: UDP, length 80
14:25:13.873592 IP <IP_ADDRESS>.48116 > <IP_ADDRESS>.51820: UDP, length 112
14:25:13.923804 IP <IP_ADDRESS>.48116 > <IP_ADDRESS>.51820: UDP, length 320
14:25:14.053812 IP <IP_ADDRESS>.48116 > <IP_ADDRESS>.51820: UDP, length 320
14:25:14.603226 IP <IP_ADDRESS>.51820 > <IP_ADDRESS>.61315: UDP, length 148
14:25:16.983368 IP <IP_ADDRESS>.48116 > <IP_ADDRESS>.51820: UDP, length 96
14:25:17.121401 IP <IP_ADDRESS>.48116 > <IP_ADDRESS>.51820: UDP, length 96
14:25:17.121401 IP <IP_ADDRESS>.48116 > <IP_ADDRESS>.51820: UDP, length 96
14:25:17.704425 IP <IP_ADDRESS>.48116 > <IP_ADDRESS>.51820: UDP, length 96
14:25:17.704425 IP <IP_ADDRESS>.48116 > <IP_ADDRESS>.51820: UDP, length 96
14:25:17.706719 IP <IP_ADDRESS>.51820 > <IP_ADDRESS>.48116: UDP, length 112
14:25:17.706725 IP <IP_ADDRESS>.51820 > <IP_ADDRESS>.48116: UDP, length 128
14:25:17.773718 IP <IP_ADDRESS>.48116 > <IP_ADDRESS>.51820: UDP, length 96
14:25:17.779665 IP <IP_ADDRESS>.51820 > <IP_ADDRESS>.48116: UDP, length 96

Weird, what if you try to connect iOS via the Android hotspot?

Just got the right IP as if I am connected to the VPN while using android hotspot but it seems that there is not packets exchange and turn on the VPN on my iPhone

Sorry test wrong network interface, it works correctly even though the connection is slow

14:39:47.105795 IP <IP_ADDRESS>.64197 > <IP_ADDRESS>.51820: UDP, length 128
14:39:47.271663 IP <IP_ADDRESS>.64197 > <IP_ADDRESS>.51820: UDP, length 128
14:39:48.299100 IP <IP_ADDRESS>.64197 > <IP_ADDRESS>.51820: UDP, length 128
14:39:49.099442 IP <IP_ADDRESS>.51820 > <IP_ADDRESS>.48116: UDP, length 148
14:39:49.263003 IP <IP_ADDRESS>.64197 > <IP_ADDRESS>.51820: UDP, length 128

Really weird I got not packet exchange
sudo tcpdump -n -i wg0 udp port 51820
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on wg0, link-type RAW (Raw IP), snapshot length 262144 bytes

but I got a really slow network connection
Tried to connect to whatis my IP to see if I go through the right network but I only have the HTML and not all the web page content and cannot see what is my IP

Sorry test wrong network interface, it works correctly even though the connection is slow
4:39:47.105795 IP <IP_ADDRESS>.64197 > <IP_ADDRESS>.51820: UDP, length 128
14:39:47.271663 IP <IP_ADDRESS>.64197 > <IP_ADDRESS>.51820: UDP, length 128
14:39:48.299100 IP <IP_ADDRESS>.64197 > <IP_ADDRESS>.51820: UDP, length 128
14:39:49.099442 IP <IP_ADDRESS>.51820 > <IP_ADDRESS>.48116: UDP, length 148
14:39:49.263003 IP <IP_ADDRESS>.64197 > <IP_ADDRESS>.51820: UDP, length 128

it works correctly even though the connection is slow

Try lowering the MTU on the iPhone https://docs.pivpn.io/faq/#tweaking-mtu

I changed  MTU from 1280 to 1420 +=20 but it is not effective and while using pivpn -c it does not appear as able to handshake while I try to connect my iPhone to my vpn through mobile data.

To eliminate a possible iOS issue, you could try the Android (e)SIM on the iPhone and see if it’s slow. Also try MTU under 1280. Though I suspect it’s an issue with the network rather than iOS.

Hello, I have been able to test the other sim card, their is no handshak with the server. It might have been an issue with the app or the network config. I reuninstalled it and reset my parameters and now its working


Error 500 - personal_access_tokens table remains empty

After installation I ssh inside the container and ran php artisan koel:init --no-assets which created a bunch of tables inside the database. I can see the default admin user inside the users table, personal_access_tokens table is empty.
When I try to log in I get error 500 and this is the log:
[2021-10-25 21:53:22] production.ERROR: SQLSTATE[08006] [7] FATAL:  password authentication failed for user "koel" (SQL: select * from "personal_
access_tokens" where "token" = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 limit 1) {"exception":"[object] (Illuminate\\Data
base\\QueryException(code: 7): SQLSTATE[08006] [7] FATAL:  password authentication failed for user \"koel\" (SQL: select * from \"personal_access
_tokens\" where \"token\" = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 limit 1) at /var/www/html/vendor/laravel/framework/s
rc/Illuminate/Database/Connection.php:692)
[stacktrace]
#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(652): Illuminate\\Database\\Connection->runQueryCallback()
#1 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(360): Illuminate\\Database\\Connection->run()
#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2350): Illuminate\\Database\\Connection->select()
#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2338): Illuminate\\Database\\Query\\Builder->runSelect()
#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2872): Illuminate\\Database\\Query\\Builder->Illuminate\\Data
base\\Query\\{closure}()
#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2339): Illuminate\\Database\\Query\\Builder->onceWithColumns(
)
#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(602): Illuminate\\Database\\Query\\Builder->get()
#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(586): Illuminate\\Database\\Eloquent\\Builder->getModels()
#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Concerns/BuildsQueries.php(259): Illuminate\\Database\\Eloquent\\Builder->get()

It looks like it cannot create the token or something - although the error is different maybe it is related somehow to #54 ?
Since artisan was able to create the tables I doubt it's a read/write permission issue, but to be safe I make the koel user a superuser.
I'm using Postgresql on a Pi 4. This pulled the latest docker version - not sure which one. If you need more info please ask.

Hi, sorry for the delay, I haven't tried reproducing since I use MySQL. Does it still occur on the latest version ?

Hi! No worries I also didn't have the patience or the time to test :smile:
I restarted from the beginning. I uses DB_* environment variable in my docker compose. It does seem to create some tables, or is it when I run the initial artisan command, I'm not sure but still.
When I run php artisan koel:init --no-assets:
From koel docker I get:
Migrating database
Oops! Koel installation or upgrade didn't finish successfully.
Please try again, or visit https://docs.koel.dev for manual installation.
😥 Sorry for this. You deserve better.

From postgres I get:
	Connection matched pg_hba.conf line 99: "host all all all md5"
2022-01-09 20:14:18.078 UTC [90] ERROR:  cannot drop index artists_name_unique because constraint artists_name_unique on table artists requires it
2022-01-09 20:14:18.078 UTC [90] HINT:  You can drop constraint artists_name_unique on table artists instead.
2022-01-09 20:14:18.078 UTC [90] STATEMENT:  drop index "artists_name_unique"
2022-01-09 20:14:18.080 UTC [90] ERROR:  current transaction is aborted, commands ignored until end of transaction block
2022-01-09 20:14:18.080 UTC [90] STATEMENT:  DEALLOCATE pdo_stmt_00000058

Maybe my previous mistake was that I tried to connect without seeing that error above, therefore login attemps might return code 500.
Between every try, I do:
DROP DATABASE koel;
CREATE DATABASE koel;
GRANT CONNECT ON DATABASE koel TO koel;

As for the settings, I use host postgres with port 5432 user and db koel and it's password.
Koel image:
ID: ba74268b845d64bdc0acee5e8955dceaeffb6eddf824f7012f9cf400958dc6cd
Date: 2021-12-30 23:04:16
Arch: arm64
I use Postgres version 12. Everything is managed inside Portainer.

Might be the same issue as https://github.com/koel/koel/issues/1401

just
docker exec -it koel_koel_1 bash
chown -R www-data:www-data
exit

and
docker exec --user www-data -it koel_koel_1 bash
php artisan koel:init --no-assets

docker exec -it koel_koel_1 bash
chown -R www-data:www-data
exit

Isn't there a missing argument for the 'chown' call ?


Improve performance of XCTest execution from CLI

By minimizing the test execution time, Gradle improves the feedback loop to the developers waiting for his build to complete.
Expected Behaviors
This epic covers:

Test filters using --test flag
Parallel test execution

Test Cases

[ ] Honor filters passed to --test flags
[ ] Honor wildcard in filters passed to --test flags
[ ] No --test filters executes all tests
[ ] Test are executed in parallel

Parallel execution on macOS with Xcode's implementation of XCTest can be achieved through Objective-C runtime reflection. See Swift PM helper for more information.

Following this discussion on Slack, XCTest should be discoverable by Gradle that works for both macOS and Linux. Some possible options are:

no discovery, developer maintains a list of test cases and we use that list on all platforms
discovery using a bundle on macOS, no discovery on other platforms so developer maintains a list of test cases
use a naming scheme and run any test class whose source file matches that naming scheme
scan the source files to discover test classes
scan the object files  to discover test classes

It would be good to end up with a cross-platform discovery strategy (and one we can reuse for other test frameworks).


Object union member functions that return never are incorrectly narrowed

🔎 Search Terms
"never", "class union", "narrowing unions", "never union"
🕗 Version & Regression Information

This is the behavior in every version I tried, and I reviewed the FAQ for entries about never

⏯ Playground Link
Playground Link
💻 Code
class Foo {
    defoo(): never {
        throw new Error("foo error")
    }
}

class Bar {
    defoo() { }
}

type Baz = Foo | Bar;

function defooer(baz: Baz) {
    baz.defoo()
    // type = void
    // aka (never | void)

    return baz
    // type = Baz
    // should narrow to Bar
}

🙁 Actual behavior
baz doesn't get narrowed after calling .defoo(), even though it's impossible for any value after that point to be Foo. This seems to happen because the type of Baz["defoo"] is equal to Foo["defoo"] | Bar["defoo"] or () => never | void.
🙂 Expected behavior
baz should narrow to Bar after calling .defoo() because the return type of Foo.defoo is never.
Additional information about the issue
No response

This is probably more of a feature request to add flow processing for throw.  In this case, practically speaking, never could mean nothing else but "throws",  but in general never is also used to represent impossible logical flow branches, so it is an overloaded term.  Probably a throws [type] return type would be better than using  never.

But without the catch to know where to pick up the flow, for all we the know the program is terminated anyway.

I think that was the point - the program will terminate if baz is a Foo, but not if it's a Bar, so TS should be able to narrow it to the latter.  In fact, with the try-catch there, the function will not terminate (because the exception is caught inside it), and therefore baz could still be a Foo afterwards.

Possibly related to https://github.com/microsoft/TypeScript/issues/49771, but not sure that fully covers the use case here

I think maybe a throws [type] should be used as a return type, and not never.
It is much more clear.
What never means is not well defined. Here are some meanings:

A type that has been narrowed to the empty set in an unreachable flow path.
A return value indicating an unreachable flow path.
2.1. Because it will throw first (probably OP's case)
2.2. Because the program will terminate. (probably Not OP's case).
2.3  I promise this function will never get called in the first place.

If I couldn't see the "throw" implementation I wouldn't know in the OP's case whether it is 2.1. or 2.2.
Because I can see the the "throw", I think it is probably 2.1.
In case it were 2.2 or 2.3. there would be no need to track the result as a potential throw, which lessens the burden on the flow processing.
But maybe 2.2 or 2.3 is actually what is meant, and the OP knows a-priori there are no enclosing try blocks all the way to the top.

never has a very well-defined type theoretical meaning - it’s the bottom type.  It is by definition an empty set, which means any code which claims to have a value of this type is unreachable.  If it is not, you are dealing with an unsoundness.
A function which claims to return never is saying that it won’t ever return normally, because, by the definition of never, there’s no way it can.

I think maybe a throws [type] is needed as an available return type

That would be typed/checked exceptions which is https://github.com/microsoft/TypeScript/issues/56365 (Ryan needs to update the description there, methinks).

You are talking about the type never, not how to deal with what happens after never.
I edited my answer just before you replied, so it may be more clear now.
Does flow need to track the try blocks or not?
In the case a return type throws [optional type], it is obvious that is does.
If it doesn't, lets not place that burden on the TypeScript flow processing.

@craigphicks
Narrowing in try blocks is applied only if the catch block terminates, this is how it works now:
// returns number | undefined
function destring(value: string | number) {
    try {
        if (typeof value == 'string' {
            throw new Error("string_error");
        }
        // value: number
    } catch {
        // value: string | number
        return undefined;
    }

    // value: number
    return value
}

It would work the same way here, whether an exception was thrown or not wouldn't matter.
// returns Bar | undefined
function try_defoo(baz: Baz) {
    try {
        baz.defoo();
        // baz: Bar
    } catch (e) {
        // baz: Baz
        return undefined;
    }
    // baz: Bar

    return baz;
}

@kalkronline - I think we're talking about different things, and and your idea is not wrong.  What I am saying is that never already has certain usages and behavior, and that doesn't include tracking try/catch blocks.
You want a new behavior to track try/catch blocks based on function return type.  I am saying that should be an explicit throws or throws Type return type.  Advantages of doing that are:

It will not break behavior in existing code.

Current usage of never will still be available, should that be desired.

I can go into more detail of useful never usage as a return type if you are interested, but I think these arguments 1 and 2 are sufficient to make the point.
One more thing - your proposal also includes modifying the flow processing to reflect the throws return action back onto the base object, which is a really good proposal.

Reflecting the never/throws return type back onto the flow of the base object is definitely a good idea.


[bug] Registering a job for deploying an app with nomad doesn't check for error status, and assumes "OK" regardless. This should be checked.

There are several things that need to be figured out here:

[ ] Log the error for server admins
[ ] Report the error for learners
[ ] Not to run checks after it fails

What is a learner expected to do when this happens and they don't know how to proceed?

Report to server admins?
Report to project author?

I have documented failure scenarios and what to do for each case in #51.


[camerax] Preview flickering when calling setState

What package does this bug report belong to?
camerax
What target platforms are you seeing this bug on?
Android
Have you already upgraded your packages?
Yes
Dependency versions
pubspec.lock
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
  async:
    dependency: transitive
    description:
      name: async
      sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
      url: "https://pub.dev"
    source: hosted
    version: "2.11.0"
  boolean_selector:
    dependency: transitive
    description:
      name: boolean_selector
      sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
      url: "https://pub.dev"
    source: hosted
    version: "2.1.1"
  camera:
    dependency: "direct main"
    description:
      name: camera
      sha256: "7fa53bb1c2059e58bf86b7ab506e3b2a78e42f82d365b44b013239b975a166ef"
      url: "https://pub.dev"
    source: hosted
    version: "0.10.5+7"
  camera_android:
    dependency: transitive
    description:
      name: camera_android
      sha256: "7215e38fa0be58cc3203a6e48de3636fb9b1bf93d6eeedf667f882d51b3a4bf3"
      url: "https://pub.dev"
    source: hosted
    version: "0.10.8+15"
  camera_android_camerax:
    dependency: "direct main"
    description:
      path: ".."
      relative: true
    source: path
    version: "0.5.0+24"
  camera_avfoundation:
    dependency: transitive
    description:
      name: camera_avfoundation
      sha256: "3c8dd395f18722f01b5f325ddd7f5256e9bcdce538fb9243b378ba759df3283c"
      url: "https://pub.dev"
    source: hosted
    version: "0.9.13+8"
  camera_platform_interface:
    dependency: "direct main"
    description:
      name: camera_platform_interface
      sha256: b6a568984254cadaca41a6b896d87d3b2e79a2e5791afa036f8d524c6783b93a
      url: "https://pub.dev"
    source: hosted
    version: "2.7.0"
  camera_web:
    dependency: transitive
    description:
      name: camera_web
      sha256: d4c2c571c7af04f8b10702ca16bb9ed2a26e64534171e8f75c9349b2c004d8f1
      url: "https://pub.dev"
    source: hosted
    version: "0.3.2+3"
  characters:
    dependency: transitive
    description:
      name: characters
      sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
      url: "https://pub.dev"
    source: hosted
    version: "1.3.0"
  clock:
    dependency: transitive
    description:
      name: clock
      sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
      url: "https://pub.dev"
    source: hosted
    version: "1.1.1"
  collection:
    dependency: transitive
    description:
      name: collection
      sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
      url: "https://pub.dev"
    source: hosted
    version: "1.18.0"
  cross_file:
    dependency: transitive
    description:
      name: cross_file
      sha256: fedaadfa3a6996f75211d835aaeb8fede285dae94262485698afd832371b9a5e
      url: "https://pub.dev"
    source: hosted
    version: "0.3.3+8"
  csslib:
    dependency: transitive
    description:
      name: csslib
      sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb"
      url: "https://pub.dev"
    source: hosted
    version: "1.0.0"
  espresso:
    dependency: "direct dev"
    description:
      name: espresso
      sha256: a11b88c61209d873735bdf3f263ab63ce28459f8d6b6ee78257b2307a7c2edf2
      url: "https://pub.dev"
    source: hosted
    version: "0.2.1"
  fake_async:
    dependency: transitive
    description:
      name: fake_async
      sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
      url: "https://pub.dev"
    source: hosted
    version: "1.3.1"
  file:
    dependency: transitive
    description:
      name: file
      sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d"
      url: "https://pub.dev"
    source: hosted
    version: "6.1.4"
  flutter:
    dependency: "direct main"
    description: flutter
    source: sdk
    version: "0.0.0"
  flutter_driver:
    dependency: transitive
    description: flutter
    source: sdk
    version: "0.0.0"
  flutter_plugin_android_lifecycle:
    dependency: transitive
    description:
      name: flutter_plugin_android_lifecycle
      sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da
      url: "https://pub.dev"
    source: hosted
    version: "2.0.17"
  flutter_test:
    dependency: "direct dev"
    description: flutter
    source: sdk
    version: "0.0.0"
  flutter_web_plugins:
    dependency: transitive
    description: flutter
    source: sdk
    version: "0.0.0"
  fuchsia_remote_debug_protocol:
    dependency: transitive
    description: flutter
    source: sdk
    version: "0.0.0"
  html:
    dependency: transitive
    description:
      name: html
      sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a"
      url: "https://pub.dev"
    source: hosted
    version: "0.15.4"
  integration_test:
    dependency: "direct dev"
    description: flutter
    source: sdk
    version: "0.0.0"
  matcher:
    dependency: transitive
    description:
      name: matcher
      sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
      url: "https://pub.dev"
    source: hosted
    version: "0.12.16"
  material_color_utilities:
    dependency: transitive
    description:
      name: material_color_utilities
      sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
      url: "https://pub.dev"
    source: hosted
    version: "0.5.0"
  meta:
    dependency: transitive
    description:
      name: meta
      sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e
      url: "https://pub.dev"
    source: hosted
    version: "1.10.0"
  path:
    dependency: transitive
    description:
      name: path
      sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
      url: "https://pub.dev"
    source: hosted
    version: "1.8.3"
  platform:
    dependency: transitive
    description:
      name: platform
      sha256: ae68c7bfcd7383af3629daafb32fb4e8681c7154428da4febcff06200585f102
      url: "https://pub.dev"
    source: hosted
    version: "3.1.2"
  plugin_platform_interface:
    dependency: transitive
    description:
      name: plugin_platform_interface
      sha256: f4f88d4a900933e7267e2b353594774fc0d07fb072b47eedcd5b54e1ea3269f8
      url: "https://pub.dev"
    source: hosted
    version: "2.1.7"
  process:
    dependency: transitive
    description:
      name: process
      sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09"
      url: "https://pub.dev"
    source: hosted
    version: "4.2.4"
  sky_engine:
    dependency: transitive
    description: flutter
    source: sdk
    version: "0.0.99"
  source_span:
    dependency: transitive
    description:
      name: source_span
      sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
      url: "https://pub.dev"
    source: hosted
    version: "1.10.0"
  stack_trace:
    dependency: transitive
    description:
      name: stack_trace
      sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
      url: "https://pub.dev"
    source: hosted
    version: "1.11.1"
  stream_channel:
    dependency: transitive
    description:
      name: stream_channel
      sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
      url: "https://pub.dev"
    source: hosted
    version: "2.1.2"
  stream_transform:
    dependency: transitive
    description:
      name: stream_transform
      sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f"
      url: "https://pub.dev"
    source: hosted
    version: "2.1.0"
  string_scanner:
    dependency: transitive
    description:
      name: string_scanner
      sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
      url: "https://pub.dev"
    source: hosted
    version: "1.2.0"
  sync_http:
    dependency: transitive
    description:
      name: sync_http
      sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961"
      url: "https://pub.dev"
    source: hosted
    version: "0.3.1"
  term_glyph:
    dependency: transitive
    description:
      name: term_glyph
      sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
      url: "https://pub.dev"
    source: hosted
    version: "1.2.1"
  test_api:
    dependency: transitive
    description:
      name: test_api
      sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
      url: "https://pub.dev"
    source: hosted
    version: "0.6.1"
  vector_math:
    dependency: transitive
    description:
      name: vector_math
      sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
      url: "https://pub.dev"
    source: hosted
    version: "2.1.4"
  video_player:
    dependency: "direct main"
    description:
      name: video_player
      sha256: e16f0a83601a78d165dabc17e4dac50997604eb9e4cc76e10fa219046b70cef3
      url: "https://pub.dev"
    source: hosted
    version: "2.8.1"
  video_player_android:
    dependency: transitive
    description:
      name: video_player_android
      sha256: "3fe89ab07fdbce786e7eb25b58532d6eaf189ceddc091cb66cba712f8d9e8e55"
      url: "https://pub.dev"
    source: hosted
    version: "2.4.10"
  video_player_avfoundation:
    dependency: transitive
    description:
      name: video_player_avfoundation
      sha256: "01a57940e1dabc8769ccd457c4ae9ea50274e7d5a7617f7820dae5fe1d8436ae"
      url: "https://pub.dev"
    source: hosted
    version: "2.5.3"
  video_player_platform_interface:
    dependency: transitive
    description:
      name: video_player_platform_interface
      sha256: be72301bf2c0150ab35a8c34d66e5a99de525f6de1e8d27c0672b836fe48f73a
      url: "https://pub.dev"
    source: hosted
    version: "6.2.1"
  video_player_web:
    dependency: transitive
    description:
      name: video_player_web
      sha256: ab7a462b07d9ca80bed579e30fb3bce372468f1b78642e0911b10600f2c5cb5b
      url: "https://pub.dev"
    source: hosted
    version: "2.1.2"
  vm_service:
    dependency: transitive
    description:
      name: vm_service
      sha256: c538be99af830f478718b51630ec1b6bee5e74e52c8a802d328d9e71d35d2583
      url: "https://pub.dev"
    source: hosted
    version: "11.10.0"
  web:
    dependency: transitive
    description:
      name: web
      sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152
      url: "https://pub.dev"
    source: hosted
    version: "0.3.0"
  webdriver:
    dependency: transitive
    description:
      name: webdriver
      sha256: "3c923e918918feeb90c4c9fdf1fe39220fa4c0e8e2c0fffaded174498ef86c49"
      url: "https://pub.dev"
    source: hosted
    version: "3.0.2"
sdks:
  dart: ">=3.2.0 <4.0.0"
  flutter: ">=3.16.0"

Steps to reproduce

Run the camerax example app
Add the following to the initState of the widget that builds the camera preview

Timer.periodic(Duration(milliseconds: 100), (_) {
    setState(() => {});
});

Expected results
The camera preview should not flicker. The camera_android implementation doesn't flicker when rebuilding.
Actual results
The camera preview flickers/flashes on every build. When building a real time detection algorithm over the camera frames this is really noticeable.
Code sample
The code sample is the example app within the camerax android implementation.
Screenshots or Videos

Screenshots / Video demonstration
https://github.com/flutter/flutter/assets/22084723/6c2f94d9-3cff-4dd2-985e-9afef14a09dc

Logs
No response
Flutter Doctor output
Doctor output
[✓] Flutter (Channel stable, 3.16.5, on Fedora Linux 38 (Workstation Edition) 6.6.6-100.fc38.x86_64, locale en_US.UTF-8)
    • Flutter version 3.16.5 on channel stable at /home/david/.puro/envs/stable/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 78666c8dc5 (3 days ago), 2023-12-19 16:14:14 -0800
    • Engine revision 3f3e560236
    • Dart version 3.2.3
    • DevTools version 2.28.4

[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.1)
    • Android SDK at /home/david/Android/Sdk/
    • Platform android-33, build-tools 33.0.1
    • Java binary at: /home/david/opt/android-studio/jbr/bin/java
    • Java version OpenJDK Runtime Environment (build 17.0.6+0-17.0.6b829.9-10027231)
    • All Android licenses accepted.

[✓] Chrome - develop for the web
    • Chrome at google-chrome

[✓] Linux toolchain - develop for Linux desktop
    • clang version 16.0.6 (Fedora 16.0.6-3.fc38)
    • cmake version 3.27.7
    • ninja version 1.11.1
    • pkg-config version 1.8.0

[✓] Android Studio (version 2022.3)
    • Android Studio at /home/david/opt/android-studio/
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • android-studio-dir = /home/david/opt/android-studio/
    • Java version OpenJDK Runtime Environment (build 17.0.6+0-17.0.6b829.9-10027231)

[✓] VS Code (version 1.85.1)
    • VS Code at /usr/share/code
    • Flutter extension version 3.78.0

[✓] Connected device (2 available)
    • Linux (desktop) • linux  • linux-x64      • Fedora Linux 38 (Workstation Edition) 6.6.6-100.fc38.x86_64
    • Chrome (web)    • chrome • web-javascript • Google Chrome 120.0.6099.109

[✓] Network resources
    • All expected network resources are available.

• No issues found!

Reproducible using the camerax example app. This does not happen with the regular android package as reported above.

flutter doctor -v
[✓] Flutter (Channel stable, 3.16.5, on macOS 14.1.2 23B92 darwin-arm64, locale en-GB)
    • Flutter version 3.16.5 on channel stable at /Users/nexus/dev/sdks/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 78666c8dc5 (7 days ago), 2023-12-19 16:14:14 -0800
    • Engine revision 3f3e560236
    • Dart version 3.2.3
    • DevTools version 2.28.4

[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0-rc1)
    • Android SDK at /Users/nexus/Library/Android/sdk
    • Platform android-34, build-tools 34.0.0-rc1
    • Java binary at: /Users/nexus/Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 17.0.6+0-17.0.6b829.9-10027231)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 15.0)
    • Xcode at /Applications/Xcode-15.0.0-Release.Candidate.app/Contents/Developer
    • Build 15A240d
    • CocoaPods version 1.13.0

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 2022.3)
    • Android Studio at /Users/nexus/Applications/Android Studio.app/Contents
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 17.0.6+0-17.0.6b829.9-10027231)

[✓] IntelliJ IDEA Ultimate Edition (version 2023.2.5)
    • IntelliJ at /Users/nexus/Applications/IntelliJ IDEA Ultimate.app
    • Flutter plugin version 76.3.4
    • Dart plugin version 232.10072.19

[✓] VS Code (version 1.85.1)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.78.0

[✓] Connected device (4 available)
    • Pixel 7 (mobile) • 28291FDH2001SA            • android-arm64  • Android 14 (API 34)
    • Nexus (mobile)   • 00008020-001875E83A38002E • ios            • iOS 17.2.1 21C66
    • macOS (desktop)  • macos                     • darwin-arm64   • macOS 14.1.2 23B92 darwin-arm64
    • Chrome (web)     • chrome                    • web-javascript • Google Chrome 120.0.6099.129
    ! Error: Browsing on the local area network for Dean’s iPad. Ensure the device is unlocked and attached with a cable or associated with the same local area network as this Mac.
      The device must be opted into Developer Mode to connect wirelessly. (code -27)

[✓] Network resources
    • All expected network resources are available.

• No issues found!

[!] Flutter (Channel master, 3.18.0-18.0.pre.30, on macOS 14.1.2 23B92 darwin-arm64, locale en-GB)
    • Flutter version 3.18.0-18.0.pre.30 on channel master at /Users/nexus/dev/sdks/flutters
    ! Warning: `flutter` on your path resolves to /Users/nexus/dev/sdks/flutter/bin/flutter, which is not inside your current Flutter SDK checkout at /Users/nexus/dev/sdks/flutters. Consider adding /Users/nexus/dev/sdks/flutters/bin to the front of your path.
    ! Warning: `dart` on your path resolves to /Users/nexus/dev/sdks/flutter/bin/dart, which is not inside your current Flutter SDK checkout at /Users/nexus/dev/sdks/flutters. Consider adding /Users/nexus/dev/sdks/flutters/bin to the front of your path.
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision f15364efe4 (8 hours ago), 2023-12-26 21:57:40 -0500
    • Engine revision 2c04f3e2af
    • Dart version 3.3.0 (build 3.3.0-262.0.dev)
    • DevTools version 2.31.0-dev.0
    • If those were intentional, you can disregard the above warnings; however it is recommended to use "git" directly to perform update checks and upgrades.

[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0-rc1)
    • Android SDK at /Users/nexus/Library/Android/sdk
    • Platform android-34, build-tools 34.0.0-rc1
    • Java binary at: /Users/nexus/Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 17.0.6+0-17.0.6b829.9-10027231)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 15.0)
    • Xcode at /Applications/Xcode-15.0.0-Release.Candidate.app/Contents/Developer
    • Build 15A240d
    • CocoaPods version 1.13.0

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 2022.3)
    • Android Studio at /Users/nexus/Applications/Android Studio.app/Contents
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 17.0.6+0-17.0.6b829.9-10027231)

[✓] IntelliJ IDEA Ultimate Edition (version 2023.2.5)
    • IntelliJ at /Users/nexus/Applications/IntelliJ IDEA Ultimate.app
    • Flutter plugin version 76.3.4
    • Dart plugin version 232.10072.19

[✓] VS Code (version 1.85.1)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.78.0

[✓] Connected device (4 available)
    • Pixel 7 (mobile) • 28291FDH2001SA            • android-arm64  • Android 14 (API 34)
    • Nexus (mobile)   • 00008020-001875E83A38002E • ios            • iOS 17.2.1 21C66
    • macOS (desktop)  • macos                     • darwin-arm64   • macOS 14.1.2 23B92 darwin-arm64
    • Chrome (web)     • chrome                    • web-javascript • Google Chrome 120.0.6099.129
    ! Error: Browsing on the local area network for Dean’s iPad. Ensure the device is unlocked and attached with a cable or associated with the same local area network as this Mac.
      The device must be opted into Developer Mode to connect wirelessly. (code -27)

[✓] Network resources
    • All expected network resources are available.

! Doctor found issues in 1 category.

@camsim99 Would you be able to link any other examples or documentation on camera preview?

My gut feeling here is that by calling setState so frequently and causing the camera preview to rebuild, we are also causing createCamera to be called which is where all of the CameraX UseCases (including the preview one) we use to perform camera functions are configured and bound to the lifecycle that CameraX uses to manage the camera. This operation is expensive, which is the primary reason why we chose to do it once in the createCamera method versus in other methods that may be called multiple times (except the video capture UseCase since it is most expensive and is lazily bound in case it is never used). This follows the recommendation in the CameraX docs of limiting your binding to one call.
What this means in terms of this issue is that the problem described will be hard to avoid by using the CameraX library in the most performant way we can, given the structure of the platform interface of this plugin. We do not manage the camera, so we must at some point bind the UseCases and moving this operation out to methods where the UseCases are immediately needed may slow down those individual operations.
Thus, I think this issue would only be actionable if more context can be provided to justify why we may want to make that tradeoff.

@camsim99
The use case on the Flutter app would be to be able to draw at a high refresh rate on top of the camera preview every time a particular object is detected by processing the camera frames.
It works fine on the camera_android , so when trying out the camerax implementation this flickering behavior was really noticeable.
This drawing on top implies calling setState, not sure if there would be a way to avoid that.

I'm not familiar with how a native app is developed with the CameraX library, but I feel such side effect for initializing/creating the camera on the Flutter build step can get very confusing to Flutter developers.
It's "common say" that rebuilding a widget should not create side effects when the state is the same.

@davidmartos96 Ah okay I see what you're saying. We will have to dig a bit deeper into camera_android to see why it doesn't behave the same and experiment with ways we may be able to work around it, either on the Flutter app's end or on the plugin's side (either if the binding is not the cause like I predict or if moving the calls out of createCamera helps immensely).

The use case on the Flutter app would be to be able to draw at a high refresh rate on top of the camera preview every time a particular object is detected by processing the camera frames.

@davidmartos96 After re-reading your use case, we wonder if using image streaming to retrieve frames (via onStreamedFrameAvailable to render the preview in your app could help solve this issue. As I mentioned above, CameraX obscures away refreshing and building the preview, so it could be difficult for us to control it like we do in camera_android.

@camsim99 Wouldn't that cause the same issue? Calling setState inside that function would flicker as well, right?
The real time processing algorithm would process the frames and then it would update a real time UI on top of the camera preview with certain information. For that setState would have to be used.

@davidmartos96 Can you explain why setState would have to be used? Why can't you listen to the onStreamedFrameAvailable Stream events to update the UI as needed?

@camsim99 I'd provide and example, maybe I'm not explaining myself correctly.
This strategy is essentially what we are using with camera_android and it works just fine. Our expectations would be that it would work roughly similar in the Dart/Flutter side without flickering
Pseudocode:
StatefulWidget {

  initState() {
     controller.onCameraFrame((frame) {
         final newInfo = processFrame(frame);
         setState(() => info = newInfo);
     })
  }

  build() {
      return Stack([
          CameraPreview(),
          RealtimeInfo(info)
      ]);
  }
}

I'll need to repro this on my end to debug the cause. I still believe my initial theory is correct, which means we would need to find a workaround on the Flutter app side. Either way, though, it is likely inefficient to have the camera preview rebuilding frequently, and I would (and will locally) try to separate the RealtimeInfo stateful widget from the CameraPreview widget (that could be stateless I believe) to avoid that.

Hi @camsim99. Did you get a chance to check what's causing the issue

Apologies for the delay.
I was able to reproduce this issue with app of structure similar to what was described above by using a counter every time the listener picks up an event to make the app redraw, causing the widget to flicker.
However, I think I was able to fix this by separating the widget that relies on setState (in my case, my counter; in the case above, the RealtimeInfo(info) widget) from the preview widget (which I made stateless).
Going to work on modifying the camera example app to demonstrate that this (or something similar) works, as I think this was be a preferred approach for the use case this issue describes.

@camsim99 I can't think of a structure that can separate onCameraFrame and setState. 🤔 Do you have any suggestions? 🙂

After further digging, I've determined that

Building the preview causes a call to the native side of the plugin to be made (see source) and this call is awaited to build the preview, so this could be behind the flicker.
A solution to this issue is to not build preview directly in the build method of your Widget. The camera preview is a stateless widget, and there's no need to re-initialize it after it has been built as far as I can see, even with camera_android, though it seems to work.

@xfqwdsj At a high level, this is my example:
class MyWidget extends StatefulWidget {
  const MyWidget({super.key});

  @override
  State<MyWidget> createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  CameraController? controller;

  /// Preview widget.
  Widget? preview;

  /// Frame info.
  String? info;

  @override
  void initState() {
     _buildPreview();
    super.initState();
  }

  void _buildPreview() async {
    controller = CameraController(...);
    await controller!.initialize();

    // Build preview.
    preview = CameraPreview(controller!);

    // Start image stream.
    controller!.startImageStream((frame) {
      final newInfo = processFrame(frame);
      setState(() => info = newInfo);
    });
  }

  @override
  Widget build(...) {
      return Stack(children: [
          preview == null ? const Text('No preview available :(') : preview!,
          RealtimeInfo(info) // custom widget
      ]);
  }
}

Given these findings, I think the actionable item here is to properly document in the plugin (likely in the README) that it is recommended not to build the camera preview directly in the build method of a Widget, as it may not be performant.

@camsim99 Thanks for digging into it, after looking at the source code call in the build, the problem could be that a the future is being recreated every build. Couldn't this be handled properly with a StatefulWidget that reuses the Future and only recreates it when cameraId changes? I haven't actually tried it, so I might be wrong and creating the future there is intended.
https://github.com/flutter/packages/blob/5b48c446976fd5f61316d58ab3fcc9888423c2e6/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart#L526
About FutureBuilder: https://stackoverflow.com/a/52249579

I'm not deeply familiar with FutureBuilders and I recall it being a recommendation being made to me based on the fact that we have to check certain conditions to ensure the preview is ready to build. I can try that out and see if it works :)

@camsim99 One easy solution could be replacing lines such as the following:
https://github.com/flutter/packages/blob/5b48c446976fd5f61316d58ab3fcc9888423c2e6/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart#L519
with:
this._lifecycleBindingFuture = _bindPreviewToLifecycle(cameraId);

And then use the cached _lifecycleBindingFuture Future in the FutureBuilder.
That alone might actually be enough.

I was trying out the first solution, but it is starting to require a lot of refactor which isn't necessarily bad, but not sure how much it would cause the logic between the plugin code and this stateful widget to get entangled. Let me try caching the Future.

@davidmartos96 Ok I just tried the caching approach, and this does not work -- same issue as before.

@camsim99 That's unfortunate. Do you refer to the refactor issue or the flicker issue?
I guess as a last resort, your workaround could be documented, although having to cache a widget is not considered a good practice, and usually means that something underneath can be cached instead.
I might look into it sometime this week.
Thanks again!

@davidmartos96 I'm referencing the flicker issue with the caching approach. I'm about to re-attempt the Stateful widget approach and will report back.

I guess as a last resort, your workaround could be documented, although having to cache a widget is not considered a good practice, and usually means that something underneath can be cached instead.

That makes sense to me, but I may need to get your help and/or reach out for help to find a better workaround since I'm not too familiar here. If you look into it, would love to hear your updates and of course would welcome a fix! I'll continue to look into it on my end, as well, before resorting to documentation.

Couldn't this be handled properly with a StatefulWidget that reuses the Future and only recreates it when cameraId changes?

Ah this didn't work either :( This group of lines that makes the preview Widget aSizedBox.shrink() while the Future is waiting to be completed is causing the flicker, I confirmed. Will need to look into other possible ways to handle building the preview after the Future is completed.

After talking to @khanhnwin about an approach here, another way to fix this issue could be changing the conditions under which we check the Future at all. Meaning, we may only need the _bindPreviewToLifecycle future if we are building the preview for the first time, i.e. not trying to resume the preview after pausing it (for which this Future is also used).
This would be a straightforward fix, just need to think through any other cases where we would then be not checking this Future when we would need to.

After more conversation, I'm not sure that we need the Future at all given that if we expect and require users to initialize the camera controller before calling buildPreview, all the necessary conditions should be met. Further, once the preview is paused via pausePreview, then resumePreview should be called, not buildPreview, so we wouldn't need the Future in that case either.
Thus at this moment, I think a good path forward is changing buildPreview to just return the Texture without a FutureBuilder. Perhaps we could warn users if they have not yet initialized the camera controller if they do try to call buildPreview before doing so.

@camsim99 That sounds great and easier.
Thanks for investigating! Looking forward to the fix.


Index out of bounds

I've come across a crash when using cpp-coveralls (latest version) to get the gcov output, filter it using lcov and upload the lcov output to coveralls with cpp-coveralls.  The crash surfaces in parse_lcov_file_info of coverage.py, I've added some print statements for debugging:
def parse_lcov_file_info(args, filepath, line_iter, line_coverage_re, file_end_string):
    """ Parse the file content in lcov info file
     """
     coverage = []
     lines_covered = []
     for line in line_iter:
         if line != "end_of_record":
             line_coverage_match = line_coverage_re.match(line)
             if line_coverage_match:
                 line_no = line_coverage_match.group(1)
                 cov_count = int(line_coverage_match.group(2))
                 if args.max_cov_count:
                     if cov_count > args.max_cov_count:
                         cov_count = args.max_cov_count + 1
                 lines_covered.append((line_no, cov_count))
         else:
             break

     line_list = [line.rstrip('\n') for line in open(filepath, 'r')]

     num_code_lines = len(line_list)

     coverage = [None] * num_code_lines

     for line_covered in lines_covered:
         if int(line_covered[0]) - 1 < num_code_lines:
            coverage[int(line_covered[0]) - 1] = line_covered[1]
         else:

             print('an error occurred\n')
             print('num_code_lines', num_code_lines)
             print('line_covered', line_covered)
             print('line_list', line_list)
             print('coverage', coverage, '\n')

     return coverage

and for the else branch I get (for example)
an error occurred

num_code_lines 109
line_covered ('187', 0)
line_list ['', '#pragma once', '', '#include "exceptions.hpp"', '', '#include <type_traits>', '#include <cfenv>', '', '/// \\file runge_kutta_integration.hpp', '/// \\brief Second, fourth and fifth order explicit methods for time integration', '', 'namespace neon', '{', '/// Perform a second order Runge-Kutta step for the given type.', '/// The type \\p function must accept time and the value.', 'template <typename T, typename function>', 'T runge_kutta_second_order(double const t, double const dt, T const& y, function&& f)', '{', '    T const dy1 = dt * f(t, y);', '    T const dy2 = dt * f(t + dt, y + dy1);', '    return y + (dy1 + dy2) / 2.0;', '}', '', '/// Perform a fourth order Runge-Kutta step for the given type.', '/// The type \\p function must accept time and the value.', 'template <typename T, typename function>', 'T runge_kutta_fourth_order(double const t, double const dt, T const& y, function&& f)', '{', '    T const dy1 = dt * f(t, y);', '    T const dy2 = dt * f(t + dt / 2.0, y + dy1 / 2.0);', '    T const dy3 = dt * f(t + dt / 2.0, y + dy2 / 2.0);', '    T const dy4 = dt * f(t + dt, y + dy3);', '', '    return y + (dy1 + 2.0 * dy2 + 2.0 * dy3 + dy4) / 6.0;', '}', '', 'namespace detail', '{', '/// Abstraction to compute the residual or the absolution value depending on', '/// the expression type (scalar or vector).', 'template <typename left_expression, typename right_expression>', 'double residual(left_expression const& left, right_expression const& right)', '{', '    if constexpr (!std::is_floating_point<left_expression>::value', '                  && !std::is_floating_point<right_expression>::value)', '    {', '        return (left - right).norm();', '    }', '    else', '    {', '        return std::abs(left - right);', '    }', '}', '}', '', '/// Perform the Dorman-Prince 4th order embedded Runge-Kutta time discretisation', '/// using the specified error tolerance \\cite DormandPrince1980', '/// \\tparam Lambda that returns the right hand side of the ODE', '/// \\param f Function object', '/// \\param error_tolerance Error tolerance for adaptive method', 'template <typename T, typename function>', 'T runge_kutta_fourth_fifth_order(double t,', '                                 double dt,', '                                 T y,', '                                 function&& f,', '                                 double const error_tolerance = 1.0e-5)', '{', '    auto const end_time = t + dt;', '', '    std::feclearexcept(FE_ALL_EXCEPT);', '', '    // Perform substep iterations until convergence', '    while (t < end_time)', '    {', '        // Correct an overzealous time step from the previous iteration', '        dt = std::min(dt, end_time - t);', '', '        // clang-format off', '        T const k1 = dt * f(t, y);', '        T const k2 = dt * f(t + 1.0 / 5.0 * dt,  y +        1.0 / 5.0 * k1);', '        T const k3 = dt * f(t + 3.0 / 10.0 * dt, y +       3.0 / 40.0 * k1 +       9.0 / 40.0 * k2);', '        T const k4 = dt * f(t + 4.0 / 5.0 * dt,  y +      44.0 / 45.0 * k1 -      56.0 / 15.0 * k2 +       32.0 / 9.0 * k3);', '        T const k5 = dt * f(t + 8.0 / 9.0 * dt,  y + 19372.0 / 6561.0 * k1 - 25360.0 / 2187.0 * k2 + 64448.0 / 6561.0 * k3 - 212.0 / 729.0 * k4);', '        T const k6 = dt * f(t + dt,              y +  9017.0 / 3168.0 * k1 -     355.0 / 33.0 * k2 + 46732.0 / 5247.0 * k3 +  49.0 / 176.0 * k4 - 5103.0 / 18656.0 * k5);', '        T const k7 = dt * f(t + dt,              y +     35.0 / 384.0 * k1                         +   500.0 / 1113.0 * k3 + 125.0 / 192.0 * k4 -  2187.0 / 6784.0 * k5 + 11.0 / 84.0 * k6);', '', '        T const dy_trial =     35.0 / 384.0 * k1 +   500.0 / 1113.0 * k3 + 125.0 / 192.0 * k4 -    2187.0 / 6784.0 * k5 +    11.0 / 84.0 * k6;', '        T const dy_error = 5179.0 / 57600.0 * k1 + 7571.0 / 16695.0 * k3 + 393.0 / 640.0 * k4 - 92097.0 / 339200.0 * k5 + 187.0 / 2100.0 * k6 + 1.0 / 40.0 * k7;', '        // clang-format on', '', '        double const R = detail::residual(dy_error, dy_trial) / dt;', '', '        if (R <= error_tolerance)', '        {', '            y += dy_trial;', '            t += dt;', '        }', '        dt *= 0.84', '              * std::pow(error_tolerance / (R + 4.0 * std::numeric_limits<double>::epsilon()), 0.25);', '', '        if (std::fetestexcept(FE_INVALID))', '        {', '            std::feclearexcept(FE_ALL_EXCEPT);', '            throw computational_error("Floating point error in adaptive RK45 detected.\\n");', '        }', '    }', '    return y;', '}', '}']
coverage [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, 8, None, 8, 8, 8, None, 0, None, 0, 0, 98172, None, 98176, 98172, 98176, 98176, 4, 98172, 0, None, 0, 0, 0, None, 4, None, 4, 4, 4, None, None, None, None, None, 8, None, 8, 8, 8, 8, None, 8, None, 0, None, 0, 0, 0, 0, None, 0, None, 4, None, 4, 4, 4, 4, None, 4, None, 0, None, 0, 0, 0, 0, None, 0, None, 4, None, 4, 4, 4, 4, None, 4, None, None, None, None, None, None, None, 44, None, None, None, None, 24, None, None]

I'm not sure why this has found itself in this state, ideas?  Should it be looking for the maximum in the first tuple rather than from the return statements in the file to use as allocation?

When you say it crashed before you added those lines, were you seeing any exception information?
Are you able to provide us with a minimum example to recreate this error?

I can't recall getting any useful exception information.  Let me get a MWE going and I'll post back.

The output from running the script
Traceback (most recent call last):
  File ".local/bin/cpp-coveralls", line 11, in <module>
    load_entry_point('cpp-coveralls==0.4.0', 'console_scripts', 'cpp-coveralls')()
  File ".local/lib/python3.6/site-packages/cpp_coveralls/__init__.py", line 97, in run
    cov_report = coverage.collect(args)
  File ".local/lib/python3.6/site-packages/cpp_coveralls/coverage.py", line 405, in collect
    src_report['coverage'] = parse_lcov_file_info(args, abs_filepath, line_iter, line_coverage_re, "end_of_record")
  File ".local/lib/python3.6/site-packages/cpp_coveralls/coverage.py", line 312, in parse_lcov_file_info
    coverage[int(line_covered[0]) - 1] = line_covered[1]
IndexError: list assignment index out of range

Do you want me to upload the offending lcov file?

yes please, that would be super helpful.

The culprit appear to be gperf files:
# coveralls --dryrun --verbose --no-gcov --lcov-file /var/tmp/systemd-test-TEST-01-BASIC/coverage-info
encodings: ['utf-8', 'latin-1']
Exception in /build/src/journal/journald-gperf.gperf
line_covered: ('58', 0)
coverage list len: 53
accessed index: 57
[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, 0, None, 0, None, None, None, None, None, None, None, None, None, None, None, 0, None, 0, None, 0, None, 0, None, 0, 0, None, None, None]

which is, well, expected I guess, since the file in question indeed has only 53 lines:
# wc -l /build/src/journal/journald-gperf.gperf
53 /build/src/journal/journald-gperf.gperf

However, after ignoring the exception, it looks like the same issue affects most (if not all) other gperf files: https://gist.github.com/mrc0mmand/894b92df8b65ad43170319c1850b85bf


feature request: allow custom file name for downloads

Optional param in download methods for custom file name

Implemented in https://github.com/unbekanntes-pferd/dracoon-python-api/commit/a197322ae36b24d309a6b191967fe035f0776e45


Update concepts-private-clouds-clusters.md

Corrected VMware product names.

@rvandenbedem : Thanks for your contribution! The author(s) have been notified to review your proposed change.

#label:"aq-pr-triaged"

@rvandenbedem : Thanks for your contribution! The author(s) have been notified to review your proposed change.


Updates for BASH Plugin

I pulled what you had from slack and threw it into the function - Worked pretty well with a few extra changes from the ZSH stuff. Hit the usual suspects (Arrays, Missing keywords like compdef, and completion file sourcing).
Tested it on my environment with a GHE token and everything, looks pretty good. There's one caveat I can't figure out how to handle (-m "message" arg to git  but I'll open a ticket to document it. )

Commit fe599fb should fix #2


As a Tournament Owner I want to be able to edit my tournament(s) to keep its details up to date

@DanielLarsenNZ To render the edit / delete buttons for the correct user, we need to store the tournament owner (ID should do) at the time of creation. On the frontend I can simply compare it against the ID acquired at authentication.
Down the line... if they leave the org, there may be an opportunity to transfer ownership.