Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package qubesome for openSUSE:Factory checked in at 2025-10-06 18:07:48 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/qubesome (Old) and /work/SRC/openSUSE:Factory/.qubesome.new.11973 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "qubesome" Mon Oct 6 18:07:48 2025 rev:9 rq:1309121 version:0.0.13 Changes: -------- --- /work/SRC/openSUSE:Factory/qubesome/qubesome.changes 2025-09-09 20:30:34.442058065 +0200 +++ /work/SRC/openSUSE:Factory/.qubesome.new.11973/qubesome.changes 2025-10-06 18:08:00.078951635 +0200 @@ -1,0 +2,19 @@ +Sun Oct 05 21:23:01 UTC 2025 - Paulo Gomes <[email protected]> + +- Update to version 0.0.13: + * build: Bump PROTOC to v32.1 + * build: Bump golangci-lint to v2.5.0 + * build: Remove redundant tenv linter + * Drop redundant //nolint + * headless: Disable mime handling The way that mime handling works at the moment, it is incompatible with headless mode. Therefore always disables it before sending the workload to the runner. + * profiles: Mount dbus system bus path + * run: Expose Wayland env variables to workloads + * start: Improve start of profile in Wayland + * Add fallback resolution In cases were xrandr or wlr-randr are not available, or return an error, fall back to a 1440x1080 resolution. This avoids silent failures which can be difficult to pinpoint. + * Add headless subcommand + * build(deps): bump the github-actions-updates group with 5 updates + * build(deps): bump github.com/cyphar/filepath-securejoin + * build(deps): bump google.golang.org/protobuf from 1.36.8 to 1.36.9 + * build(deps): bump google.golang.org/grpc from 1.75.0 to 1.75.1 + +------------------------------------------------------------------- Old: ---- qubesome-0.0.12.tar.gz New: ---- qubesome-0.0.13.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ qubesome.spec ++++++ --- /var/tmp/diff_new_pack.F3w7MK/_old 2025-10-06 18:08:02.403049221 +0200 +++ /var/tmp/diff_new_pack.F3w7MK/_new 2025-10-06 18:08:02.427050229 +0200 @@ -17,7 +17,7 @@ Name: qubesome -Version: 0.0.12 +Version: 0.0.13 Release: 0 Summary: Containerize Window Managers, apps and config from a declarative state in Git License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.F3w7MK/_old 2025-10-06 18:08:02.835067361 +0200 +++ /var/tmp/diff_new_pack.F3w7MK/_new 2025-10-06 18:08:02.895069880 +0200 @@ -3,7 +3,7 @@ <param name="url">https://github.com/qubesome/cli.git</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v0.0.12</param> + <param name="revision">v0.0.13</param> <param name="versionformat">@PARENT_TAG@</param> <param name="changesgenerate">enable</param> <param name="match-tag">v*</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.F3w7MK/_old 2025-10-06 18:08:03.147080462 +0200 +++ /var/tmp/diff_new_pack.F3w7MK/_new 2025-10-06 18:08:03.235084157 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/qubesome/cli.git</param> - <param name="changesrevision">7f18a9461957b978fa5dd41cfc95f917b9f754ee</param></service></servicedata> + <param name="changesrevision">67a4cbcb3abe3fb3c441f18b4ac23ad470089ee7</param></service></servicedata> (No newline at EOF) ++++++ qubesome-0.0.12.tar.gz -> qubesome-0.0.13.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qubesome-0.0.12/.golangci.yaml new/qubesome-0.0.13/.golangci.yaml --- old/qubesome-0.0.12/.golangci.yaml 2025-09-08 13:28:03.000000000 +0200 +++ new/qubesome-0.0.13/.golangci.yaml 2025-10-05 23:10:31.000000000 +0200 @@ -1,5 +1,6 @@ +version: "2" linters: - disable-all: true + default: none enable: - asasalint - asciicheck @@ -22,13 +23,10 @@ - gochecknoinits - gochecksumtype - goconst - - gofmt - goheader - - goimports - gomodguard - goprintffuncname - gosec - - gosimple - gosmopolitan - govet - grouper @@ -53,18 +51,38 @@ - sloglint - spancheck - sqlclosecheck - - stylecheck + - staticcheck - tagalign - tagliatelle - - tenv - testableexamples - thelper - tparallel - - typecheck - unconvert - unparam - unused - usestdlibvars + - usetesting - wastedassign - whitespace - zerologlint + exclusions: + generated: lax + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + paths: + - third_party$ + - builtin$ + - examples$ +formatters: + enable: + - gofmt + - goimports + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qubesome-0.0.12/cmd/cli/headless.go new/qubesome-0.0.13/cmd/cli/headless.go --- old/qubesome-0.0.12/cmd/cli/headless.go 1970-01-01 01:00:00.000000000 +0100 +++ new/qubesome-0.0.13/cmd/cli/headless.go 2025-10-05 23:10:31.000000000 +0200 @@ -0,0 +1,55 @@ +package cli + +import ( + "context" + + "github.com/qubesome/cli/internal/qubesome" + "github.com/urfave/cli/v3" +) + +var conf string + +func headlessCommand() *cli.Command { + cmd := &cli.Command{ + Name: "headless", + Usage: "execute workloads in headless mode", + Description: `Examples: + +qubesome headless -profile <path> <workload> +qubesome headless -profile ~/git/dotfiles chrome +`, + Arguments: []cli.Argument{ + &cli.StringArg{ + Name: "workload", + Destination: &workload, + }, + }, + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "config", + Destination: &conf, + }, + &cli.StringFlag{ + Name: "profile", + Destination: &targetProfile, + }, + &cli.StringFlag{ + Name: "runner", + Destination: &runner, + }, + }, + Action: func(ctx context.Context, cmd *cli.Command) error { + cfg := config(conf) + + return qubesome.Run( + qubesome.WithHeadless(), + qubesome.WithWorkload(workload), + qubesome.WithProfile(targetProfile), + qubesome.WithConfig(cfg), + qubesome.WithRunner(runner), + qubesome.WithExtraArgs(cmd.Args().Slice()), + ) + }, + } + return cmd +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qubesome-0.0.12/cmd/cli/root.go new/qubesome-0.0.13/cmd/cli/root.go --- old/qubesome-0.0.12/cmd/cli/root.go 2025-09-08 13:28:03.000000000 +0200 +++ new/qubesome-0.0.13/cmd/cli/root.go 2025-10-05 23:10:31.000000000 +0200 @@ -41,6 +41,7 @@ completionCommand(), hostRunCommand(), flatpakCommand(), + headlessCommand(), }, } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qubesome-0.0.12/go.mod new/qubesome-0.0.13/go.mod --- old/qubesome-0.0.12/go.mod 2025-09-08 13:28:03.000000000 +0200 +++ new/qubesome-0.0.13/go.mod 2025-10-05 23:10:31.000000000 +0200 @@ -3,7 +3,7 @@ go 1.24.0 require ( - github.com/cyphar/filepath-securejoin v0.4.1 + github.com/cyphar/filepath-securejoin v0.5.0 github.com/go-git/go-git/v6 v6.0.0-20250628104446-20c25df268c3 github.com/google/uuid v1.6.0 github.com/stretchr/testify v1.11.1 @@ -11,8 +11,8 @@ github.com/zalando/go-keyring v0.2.6 golang.org/x/sys v0.36.0 golang.org/x/term v0.35.0 - google.golang.org/grpc v1.75.0 - google.golang.org/protobuf v1.36.8 + google.golang.org/grpc v1.75.1 + google.golang.org/protobuf v1.36.9 gopkg.in/yaml.v3 v3.0.1 ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qubesome-0.0.12/go.sum new/qubesome-0.0.13/go.sum --- old/qubesome-0.0.12/go.sum 2025-09-08 13:28:03.000000000 +0200 +++ new/qubesome-0.0.13/go.sum 2025-10-05 23:10:31.000000000 +0200 @@ -12,8 +12,8 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= -github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s= -github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= +github.com/cyphar/filepath-securejoin v0.5.0 h1:hIAhkRBMQ8nIeuVwcAoymp7MY4oherZdAxD+m0u9zaw= +github.com/cyphar/filepath-securejoin v0.5.0/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= github.com/danieljoos/wincred v1.2.2 h1:774zMFJrqaeYCK2W57BgAem/MLi6mtSE47MB6BOJ0i0= github.com/danieljoos/wincred v1.2.2/go.mod h1:w7w4Utbrz8lqeMbDAK0lkNJUv5sAOkFi7nd/ogr0Uh8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -106,10 +106,10 @@ gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= -google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= -google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= -google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= -google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +google.golang.org/grpc v1.75.1 h1:/ODCNEuf9VghjgO3rqLcfg8fiOP0nSluljWFlDxELLI= +google.golang.org/grpc v1.75.1/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= +google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qubesome-0.0.12/hack/base.mk new/qubesome-0.0.13/hack/base.mk --- old/qubesome-0.0.12/hack/base.mk 2025-09-08 13:28:03.000000000 +0200 +++ new/qubesome-0.0.13/hack/base.mk 2025-10-05 23:10:31.000000000 +0200 @@ -1,5 +1,5 @@ -GOLANGCI_VERSION ?= v1.64.5 -PROTOC_VERSION ?= 29.3 +GOLANGCI_VERSION ?= v2.5.0 +PROTOC_VERSION ?= 32.1 TOOLS_BIN := $(shell mkdir -p build/tools && realpath build/tools) ifneq ($(shell git status --porcelain --untracked-files=no),) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qubesome-0.0.12/internal/files/binaries.go new/qubesome-0.0.13/internal/files/binaries.go --- old/qubesome-0.0.12/internal/files/binaries.go 2025-09-08 13:28:03.000000000 +0200 +++ new/qubesome-0.0.13/internal/files/binaries.go 2025-10-05 23:10:31.000000000 +0200 @@ -10,6 +10,7 @@ XclipBinary = "/usr/bin/xclip" FireCrackerBinary = "/usr/bin/firecracker" XrandrBinary = "/usr/bin/xrandr" + WlrRandrBinary = "/usr/bin/wlr-randr" DbusBinary = "/usr/bin/dbus-send" PodmanBinary = "/usr/bin/podman" DockerBinary = "/usr/bin/docker" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qubesome-0.0.12/internal/flatpak/flatpak.go new/qubesome-0.0.13/internal/flatpak/flatpak.go --- old/qubesome-0.0.12/internal/flatpak/flatpak.go 2025-09-08 13:28:03.000000000 +0200 +++ new/qubesome-0.0.13/internal/flatpak/flatpak.go 2025-10-05 23:10:31.000000000 +0200 @@ -54,7 +54,7 @@ args := []string{"run", o.Name} args = append(args, o.ExtraArgs...) - c := exec.Command("/usr/bin/flatpak", args...) + c := exec.CommandContext(context.TODO(), "/usr/bin/flatpak", args...) c.Env = append(os.Environ(), fmt.Sprintf("DISPLAY=:%d", prof.Display)) out, err := c.CombinedOutput() fmt.Println(string(out)) @@ -86,7 +86,7 @@ fmt.Println("installing Flatpak", name) args := []string{"install", "flathub", name} - c := exec.Command("/usr/bin/flatpak", args...) + c := exec.CommandContext(context.TODO(), "/usr/bin/flatpak", args...) c.Stdin = os.Stdin c.Stdout = os.Stdout c.Stderr = os.Stderr diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qubesome-0.0.12/internal/profiles/profiles.go new/qubesome-0.0.13/internal/profiles/profiles.go --- old/qubesome-0.0.12/internal/profiles/profiles.go 2025-09-08 13:28:03.000000000 +0200 +++ new/qubesome-0.0.13/internal/profiles/profiles.go 2025-10-05 23:10:31.000000000 +0200 @@ -81,11 +81,12 @@ if err != nil { return err } - cfg.RootDir = filepath.Dir(path) if cfg == nil { return fmt.Errorf("cannot start profile: nil config") } + + cfg.RootDir = filepath.Dir(path) profile, ok := cfg.Profile(o.Profile) if !ok { return fmt.Errorf("cannot start profile: profile %q not found", o.Profile) @@ -336,6 +337,7 @@ creds.CA, creds.ClientPEM, creds.ClientKeyPEM, profile, strconv.Itoa(int(profile.Display)), interactive, cfg) if err != nil { + slog.Warn("failed to create display", "error", err) return err } @@ -412,12 +414,13 @@ xauthority := os.Getenv("XAUTHORITY") if xauthority == "" { - return fmt.Errorf("XAUTHORITY not defined") + xauthority = os.ExpandEnv("${HOME}/.XAUTHORITY") } slog.Debug("opening parent xauthority", "path", xauthority) parent, err := os.Open(xauthority) if err != nil { + slog.Debug("failed to open parent xauthority", "error", err) return err } defer parent.Close() @@ -470,6 +473,7 @@ "-tst", "-nolisten", "tcp", "-auth", "/home/xorg-user/.Xserver", + "-verbose", "9", "--", strings.TrimPrefix(profile.WindowManager, "exec ")} } @@ -549,7 +553,6 @@ "--rm", // rely on currently set DISPLAY. "-e", "DISPLAY", - "-e", "XDG_SESSION_TYPE=X11", "-e", "Q_MTLS_CA", "-e", "Q_MTLS_CERT", "-e", "Q_MTLS_KEY", @@ -578,10 +581,20 @@ } // TODO: Investigate ways to avoid sharing /run/user/1000 on Wayland. - dockerArgs = append(dockerArgs, "-e XDG_RUNTIME_DIR") + dockerArgs = append(dockerArgs, "-e", "XDG_RUNTIME_DIR") + dockerArgs = append(dockerArgs, "-e", "XDG_BACKEND") + dockerArgs = append(dockerArgs, "-e", "XDG_SEAT") + dockerArgs = append(dockerArgs, "-e", "XDG_SESSION_TYPE") + dockerArgs = append(dockerArgs, "-e", "XDG_SESSION_ID") + dockerArgs = append(dockerArgs, "-e", "XDG_SESSION_CLASS") + dockerArgs = append(dockerArgs, "-e", "XDG_SESSION_DESKTOP") + dockerArgs = append(dockerArgs, "-e", "WAYLAND_DISPLAY") + dockerArgs = append(dockerArgs, "-e", "HYPRLAND_INSTANCE_SIGNATURE") dockerArgs = append(dockerArgs, "-v="+xdgRuntimeDir+":/run/user/1000") + } else { + dockerArgs = append(dockerArgs, "-e", "XDG_SESSION_TYPE=X11") } - if profile.HostAccess.Gpus != "" { + if profile.Gpus != "" { if gpus, ok := gpu.Supported(profile.Runner); ok { dockerArgs = append(dockerArgs, gpus) } @@ -623,6 +636,7 @@ paths = append(paths, fmt.Sprintf("-v=%s:/dev/shm", filepath.Join(userDir, "shm"))) if profile.Dbus { + paths = append(paths, "-v=/run/dbus/system_bus_socket:/run/dbus/system_bus_socket") paths = append(paths, "-v=/etc/machine-id:/etc/machine-id:ro") } else { paths = append(paths, fmt.Sprintf("-v=%s:/run/user/1000", userDir)) @@ -657,6 +671,8 @@ slog.Debug("exec: "+bin, "args", dockerArgs) cmd := execabs.Command(bin, dockerArgs...) + cmd.Env = append(cmd.Env, os.Environ()...) + cmd.Env = append(os.Environ(), "Q_MTLS_CA="+string(ca)) cmd.Env = append(cmd.Env, "Q_MTLS_CERT="+string(cert)) cmd.Env = append(cmd.Env, "Q_MTLS_KEY="+string(key)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qubesome-0.0.12/internal/qubesome/mime.go new/qubesome-0.0.13/internal/qubesome/mime.go --- old/qubesome-0.0.12/internal/qubesome/mime.go 2025-09-08 13:28:03.000000000 +0200 +++ new/qubesome-0.0.13/internal/qubesome/mime.go 2025-10-05 23:10:31.000000000 +0200 @@ -31,7 +31,7 @@ return fmt.Errorf("cannot handle schemeless mime type: default mime handler is not set") } - return q.runner(q.defaultWorkload(in, args), runnerOverride) + return q.runner(q.defaultWorkload(in, args), runnerOverride, false) } if m, ok := in.Config.MimeHandlers[u.Scheme]; ok { @@ -43,7 +43,7 @@ } q.overrideWithProfile(in, &wi) - return q.runner(wi, runnerOverride) + return q.runner(wi, runnerOverride, false) } if in.Config.DefaultMimeHandler == nil { @@ -53,7 +53,7 @@ slog.Debug("no scheme specific handler: falling back to default mime handler") // falls back to default - return q.runner(q.defaultWorkload(in, args), runnerOverride) + return q.runner(q.defaultWorkload(in, args), runnerOverride, false) } func (q *Qubesome) overrideWithProfile(in *WorkloadInfo, wi *WorkloadInfo) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qubesome-0.0.12/internal/qubesome/mime_test.go new/qubesome-0.0.13/internal/qubesome/mime_test.go --- old/qubesome-0.0.12/internal/qubesome/mime_test.go 2025-09-08 13:28:03.000000000 +0200 +++ new/qubesome-0.0.13/internal/qubesome/mime_test.go 2025-10-05 23:10:31.000000000 +0200 @@ -143,7 +143,7 @@ called := 0 q := New() - q.runner = func(wi WorkloadInfo, _ string) error { + q.runner = func(wi WorkloadInfo, _ string, _ bool) error { actual = &wi called++ return nil diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qubesome-0.0.12/internal/qubesome/options.go new/qubesome-0.0.13/internal/qubesome/options.go --- old/qubesome-0.0.12/internal/qubesome/options.go 2025-09-08 13:28:03.000000000 +0200 +++ new/qubesome-0.0.13/internal/qubesome/options.go 2025-10-05 23:10:31.000000000 +0200 @@ -13,6 +13,7 @@ Profile string Runner string ExtraArgs []string + Headless bool } func WithExtraArgs(args []string) command.Option[Options] { @@ -44,6 +45,11 @@ o.Config = cfg } } +func WithHeadless() command.Option[Options] { + return func(o *Options) { + o.Headless = true + } +} func (o *Options) Validate() error { if o.Config == nil { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qubesome-0.0.12/internal/qubesome/qubesome.go new/qubesome-0.0.13/internal/qubesome/qubesome.go --- old/qubesome-0.0.12/internal/qubesome/qubesome.go 2025-09-08 13:28:03.000000000 +0200 +++ new/qubesome-0.0.13/internal/qubesome/qubesome.go 2025-10-05 23:10:31.000000000 +0200 @@ -17,7 +17,7 @@ ) type Qubesome struct { - runner func(in WorkloadInfo, runnerOverride string) error + runner func(in WorkloadInfo, runnerOverride string, headless bool) error } func New() *Qubesome { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qubesome-0.0.12/internal/qubesome/run.go new/qubesome-0.0.13/internal/qubesome/run.go --- old/qubesome-0.0.12/internal/qubesome/run.go 2025-09-08 13:28:03.000000000 +0200 +++ new/qubesome-0.0.13/internal/qubesome/run.go 2025-10-05 23:10:31.000000000 +0200 @@ -78,10 +78,10 @@ // Wait for any background operation that is in-flight. defer wg.Wait() - return runner(in, o.Runner) + return runner(in, o.Runner, o.Headless) } -func runner(in WorkloadInfo, runnerOverride string) error { +func runner(in WorkloadInfo, runnerOverride string, headless bool) error { if err := in.Validate(); err != nil { return err } @@ -190,6 +190,11 @@ ew.Workload.Runner = runnerOverride } + if headless { + // In headless mode, Mime handling is not supported. + ew.Workload.HostAccess.Mime = false + } + switch ew.Workload.Runner { case "firecracker": return firecracker.Run(ew) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qubesome-0.0.12/internal/runners/docker/run.go new/qubesome-0.0.13/internal/runners/docker/run.go --- old/qubesome-0.0.12/internal/runners/docker/run.go 2025-09-08 13:28:03.000000000 +0200 +++ new/qubesome-0.0.13/internal/runners/docker/run.go 2025-10-05 23:10:31.000000000 +0200 @@ -112,7 +112,17 @@ } // TODO: Investigate ways to avoid sharing /run/user/1000 on Wayland. - args = append(args, "-e XDG_RUNTIME_DIR") + args = append(args, "-e", "XDG_RUNTIME_DIR") + args = append(args, "-e", "XDG_BACKEND") + args = append(args, "-e", "XDG_SEAT") + args = append(args, "-e", "XDG_SESSION_TYPE") + args = append(args, "-e", "XDG_SESSION_ID") + args = append(args, "-e", "XDG_SESSION_CLASS") + args = append(args, "-e", "XDG_SESSION_DESKTOP") + args = append(args, "-e", "WAYLAND_DISPLAY") + args = append(args, "-e", "HYPRLAND_INSTANCE_SIGNATURE") + args = append(args, "-e", "DBUS_SESSION_BUS_ADDRESS") + args = append(args, "-v="+xdgRuntimeDir+":/run/user/1000") } else { if wl.HostAccess.Dbus || wl.HostAccess.Bluetooth || wl.HostAccess.VarRunUser { @@ -164,6 +174,11 @@ return err } + err = os.MkdirAll(pdir, files.DirMode) + if err != nil { + return fmt.Errorf("failed to ensure profile dir: %w", err) + } + srcMimeList := filepath.Join(pdir, "mimeapps.list") dstMimeList := filepath.Join(homedir, ".local", "share", "applications", "mimeapps.list") err = os.WriteFile(srcMimeList, []byte(mime.MimesList), files.FileMode) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qubesome-0.0.12/internal/types/workload.go new/qubesome-0.0.13/internal/types/workload.go --- old/qubesome-0.0.12/internal/types/workload.go 2025-09-08 13:28:03.000000000 +0200 +++ new/qubesome-0.0.13/internal/types/workload.go 2025-10-05 23:10:31.000000000 +0200 @@ -72,14 +72,14 @@ e.Name = fmt.Sprintf("%s-%s", w.Name, p.Name) - e.Workload.HostAccess.Camera = w.HostAccess.Camera && p.HostAccess.Camera - e.Workload.HostAccess.Microphone = w.HostAccess.Microphone && p.HostAccess.Microphone - e.Workload.HostAccess.Speakers = w.HostAccess.Speakers && p.HostAccess.Speakers - e.Workload.HostAccess.Dbus = w.HostAccess.Dbus && p.HostAccess.Dbus - e.Workload.HostAccess.VarRunUser = w.HostAccess.VarRunUser && p.HostAccess.VarRunUser - e.Workload.HostAccess.Bluetooth = w.HostAccess.Bluetooth && p.HostAccess.Bluetooth - e.Workload.HostAccess.Mime = w.HostAccess.Mime && p.HostAccess.Mime - e.Workload.HostAccess.Privileged = w.HostAccess.Privileged && p.HostAccess.Privileged + e.Workload.HostAccess.Camera = w.HostAccess.Camera && p.Camera + e.Workload.HostAccess.Microphone = w.HostAccess.Microphone && p.Microphone + e.Workload.HostAccess.Speakers = w.HostAccess.Speakers && p.Speakers + e.Workload.HostAccess.Dbus = w.HostAccess.Dbus && p.Dbus + e.Workload.HostAccess.VarRunUser = w.HostAccess.VarRunUser && p.VarRunUser + e.Workload.HostAccess.Bluetooth = w.HostAccess.Bluetooth && p.Bluetooth + e.Workload.HostAccess.Mime = w.HostAccess.Mime && p.Mime + e.Workload.HostAccess.Privileged = w.HostAccess.Privileged && p.Privileged // TODO: Consider restraining user on workloads. e.Workload.User = w.User @@ -127,13 +127,13 @@ e.Workload.HostAccess.CapsAdd = caps } - if len(p.HostAccess.Devices) == 0 { + if len(p.Devices) == 0 { e.Workload.HostAccess.Devices = p.Devices[:0] } else if len(w.HostAccess.Devices) > 0 { devs := make([]string, 0, len(w.HostAccess.Devices)) for _, path := range w.HostAccess.Devices { - if pathAllowed(path, p.HostAccess.Devices) { + if pathAllowed(path, p.Devices) { devs = append(devs, path) } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qubesome-0.0.12/internal/util/resolution/resolution.go new/qubesome-0.0.13/internal/util/resolution/resolution.go --- old/qubesome-0.0.12/internal/util/resolution/resolution.go 2025-09-08 13:28:03.000000000 +0200 +++ new/qubesome-0.0.13/internal/util/resolution/resolution.go 2025-10-05 23:10:31.000000000 +0200 @@ -6,18 +6,34 @@ "bufio" "bytes" "fmt" + "log/slog" "strings" "github.com/qubesome/cli/internal/files" "golang.org/x/sys/execabs" ) +const defaultResolution = "1440x1080" + // Primary returns the screen resolution for the primary display. func Primary() (string, error) { - cmd := execabs.Command(files.XrandrBinary) //nolint - output, err := cmd.Output() - if err != nil { - return "", err + binaries := []string{files.XrandrBinary, files.WlrRandrBinary} + var output []byte + var err error + + for _, binary := range binaries { + cmd := execabs.Command(binary) + output, err = cmd.Output() + if err == nil && len(output) > 0 { + break + } + + slog.Debug("could not get resolution via %s: %w", binary, err) + } + + if len(output) == 0 { + slog.Debug("falling back to default resolution", "resolution", defaultResolution) + return defaultResolution, nil } scanner := bufio.NewScanner(bytes.NewReader(output)) @@ -38,5 +54,5 @@ } } - return "", fmt.Errorf("cannot get resolution") + return "", fmt.Errorf("cannot get resolution from output: %q", output) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qubesome-0.0.12/pkg/inception/server.go new/qubesome-0.0.13/pkg/inception/server.go --- old/qubesome-0.0.12/pkg/inception/server.go 2025-09-08 13:28:03.000000000 +0200 +++ new/qubesome-0.0.13/pkg/inception/server.go 2025-10-05 23:10:31.000000000 +0200 @@ -38,7 +38,8 @@ } func (s *Server) Listen(serverCert tls.Certificate, ca []byte, socket string) error { - lis, err := net.Listen("unix", socket) + lc := net.ListenConfig{} + lis, err := lc.Listen(context.Background(), "unix", socket) if err != nil { return fmt.Errorf("failed to listen: %w", err) } ++++++ vendor.tar.gz ++++++ ++++ 6007 lines of diff (skipped)
