···3535 icon := resolveIcon(fsys)
3636 appName = deriveAppName(desktop, desktopName, appimage)
37373838+ // No desktop file inside the AppImage: synthesize a terminal launcher so
3939+ // CLI apps still get a menu entry and are tracked by managedApps.
4040+ if desktop == nil {
4141+ desktop = parseDesktopFile([]byte(fmt.Sprintf(
4242+ "[Desktop Entry]\nType=Application\nName=%s\nTerminal=true\n",
4343+ appNameFromPath(appimage),
4444+ )))
4545+ }
4646+3847 // Patch in memory before any filesystem writes so a failure here installs nothing.
3939- if desktop != nil {
4040- if err := a.patchDesktopFile(desktop, appName, icon != ""); err != nil {
4141- return "", err
4242- }
4848+ if err := a.patchDesktopFile(desktop, appName, icon != ""); err != nil {
4949+ return "", err
4350 }
44514552 // Roll back written files on a later failure rather than leaving a half-installed app.
···5966 installed = append(installed, dest)
6067 }
61686262- if desktop != nil {
6363- dest, err := a.installDesktopFile(desktop, appName)
6464- if err != nil {
6565- rollback()
6666- return "", err
6767- }
6868- installed = append(installed, dest)
6969+ dest, err := a.installDesktopFile(desktop, appName)
7070+ if err != nil {
7171+ rollback()
7272+ return "", err
6973 }
7474+ installed = append(installed, dest)
70757176 // Materialize the AppImage last: when the source is already in ~/AppImages
7277 // it gets moved, so an earlier failure must not roll back over the user's