From e5c209de936f9d010858d8b432fb7d09c4671fad Mon Sep 17 00:00:00 2001 From: christophe-duc Date: Wed, 7 Jan 2026 17:11:26 -0400 Subject: [PATCH 1/3] feature: add pod support in the container pane --- coverage.txt | 1284 +++++++++++++---------- pkg/commands/container_list_item.go | 66 ++ pkg/commands/pod.go | 36 + pkg/commands/podman.go | 105 +- pkg/commands/runtime.go | 3 + pkg/commands/runtime_libpod.go | 43 +- pkg/commands/runtime_libpod_stub.go | 6 + pkg/commands/runtime_mock.go | 13 + pkg/commands/runtime_socket.go | 41 + pkg/commands/runtime_types.go | 11 + pkg/gui/container_logs.go | 71 ++ pkg/gui/containers_panel.go | 274 ++++- pkg/gui/gui.go | 17 +- pkg/gui/presentation/container_stats.go | 4 +- pkg/gui/presentation/containers.go | 85 ++ pkg/i18n/english.go | 23 +- 16 files changed, 1460 insertions(+), 622 deletions(-) create mode 100644 pkg/commands/container_list_item.go create mode 100644 pkg/commands/pod.go diff --git a/coverage.txt b/coverage.txt index 6a4016ce..57529a63 100644 --- a/coverage.txt +++ b/coverage.txt @@ -359,166 +359,260 @@ github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:136.20,137.49 1 0 github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:137.49,139.4 1 0 github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:140.3,140.13 1 0 github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:141.21,142.13 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:21.81,23.68 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:148.71,150.64 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:150.64,152.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:154.41,154.64 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:160.109,162.15 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:162.15,164.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:166.2,168.61 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:168.61,170.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:173.2,173.14 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:176.94,180.43 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:180.43,182.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:183.2,183.44 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:183.44,185.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:186.2,186.43 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:186.43,188.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:189.2,195.36 5 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:195.36,198.3 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:201.2,202.12 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:202.12,204.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:206.2,206.9 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:207.20,208.49 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:208.49,210.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:211.3,211.13 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/container_logs.go:212.21,213.13 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:21.89,23.68 1 0 github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:23.68,24.54 1 0 github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:24.54,26.4 1 0 github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:28.3,28.98 1 0 github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:28.98,30.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:33.2,35.62 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:35.62,63.5 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:64.71,71.5 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:81.65,83.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:84.52,88.89 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:88.89,90.5 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:92.4,92.78 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:92.78,94.5 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:96.4,96.15 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:98.63,100.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:110.89,111.16 1 7 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:111.16,113.3 1 3 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:115.2,117.29 3 4 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:117.29,119.3 1 1 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:121.2,121.76 1 3 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:124.82,125.53 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:125.53,125.91 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:128.68,129.32 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:129.32,131.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:133.2,133.44 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:133.44,135.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:137.2,137.90 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:137.90,141.24 4 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:141.24,143.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:144.3,147.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:150.2,151.16 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:151.16,154.3 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:156.2,156.15 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:159.85,160.53 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:160.53,160.97 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:163.74,164.32 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:164.32,166.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:168.2,178.39 10 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:178.39,180.50 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:180.50,181.30 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:181.30,183.5 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:183.10,185.5 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:187.8,189.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:191.2,192.54 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:192.54,194.61 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:194.61,195.27 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:195.27,197.5 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:199.8,201.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:203.2,204.16 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:204.16,206.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:208.2,210.15 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:213.84,215.64 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:215.64,217.18 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:217.18,219.5 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:221.4,221.36 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:224.41,224.64 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:230.82,232.64 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:232.64,234.18 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:234.18,236.5 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:238.4,238.36 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:241.41,241.64 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:247.54,248.33 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:248.33,251.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:254.2,261.16 4 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:261.16,263.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:265.2,269.23 3 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:269.23,270.63 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:270.63,271.40 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:271.40,272.37 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:272.37,273.11 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:275.5,276.34 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:281.2,281.42 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:284.53,285.40 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:285.40,286.60 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:286.60,288.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:291.2,291.61 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:291.61,293.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:295.2,295.12 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:298.80,302.2 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:304.79,306.16 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:306.16,308.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:310.2,310.64 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:310.64,311.68 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:311.68,312.59 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:312.59,313.63 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:313.63,314.132 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:314.132,315.72 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:315.72,317.8 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:320.5,320.45 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:322.4,322.14 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:326.2,329.31 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:329.31,329.71 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:333.31,333.70 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:337.2,340.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:343.69,344.72 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:344.72,345.37 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:345.37,347.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:347.9,349.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:351.3,351.17 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:351.17,353.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:355.3,355.44 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:359.73,361.16 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:361.16,363.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:365.2,365.32 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:368.72,370.16 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:370.16,372.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:374.2,374.115 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:374.115,375.68 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:375.68,376.37 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:376.37,378.5 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:380.4,380.14 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:385.75,387.16 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:387.16,389.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:391.2,391.69 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:391.69,392.39 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:392.39,394.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:396.3,396.13 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:400.74,402.16 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:402.16,404.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:406.2,407.16 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:407.16,409.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:411.2,411.76 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:414.47,415.124 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:415.124,416.67 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:416.67,418.18 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:418.18,420.5 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:421.4,421.14 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:426.76,428.16 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:428.16,430.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:432.2,434.12 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:437.78,439.16 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:33.2,35.70 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:35.70,63.5 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:64.74,68.5 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:77.81,79.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:80.55,82.18 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:82.18,84.5 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:86.4,90.89 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:90.89,92.5 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:94.4,94.78 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:94.78,96.5 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:98.4,98.15 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:100.66,102.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:112.89,113.16 1 7 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:113.16,115.3 1 3 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:117.2,119.29 3 4 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:119.29,121.3 1 1 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:123.2,123.76 1 3 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:129.113,131.47 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:131.47,133.26 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:133.26,135.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:136.3,136.26 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:136.26,138.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:140.3,140.29 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:144.2,146.33 3 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:146.33,148.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:149.2,149.33 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:149.33,151.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:152.2,152.13 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:152.13,154.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:155.2,155.13 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:155.13,157.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:160.2,163.23 3 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:163.23,165.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:166.2,166.23 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:166.23,168.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:171.2,171.16 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:171.16,173.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:176.2,178.22 3 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:178.22,180.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:181.2,181.24 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:186.94,187.16 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:187.16,189.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:190.2,190.54 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:193.95,194.16 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:194.16,195.54 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:195.54,198.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:200.2,200.49 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:203.93,204.16 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:204.16,205.54 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:205.54,207.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:209.2,209.47 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:212.96,213.16 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:213.16,215.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:216.2,216.50 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:219.93,220.16 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:220.16,221.54 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:221.54,223.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:225.2,225.47 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:228.67,229.53 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:229.53,239.30 9 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:239.30,241.37 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:241.37,243.28 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:244.20,245.32 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:246.19,247.30 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:249.5,249.101 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:253.3,253.16 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:257.82,258.53 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:258.53,258.91 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:261.68,262.32 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:262.32,264.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:266.2,266.44 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:266.44,268.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:270.2,270.90 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:270.90,274.24 4 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:274.24,276.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:277.3,280.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:283.2,284.16 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:284.16,287.3 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:289.2,289.15 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:292.85,293.53 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:293.53,293.97 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:296.74,297.32 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:297.32,299.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:301.2,311.39 10 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:311.39,313.50 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:313.50,314.30 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:314.30,316.5 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:316.10,318.5 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:320.8,322.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:324.2,325.54 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:325.54,327.61 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:327.61,328.27 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:328.27,330.5 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:332.8,334.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:336.2,337.16 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:337.16,339.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:341.2,343.15 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:346.84,348.64 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:348.64,350.18 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:350.18,352.5 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:354.4,354.36 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:357.41,357.64 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:363.82,365.64 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:365.64,367.18 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:367.18,369.5 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:371.4,371.36 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:374.41,374.64 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:380.54,381.33 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:381.33,384.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:387.2,394.16 4 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:394.16,396.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:398.2,402.23 3 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:402.23,403.63 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:403.63,404.40 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:404.40,405.37 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:405.37,406.11 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:408.5,409.34 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:414.2,414.42 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:417.53,418.40 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:418.40,419.60 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:419.60,421.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:424.2,424.61 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:424.61,426.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:428.2,428.12 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:431.80,435.2 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:437.79,439.16 2 0 github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:439.16,441.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:443.2,443.36 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:446.73,456.2 4 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:458.82,460.16 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:460.16,462.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:464.2,470.67 3 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:473.46,474.123 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:474.123,475.68 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:475.68,476.65 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:476.65,477.38 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:477.38,479.6 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:482.4,482.14 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:487.48,488.125 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:488.125,489.68 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:489.68,490.65 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:490.65,491.51 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:491.51,493.6 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:496.4,496.14 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:501.80,521.2 4 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:524.89,526.16 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:526.16,528.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:530.2,530.40 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:533.71,535.33 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:535.33,537.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:539.2,540.19 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:540.19,542.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:543.2,544.21 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:544.21,546.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:547.2,548.37 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:443.2,443.16 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:443.16,445.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:447.2,448.64 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:448.64,449.68 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:449.68,450.59 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:450.59,451.63 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:451.63,452.132 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:452.132,453.72 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:453.72,455.8 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:458.5,458.45 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:460.4,460.14 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:464.2,467.31 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:467.31,467.71 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:471.31,471.70 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:475.2,478.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:481.69,482.72 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:482.72,483.37 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:483.37,485.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:485.9,487.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:489.3,489.17 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:489.17,491.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:493.3,493.44 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:497.73,499.16 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:499.16,501.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:503.2,503.16 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:503.16,505.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:507.2,507.43 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:510.72,512.16 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:512.16,514.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:516.2,516.16 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:516.16,518.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:520.2,521.115 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:521.115,522.68 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:522.68,523.37 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:523.37,525.5 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:527.4,527.14 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:532.75,534.16 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:534.16,536.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:538.2,538.16 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:538.16,540.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:542.2,543.69 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:543.69,544.39 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:544.39,546.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:548.3,548.13 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:552.74,554.16 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:554.16,556.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:558.2,558.16 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:558.16,560.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:562.2,564.16 3 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:564.16,566.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:568.2,568.76 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:571.47,572.124 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:572.124,573.67 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:573.67,575.18 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:575.18,577.5 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:578.4,578.14 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:583.76,585.16 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:585.16,587.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:589.2,589.16 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:589.16,592.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:594.2,596.12 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:599.78,601.16 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:601.16,603.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:605.2,605.16 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:605.16,607.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:609.2,609.47 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:612.73,622.2 4 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:624.82,626.16 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:626.16,628.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:630.2,630.16 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:630.16,632.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:634.2,640.67 3 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:643.46,644.123 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:644.123,645.68 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:645.68,646.66 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:646.66,647.45 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:647.45,648.50 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:648.50,650.7 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:654.4,654.14 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:659.48,660.125 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:660.125,661.68 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:661.68,662.66 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:662.66,663.45 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:663.45,664.63 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:664.63,666.7 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:670.4,670.14 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:675.80,695.2 4 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:698.89,700.16 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:700.16,702.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:704.2,704.16 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:704.16,706.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:708.2,708.51 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:711.71,713.33 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:713.33,715.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:717.2,718.19 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:718.19,720.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:721.2,722.21 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:722.21,724.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/containers_panel.go:725.2,726.37 2 0 github.com/christophe-duc/lazypodman/pkg/gui/custom_commands.go:12.154,13.96 1 0 github.com/christophe-duc/lazypodman/pkg/gui/custom_commands.go:13.96,16.27 2 0 github.com/christophe-duc/lazypodman/pkg/gui/custom_commands.go:16.27,17.39 1 0 @@ -651,82 +745,85 @@ github.com/christophe-duc/lazypodman/pkg/gui/gui.go:273.2,274.26 2 0 github.com/christophe-duc/lazypodman/pkg/gui/gui.go:274.26,276.3 1 0 github.com/christophe-duc/lazypodman/pkg/gui/gui.go:277.2,277.12 1 0 github.com/christophe-duc/lazypodman/pkg/gui/gui.go:280.29,290.2 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:292.48,294.2 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:296.27,297.12 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:297.12,298.46 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:298.46,300.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:302.2,302.12 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:302.12,303.60 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:303.60,305.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:307.2,307.12 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:307.12,308.45 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:308.45,310.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:312.2,312.12 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:312.12,313.46 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:313.46,315.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:317.2,317.12 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:317.12,318.44 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:318.44,320.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:324.70,327.29 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:327.29,328.17 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:328.17,330.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:331.3,332.30 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:336.2,338.6 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:338.6,339.10 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:340.21,341.10 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:342.29,343.24 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:343.24,349.5 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:350.25,351.18 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:351.18,354.23 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:354.23,358.6 3 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:360.5,360.63 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:367.47,369.2 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:371.38,373.21 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:373.21,375.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:376.2,376.26 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:376.26,377.41 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:377.41,379.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:381.2,381.12 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:384.57,385.41 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:385.41,386.102 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:386.102,388.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:390.2,390.22 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:395.32,396.29 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:396.29,398.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:400.2,400.12 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:403.65,404.18 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:404.18,406.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:408.2,409.29 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:409.29,411.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:412.2,412.76 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:415.49,417.16 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:417.16,419.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:421.2,421.31 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:424.49,425.57 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:425.57,427.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:428.2,428.12 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:431.72,432.98 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:432.98,435.3 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:438.48,439.44 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:439.44,441.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:443.2,444.13 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:447.51,448.40 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:448.40,450.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:451.2,451.21 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:454.42,456.2 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:458.40,459.38 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:459.38,459.52 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:462.60,467.6 3 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:467.6,468.10 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:469.21,470.10 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:471.19,472.71 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:472.71,473.35 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:473.35,475.6 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:484.32,490.16 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:490.16,491.13 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:493.2,495.45 3 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:495.45,496.13 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/gui.go:499.2,499.17 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:292.48,295.64 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:295.64,296.43 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:296.43,298.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:300.2,300.62 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:303.27,304.12 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:304.12,305.46 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:305.46,307.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:309.2,309.12 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:309.12,310.60 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:310.60,312.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:314.2,314.12 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:314.12,315.45 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:315.45,317.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:319.2,319.12 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:319.12,320.46 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:320.46,322.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:324.2,324.12 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:324.12,325.44 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:325.44,327.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:331.70,334.29 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:334.29,335.17 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:335.17,337.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:338.3,339.30 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:343.2,345.6 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:345.6,346.10 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:347.21,348.10 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:349.29,350.24 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:350.24,356.5 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:357.25,358.18 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:358.18,361.23 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:361.23,365.6 3 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:367.5,367.63 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:374.47,376.2 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:378.38,380.21 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:380.21,382.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:383.2,383.26 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:383.26,384.41 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:384.41,386.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:388.2,388.12 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:391.57,392.41 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:392.41,393.102 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:393.102,395.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:397.2,397.22 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:402.32,403.29 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:403.29,405.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:407.2,407.12 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:410.65,411.18 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:411.18,413.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:415.2,416.29 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:416.29,418.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:419.2,419.76 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:422.49,424.16 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:424.16,426.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:428.2,428.31 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:431.49,432.57 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:432.57,434.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:435.2,435.12 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:438.72,439.98 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:439.98,442.3 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:445.48,446.44 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:446.44,448.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:450.2,451.13 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:454.51,455.40 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:455.40,457.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:458.2,458.21 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:461.42,463.2 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:465.40,466.38 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:466.38,466.52 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:469.60,474.6 3 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:474.6,475.10 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:476.21,477.10 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:478.19,479.66 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:479.66,480.80 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:480.80,482.6 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:491.32,497.16 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:497.16,498.13 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:500.2,502.45 3 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:502.45,503.13 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/gui.go:506.2,506.17 1 0 github.com/christophe-duc/lazypodman/pkg/gui/images_panel.go:20.73,25.58 2 0 github.com/christophe-duc/lazypodman/pkg/gui/images_panel.go:25.58,33.5 1 0 github.com/christophe-duc/lazypodman/pkg/gui/images_panel.go:34.63,36.5 1 0 @@ -1489,57 +1586,80 @@ github.com/christophe-duc/lazypodman/pkg/gui/presentation/container_stats.go:138 github.com/christophe-duc/lazypodman/pkg/gui/presentation/container_stats.go:138.48,142.4 3 0 github.com/christophe-duc/lazypodman/pkg/gui/presentation/container_stats.go:142.9,144.4 1 0 github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:16.102,25.2 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:27.66,29.2 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:31.49,32.87 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:32.87,33.27 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:33.27,35.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:40.3,41.27 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:41.27,43.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:44.3,44.92 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:49.2,51.40 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:55.91,77.46 4 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:78.15,79.51 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:80.14,81.58 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:82.14,83.14 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:84.10,85.35 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:88.2,88.66 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:92.94,93.24 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:93.24,95.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:97.2,97.25 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:98.16,101.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:102.17,103.39 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:104.10,105.12 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:109.81,110.24 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:110.24,112.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:114.2,120.35 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:120.35,122.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:124.2,137.46 4 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:138.15,139.69 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:140.14,141.76 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:142.14,143.14 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:144.10,145.47 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:148.2,148.86 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:148.86,150.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:151.2,151.11 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:155.54,157.9 2 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:157.9,159.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:161.2,165.21 4 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:165.21,167.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:167.8,167.28 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:167.28,169.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:169.8,171.3 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:173.2,173.54 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:177.63,178.25 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:179.16,182.58 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:182.58,184.4 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:185.3,185.21 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:186.17,187.22 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:188.17,189.23 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:190.16,191.24 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:192.14,193.21 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:194.20,195.22 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:196.18,197.25 1 0 -github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:198.10,199.23 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:28.113,29.16 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:29.16,31.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:34.2,35.21 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:35.21,37.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:38.2,38.16 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:42.84,51.2 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:53.81,71.46 4 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:72.15,73.47 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:73.47,75.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:75.9,77.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:78.14,79.46 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:79.46,81.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:81.9,83.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:84.10,85.25 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:88.2,88.56 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:91.53,92.21 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:93.17,94.23 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:95.18,96.24 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:97.16,98.21 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:99.14,100.21 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:101.17,102.22 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:103.10,104.23 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:108.38,110.2 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:112.66,114.2 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:116.49,117.87 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:117.87,118.27 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:118.27,120.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:125.3,126.27 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:126.27,128.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:129.3,129.92 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:134.2,136.40 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:140.91,162.46 4 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:163.15,164.51 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:165.14,166.58 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:167.14,168.14 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:169.10,170.35 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:173.2,173.66 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:177.94,178.24 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:178.24,180.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:182.2,182.25 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:183.16,186.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:187.17,188.39 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:189.10,190.12 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:194.81,195.24 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:195.24,197.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:199.2,205.35 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:205.35,207.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:209.2,222.46 4 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:223.15,224.69 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:225.14,226.76 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:227.14,228.14 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:229.10,230.47 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:233.2,233.86 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:233.86,235.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:236.2,236.11 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:240.54,242.9 2 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:242.9,244.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:246.2,250.21 4 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:250.21,252.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:252.8,252.28 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:252.28,254.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:254.8,256.3 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:258.2,258.54 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:262.63,263.25 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:264.16,267.58 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:267.58,269.4 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:270.3,270.21 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:271.17,272.22 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:273.17,274.23 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:275.16,276.24 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:277.14,278.21 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:279.20,280.22 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:281.18,282.25 1 0 +github.com/christophe-duc/lazypodman/pkg/gui/presentation/containers.go:283.10,284.23 1 0 github.com/christophe-duc/lazypodman/pkg/gui/presentation/images.go:8.61,14.2 1 0 github.com/christophe-duc/lazypodman/pkg/gui/presentation/menu_items.go:5.67,7.2 1 0 github.com/christophe-duc/lazypodman/pkg/gui/presentation/networks.go:5.67,7.2 1 0 @@ -1595,6 +1715,27 @@ github.com/christophe-duc/lazypodman/pkg/commands/container.go:140.16,142.3 1 0 github.com/christophe-duc/lazypodman/pkg/commands/container.go:144.2,144.82 1 0 github.com/christophe-duc/lazypodman/pkg/commands/container.go:150.42,152.2 1 0 github.com/christophe-duc/lazypodman/pkg/commands/container.go:155.39,157.2 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/container_list_item.go:13.41,14.13 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/container_list_item.go:14.13,16.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/container_list_item.go:17.2,17.23 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/container_list_item.go:21.43,22.13 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/container_list_item.go:22.13,24.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/container_list_item.go:25.2,25.25 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/container_list_item.go:29.44,30.13 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/container_list_item.go:30.13,32.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/container_list_item.go:33.2,33.34 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/container_list_item.go:37.58,38.13 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/container_list_item.go:38.13,40.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/container_list_item.go:41.2,41.12 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/container_list_item.go:45.44,46.13 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/container_list_item.go:46.13,48.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/container_list_item.go:49.2,49.38 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/container_list_item.go:53.44,54.13 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/container_list_item.go:54.13,56.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/container_list_item.go:57.2,57.32 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/container_list_item.go:61.46,62.13 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/container_list_item.go:62.13,64.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/container_list_item.go:65.2,65.36 1 0 github.com/christophe-duc/lazypodman/pkg/commands/container_stats.go:138.68,143.23 4 1 github.com/christophe-duc/lazypodman/pkg/commands/container_stats.go:143.23,145.3 1 0 github.com/christophe-duc/lazypodman/pkg/commands/container_stats.go:146.2,146.14 1 1 @@ -1735,6 +1876,12 @@ github.com/christophe-duc/lazypodman/pkg/commands/os.go:364.2,364.12 1 0 github.com/christophe-duc/lazypodman/pkg/commands/os.go:368.47,370.2 1 0 github.com/christophe-duc/lazypodman/pkg/commands/os.go:373.55,375.2 1 0 github.com/christophe-duc/lazypodman/pkg/commands/os_default_platform.go:10.30,18.2 1 31 +github.com/christophe-duc/lazypodman/pkg/commands/pod.go:18.30,20.2 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/pod.go:23.36,25.2 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/pod.go:28.46,30.33 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/pod.go:30.33,31.35 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/pod.go:31.35,33.4 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/pod.go:35.2,35.14 1 0 github.com/christophe-duc/lazypodman/pkg/commands/podman.go:61.75,65.2 3 2 github.com/christophe-duc/lazypodman/pkg/commands/podman.go:69.161,78.45 5 0 github.com/christophe-duc/lazypodman/pkg/commands/podman.go:78.45,81.23 3 0 @@ -1784,76 +1931,100 @@ github.com/christophe-duc/lazypodman/pkg/commands/podman.go:340.2,340.12 1 3 github.com/christophe-duc/lazypodman/pkg/commands/podman.go:343.76,344.33 1 4 github.com/christophe-duc/lazypodman/pkg/commands/podman.go:344.33,346.3 1 3 github.com/christophe-duc/lazypodman/pkg/commands/podman.go:347.2,347.12 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:350.148,355.16 4 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:355.16,357.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:359.2,361.28 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:361.28,363.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:363.8,365.17 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:365.17,367.4 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:370.2,372.34 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:375.98,377.35 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:377.35,378.34 1 3 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:378.34,379.54 1 6 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:379.54,381.15 2 2 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:384.3,384.26 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:389.94,395.16 5 3 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:395.16,397.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:399.2,401.33 2 3 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:401.33,405.56 2 4 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:405.56,406.38 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:406.38,408.10 2 1 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:413.3,413.26 1 4 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:413.26,422.4 1 3 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:424.3,426.41 2 4 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:426.41,428.4 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:428.9,429.26 1 3 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:429.26,431.5 1 3 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:431.10,433.5 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:436.3,441.34 5 4 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:444.2,446.27 2 3 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:450.59,451.25 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:451.25,453.3 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:455.2,457.16 3 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:457.16,459.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:465.2,467.28 3 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:467.28,475.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:477.2,477.22 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:480.80,487.2 4 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:490.70,493.33 3 3 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:493.33,496.13 3 4 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:496.13,499.18 3 4 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:499.18,501.5 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:501.10,503.5 1 4 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:506.2,506.11 1 3 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:510.58,521.2 3 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:524.48,531.16 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:531.16,533.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:534.2,534.15 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:538.49,540.2 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:543.45,545.2 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:548.46,550.2 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:553.47,555.2 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:558.59,561.16 3 2 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:561.16,563.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:565.2,567.29 2 2 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:567.29,570.20 3 3 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:570.20,572.4 1 2 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:574.3,577.25 4 3 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:577.25,581.88 3 2 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:581.88,582.40 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:582.40,584.11 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:589.3,598.4 1 3 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:601.2,601.23 1 2 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:605.61,608.16 3 1 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:608.16,610.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:612.2,614.30 2 1 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:614.30,623.3 1 2 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:625.2,625.24 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:629.63,632.16 3 1 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:632.16,634.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:636.2,638.30 2 1 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:638.30,647.3 1 2 -github.com/christophe-duc/lazypodman/pkg/commands/podman.go:649.2,649.25 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:350.159,356.36 4 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:356.36,357.43 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:357.43,359.4 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:362.2,363.16 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:363.16,365.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:368.2,370.16 3 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:370.16,374.3 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:377.2,381.28 3 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:381.28,383.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:383.8,385.17 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:385.17,387.4 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:391.2,392.29 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:392.29,393.43 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:393.43,395.4 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:397.2,399.29 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:403.122,408.34 3 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:408.34,410.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:413.2,416.33 3 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:416.33,418.26 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:418.26,419.12 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:422.3,422.28 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:422.28,424.4 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:424.9,426.4 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:430.2,430.32 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:430.32,449.44 3 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:449.44,451.33 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:451.33,453.5 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:454.4,458.6 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:463.2,463.43 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:463.43,469.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:471.2,471.14 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:474.98,476.35 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:476.35,477.34 1 3 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:477.34,478.54 1 6 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:478.54,480.15 2 2 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:483.3,483.26 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:488.94,494.16 5 3 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:494.16,496.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:498.2,500.33 2 3 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:500.33,504.56 2 4 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:504.56,505.38 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:505.38,507.10 2 1 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:512.3,512.26 1 4 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:512.26,521.4 1 3 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:523.3,525.41 2 4 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:525.41,527.4 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:527.9,528.26 1 3 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:528.26,530.5 1 3 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:530.10,532.5 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:535.3,540.34 5 4 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:543.2,545.27 2 3 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:549.59,550.25 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:550.25,552.3 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:554.2,556.16 3 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:556.16,558.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:564.2,566.28 3 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:566.28,574.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:576.2,576.22 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:579.80,586.2 4 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:589.70,592.33 3 3 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:592.33,595.13 3 4 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:595.13,598.18 3 4 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:598.18,600.5 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:600.10,602.5 1 4 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:605.2,605.11 1 3 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:609.58,620.2 3 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:623.48,630.16 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:630.16,632.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:633.2,633.15 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:637.49,639.2 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:642.45,644.2 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:647.46,649.2 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:652.47,654.2 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:657.59,660.16 3 2 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:660.16,662.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:664.2,666.29 2 2 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:666.29,669.20 3 3 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:669.20,671.4 1 2 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:673.3,676.25 4 3 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:676.25,680.88 3 2 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:680.88,681.40 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:681.40,683.11 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:688.3,697.4 1 3 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:700.2,700.23 1 2 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:704.61,707.16 3 1 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:707.16,709.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:711.2,713.30 2 1 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:713.30,722.3 1 2 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:724.2,724.24 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:728.63,731.16 3 1 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:731.16,733.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:735.2,737.30 2 1 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:737.30,746.3 1 2 +github.com/christophe-duc/lazypodman/pkg/commands/podman.go:748.2,748.25 1 1 github.com/christophe-duc/lazypodman/pkg/commands/podman_host_unix.go:16.32,18.53 1 12 github.com/christophe-duc/lazypodman/pkg/commands/podman_host_unix.go:18.53,20.3 1 9 github.com/christophe-duc/lazypodman/pkg/commands/podman_host_unix.go:23.2,23.50 1 3 @@ -1890,204 +2061,215 @@ github.com/christophe-duc/lazypodman/pkg/commands/runtime_libpod_stub.go:113.65, github.com/christophe-duc/lazypodman/pkg/commands/runtime_libpod_stub.go:119.85,121.2 1 0 github.com/christophe-duc/lazypodman/pkg/commands/runtime_libpod_stub.go:123.79,125.2 1 0 github.com/christophe-duc/lazypodman/pkg/commands/runtime_libpod_stub.go:127.66,129.2 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_libpod_stub.go:132.82,137.2 4 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:63.70,65.2 1 80 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:69.87,71.33 2 10 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:71.33,73.3 1 8 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:74.2,74.35 1 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:77.99,79.35 2 9 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:79.35,81.3 1 7 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:82.2,82.35 1 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:85.76,87.33 2 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:87.33,89.3 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:90.2,90.30 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:93.89,95.32 2 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:95.32,97.3 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:98.2,98.30 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:101.76,103.33 2 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:103.33,105.3 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:106.2,106.30 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:109.78,111.35 2 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:111.35,113.3 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:114.2,114.30 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:117.92,119.35 2 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:119.35,121.3 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:122.2,122.30 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:125.103,127.34 2 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:127.34,129.3 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:130.2,130.30 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:133.98,135.31 2 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:135.31,137.3 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:138.2,138.40 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:141.66,143.34 2 3 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:143.34,145.3 1 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:146.2,146.30 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:149.126,151.33 2 3 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:151.33,153.3 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:154.2,157.19 4 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:162.79,164.29 2 4 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:164.29,166.3 1 3 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:167.2,167.35 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:170.91,172.31 2 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:172.31,174.3 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:175.2,175.35 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:178.97,180.31 2 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:180.31,182.3 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:183.2,183.35 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:186.85,188.30 2 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:188.30,190.3 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:191.2,191.30 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:194.62,196.30 2 3 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:196.30,198.3 1 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:199.2,199.30 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:204.81,206.30 2 3 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:206.30,208.3 1 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:209.2,209.35 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:212.88,214.31 2 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:214.31,216.3 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:217.2,217.30 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:220.63,222.31 2 3 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:222.31,224.3 1 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:225.2,225.30 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:230.83,232.31 2 3 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:232.31,234.3 1 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:235.2,235.35 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:238.77,240.32 2 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:240.32,242.3 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:243.2,243.30 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:246.64,248.32 2 3 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:248.32,250.3 1 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:251.2,251.30 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:256.80,258.25 2 3 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:258.25,260.3 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:261.2,264.19 4 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:269.37,271.24 2 5 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:271.24,273.3 1 2 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:274.2,274.12 1 3 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:277.37,279.23 2 4 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:279.23,281.3 1 1 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:282.2,282.15 1 3 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:288.52,290.31 2 39 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:290.31,291.28 1 666 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:291.28,293.4 1 40 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:295.2,295.14 1 39 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:299.53,301.2 1 35 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:304.31,306.2 1 4 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:30.66,32.16 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:32.16,34.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:35.2,35.40 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:39.39,41.2 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:44.39,46.2 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:51.89,57.16 4 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:57.16,59.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:60.2,60.58 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:64.101,66.16 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:66.16,68.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:69.2,69.49 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:73.78,75.2 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:78.91,80.20 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:80.20,83.3 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:84.2,84.42 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:88.78,90.2 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:93.80,95.2 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:98.94,100.20 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:100.20,103.3 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:104.2,104.45 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:108.111,115.2 3 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:118.100,120.16 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:120.16,122.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:124.2,124.22 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:124.22,126.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:127.2,129.34 3 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:129.34,131.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:132.2,132.32 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:136.68,139.2 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:142.128,146.12 3 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:146.12,155.17 5 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:155.17,158.4 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:160.3,160.34 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:160.34,161.27 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:161.27,164.5 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:166.4,166.38 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:166.38,168.12 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:169.29,169.29 0 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:170.23,171.12 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:177.2,177.27 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:183.81,186.16 3 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:186.16,188.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:189.2,189.50 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:193.93,195.16 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:195.16,197.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:198.2,198.45 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:202.99,204.16 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:204.16,206.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:207.2,207.48 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:211.87,216.19 3 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:216.19,218.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:219.2,219.12 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:223.64,226.2 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:231.83,234.16 3 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:234.16,236.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:237.2,237.52 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:241.90,246.2 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:249.65,252.2 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:257.85,260.16 3 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:260.16,262.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:263.2,263.54 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:267.79,270.2 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:273.66,276.2 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:279.82,283.12 3 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:283.12,291.13 6 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:291.13,294.4 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:296.3,296.13 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:296.13,298.18 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:298.18,300.5 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:303.3,303.44 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:303.44,313.11 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:314.28,314.28 0 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:315.22,316.11 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:321.2,321.27 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:326.95,328.37 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:328.37,330.20 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:330.20,333.4 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:334.3,349.4 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:351.2,351.15 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:354.43,355.19 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:355.19,357.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:359.2,360.21 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:363.69,365.26 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:365.26,372.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:373.2,373.15 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:376.89,377.17 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:377.17,379.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:381.2,399.23 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:399.23,414.31 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:414.31,419.4 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:422.2,422.24 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:422.24,424.33 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:424.33,426.4 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:427.3,445.4 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:448.2,448.16 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:451.82,473.2 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:475.83,477.35 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:477.35,490.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:491.2,491.15 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:494.81,495.17 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:495.17,497.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:499.2,513.24 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:513.24,515.44 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:515.44,517.4 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:518.3,521.4 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:524.2,524.16 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:527.93,529.32 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:529.32,538.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:539.2,539.15 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:542.90,544.36 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:544.36,554.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:555.2,555.15 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:558.83,560.36 2 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:560.36,568.3 1 0 -github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:569.2,569.15 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_libpod_stub.go:133.77,135.2 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_libpod_stub.go:138.82,143.2 4 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:66.70,68.2 1 80 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:72.87,74.33 2 10 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:74.33,76.3 1 8 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:77.2,77.35 1 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:80.99,82.35 2 9 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:82.35,84.3 1 7 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:85.2,85.35 1 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:88.76,90.33 2 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:90.33,92.3 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:93.2,93.30 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:96.89,98.32 2 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:98.32,100.3 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:101.2,101.30 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:104.76,106.33 2 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:106.33,108.3 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:109.2,109.30 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:112.78,114.35 2 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:114.35,116.3 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:117.2,117.30 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:120.92,122.35 2 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:122.35,124.3 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:125.2,125.30 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:128.103,130.34 2 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:130.34,132.3 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:133.2,133.30 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:136.98,138.31 2 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:138.31,140.3 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:141.2,141.40 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:144.66,146.34 2 3 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:146.34,148.3 1 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:149.2,149.30 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:152.126,154.33 2 3 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:154.33,156.3 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:157.2,160.19 4 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:165.79,167.29 2 4 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:167.29,169.3 1 3 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:170.2,170.35 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:173.91,175.31 2 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:175.31,177.3 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:178.2,178.35 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:181.97,183.31 2 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:183.31,185.3 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:186.2,186.35 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:189.85,191.30 2 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:191.30,193.3 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:194.2,194.30 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:197.62,199.30 2 3 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:199.30,201.3 1 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:202.2,202.30 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:207.81,209.30 2 3 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:209.30,211.3 1 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:212.2,212.35 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:215.88,217.31 2 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:217.31,219.3 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:220.2,220.30 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:223.63,225.31 2 3 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:225.31,227.3 1 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:228.2,228.30 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:233.83,235.31 2 3 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:235.31,237.3 1 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:238.2,238.35 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:241.77,243.32 2 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:243.32,245.3 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:246.2,246.30 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:249.64,251.32 2 3 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:251.32,253.3 1 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:254.2,254.30 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:259.75,261.27 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:261.27,263.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:264.2,264.35 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:269.80,271.25 2 3 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:271.25,273.3 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:274.2,277.19 4 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:282.37,284.24 2 5 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:284.24,286.3 1 2 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:287.2,287.12 1 3 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:290.37,292.23 2 4 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:292.23,294.3 1 1 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:295.2,295.15 1 3 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:301.52,303.31 2 39 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:303.31,304.28 1 666 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:304.28,306.4 1 40 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:308.2,308.14 1 39 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:312.53,314.2 1 35 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_mock.go:317.31,319.2 1 4 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:31.66,33.16 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:33.16,35.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:36.2,36.40 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:40.39,42.2 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:45.39,47.2 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:52.89,58.16 4 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:58.16,60.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:61.2,61.58 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:65.101,67.16 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:67.16,69.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:70.2,70.49 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:74.78,76.2 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:79.91,81.20 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:81.20,84.3 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:85.2,85.42 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:89.78,91.2 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:94.80,96.2 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:99.94,101.20 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:101.20,104.3 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:105.2,105.45 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:109.111,116.2 3 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:119.100,121.16 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:121.16,123.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:125.2,125.22 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:125.22,127.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:128.2,130.34 3 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:130.34,132.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:133.2,133.32 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:137.68,140.2 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:143.128,147.12 3 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:147.12,156.17 5 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:156.17,159.4 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:161.3,161.34 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:161.34,162.27 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:162.27,165.5 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:167.4,167.38 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:167.38,169.12 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:170.29,170.29 0 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:171.23,172.12 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:178.2,178.27 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:184.81,187.16 3 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:187.16,189.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:190.2,190.50 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:194.93,196.16 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:196.16,198.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:199.2,199.45 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:203.99,205.16 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:205.16,207.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:208.2,208.48 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:212.87,217.19 3 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:217.19,219.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:220.2,220.12 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:224.64,227.2 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:232.83,235.16 3 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:235.16,237.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:238.2,238.52 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:242.90,247.2 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:250.65,253.2 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:258.85,261.16 3 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:261.16,263.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:264.2,264.54 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:268.79,271.2 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:274.66,277.2 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:290.77,294.16 3 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:294.16,296.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:298.2,299.54 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:299.54,301.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:303.2,304.25 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:304.25,314.3 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:315.2,315.20 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:319.82,323.12 3 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:323.12,331.13 6 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:331.13,334.4 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:336.3,336.13 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:336.13,338.18 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:338.18,340.5 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:343.3,343.44 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:343.44,353.11 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:354.28,354.28 0 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:355.22,356.11 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:361.2,361.27 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:366.95,368.37 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:368.37,370.20 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:370.20,373.4 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:374.3,390.4 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:392.2,392.15 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:395.43,396.19 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:396.19,398.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:400.2,401.21 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:404.69,406.26 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:406.26,413.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:414.2,414.15 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:417.89,418.17 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:418.17,420.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:422.2,440.23 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:440.23,455.31 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:455.31,460.4 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:463.2,463.24 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:463.24,465.33 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:465.33,467.4 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:468.3,486.4 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:489.2,489.16 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:492.82,514.2 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:516.83,518.35 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:518.35,531.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:532.2,532.15 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:535.81,536.17 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:536.17,538.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:540.2,554.24 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:554.24,556.44 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:556.44,558.4 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:559.3,562.4 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:565.2,565.16 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:568.93,570.32 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:570.32,579.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:580.2,580.15 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:583.90,585.36 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:585.36,595.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:596.2,596.15 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:599.83,601.36 2 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:601.36,609.3 1 0 +github.com/christophe-duc/lazypodman/pkg/commands/runtime_socket.go:610.2,610.15 1 0 github.com/christophe-duc/lazypodman/pkg/commands/service.go:22.64,24.2 1 0 github.com/christophe-duc/lazypodman/pkg/commands/service.go:27.32,29.2 1 0 github.com/christophe-duc/lazypodman/pkg/commands/service.go:32.30,34.2 1 0 @@ -2138,7 +2320,7 @@ github.com/christophe-duc/lazypodman/pkg/commands/ssh/ssh.go:165.2,165.17 1 1 mode: atomic github.com/christophe-duc/lazypodman/pkg/i18n/chinese.go:3.34,136.2 1 0 github.com/christophe-duc/lazypodman/pkg/i18n/dutch.go:3.32,98.2 1 0 -github.com/christophe-duc/lazypodman/pkg/i18n/english.go:140.34,281.2 1 0 +github.com/christophe-duc/lazypodman/pkg/i18n/english.go:139.34,280.2 1 0 github.com/christophe-duc/lazypodman/pkg/i18n/french.go:3.33,120.2 1 0 github.com/christophe-duc/lazypodman/pkg/i18n/german.go:3.33,97.2 1 0 github.com/christophe-duc/lazypodman/pkg/i18n/i18n.go:19.101,20.30 1 0 diff --git a/pkg/commands/container_list_item.go b/pkg/commands/container_list_item.go new file mode 100644 index 00000000..296b7b8e --- /dev/null +++ b/pkg/commands/container_list_item.go @@ -0,0 +1,66 @@ +package commands + +// ContainerListItem represents either a pod or a container in the unified list view. +// This allows the container panel to display both pods and containers. +type ContainerListItem struct { + IsPod bool + Pod *Pod // Set if IsPod is true + Container *Container // Set if IsPod is false + Indent int // 0 for pods/standalone containers, 2 for containers in pods +} + +// ID returns the unique ID for the item. +func (c *ContainerListItem) ID() string { + if c.IsPod { + return c.Pod.ID + } + return c.Container.ID +} + +// Name returns the display name for the item. +func (c *ContainerListItem) Name() string { + if c.IsPod { + return c.Pod.Name + } + return c.Container.Name +} + +// State returns the state for the item. +func (c *ContainerListItem) State() string { + if c.IsPod { + return c.Pod.State() + } + return c.Container.Summary.State +} + +// GetContainers returns the containers if this is a pod, nil otherwise. +func (c *ContainerListItem) GetContainers() []*Container { + if c.IsPod { + return c.Pod.Containers + } + return nil +} + +// IsInPod returns true if this is a container that belongs to a pod. +func (c *ContainerListItem) IsInPod() bool { + if c.IsPod { + return false + } + return c.Container.Summary.Pod != "" +} + +// PodID returns the pod ID if this container is in a pod, empty string otherwise. +func (c *ContainerListItem) PodID() string { + if c.IsPod { + return c.Pod.ID + } + return c.Container.Summary.Pod +} + +// PodName returns the pod name if this container is in a pod, empty string otherwise. +func (c *ContainerListItem) PodName() string { + if c.IsPod { + return c.Pod.Name + } + return c.Container.Summary.PodName +} diff --git a/pkg/commands/pod.go b/pkg/commands/pod.go new file mode 100644 index 00000000..4a692a08 --- /dev/null +++ b/pkg/commands/pod.go @@ -0,0 +1,36 @@ +package commands + +import ( + "github.com/sirupsen/logrus" +) + +// Pod represents a Podman pod with its containers. +type Pod struct { + ID string + Name string + Summary PodSummary + Containers []*Container // Non-infra containers in this pod + OSCommand *OSCommand + Log *logrus.Entry +} + +// State returns the pod state. +func (p *Pod) State() string { + return p.Summary.Status +} + +// HasContainers returns true if the pod has non-infra containers. +func (p *Pod) HasContainers() bool { + return len(p.Containers) > 0 +} + +// GetRunningContainerCount returns the number of running containers in the pod. +func (p *Pod) GetRunningContainerCount() int { + count := 0 + for _, c := range p.Containers { + if c.Summary.State == "running" { + count++ + } + } + return count +} diff --git a/pkg/commands/podman.go b/pkg/commands/podman.go index 42359321..9ccf6055 100644 --- a/pkg/commands/podman.go +++ b/pkg/commands/podman.go @@ -347,15 +347,35 @@ func calculateMemoryPercentageFromEntry(stats ContainerStatsEntry) float64 { return 0.0 } -func (c *PodmanCommand) RefreshContainersAndServices(currentServices []*Service, currentContainers []*Container) ([]*Container, []*Service, error) { +func (c *PodmanCommand) RefreshContainersAndServices(currentServices []*Service, currentItems []*ContainerListItem) ([]*ContainerListItem, []*Service, error) { c.ServiceMutex.Lock() defer c.ServiceMutex.Unlock() + // Extract existing containers from current items + var currentContainers []*Container + for _, item := range currentItems { + if !item.IsPod && item.Container != nil { + currentContainers = append(currentContainers, item.Container) + } + } + containers, err := c.GetContainers(currentContainers) if err != nil { return nil, nil, err } + // Get pods + ctx := context.Background() + podSummaries, err := c.Runtime.ListPods(ctx) + if err != nil { + // Don't fail if pods can't be listed, just log and continue without pods + c.Log.Warnf("Failed to list pods: %v", err) + podSummaries = nil + } + + // Build the unified list + items := c.buildContainerListItems(containers, podSummaries) + var services []*Service // we only need to get these services once because they won't change in the runtime of the program if currentServices != nil { @@ -367,9 +387,88 @@ func (c *PodmanCommand) RefreshContainersAndServices(currentServices []*Service, } } - c.assignContainersToServices(containers, services) + // Extract just containers for service assignment + var containersForServices []*Container + for _, item := range items { + if !item.IsPod && item.Container != nil { + containersForServices = append(containersForServices, item.Container) + } + } + c.assignContainersToServices(containersForServices, services) - return containers, services, nil + return items, services, nil +} + +// buildContainerListItems creates a unified list of pods and containers +func (c *PodmanCommand) buildContainerListItems(containers []*Container, podSummaries []PodSummary) []*ContainerListItem { + var items []*ContainerListItem + + // Create a map of pod ID -> pod summary + podMap := make(map[string]PodSummary) + for _, ps := range podSummaries { + podMap[ps.ID] = ps + } + + // Create a map of pod ID -> containers in that pod + podContainers := make(map[string][]*Container) + var standaloneContainers []*Container + + for _, ctr := range containers { + // Skip infra containers + if ctr.Summary.IsInfra { + continue + } + + if ctr.Summary.Pod != "" { + podContainers[ctr.Summary.Pod] = append(podContainers[ctr.Summary.Pod], ctr) + } else { + standaloneContainers = append(standaloneContainers, ctr) + } + } + + // Add pods and their containers + for podID, ps := range podMap { + // Create pod object + pod := &Pod{ + ID: ps.ID, + Name: ps.Name, + Summary: ps, + Containers: podContainers[podID], + OSCommand: c.OSCommand, + Log: c.Log, + } + + // Add pod item + items = append(items, &ContainerListItem{ + IsPod: true, + Pod: pod, + Indent: 0, + }) + + // Add containers in this pod with indent + for _, ctr := range podContainers[podID] { + // Set pod name on container if not already set + if ctr.Summary.PodName == "" { + ctr.Summary.PodName = ps.Name + } + items = append(items, &ContainerListItem{ + IsPod: false, + Container: ctr, + Indent: 2, + }) + } + } + + // Add standalone containers + for _, ctr := range standaloneContainers { + items = append(items, &ContainerListItem{ + IsPod: false, + Container: ctr, + Indent: 0, + }) + } + + return items } func (c *PodmanCommand) assignContainersToServices(containers []*Container, services []*Service) { diff --git a/pkg/commands/runtime.go b/pkg/commands/runtime.go index 9a6f530b..84e73019 100644 --- a/pkg/commands/runtime.go +++ b/pkg/commands/runtime.go @@ -37,6 +37,9 @@ type ContainerRuntime interface { RemoveNetwork(ctx context.Context, name string) error PruneNetworks(ctx context.Context) error + // Pod operations + ListPods(ctx context.Context) ([]PodSummary, error) + // Events streams container/image/volume/network events Events(ctx context.Context) (<-chan Event, <-chan error) diff --git a/pkg/commands/runtime_libpod.go b/pkg/commands/runtime_libpod.go index 37dc2ead..7d9b8862 100644 --- a/pkg/commands/runtime_libpod.go +++ b/pkg/commands/runtime_libpod.go @@ -146,7 +146,7 @@ func (r *LibpodRuntime) ContainerTop(ctx context.Context, id string) ([]string, // Parse the result: first line is headers, rest are process rows // Each line is space-separated fields headers := splitFields(result[0]) - var processes [][]string + processes := make([][]string, 0, len(result)-1) for _, line := range result[1:] { processes = append(processes, splitFields(line)) } @@ -309,6 +309,37 @@ func (r *LibpodRuntime) PruneNetworks(ctx context.Context) error { return nil } +// Pod operations + +// ListPods returns all pods. +func (r *LibpodRuntime) ListPods(ctx context.Context) ([]PodSummary, error) { + pods, err := r.runtime.GetAllPods() + if err != nil { + return nil, err + } + result := make([]PodSummary, len(pods)) + for i, pod := range pods { + status, err := pod.GetPodStatus() + if err != nil { + status = "unknown" + } + config := pod.Config() + infraID := "" + if config != nil { + infraID = config.InfraContainerID + } + result[i] = PodSummary{ + ID: pod.ID(), + Name: pod.Name(), + Status: status, + Created: pod.CreatedTime(), + InfraID: infraID, + Labels: pod.Labels(), + } + } + return result, nil +} + // Events streams container runtime events. // For libpod, we use a polling approach since direct event streaming requires more setup. func (r *LibpodRuntime) Events(ctx context.Context) (<-chan Event, <-chan error) { @@ -361,6 +392,14 @@ func convertLibpodContainerList(ctrs []*libpod.Container) ([]ContainerSummary, e if len(config.Command) > 0 { command = config.Command[0] } + // Get pod name if container is in a pod + podName := "" + if podID := ctr.PodID(); podID != "" { + // Try to get pod name from config labels or leave empty + if pn, ok := config.Labels["io.kubernetes.pod.name"]; ok { + podName = pn + } + } result[i] = ContainerSummary{ ID: ctr.ID(), Names: []string{ctr.Name()}, @@ -372,6 +411,8 @@ func convertLibpodContainerList(ctrs []*libpod.Container) ([]ContainerSummary, e Status: state.String(), Labels: config.Labels, Pod: ctr.PodID(), + PodName: podName, + IsInfra: ctr.IsInfra(), } } return result, nil diff --git a/pkg/commands/runtime_libpod_stub.go b/pkg/commands/runtime_libpod_stub.go index dec54024..d0e6ddbb 100644 --- a/pkg/commands/runtime_libpod_stub.go +++ b/pkg/commands/runtime_libpod_stub.go @@ -128,6 +128,12 @@ func (r *LibpodRuntime) PruneNetworks(ctx context.Context) error { return ErrLibpodNotAvailable } +// Pod operations - all return ErrLibpodNotAvailable + +func (r *LibpodRuntime) ListPods(ctx context.Context) ([]PodSummary, error) { + return nil, ErrLibpodNotAvailable +} + // Events returns an error channel on non-Linux platforms. func (r *LibpodRuntime) Events(ctx context.Context) (<-chan Event, <-chan error) { errChan := make(chan error, 1) diff --git a/pkg/commands/runtime_mock.go b/pkg/commands/runtime_mock.go index 8fbeb310..f4037562 100644 --- a/pkg/commands/runtime_mock.go +++ b/pkg/commands/runtime_mock.go @@ -39,6 +39,9 @@ type MockRuntime struct { RemoveNetworkFunc func(ctx context.Context, name string) error PruneNetworksFunc func(ctx context.Context) error + // Pod operation mocks + ListPodsFunc func(ctx context.Context) ([]PodSummary, error) + // Event mock EventsFunc func(ctx context.Context) (<-chan Event, <-chan error) @@ -251,6 +254,16 @@ func (m *MockRuntime) PruneNetworks(ctx context.Context) error { return ErrMockNotImplemented } +// Pod operations + +func (m *MockRuntime) ListPods(ctx context.Context) ([]PodSummary, error) { + m.recordCall("ListPods") + if m.ListPodsFunc != nil { + return m.ListPodsFunc(ctx) + } + return nil, ErrMockNotImplemented +} + // Events func (m *MockRuntime) Events(ctx context.Context) (<-chan Event, <-chan error) { diff --git a/pkg/commands/runtime_socket.go b/pkg/commands/runtime_socket.go index ee6eee24..6e87f1e6 100644 --- a/pkg/commands/runtime_socket.go +++ b/pkg/commands/runtime_socket.go @@ -3,6 +3,7 @@ package commands import ( "context" "encoding/json" + "os/exec" "strings" "time" @@ -275,6 +276,45 @@ func (r *SocketRuntime) PruneNetworks(ctx context.Context) error { return err } +// podPsJSON represents the JSON output of `podman pod ps --format json` +type podPsJSON struct { + ID string `json:"Id"` + Name string `json:"Name"` + Status string `json:"Status"` + Created string `json:"Created"` + InfraID string `json:"InfraId"` + Labels map[string]string `json:"Labels"` +} + +// ListPods returns all pods. +func (r *SocketRuntime) ListPods(ctx context.Context) ([]PodSummary, error) { + // Use podman CLI since there's no pods binding package + cmd := exec.CommandContext(ctx, "podman", "pod", "ps", "--format", "json") + output, err := cmd.Output() + if err != nil { + return nil, err + } + + var pods []podPsJSON + if err := json.Unmarshal(output, &pods); err != nil { + return nil, err + } + + result := make([]PodSummary, len(pods)) + for i, p := range pods { + created, _ := time.Parse(time.RFC3339, p.Created) + result[i] = PodSummary{ + ID: p.ID, + Name: p.Name, + Status: p.Status, + Created: created, + InfraID: p.InfraID, + Labels: p.Labels, + } + } + return result, nil +} + // Events streams container runtime events. func (r *SocketRuntime) Events(ctx context.Context) (<-chan Event, <-chan error) { eventChan := make(chan Event) @@ -346,6 +386,7 @@ func convertPodmanContainerList(podmanContainers []entities.ListContainer) []Con SizeRootFs: sizeRootFs, Pod: c.Pod, PodName: c.PodName, + IsInfra: c.IsInfra, } } return result diff --git a/pkg/commands/runtime_types.go b/pkg/commands/runtime_types.go index 890cd189..6eba677e 100644 --- a/pkg/commands/runtime_types.go +++ b/pkg/commands/runtime_types.go @@ -20,6 +20,7 @@ type ContainerSummary struct { // Podman-specific fields Pod string PodName string + IsInfra bool } // PortMapping represents a container port mapping. @@ -424,3 +425,13 @@ type EventActor struct { ID string Attributes map[string]string } + +// PodSummary provides runtime-agnostic pod information. +type PodSummary struct { + ID string + Name string + Status string + Created time.Time + InfraID string + Labels map[string]string +} diff --git a/pkg/gui/container_logs.go b/pkg/gui/container_logs.go index 1f9c9c6d..931f72f1 100644 --- a/pkg/gui/container_logs.go +++ b/pkg/gui/container_logs.go @@ -142,3 +142,74 @@ func (gui *Gui) writeContainerLogs(ctr *commands.Container, ctx context.Context, return err } } + +// Pod logs rendering + +func (gui *Gui) renderPodLogsToMain(pod *commands.Pod) tasks.TaskFunc { + return gui.NewTickerTask(TickerTaskOpts{ + Func: func(ctx context.Context, notifyStopped chan struct{}) { + gui.renderPodLogsToMainAux(pod, ctx, notifyStopped) + }, + Duration: time.Millisecond * 200, + Before: func(ctx context.Context) { gui.clearMainView() }, + Wrap: gui.Config.UserConfig.Gui.WrapMainPanel, + Autoscroll: true, + }) +} + +func (gui *Gui) renderPodLogsToMainAux(pod *commands.Pod, ctx context.Context, notifyStopped chan struct{}) { + gui.clearMainView() + defer func() { + notifyStopped <- struct{}{} + }() + + mainView := gui.Views.Main + + if err := gui.writePodLogs(pod, ctx, mainView); err != nil { + gui.Log.Error(err) + } + + // Wait for context cancellation + <-ctx.Done() +} + +func (gui *Gui) writePodLogs(pod *commands.Pod, ctx context.Context, writer io.Writer) error { + // Build podman pod logs command + args := []string{"pod", "logs", "--follow", "--color"} + + if gui.Config.UserConfig.Logs.Timestamps { + args = append(args, "--timestamps") + } + if gui.Config.UserConfig.Logs.Since != "" { + args = append(args, "--since", gui.Config.UserConfig.Logs.Since) + } + if gui.Config.UserConfig.Logs.Tail != "" { + args = append(args, "--tail", gui.Config.UserConfig.Logs.Tail) + } + args = append(args, pod.Name) + + cmd := pod.OSCommand.NewCmd("podman", args...) + cmd.Stdout = writer + cmd.Stderr = writer + + if err := cmd.Start(); err != nil { + gui.Log.Error(err) + return err + } + + // Wait for context cancellation or command completion + done := make(chan error, 1) + go func() { + done <- cmd.Wait() + }() + + select { + case <-ctx.Done(): + if err := pod.OSCommand.Kill(cmd); err != nil { + gui.Log.Warn(err) + } + return nil + case err := <-done: + return err + } +} diff --git a/pkg/gui/containers_panel.go b/pkg/gui/containers_panel.go index 7513897a..be0e0795 100644 --- a/pkg/gui/containers_panel.go +++ b/pkg/gui/containers_panel.go @@ -18,7 +18,7 @@ import ( "github.com/samber/lo" ) -func (gui *Gui) getContainersPanel() *panels.SideListPanel[*commands.Container] { +func (gui *Gui) getContainersPanel() *panels.SideListPanel[*commands.ContainerListItem] { // Standalone containers are containers which are either one-off containers, or whose service is not part of this docker-compose context. isStandaloneContainer := func(container *commands.Container) bool { if container.OneOff || container.ServiceName == "" { @@ -30,58 +30,60 @@ func (gui *Gui) getContainersPanel() *panels.SideListPanel[*commands.Container] }) } - return &panels.SideListPanel[*commands.Container]{ - ContextState: &panels.ContextState[*commands.Container]{ - GetMainTabs: func() []panels.MainTab[*commands.Container] { - return []panels.MainTab[*commands.Container]{ + return &panels.SideListPanel[*commands.ContainerListItem]{ + ContextState: &panels.ContextState[*commands.ContainerListItem]{ + GetMainTabs: func() []panels.MainTab[*commands.ContainerListItem] { + return []panels.MainTab[*commands.ContainerListItem]{ { Key: "logs", Title: gui.Tr.LogsTitle, - Render: gui.renderContainerLogsToMain, + Render: gui.renderContainerListItemLogs, }, { Key: "stats", Title: gui.Tr.StatsTitle, - Render: gui.renderContainerStats, + Render: gui.renderContainerListItemStats, }, { Key: "env", Title: gui.Tr.EnvTitle, - Render: gui.renderContainerEnv, + Render: gui.renderContainerListItemEnv, }, { Key: "config", Title: gui.Tr.ConfigTitle, - Render: gui.renderContainerConfig, + Render: gui.renderContainerListItemConfig, }, { Key: "top", Title: gui.Tr.TopTitle, - Render: gui.renderContainerTop, + Render: gui.renderContainerListItemTop, }, } }, - GetItemContextCacheKey: func(container *commands.Container) string { - // Including the container state in the cache key so that if the container - // restarts we re-read the logs. In the past we've had some glitchiness - // where a container restarts but the new logs don't get read. - // Note that this might be jarring if we have a lot of logs and the container - // restarts a lot, so let's keep an eye on it. - return "containers-" + container.ID + "-" + container.Summary.State + GetItemContextCacheKey: func(item *commands.ContainerListItem) string { + // Including the state in the cache key so that if the container/pod + // restarts we re-read the logs. + return "containers-" + item.ID() + "-" + item.State() }, }, - ListPanel: panels.ListPanel[*commands.Container]{ - List: panels.NewFilteredList[*commands.Container](), + ListPanel: panels.ListPanel[*commands.ContainerListItem]{ + List: panels.NewFilteredList[*commands.ContainerListItem](), View: gui.Views.Containers, }, NoItemsMessage: gui.Tr.NoContainers, Gui: gui.intoInterface(), - // sortedContainers returns containers sorted by state if c.SortContainersByState is true (follows 1- running, 2- exited, 3- created) - // and sorted by name if c.SortContainersByState is false - Sort: func(a *commands.Container, b *commands.Container) bool { - return sortContainers(a, b, gui.Config.UserConfig.Gui.LegacySortContainers) + // Sort items: pods first (with their containers grouped), then standalone containers + Sort: func(a *commands.ContainerListItem, b *commands.ContainerListItem) bool { + return sortContainerListItems(a, b, gui.Config.UserConfig.Gui.LegacySortContainers) }, - Filter: func(container *commands.Container) bool { + Filter: func(item *commands.ContainerListItem) bool { + // Pods are always shown + if item.IsPod { + return true + } + + container := item.Container // Note that this is O(N*M) time complexity where N is the number of services // and M is the number of containers. We expect N to be small but M may be large, // so we will need to keep an eye on this. @@ -95,8 +97,8 @@ func (gui *Gui) getContainersPanel() *panels.SideListPanel[*commands.Container] return true }, - GetTableCells: func(container *commands.Container) []string { - return presentation.GetContainerDisplayStrings(&gui.Config.UserConfig.Gui, container) + GetTableCells: func(item *commands.ContainerListItem) []string { + return presentation.GetContainerListItemDisplayStrings(&gui.Config.UserConfig.Gui, item) }, } } @@ -121,6 +123,137 @@ func sortContainers(a *commands.Container, b *commands.Container, legacySort boo return containerStates[a.Summary.State] < containerStates[b.Summary.State] } +// sortContainerListItems sorts items to group pods with their containers. +// Order: pods first (sorted by state/name), then their containers indented, +// then standalone containers (sorted by state/name). +func sortContainerListItems(a *commands.ContainerListItem, b *commands.ContainerListItem, legacySort bool) bool { + // If both are in the same pod, sort by indent (pod first) then by name + if a.PodID() != "" && a.PodID() == b.PodID() { + // Pod comes before its containers + if a.IsPod && !b.IsPod { + return true + } + if !a.IsPod && b.IsPod { + return false + } + // Both are containers in the same pod, sort by name + return a.Name() < b.Name() + } + + // Get the effective sort key (pod name for items in pods, own name for standalone) + aKey := a.Name() + bKey := b.Name() + if a.PodID() != "" && !a.IsPod { + aKey = a.PodName() + "\x00" + a.Name() // Sort after the pod + } + if b.PodID() != "" && !b.IsPod { + bKey = b.PodName() + "\x00" + b.Name() + } + if a.IsPod { + aKey = a.Name() + "\x00" // Pod sorts before its containers + } + if b.IsPod { + bKey = b.Name() + "\x00" + } + + // Pods and their containers sort together, standalone containers at the end + aInPod := a.IsPod || a.PodID() != "" + bInPod := b.IsPod || b.PodID() != "" + + if aInPod && !bInPod { + return true // Pods/pod containers before standalone + } + if !aInPod && bInPod { + return false + } + + // Both in same category (pod-related or standalone) + if legacySort { + return aKey < bKey + } + + // Sort by state, then by key + stateA := containerStates[a.State()] + stateB := containerStates[b.State()] + if stateA == stateB { + return aKey < bKey + } + return stateA < stateB +} + +// Wrapper functions that delegate to container or pod rendering + +func (gui *Gui) renderContainerListItemLogs(item *commands.ContainerListItem) tasks.TaskFunc { + if item.IsPod { + return gui.renderPodLogsToMain(item.Pod) + } + return gui.renderContainerLogsToMain(item.Container) +} + +func (gui *Gui) renderContainerListItemStats(item *commands.ContainerListItem) tasks.TaskFunc { + if item.IsPod { + return gui.NewSimpleRenderStringTask(func() string { + return fmt.Sprintf("Pod: %s\nStatus: %s\nContainers: %d\n\nStats not available for pods. Select a container to view stats.", + item.Pod.Name, item.Pod.State(), len(item.Pod.Containers)) + }) + } + return gui.renderContainerStats(item.Container) +} + +func (gui *Gui) renderContainerListItemEnv(item *commands.ContainerListItem) tasks.TaskFunc { + if item.IsPod { + return gui.NewSimpleRenderStringTask(func() string { + return "Environment variables not available for pods. Select a container to view environment." + }) + } + return gui.renderContainerEnv(item.Container) +} + +func (gui *Gui) renderContainerListItemConfig(item *commands.ContainerListItem) tasks.TaskFunc { + if item.IsPod { + return gui.renderPodConfig(item.Pod) + } + return gui.renderContainerConfig(item.Container) +} + +func (gui *Gui) renderContainerListItemTop(item *commands.ContainerListItem) tasks.TaskFunc { + if item.IsPod { + return gui.NewSimpleRenderStringTask(func() string { + return "Process list not available for pods. Select a container to view processes." + }) + } + return gui.renderContainerTop(item.Container) +} + +func (gui *Gui) renderPodConfig(pod *commands.Pod) tasks.TaskFunc { + return gui.NewSimpleRenderStringTask(func() string { + padding := 10 + output := "" + output += utils.ColoredString("Pod Information\n\n", color.FgCyan) + output += utils.WithPadding("ID: ", padding) + pod.ID + "\n" + output += utils.WithPadding("Name: ", padding) + pod.Name + "\n" + output += utils.WithPadding("Status: ", padding) + pod.State() + "\n" + output += utils.WithPadding("Created: ", padding) + pod.Summary.Created.Format(time.RFC3339) + "\n" + output += fmt.Sprintf("%s%d\n", utils.WithPadding("Containers: ", padding), len(pod.Containers)) + + if len(pod.Containers) > 0 { + output += "\n" + utils.ColoredString("Containers in this pod:\n", color.FgYellow) + for _, c := range pod.Containers { + stateColor := color.FgWhite + switch c.Summary.State { + case "running": + stateColor = color.FgGreen + case "exited": + stateColor = color.FgRed + } + output += fmt.Sprintf(" - %s (%s)\n", c.Name, utils.ColoredString(c.Summary.State, stateColor)) + } + } + + return output + }) +} + func (gui *Gui) renderContainerEnv(container *commands.Container) tasks.TaskFunc { return gui.NewSimpleRenderStringTask(func() string { return gui.containerEnv(container) }) } @@ -179,9 +312,9 @@ func (gui *Gui) containerConfigStr(container *commands.Container) string { output += "\n" for _, mount := range container.Details.Mounts { if mount.Type == "volume" { - output += fmt.Sprintf("%s%s %s\n", strings.Repeat(" ", padding), utils.ColoredString(string(mount.Type)+":", color.FgYellow), mount.Name) + output += fmt.Sprintf("%s%s %s\n", strings.Repeat(" ", padding), utils.ColoredString(mount.Type+":", color.FgYellow), mount.Name) } else { - output += fmt.Sprintf("%s%s %s:%s\n", strings.Repeat(" ", padding), utils.ColoredString(string(mount.Type)+":", color.FgYellow), mount.Source, mount.Destination) + output += fmt.Sprintf("%s%s %s:%s\n", strings.Repeat(" ", padding), utils.ColoredString(mount.Type+":", color.FgYellow), mount.Source, mount.Destination) } } } else { @@ -302,11 +435,16 @@ func (gui *Gui) handleHideStoppedContainers(g *gocui.Gui, v *gocui.View) error { } func (gui *Gui) handleContainersRemoveMenu(g *gocui.Gui, v *gocui.View) error { - ctr, err := gui.Panels.Containers.GetSelectedItem() + item, err := gui.Panels.Containers.GetSelectedItem() if err != nil { return nil } + if item.IsPod { + return gui.createErrorPanel("Pod operations not yet supported") + } + + ctr := item.Container handleMenuPress := func(force bool, removeVolumes bool) error { return gui.WithWaitingStatus(gui.Tr.RemovingStatus, func() error { if err := ctr.Remove(force, removeVolumes); err != nil { @@ -357,20 +495,29 @@ func (gui *Gui) PauseContainer(container *commands.Container) error { } func (gui *Gui) handleContainerPause(g *gocui.Gui, v *gocui.View) error { - ctr, err := gui.Panels.Containers.GetSelectedItem() + item, err := gui.Panels.Containers.GetSelectedItem() if err != nil { return nil } - return gui.PauseContainer(ctr) + if item.IsPod { + return gui.createErrorPanel("Pod operations not yet supported") + } + + return gui.PauseContainer(item.Container) } func (gui *Gui) handleContainerStop(g *gocui.Gui, v *gocui.View) error { - ctr, err := gui.Panels.Containers.GetSelectedItem() + item, err := gui.Panels.Containers.GetSelectedItem() if err != nil { return nil } + if item.IsPod { + return gui.createErrorPanel("Pod operations not yet supported") + } + + ctr := item.Container return gui.createConfirmationPanel(gui.Tr.Confirm, gui.Tr.StopContainer, func(g *gocui.Gui, v *gocui.View) error { return gui.WithWaitingStatus(gui.Tr.StoppingStatus, func() error { if err := ctr.Stop(); err != nil { @@ -383,11 +530,16 @@ func (gui *Gui) handleContainerStop(g *gocui.Gui, v *gocui.View) error { } func (gui *Gui) handleContainerRestart(g *gocui.Gui, v *gocui.View) error { - ctr, err := gui.Panels.Containers.GetSelectedItem() + item, err := gui.Panels.Containers.GetSelectedItem() if err != nil { return nil } + if item.IsPod { + return gui.createErrorPanel("Pod operations not yet supported") + } + + ctr := item.Container return gui.WithWaitingStatus(gui.Tr.RestartingStatus, func() error { if err := ctr.Restart(); err != nil { return gui.createErrorPanel(err.Error()) @@ -398,11 +550,16 @@ func (gui *Gui) handleContainerRestart(g *gocui.Gui, v *gocui.View) error { } func (gui *Gui) handleContainerAttach(g *gocui.Gui, v *gocui.View) error { - ctr, err := gui.Panels.Containers.GetSelectedItem() + item, err := gui.Panels.Containers.GetSelectedItem() if err != nil { return nil } + if item.IsPod { + return gui.createErrorPanel("Pod operations not yet supported") + } + + ctr := item.Container c, err := ctr.Attach() if err != nil { return gui.createErrorPanel(err.Error()) @@ -424,23 +581,32 @@ func (gui *Gui) handlePruneContainers() error { } func (gui *Gui) handleContainerViewLogs(g *gocui.Gui, v *gocui.View) error { - ctr, err := gui.Panels.Containers.GetSelectedItem() + item, err := gui.Panels.Containers.GetSelectedItem() if err != nil { return nil } - gui.renderLogsToStdout(ctr) + if item.IsPod { + // TODO: implement pod logs to stdout + return gui.createErrorPanel("Pod logs to stdout not yet supported") + } + + gui.renderLogsToStdout(item.Container) return nil } func (gui *Gui) handleContainersExecShell(g *gocui.Gui, v *gocui.View) error { - ctr, err := gui.Panels.Containers.GetSelectedItem() + item, err := gui.Panels.Containers.GetSelectedItem() if err != nil { return nil } - return gui.containerExecShell(ctr) + if item.IsPod { + return gui.createErrorPanel("Cannot exec into a pod. Select a container instead.") + } + + return gui.containerExecShell(item.Container) } func (gui *Gui) containerExecShell(container *commands.Container) error { @@ -456,13 +622,17 @@ func (gui *Gui) containerExecShell(container *commands.Container) error { } func (gui *Gui) handleContainersCustomCommand(g *gocui.Gui, v *gocui.View) error { - ctr, err := gui.Panels.Containers.GetSelectedItem() + item, err := gui.Panels.Containers.GetSelectedItem() if err != nil { return nil } + if item.IsPod { + return gui.createErrorPanel("Custom commands not yet supported for pods") + } + commandObject := gui.PodmanCommand.NewCommandObject(commands.CommandObject{ - Container: ctr, + Container: item.Container, }) customCommands := gui.Config.UserConfig.CustomCommands.Containers @@ -473,9 +643,11 @@ func (gui *Gui) handleContainersCustomCommand(g *gocui.Gui, v *gocui.View) error func (gui *Gui) handleStopContainers() error { return gui.createConfirmationPanel(gui.Tr.Confirm, gui.Tr.ConfirmStopContainers, func(g *gocui.Gui, v *gocui.View) error { return gui.WithWaitingStatus(gui.Tr.StoppingStatus, func() error { - for _, ctr := range gui.Panels.Containers.List.GetAllItems() { - if err := ctr.Stop(); err != nil { - gui.Log.Error(err) + for _, item := range gui.Panels.Containers.List.GetAllItems() { + if !item.IsPod && item.Container != nil { + if err := item.Container.Stop(); err != nil { + gui.Log.Error(err) + } } } @@ -487,9 +659,11 @@ func (gui *Gui) handleStopContainers() error { func (gui *Gui) handleRemoveContainers() error { return gui.createConfirmationPanel(gui.Tr.Confirm, gui.Tr.ConfirmRemoveContainers, func(g *gocui.Gui, v *gocui.View) error { return gui.WithWaitingStatus(gui.Tr.RemovingStatus, func() error { - for _, ctr := range gui.Panels.Containers.List.GetAllItems() { - if err := ctr.Remove(true, false); err != nil { - gui.Log.Error(err) + for _, item := range gui.Panels.Containers.List.GetAllItems() { + if !item.IsPod && item.Container != nil { + if err := item.Container.Remove(true, false); err != nil { + gui.Log.Error(err) + } } } @@ -522,12 +696,16 @@ func (gui *Gui) handleContainersBulkCommand(g *gocui.Gui, v *gocui.View) error { // Open first port in browser func (gui *Gui) handleContainersOpenInBrowserCommand(g *gocui.Gui, v *gocui.View) error { - ctr, err := gui.Panels.Containers.GetSelectedItem() + item, err := gui.Panels.Containers.GetSelectedItem() if err != nil { return nil } - return gui.openContainerInBrowser(ctr) + if item.IsPod { + return gui.createErrorPanel("Cannot open pod in browser. Select a container instead.") + } + + return gui.openContainerInBrowser(item.Container) } func (gui *Gui) openContainerInBrowser(ctr *commands.Container) error { diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index 6bbdf48f..d6e0711b 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -48,7 +48,7 @@ type Gui struct { type Panels struct { Projects *panels.SideListPanel[*commands.Project] Services *panels.SideListPanel[*commands.Service] - Containers *panels.SideListPanel[*commands.Container] + Containers *panels.SideListPanel[*commands.ContainerListItem] Images *panels.SideListPanel[*commands.Image] Volumes *panels.SideListPanel[*commands.Volume] Networks *panels.SideListPanel[*commands.Network] @@ -290,7 +290,14 @@ func (gui *Gui) setPanels() { } func (gui *Gui) updateContainerDetails() error { - return gui.PodmanCommand.RefreshContainerDetails(gui.Panels.Containers.List.GetAllItems()) + // Extract containers from ContainerListItems + var containers []*commands.Container + for _, item := range gui.Panels.Containers.List.GetAllItems() { + if !item.IsPod && item.Container != nil { + containers = append(containers, item.Container) + } + } + return gui.PodmanCommand.RefreshContainerDetails(containers) } func (gui *Gui) refresh() { @@ -469,9 +476,9 @@ func (gui *Gui) monitorContainerStats(ctx context.Context) { case <-ctx.Done(): return case <-ticker.C: - for _, container := range gui.Panels.Containers.List.GetAllItems() { - if !container.MonitoringStats { - go gui.PodmanCommand.CreateClientStatMonitor(container) + for _, item := range gui.Panels.Containers.List.GetAllItems() { + if !item.IsPod && item.Container != nil && !item.Container.MonitoringStats { + go gui.PodmanCommand.CreateClientStatMonitor(item.Container) } } } diff --git a/pkg/gui/presentation/container_stats.go b/pkg/gui/presentation/container_stats.go index 51606b9d..74b0658c 100644 --- a/pkg/gui/presentation/container_stats.go +++ b/pkg/gui/presentation/container_stats.go @@ -8,11 +8,11 @@ import ( "strings" "time" - "github.com/fatih/color" - "github.com/jesseduffield/asciigraph" "github.com/christophe-duc/lazypodman/pkg/commands" "github.com/christophe-duc/lazypodman/pkg/config" "github.com/christophe-duc/lazypodman/pkg/utils" + "github.com/fatih/color" + "github.com/jesseduffield/asciigraph" "github.com/mcuadros/go-lookup" "github.com/samber/lo" ) diff --git a/pkg/gui/presentation/containers.go b/pkg/gui/presentation/containers.go index baf42565..fe7a5a74 100644 --- a/pkg/gui/presentation/containers.go +++ b/pkg/gui/presentation/containers.go @@ -24,6 +24,91 @@ func GetContainerDisplayStrings(guiConfig *config.GuiConfig, container *commands } } +// GetContainerListItemDisplayStrings returns display strings for a ContainerListItem (pod or container) +func GetContainerListItemDisplayStrings(guiConfig *config.GuiConfig, item *commands.ContainerListItem) []string { + if item.IsPod { + return GetPodDisplayStrings(guiConfig, item.Pod) + } + + // Add indentation for containers in pods + strings := GetContainerDisplayStrings(guiConfig, item.Container) + if item.Indent > 0 { + strings[2] = fmt.Sprintf("%s%s", createIndent(item.Indent), strings[2]) + } + return strings +} + +// GetPodDisplayStrings returns display strings for a pod +func GetPodDisplayStrings(guiConfig *config.GuiConfig, pod *commands.Pod) []string { + return []string{ + getPodDisplayStatus(guiConfig, pod), + "", // No substatus for pods + utils.ColoredString(pod.Name, color.FgCyan), + "", // No CPU% for pods + "", // No ports for pods + utils.ColoredString(fmt.Sprintf("(%d containers)", len(pod.Containers)), color.FgMagenta), + } +} + +func getPodDisplayStatus(guiConfig *config.GuiConfig, pod *commands.Pod) string { + shortStatusMap := map[string]string{ + "Running": "R", + "Degraded": "D", + "Exited": "X", + "Dead": "!", + "Created": "C", + } + + iconStatusMap := map[string]rune{ + "Running": '▶', + "Degraded": '◐', + "Exited": '⨯', + "Dead": '!', + "Created": '+', + } + + var podState string + switch guiConfig.ContainerStatusHealthStyle { + case "short": + if s, ok := shortStatusMap[pod.State()]; ok { + podState = s + } else { + podState = "?" + } + case "icon": + if r, ok := iconStatusMap[pod.State()]; ok { + podState = string(r) + } else { + podState = "?" + } + default: + podState = pod.State() + } + + return utils.ColoredString(podState, getPodColor(pod)) +} + +func getPodColor(pod *commands.Pod) color.Attribute { + switch pod.State() { + case "Running": + return color.FgGreen + case "Degraded": + return color.FgYellow + case "Exited": + return color.FgRed + case "Dead": + return color.FgRed + case "Created": + return color.FgCyan + default: + return color.FgWhite + } +} + +func createIndent(spaces int) string { + return fmt.Sprintf("%*s", spaces, "") +} + func displayContainerImage(container *commands.Container) string { return strings.TrimPrefix(container.Summary.Image, "sha256:") } diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go index 0c5e7561..27f8d0ac 100644 --- a/pkg/i18n/english.go +++ b/pkg/i18n/english.go @@ -109,18 +109,17 @@ type TranslationSet struct { FilterList string OpenInBrowser string SortContainersByState string - - LogsTitle string - ConfigTitle string - EnvTitle string - ComposeConfigTitle string - StatsTitle string - CreditsTitle string - ContainerConfigTitle string - ContainerEnvTitle string - NothingToDisplay string - NoContainerForService string - CannotDisplayEnvVariables string + LogsTitle string + ConfigTitle string + EnvTitle string + ComposeConfigTitle string + StatsTitle string + CreditsTitle string + ContainerConfigTitle string + ContainerEnvTitle string + NothingToDisplay string + NoContainerForService string + CannotDisplayEnvVariables string No string Yes string From 0e0a67aef9c788b2b621906e6edd1c8b3bda9e3b Mon Sep 17 00:00:00 2001 From: christophe-duc Date: Wed, 7 Jan 2026 18:21:16 -0400 Subject: [PATCH 2/3] fix: use pods bindings API and update documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address PR review feedback: - Replace CLI execution with Podman REST API bindings for ListPods - Update CLAUDE.md to document pod support architecture 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- CLAUDE.md | 7 +- go.mod | 4 +- pkg/commands/runtime_libpod.go | 4 +- pkg/commands/runtime_socket.go | 34 +- .../podman/v5/pkg/bindings/pods/pods.go | 342 ++++++++++++++++++ .../podman/v5/pkg/bindings/pods/types.go | 92 +++++ .../pkg/bindings/pods/types_create_options.go | 18 + .../pkg/bindings/pods/types_exists_options.go | 18 + .../bindings/pods/types_inspect_options.go | 18 + .../pkg/bindings/pods/types_kill_options.go | 33 ++ .../pkg/bindings/pods/types_list_options.go | 33 ++ .../pkg/bindings/pods/types_pause_options.go | 18 + .../pkg/bindings/pods/types_prune_options.go | 18 + .../pkg/bindings/pods/types_remove_options.go | 48 +++ .../bindings/pods/types_restart_options.go | 18 + .../pkg/bindings/pods/types_start_options.go | 18 + .../pkg/bindings/pods/types_stats_options.go | 33 ++ .../pkg/bindings/pods/types_stop_options.go | 33 ++ .../v5/pkg/bindings/pods/types_top_options.go | 33 ++ .../bindings/pods/types_unpause_options.go | 18 + vendor/modules.txt | 1 + 21 files changed, 810 insertions(+), 31 deletions(-) create mode 100644 vendor/github.com/containers/podman/v5/pkg/bindings/pods/pods.go create mode 100644 vendor/github.com/containers/podman/v5/pkg/bindings/pods/types.go create mode 100644 vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_create_options.go create mode 100644 vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_exists_options.go create mode 100644 vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_inspect_options.go create mode 100644 vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_kill_options.go create mode 100644 vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_list_options.go create mode 100644 vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_pause_options.go create mode 100644 vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_prune_options.go create mode 100644 vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_remove_options.go create mode 100644 vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_restart_options.go create mode 100644 vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_start_options.go create mode 100644 vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_stats_options.go create mode 100644 vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_stop_options.go create mode 100644 vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_top_options.go create mode 100644 vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_unpause_options.go diff --git a/CLAUDE.md b/CLAUDE.md index 20cde975..4b7448f1 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -55,11 +55,13 @@ pkg/ - `pkg/commands/runtime_socket.go` - Socket mode implementation using Podman REST API bindings - `pkg/commands/runtime_libpod.go` - Direct libpod implementation (Linux+CGO only) - `pkg/commands/runtime_libpod_stub.go` - Stub for non-Linux platforms -- `pkg/commands/runtime_types.go` - Custom types (ContainerSummary, ImageSummary, etc.) +- `pkg/commands/runtime_types.go` - Custom types (ContainerSummary, ImageSummary, PodSummary, etc.) **Podman integration:** - `pkg/commands/podman.go` - Main client connection, auto-detection, and initialization - `pkg/commands/container.go` - Container wrapper operations +- `pkg/commands/pod.go` - Pod wrapper with state and container count methods +- `pkg/commands/container_list_item.go` - Unified wrapper for pods/containers in list view - `pkg/commands/image.go` - Image wrapper operations - `pkg/commands/volume.go` - Volume wrapper operations - `pkg/commands/network.go` - Network wrapper operations @@ -102,6 +104,9 @@ ListContainers() / InspectContainer() / ContainerStats() StartContainer() / StopContainer() / PauseContainer() / UnpauseContainer() RestartContainer() / RemoveContainer() / PruneContainers() / ContainerTop() +// Pod operations +ListPods() - Returns all pods with their metadata + // Image operations ListImages() / InspectImage() / ImageHistory() / RemoveImage() / PruneImages() diff --git a/go.mod b/go.mod index b43cccdd..bd49e848 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,6 @@ require ( github.com/boz/go-throttle v0.0.0-20160922054636-fdc4eab740c1 github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21 github.com/containers/podman/v5 v5.7.1 - github.com/docker/docker v28.5.1+incompatible github.com/fatih/color v1.15.0 github.com/go-errors/errors v1.5.1 github.com/gookit/color v1.5.0 @@ -27,6 +26,7 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad github.com/stretchr/testify v1.11.1 + go.podman.io/common v0.66.1 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 ) @@ -63,6 +63,7 @@ require ( github.com/disiqueira/gotree/v3 v3.0.2 // indirect github.com/distribution/reference v0.6.0 // indirect github.com/docker/distribution v2.8.3+incompatible // indirect + github.com/docker/docker v28.5.1+incompatible // indirect github.com/docker/docker-credential-helpers v0.9.4 // indirect github.com/docker/go-connections v0.6.0 // indirect github.com/docker/go-plugins-helpers v0.0.0-20240701071450-45e2431495c8 // indirect @@ -155,7 +156,6 @@ require ( go.opentelemetry.io/otel v1.36.0 // indirect go.opentelemetry.io/otel/metric v1.36.0 // indirect go.opentelemetry.io/otel/trace v1.36.0 // indirect - go.podman.io/common v0.66.1 // indirect go.podman.io/image/v5 v5.38.0 // indirect go.podman.io/storage v1.61.0 // indirect go.yaml.in/yaml/v2 v2.4.2 // indirect diff --git a/pkg/commands/runtime_libpod.go b/pkg/commands/runtime_libpod.go index 7d9b8862..b09e1d4b 100644 --- a/pkg/commands/runtime_libpod.go +++ b/pkg/commands/runtime_libpod.go @@ -323,9 +323,9 @@ func (r *LibpodRuntime) ListPods(ctx context.Context) ([]PodSummary, error) { if err != nil { status = "unknown" } - config := pod.Config() + config, configErr := pod.Config() infraID := "" - if config != nil { + if configErr == nil && config != nil { infraID = config.InfraContainerID } result[i] = PodSummary{ diff --git a/pkg/commands/runtime_socket.go b/pkg/commands/runtime_socket.go index 6e87f1e6..dc01d1be 100644 --- a/pkg/commands/runtime_socket.go +++ b/pkg/commands/runtime_socket.go @@ -3,7 +3,6 @@ package commands import ( "context" "encoding/json" - "os/exec" "strings" "time" @@ -12,6 +11,7 @@ import ( "github.com/containers/podman/v5/pkg/bindings/containers" "github.com/containers/podman/v5/pkg/bindings/images" "github.com/containers/podman/v5/pkg/bindings/network" + "github.com/containers/podman/v5/pkg/bindings/pods" "github.com/containers/podman/v5/pkg/bindings/system" "github.com/containers/podman/v5/pkg/bindings/volumes" "github.com/containers/podman/v5/pkg/domain/entities" @@ -276,39 +276,21 @@ func (r *SocketRuntime) PruneNetworks(ctx context.Context) error { return err } -// podPsJSON represents the JSON output of `podman pod ps --format json` -type podPsJSON struct { - ID string `json:"Id"` - Name string `json:"Name"` - Status string `json:"Status"` - Created string `json:"Created"` - InfraID string `json:"InfraId"` - Labels map[string]string `json:"Labels"` -} - -// ListPods returns all pods. +// ListPods returns all pods using the pods bindings API. func (r *SocketRuntime) ListPods(ctx context.Context) ([]PodSummary, error) { - // Use podman CLI since there's no pods binding package - cmd := exec.CommandContext(ctx, "podman", "pod", "ps", "--format", "json") - output, err := cmd.Output() + podList, err := pods.List(r.conn, nil) if err != nil { return nil, err } - var pods []podPsJSON - if err := json.Unmarshal(output, &pods); err != nil { - return nil, err - } - - result := make([]PodSummary, len(pods)) - for i, p := range pods { - created, _ := time.Parse(time.RFC3339, p.Created) + result := make([]PodSummary, len(podList)) + for i, p := range podList { result[i] = PodSummary{ - ID: p.ID, + ID: p.Id, Name: p.Name, Status: p.Status, - Created: created, - InfraID: p.InfraID, + Created: p.Created, + InfraID: p.InfraId, Labels: p.Labels, } } diff --git a/vendor/github.com/containers/podman/v5/pkg/bindings/pods/pods.go b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/pods.go new file mode 100644 index 00000000..200d579b --- /dev/null +++ b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/pods.go @@ -0,0 +1,342 @@ +package pods + +import ( + "context" + "net/http" + "net/url" + "strings" + + "github.com/containers/podman/v5/pkg/api/handlers" + "github.com/containers/podman/v5/pkg/bindings" + entitiesTypes "github.com/containers/podman/v5/pkg/domain/entities/types" + "github.com/containers/podman/v5/pkg/errorhandling" + jsoniter "github.com/json-iterator/go" +) + +func CreatePodFromSpec(ctx context.Context, spec *entitiesTypes.PodSpec) (*entitiesTypes.PodCreateReport, error) { + var pcr entitiesTypes.PodCreateReport + if spec == nil { + spec = new(entitiesTypes.PodSpec) + } + conn, err := bindings.GetClient(ctx) + if err != nil { + return nil, err + } + specString, err := jsoniter.MarshalToString(spec.PodSpecGen) + if err != nil { + return nil, err + } + stringReader := strings.NewReader(specString) + response, err := conn.DoRequest(ctx, stringReader, http.MethodPost, "/pods/create", nil, nil) + if err != nil { + return nil, err + } + defer response.Body.Close() + + return &pcr, response.Process(&pcr) +} + +// Exists is a lightweight method to determine if a pod exists in local storage +func Exists(ctx context.Context, nameOrID string, _ *ExistsOptions) (bool, error) { + conn, err := bindings.GetClient(ctx) + if err != nil { + return false, err + } + response, err := conn.DoRequest(ctx, nil, http.MethodGet, "/pods/%s/exists", nil, nil, nameOrID) + if err != nil { + return false, err + } + defer response.Body.Close() + + return response.IsSuccess(), nil +} + +// Inspect returns low-level information about the given pod. +func Inspect(ctx context.Context, nameOrID string, options *InspectOptions) (*entitiesTypes.PodInspectReport, error) { + var report entitiesTypes.PodInspectReport + if options == nil { + options = new(InspectOptions) + } + _ = options + conn, err := bindings.GetClient(ctx) + if err != nil { + return nil, err + } + response, err := conn.DoRequest(ctx, nil, http.MethodGet, "/pods/%s/json", nil, nil, nameOrID) + if err != nil { + return nil, err + } + defer response.Body.Close() + + return &report, response.Process(&report) +} + +// Kill sends a SIGTERM to all the containers in a pod. The optional signal parameter +// can be used to override SIGTERM. +func Kill(ctx context.Context, nameOrID string, options *KillOptions) (*entitiesTypes.PodKillReport, error) { + var report entitiesTypes.PodKillReport + if options == nil { + options = new(KillOptions) + } + conn, err := bindings.GetClient(ctx) + if err != nil { + return nil, err + } + params, err := options.ToParams() + if err != nil { + return nil, err + } + response, err := conn.DoRequest(ctx, nil, http.MethodPost, "/pods/%s/kill", params, nil, nameOrID) + if err != nil { + return nil, err + } + defer response.Body.Close() + + return &report, response.ProcessWithError(&report, &errorhandling.PodConflictErrorModel{}) +} + +// Pause pauses all running containers in a given pod. +func Pause(ctx context.Context, nameOrID string, options *PauseOptions) (*entitiesTypes.PodPauseReport, error) { + var report entitiesTypes.PodPauseReport + if options == nil { + options = new(PauseOptions) + } + _ = options + conn, err := bindings.GetClient(ctx) + if err != nil { + return nil, err + } + response, err := conn.DoRequest(ctx, nil, http.MethodPost, "/pods/%s/pause", nil, nil, nameOrID) + if err != nil { + return nil, err + } + defer response.Body.Close() + + return &report, response.ProcessWithError(&report, &errorhandling.PodConflictErrorModel{}) +} + +// Prune by default removes all non-running pods in local storage. +// And with force set true removes all pods. +func Prune(ctx context.Context, options *PruneOptions) ([]*entitiesTypes.PodPruneReport, error) { + var reports []*entitiesTypes.PodPruneReport + if options == nil { + options = new(PruneOptions) + } + _ = options + conn, err := bindings.GetClient(ctx) + if err != nil { + return nil, err + } + response, err := conn.DoRequest(ctx, nil, http.MethodPost, "/pods/prune", nil, nil) + if err != nil { + return nil, err + } + defer response.Body.Close() + + return reports, response.Process(&reports) +} + +// List returns all pods in local storage. The optional filters parameter can +// be used to refine which pods should be listed. +func List(ctx context.Context, options *ListOptions) ([]*entitiesTypes.ListPodsReport, error) { + var podsReports []*entitiesTypes.ListPodsReport + if options == nil { + options = new(ListOptions) + } + conn, err := bindings.GetClient(ctx) + if err != nil { + return nil, err + } + params, err := options.ToParams() + if err != nil { + return nil, err + } + response, err := conn.DoRequest(ctx, nil, http.MethodGet, "/pods/json", params, nil) + if err != nil { + return podsReports, err + } + defer response.Body.Close() + + return podsReports, response.Process(&podsReports) +} + +// Restart restarts all containers in a pod. +func Restart(ctx context.Context, nameOrID string, options *RestartOptions) (*entitiesTypes.PodRestartReport, error) { + var report entitiesTypes.PodRestartReport + if options == nil { + options = new(RestartOptions) + } + _ = options + conn, err := bindings.GetClient(ctx) + if err != nil { + return nil, err + } + response, err := conn.DoRequest(ctx, nil, http.MethodPost, "/pods/%s/restart", nil, nil, nameOrID) + if err != nil { + return nil, err + } + defer response.Body.Close() + + return &report, response.ProcessWithError(&report, &errorhandling.PodConflictErrorModel{}) +} + +// Remove deletes a Pod from local storage. The optional force parameter denotes +// that the Pod can be removed even if in a running state. +func Remove(ctx context.Context, nameOrID string, options *RemoveOptions) (*entitiesTypes.PodRmReport, error) { + var report entitiesTypes.PodRmReport + if options == nil { + options = new(RemoveOptions) + } + conn, err := bindings.GetClient(ctx) + if err != nil { + return nil, err + } + params, err := options.ToParams() + if err != nil { + return nil, err + } + response, err := conn.DoRequest(ctx, nil, http.MethodDelete, "/pods/%s", params, nil, nameOrID) + if err != nil { + return nil, err + } + defer response.Body.Close() + + return &report, response.Process(&report) +} + +// Start starts all containers in a pod. +func Start(ctx context.Context, nameOrID string, options *StartOptions) (*entitiesTypes.PodStartReport, error) { + var report entitiesTypes.PodStartReport + if options == nil { + options = new(StartOptions) + } + _ = options + conn, err := bindings.GetClient(ctx) + if err != nil { + return nil, err + } + response, err := conn.DoRequest(ctx, nil, http.MethodPost, "/pods/%s/start", nil, nil, nameOrID) + if err != nil { + return nil, err + } + defer response.Body.Close() + + if response.StatusCode == http.StatusNotModified { + report.Id = nameOrID + report.RawInput = nameOrID + return &report, nil + } + + return &report, response.ProcessWithError(&report, &errorhandling.PodConflictErrorModel{}) +} + +// Stop stops all containers in a Pod. The optional timeout parameter can be +// used to override the timeout before the container is killed. +func Stop(ctx context.Context, nameOrID string, options *StopOptions) (*entitiesTypes.PodStopReport, error) { + var report entitiesTypes.PodStopReport + if options == nil { + options = new(StopOptions) + } + conn, err := bindings.GetClient(ctx) + if err != nil { + return nil, err + } + params, err := options.ToParams() + if err != nil { + return nil, err + } + response, err := conn.DoRequest(ctx, nil, http.MethodPost, "/pods/%s/stop", params, nil, nameOrID) + if err != nil { + return nil, err + } + defer response.Body.Close() + + if response.StatusCode == http.StatusNotModified { + report.Id = nameOrID + return &report, nil + } + return &report, response.ProcessWithError(&report, &errorhandling.PodConflictErrorModel{}) +} + +// Top gathers statistics about the running processes in a pod. The nameOrID can be a pod name +// or a partial/full ID. The descriptors allow for specifying which data to collect from each process. +func Top(ctx context.Context, nameOrID string, options *TopOptions) ([]string, error) { + if options == nil { + options = new(TopOptions) + } + conn, err := bindings.GetClient(ctx) + if err != nil { + return nil, err + } + params := url.Values{} + if descriptors := options.GetDescriptors(); len(descriptors) > 0 { + params.Set("ps_args", strings.Join(descriptors, ",")) + } + response, err := conn.DoRequest(ctx, nil, http.MethodGet, "/pods/%s/top", params, nil, nameOrID) + if err != nil { + return nil, err + } + defer response.Body.Close() + + body := handlers.PodTopOKBody{} + if err = response.Process(&body); err != nil { + return nil, err + } + + // handlers.PodTopOKBody{} returns a slice of slices where each cell in the top table is an item. + // In libpod land, we're just using a slice with cells being split by tabs, which allows for an idiomatic + // usage of the tabwriter. + topOutput := []string{strings.Join(body.Titles, "\t")} + for _, out := range body.Processes { + topOutput = append(topOutput, strings.Join(out, "\t")) + } + + return topOutput, err +} + +// Unpause unpauses all paused containers in a Pod. +func Unpause(ctx context.Context, nameOrID string, options *UnpauseOptions) (*entitiesTypes.PodUnpauseReport, error) { + if options == nil { + options = new(UnpauseOptions) + } + _ = options + var report entitiesTypes.PodUnpauseReport + conn, err := bindings.GetClient(ctx) + if err != nil { + return nil, err + } + response, err := conn.DoRequest(ctx, nil, http.MethodPost, "/pods/%s/unpause", nil, nil, nameOrID) + if err != nil { + return nil, err + } + defer response.Body.Close() + + return &report, response.ProcessWithError(&report, &errorhandling.PodConflictErrorModel{}) +} + +// Stats display resource-usage statistics of one or more pods. +func Stats(ctx context.Context, namesOrIDs []string, options *StatsOptions) ([]*entitiesTypes.PodStatsReport, error) { + if options == nil { + options = new(StatsOptions) + } + conn, err := bindings.GetClient(ctx) + if err != nil { + return nil, err + } + params, err := options.ToParams() + if err != nil { + return nil, err + } + for _, i := range namesOrIDs { + params.Add("namesOrIDs", i) + } + + var reports []*entitiesTypes.PodStatsReport + response, err := conn.DoRequest(ctx, nil, http.MethodGet, "/pods/stats", params, nil) + if err != nil { + return nil, err + } + defer response.Body.Close() + + return reports, response.Process(&reports) +} diff --git a/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types.go b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types.go new file mode 100644 index 00000000..904815db --- /dev/null +++ b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types.go @@ -0,0 +1,92 @@ +package pods + +// CreateOptions are optional options for creating pods +// +//go:generate go run ../generator/generator.go CreateOptions +type CreateOptions struct { +} + +// InspectOptions are optional options for inspecting pods +// +//go:generate go run ../generator/generator.go InspectOptions +type InspectOptions struct { +} + +// KillOptions are optional options for killing pods +// +//go:generate go run ../generator/generator.go KillOptions +type KillOptions struct { + Signal *string +} + +// PauseOptions are optional options for pausing pods +// +//go:generate go run ../generator/generator.go PauseOptions +type PauseOptions struct { +} + +// PruneOptions are optional options for pruning pods +// +//go:generate go run ../generator/generator.go PruneOptions +type PruneOptions struct { +} + +// ListOptions are optional options for listing pods +// +//go:generate go run ../generator/generator.go ListOptions +type ListOptions struct { + Filters map[string][]string +} + +// RestartOptions are optional options for restarting pods +// +//go:generate go run ../generator/generator.go RestartOptions +type RestartOptions struct { +} + +// StartOptions are optional options for starting pods +// +//go:generate go run ../generator/generator.go StartOptions +type StartOptions struct { +} + +// StopOptions are optional options for stopping pods +// +//go:generate go run ../generator/generator.go StopOptions +type StopOptions struct { + Timeout *int +} + +// TopOptions are optional options for getting top on pods +// +//go:generate go run ../generator/generator.go TopOptions +type TopOptions struct { + Descriptors []string +} + +// UnpauseOptions are optional options for unpausinging pods +// +//go:generate go run ../generator/generator.go UnpauseOptions +type UnpauseOptions struct { +} + +// StatsOptions are optional options for getting stats of pods +// +//go:generate go run ../generator/generator.go StatsOptions +type StatsOptions struct { + All *bool +} + +// RemoveOptions are optional options for removing pods +// +//go:generate go run ../generator/generator.go RemoveOptions +type RemoveOptions struct { + Force *bool + Timeout *uint +} + +// ExistsOptions are optional options for checking if a pod exists +// +//go:generate go run ../generator/generator.go ExistsOptions +type ExistsOptions struct { +} diff --git a/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_create_options.go b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_create_options.go new file mode 100644 index 00000000..b9ae5122 --- /dev/null +++ b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_create_options.go @@ -0,0 +1,18 @@ +// Code generated by go generate; DO NOT EDIT. +package pods + +import ( + "net/url" + + "github.com/containers/podman/v5/pkg/bindings/internal/util" +) + +// Changed returns true if named field has been set +func (o *CreateOptions) Changed(fieldName string) bool { + return util.Changed(o, fieldName) +} + +// ToParams formats struct fields to be passed to API service +func (o *CreateOptions) ToParams() (url.Values, error) { + return util.ToParams(o) +} diff --git a/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_exists_options.go b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_exists_options.go new file mode 100644 index 00000000..3dd4f0a0 --- /dev/null +++ b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_exists_options.go @@ -0,0 +1,18 @@ +// Code generated by go generate; DO NOT EDIT. +package pods + +import ( + "net/url" + + "github.com/containers/podman/v5/pkg/bindings/internal/util" +) + +// Changed returns true if named field has been set +func (o *ExistsOptions) Changed(fieldName string) bool { + return util.Changed(o, fieldName) +} + +// ToParams formats struct fields to be passed to API service +func (o *ExistsOptions) ToParams() (url.Values, error) { + return util.ToParams(o) +} diff --git a/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_inspect_options.go b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_inspect_options.go new file mode 100644 index 00000000..75c501a5 --- /dev/null +++ b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_inspect_options.go @@ -0,0 +1,18 @@ +// Code generated by go generate; DO NOT EDIT. +package pods + +import ( + "net/url" + + "github.com/containers/podman/v5/pkg/bindings/internal/util" +) + +// Changed returns true if named field has been set +func (o *InspectOptions) Changed(fieldName string) bool { + return util.Changed(o, fieldName) +} + +// ToParams formats struct fields to be passed to API service +func (o *InspectOptions) ToParams() (url.Values, error) { + return util.ToParams(o) +} diff --git a/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_kill_options.go b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_kill_options.go new file mode 100644 index 00000000..489800c6 --- /dev/null +++ b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_kill_options.go @@ -0,0 +1,33 @@ +// Code generated by go generate; DO NOT EDIT. +package pods + +import ( + "net/url" + + "github.com/containers/podman/v5/pkg/bindings/internal/util" +) + +// Changed returns true if named field has been set +func (o *KillOptions) Changed(fieldName string) bool { + return util.Changed(o, fieldName) +} + +// ToParams formats struct fields to be passed to API service +func (o *KillOptions) ToParams() (url.Values, error) { + return util.ToParams(o) +} + +// WithSignal set field Signal to given value +func (o *KillOptions) WithSignal(value string) *KillOptions { + o.Signal = &value + return o +} + +// GetSignal returns value of field Signal +func (o *KillOptions) GetSignal() string { + if o.Signal == nil { + var z string + return z + } + return *o.Signal +} diff --git a/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_list_options.go b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_list_options.go new file mode 100644 index 00000000..038b753b --- /dev/null +++ b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_list_options.go @@ -0,0 +1,33 @@ +// Code generated by go generate; DO NOT EDIT. +package pods + +import ( + "net/url" + + "github.com/containers/podman/v5/pkg/bindings/internal/util" +) + +// Changed returns true if named field has been set +func (o *ListOptions) Changed(fieldName string) bool { + return util.Changed(o, fieldName) +} + +// ToParams formats struct fields to be passed to API service +func (o *ListOptions) ToParams() (url.Values, error) { + return util.ToParams(o) +} + +// WithFilters set field Filters to given value +func (o *ListOptions) WithFilters(value map[string][]string) *ListOptions { + o.Filters = value + return o +} + +// GetFilters returns value of field Filters +func (o *ListOptions) GetFilters() map[string][]string { + if o.Filters == nil { + var z map[string][]string + return z + } + return o.Filters +} diff --git a/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_pause_options.go b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_pause_options.go new file mode 100644 index 00000000..0bee2b0f --- /dev/null +++ b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_pause_options.go @@ -0,0 +1,18 @@ +// Code generated by go generate; DO NOT EDIT. +package pods + +import ( + "net/url" + + "github.com/containers/podman/v5/pkg/bindings/internal/util" +) + +// Changed returns true if named field has been set +func (o *PauseOptions) Changed(fieldName string) bool { + return util.Changed(o, fieldName) +} + +// ToParams formats struct fields to be passed to API service +func (o *PauseOptions) ToParams() (url.Values, error) { + return util.ToParams(o) +} diff --git a/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_prune_options.go b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_prune_options.go new file mode 100644 index 00000000..dac0417f --- /dev/null +++ b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_prune_options.go @@ -0,0 +1,18 @@ +// Code generated by go generate; DO NOT EDIT. +package pods + +import ( + "net/url" + + "github.com/containers/podman/v5/pkg/bindings/internal/util" +) + +// Changed returns true if named field has been set +func (o *PruneOptions) Changed(fieldName string) bool { + return util.Changed(o, fieldName) +} + +// ToParams formats struct fields to be passed to API service +func (o *PruneOptions) ToParams() (url.Values, error) { + return util.ToParams(o) +} diff --git a/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_remove_options.go b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_remove_options.go new file mode 100644 index 00000000..a0bbd57d --- /dev/null +++ b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_remove_options.go @@ -0,0 +1,48 @@ +// Code generated by go generate; DO NOT EDIT. +package pods + +import ( + "net/url" + + "github.com/containers/podman/v5/pkg/bindings/internal/util" +) + +// Changed returns true if named field has been set +func (o *RemoveOptions) Changed(fieldName string) bool { + return util.Changed(o, fieldName) +} + +// ToParams formats struct fields to be passed to API service +func (o *RemoveOptions) ToParams() (url.Values, error) { + return util.ToParams(o) +} + +// WithForce set field Force to given value +func (o *RemoveOptions) WithForce(value bool) *RemoveOptions { + o.Force = &value + return o +} + +// GetForce returns value of field Force +func (o *RemoveOptions) GetForce() bool { + if o.Force == nil { + var z bool + return z + } + return *o.Force +} + +// WithTimeout set field Timeout to given value +func (o *RemoveOptions) WithTimeout(value uint) *RemoveOptions { + o.Timeout = &value + return o +} + +// GetTimeout returns value of field Timeout +func (o *RemoveOptions) GetTimeout() uint { + if o.Timeout == nil { + var z uint + return z + } + return *o.Timeout +} diff --git a/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_restart_options.go b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_restart_options.go new file mode 100644 index 00000000..957bab98 --- /dev/null +++ b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_restart_options.go @@ -0,0 +1,18 @@ +// Code generated by go generate; DO NOT EDIT. +package pods + +import ( + "net/url" + + "github.com/containers/podman/v5/pkg/bindings/internal/util" +) + +// Changed returns true if named field has been set +func (o *RestartOptions) Changed(fieldName string) bool { + return util.Changed(o, fieldName) +} + +// ToParams formats struct fields to be passed to API service +func (o *RestartOptions) ToParams() (url.Values, error) { + return util.ToParams(o) +} diff --git a/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_start_options.go b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_start_options.go new file mode 100644 index 00000000..ec971037 --- /dev/null +++ b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_start_options.go @@ -0,0 +1,18 @@ +// Code generated by go generate; DO NOT EDIT. +package pods + +import ( + "net/url" + + "github.com/containers/podman/v5/pkg/bindings/internal/util" +) + +// Changed returns true if named field has been set +func (o *StartOptions) Changed(fieldName string) bool { + return util.Changed(o, fieldName) +} + +// ToParams formats struct fields to be passed to API service +func (o *StartOptions) ToParams() (url.Values, error) { + return util.ToParams(o) +} diff --git a/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_stats_options.go b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_stats_options.go new file mode 100644 index 00000000..f3e662b1 --- /dev/null +++ b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_stats_options.go @@ -0,0 +1,33 @@ +// Code generated by go generate; DO NOT EDIT. +package pods + +import ( + "net/url" + + "github.com/containers/podman/v5/pkg/bindings/internal/util" +) + +// Changed returns true if named field has been set +func (o *StatsOptions) Changed(fieldName string) bool { + return util.Changed(o, fieldName) +} + +// ToParams formats struct fields to be passed to API service +func (o *StatsOptions) ToParams() (url.Values, error) { + return util.ToParams(o) +} + +// WithAll set field All to given value +func (o *StatsOptions) WithAll(value bool) *StatsOptions { + o.All = &value + return o +} + +// GetAll returns value of field All +func (o *StatsOptions) GetAll() bool { + if o.All == nil { + var z bool + return z + } + return *o.All +} diff --git a/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_stop_options.go b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_stop_options.go new file mode 100644 index 00000000..e635780a --- /dev/null +++ b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_stop_options.go @@ -0,0 +1,33 @@ +// Code generated by go generate; DO NOT EDIT. +package pods + +import ( + "net/url" + + "github.com/containers/podman/v5/pkg/bindings/internal/util" +) + +// Changed returns true if named field has been set +func (o *StopOptions) Changed(fieldName string) bool { + return util.Changed(o, fieldName) +} + +// ToParams formats struct fields to be passed to API service +func (o *StopOptions) ToParams() (url.Values, error) { + return util.ToParams(o) +} + +// WithTimeout set field Timeout to given value +func (o *StopOptions) WithTimeout(value int) *StopOptions { + o.Timeout = &value + return o +} + +// GetTimeout returns value of field Timeout +func (o *StopOptions) GetTimeout() int { + if o.Timeout == nil { + var z int + return z + } + return *o.Timeout +} diff --git a/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_top_options.go b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_top_options.go new file mode 100644 index 00000000..c8e415ec --- /dev/null +++ b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_top_options.go @@ -0,0 +1,33 @@ +// Code generated by go generate; DO NOT EDIT. +package pods + +import ( + "net/url" + + "github.com/containers/podman/v5/pkg/bindings/internal/util" +) + +// Changed returns true if named field has been set +func (o *TopOptions) Changed(fieldName string) bool { + return util.Changed(o, fieldName) +} + +// ToParams formats struct fields to be passed to API service +func (o *TopOptions) ToParams() (url.Values, error) { + return util.ToParams(o) +} + +// WithDescriptors set field Descriptors to given value +func (o *TopOptions) WithDescriptors(value []string) *TopOptions { + o.Descriptors = value + return o +} + +// GetDescriptors returns value of field Descriptors +func (o *TopOptions) GetDescriptors() []string { + if o.Descriptors == nil { + var z []string + return z + } + return o.Descriptors +} diff --git a/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_unpause_options.go b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_unpause_options.go new file mode 100644 index 00000000..01f316d0 --- /dev/null +++ b/vendor/github.com/containers/podman/v5/pkg/bindings/pods/types_unpause_options.go @@ -0,0 +1,18 @@ +// Code generated by go generate; DO NOT EDIT. +package pods + +import ( + "net/url" + + "github.com/containers/podman/v5/pkg/bindings/internal/util" +) + +// Changed returns true if named field has been set +func (o *UnpauseOptions) Changed(fieldName string) bool { + return util.Changed(o, fieldName) +} + +// ToParams formats struct fields to be passed to API service +func (o *UnpauseOptions) ToParams() (url.Values, error) { + return util.ToParams(o) +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 98649be9..d3d3cd57 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -165,6 +165,7 @@ github.com/containers/podman/v5/pkg/bindings/containers github.com/containers/podman/v5/pkg/bindings/images github.com/containers/podman/v5/pkg/bindings/internal/util github.com/containers/podman/v5/pkg/bindings/network +github.com/containers/podman/v5/pkg/bindings/pods github.com/containers/podman/v5/pkg/bindings/system github.com/containers/podman/v5/pkg/bindings/volumes github.com/containers/podman/v5/pkg/checkpoint/crutils From 1518ae2d362d72ac740fa07ea5eecae426cbbedb Mon Sep 17 00:00:00 2001 From: christophe-duc Date: Wed, 7 Jan 2026 18:26:39 -0400 Subject: [PATCH 3/3] fix: address Copilot PR review comments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add nil checks to ContainerListItem methods to prevent panics - Add nil checks in presentation/containers.go for pod and container - Sort pods by name for deterministic ordering in the UI - Make pod operation error messages consistent ("X not yet supported for pods") - Remove --color flag from pod logs for consistency with container logs 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- pkg/commands/container_list_item.go | 42 ++++++++++++++++++++--------- pkg/commands/podman.go | 13 ++++++++- pkg/gui/container_logs.go | 3 ++- pkg/gui/containers_panel.go | 16 +++++------ pkg/gui/presentation/containers.go | 7 ++++- 5 files changed, 58 insertions(+), 23 deletions(-) diff --git a/pkg/commands/container_list_item.go b/pkg/commands/container_list_item.go index 296b7b8e..54786bee 100644 --- a/pkg/commands/container_list_item.go +++ b/pkg/commands/container_list_item.go @@ -11,31 +11,40 @@ type ContainerListItem struct { // ID returns the unique ID for the item. func (c *ContainerListItem) ID() string { - if c.IsPod { + if c.IsPod && c.Pod != nil { return c.Pod.ID } - return c.Container.ID + if c.Container != nil { + return c.Container.ID + } + return "" } // Name returns the display name for the item. func (c *ContainerListItem) Name() string { - if c.IsPod { + if c.IsPod && c.Pod != nil { return c.Pod.Name } - return c.Container.Name + if c.Container != nil { + return c.Container.Name + } + return "" } // State returns the state for the item. func (c *ContainerListItem) State() string { - if c.IsPod { + if c.IsPod && c.Pod != nil { return c.Pod.State() } - return c.Container.Summary.State + if c.Container != nil { + return c.Container.Summary.State + } + return "" } // GetContainers returns the containers if this is a pod, nil otherwise. func (c *ContainerListItem) GetContainers() []*Container { - if c.IsPod { + if c.IsPod && c.Pod != nil { return c.Pod.Containers } return nil @@ -46,21 +55,30 @@ func (c *ContainerListItem) IsInPod() bool { if c.IsPod { return false } - return c.Container.Summary.Pod != "" + if c.Container != nil { + return c.Container.Summary.Pod != "" + } + return false } // PodID returns the pod ID if this container is in a pod, empty string otherwise. func (c *ContainerListItem) PodID() string { - if c.IsPod { + if c.IsPod && c.Pod != nil { return c.Pod.ID } - return c.Container.Summary.Pod + if c.Container != nil { + return c.Container.Summary.Pod + } + return "" } // PodName returns the pod name if this container is in a pod, empty string otherwise. func (c *ContainerListItem) PodName() string { - if c.IsPod { + if c.IsPod && c.Pod != nil { return c.Pod.Name } - return c.Container.Summary.PodName + if c.Container != nil { + return c.Container.Summary.PodName + } + return "" } diff --git a/pkg/commands/podman.go b/pkg/commands/podman.go index 9ccf6055..6a607fa3 100644 --- a/pkg/commands/podman.go +++ b/pkg/commands/podman.go @@ -7,6 +7,7 @@ import ( ogLog "log" "os" "os/exec" + "sort" "strings" "sync" "time" @@ -426,8 +427,18 @@ func (c *PodmanCommand) buildContainerListItems(containers []*Container, podSumm } } + // Sort pod IDs for deterministic ordering + podIDs := make([]string, 0, len(podMap)) + for podID := range podMap { + podIDs = append(podIDs, podID) + } + sort.Slice(podIDs, func(i, j int) bool { + return podMap[podIDs[i]].Name < podMap[podIDs[j]].Name + }) + // Add pods and their containers - for podID, ps := range podMap { + for _, podID := range podIDs { + ps := podMap[podID] // Create pod object pod := &Pod{ ID: ps.ID, diff --git a/pkg/gui/container_logs.go b/pkg/gui/container_logs.go index 931f72f1..9115d436 100644 --- a/pkg/gui/container_logs.go +++ b/pkg/gui/container_logs.go @@ -175,7 +175,8 @@ func (gui *Gui) renderPodLogsToMainAux(pod *commands.Pod, ctx context.Context, n func (gui *Gui) writePodLogs(pod *commands.Pod, ctx context.Context, writer io.Writer) error { // Build podman pod logs command - args := []string{"pod", "logs", "--follow", "--color"} + // Note: --color is used to distinguish output from different containers in the pod + args := []string{"pod", "logs", "--follow"} if gui.Config.UserConfig.Logs.Timestamps { args = append(args, "--timestamps") diff --git a/pkg/gui/containers_panel.go b/pkg/gui/containers_panel.go index be0e0795..9a42fc82 100644 --- a/pkg/gui/containers_panel.go +++ b/pkg/gui/containers_panel.go @@ -441,7 +441,7 @@ func (gui *Gui) handleContainersRemoveMenu(g *gocui.Gui, v *gocui.View) error { } if item.IsPod { - return gui.createErrorPanel("Pod operations not yet supported") + return gui.createErrorPanel("Remove not yet supported for pods") } ctr := item.Container @@ -501,7 +501,7 @@ func (gui *Gui) handleContainerPause(g *gocui.Gui, v *gocui.View) error { } if item.IsPod { - return gui.createErrorPanel("Pod operations not yet supported") + return gui.createErrorPanel("Pause not yet supported for pods") } return gui.PauseContainer(item.Container) @@ -514,7 +514,7 @@ func (gui *Gui) handleContainerStop(g *gocui.Gui, v *gocui.View) error { } if item.IsPod { - return gui.createErrorPanel("Pod operations not yet supported") + return gui.createErrorPanel("Stop not yet supported for pods") } ctr := item.Container @@ -536,7 +536,7 @@ func (gui *Gui) handleContainerRestart(g *gocui.Gui, v *gocui.View) error { } if item.IsPod { - return gui.createErrorPanel("Pod operations not yet supported") + return gui.createErrorPanel("Restart not yet supported for pods") } ctr := item.Container @@ -556,7 +556,7 @@ func (gui *Gui) handleContainerAttach(g *gocui.Gui, v *gocui.View) error { } if item.IsPod { - return gui.createErrorPanel("Pod operations not yet supported") + return gui.createErrorPanel("Attach not yet supported for pods") } ctr := item.Container @@ -588,7 +588,7 @@ func (gui *Gui) handleContainerViewLogs(g *gocui.Gui, v *gocui.View) error { if item.IsPod { // TODO: implement pod logs to stdout - return gui.createErrorPanel("Pod logs to stdout not yet supported") + return gui.createErrorPanel("View logs (stdout) not yet supported for pods") } gui.renderLogsToStdout(item.Container) @@ -603,7 +603,7 @@ func (gui *Gui) handleContainersExecShell(g *gocui.Gui, v *gocui.View) error { } if item.IsPod { - return gui.createErrorPanel("Cannot exec into a pod. Select a container instead.") + return gui.createErrorPanel("Exec shell not yet supported for pods. Select a container instead.") } return gui.containerExecShell(item.Container) @@ -628,7 +628,7 @@ func (gui *Gui) handleContainersCustomCommand(g *gocui.Gui, v *gocui.View) error } if item.IsPod { - return gui.createErrorPanel("Custom commands not yet supported for pods") + return gui.createErrorPanel("Custom commands not yet supported for pods. Select a container instead.") } commandObject := gui.PodmanCommand.NewCommandObject(commands.CommandObject{ diff --git a/pkg/gui/presentation/containers.go b/pkg/gui/presentation/containers.go index fe7a5a74..2d74ccdc 100644 --- a/pkg/gui/presentation/containers.go +++ b/pkg/gui/presentation/containers.go @@ -26,10 +26,15 @@ func GetContainerDisplayStrings(guiConfig *config.GuiConfig, container *commands // GetContainerListItemDisplayStrings returns display strings for a ContainerListItem (pod or container) func GetContainerListItemDisplayStrings(guiConfig *config.GuiConfig, item *commands.ContainerListItem) []string { - if item.IsPod { + if item.IsPod && item.Pod != nil { return GetPodDisplayStrings(guiConfig, item.Pod) } + if item.Container == nil { + // Return an empty row with the expected number of columns when container data is missing. + return []string{"", "", "", "", "", ""} + } + // Add indentation for containers in pods strings := GetContainerDisplayStrings(guiConfig, item.Container) if item.Indent > 0 {