Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gnomeExtensions: add patch framework and fix extensions #137131

Merged
merged 5 commits into from Sep 30, 2021

Conversation

piegamesde
Copy link
Member

Motivation for this change

Fixes #136111 and #136112. @chrisportela please give it a try.

Things done
  • Built on platform(s)
    • x86_64-linux
    • aarch64-linux
    • x86_64-darwin
    • aarch64-darwin
  • For non-Linux: Is sandbox = true set in nix.conf? (See Nix manual)
  • Tested via one or more NixOS test(s) if existing and applicable for the change (look inside nixos/tests)
  • Tested compilation of all packages that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review wip"
  • Tested execution of all binary files (usually in ./result/bin/)
  • 21.11 Release Notes (or backporting 21.05 Release notes)
    • (Package updates) Added a release notes entry if the change is major or breaking
    • (Module updates) Added a release notes entry if the change is significant
    • (Module addition) Added a release notes entry if adding a new NixOS module
  • Fits CONTRIBUTING.md.

It's like Haskell's overlay system, but way more primitive. We simply pre-define some
package overrides that are required for an automatically packaged extension to work.
Ideally, all (or almost all) currently manually pacakged extensions will work this way.

Since these are mostly just a few lines each, there is no need to split this up into a
lot of small files.
@github-actions github-actions bot added the 6.topic: GNOME GNOME desktop environment and its underlying platform label Sep 8, 2021
@piegamesde
Copy link
Member Author

piegamesde commented Sep 8, 2021

@jtojnar I'd like to know your opinion about my approach to patching extensions. Generally it is the right move forward, as it will make manual packaging like #134789 obsolete. Having patches on top of automatic packaging means that maintainers don't have to manually track updates.

My main open question however is how should we deal with patches that are more than just a few lines, especially those that require actual patch files (instead of substituteInplace).

@r-rmcgibbo
Copy link

Result of nixpkgs-review pr 137131 at 48064d9 run on x86_64-linux 1

380 packages built successfully:
  • gnomeExtensions.activities-icons
  • gnomeExtensions.activities-menu-for-apps-and-windows
  • gnomeExtensions.activity-app-launcher
  • gnomeExtensions.add-to-desktop
  • gnomeExtensions.add-userhost-to-panel
  • gnomeExtensions.add-username-to-top-panel
  • gnomeExtensions.advanced-alttab-window-switcher
  • gnomeExtensions.adwaita-theme-switcher
  • gnomeExtensions.air-quality
  • gnomeExtensions.airpods-battery-status
  • gnomeExtensions.all-windows
  • gnomeExtensions.alphabetical-app-grid
  • gnomeExtensions.alt-tab-only-on-current-workspace
  • gnomeExtensions.alttab-mod
  • gnomeExtensions.always-indicator
  • gnomeExtensions.always-show-titles-in-overview
  • gnomeExtensions.always-show-workspace-thumbnails
  • gnomeExtensions.animation-tweaks
  • gnomeExtensions.app-grid-tweaks
  • gnomeExtensions.app-menu-icon-remove-symbolic
  • gnomeExtensions.app-switcher-current-workspace-first
  • gnomeExtensions.appindicator
  • gnomeExtensions.application-view-text
  • gnomeExtensions.application-volume-mixer
  • gnomeExtensions.applications-menu
  • gnomeExtensions.applications-overview-tooltip
  • gnomeExtensions.arbtt-stats
  • gnomeExtensions.archlinux-updates-indicator
  • gnomeExtensions.arrange-windows
  • gnomeExtensions.audio-output-switcher
  • gnomeExtensions.audio-switcher-40
  • gnomeExtensions.auto-activities
  • gnomeExtensions.auto-move-windows
  • gnomeExtensions.auto-mute-toggle
  • gnomeExtensions.auto-select-headset
  • gnomeExtensions.autohide-battery
  • gnomeExtensions.babar
  • gnomeExtensions.backslide
  • gnomeExtensions.battery-time
  • gnomeExtensions.battery-time-percentage-compact
  • gnomeExtensions.better-osd-gnome-40
  • gnomeExtensions.bifocals
  • gnomeExtensions.big-avatar
  • gnomeExtensions.big-sur-status-area
  • gnomeExtensions.bing-wallpaper-changer
  • gnomeExtensions.bitcoin-markets
  • gnomeExtensions.block-caribou-36
  • gnomeExtensions.bluetooth-battery
  • gnomeExtensions.bluetooth-quick-connect
  • gnomeExtensions.blur-me
  • gnomeExtensions.blur-my-shell
  • gnomeExtensions.bottom-panel
  • gnomeExtensions.bottom-triggers-activities-overview
  • gnomeExtensions.brightness-control-using-ddcutil
  • gnomeExtensions.brightness-panel-menu-indicator
  • gnomeExtensions.bring-out-submenu-of-power-offlogout-button
  • gnomeExtensions.bubblemail
  • gnomeExtensions.change-desktop-background-when-workspace-empty
  • gnomeExtensions.clean-system-menu
  • gnomeExtensions.cleaner-overview
  • gnomeExtensions.clear-top-bar
  • gnomeExtensions.clipboard-indicator
  • gnomeExtensions.clippie
  • gnomeExtensions.color-picker
  • gnomeExtensions.colortint
  • gnomeExtensions.colosseum
  • gnomeExtensions.compiz-alike-magic-lamp-effect
  • gnomeExtensions.compiz-alike-windows-effect
  • gnomeExtensions.compiz-windows-effect
  • gnomeExtensions.containers
  • gnomeExtensions.control-blur-effect-on-lock-screen
  • gnomeExtensions.coverflow-alt-tab
  • gnomeExtensions.cpufreq
  • gnomeExtensions.custom-hot-corners-extended
  • gnomeExtensions.custom-menu-panel
  • gnomeExtensions.customize-ibus
  • gnomeExtensions.dark-side-of-gnome
  • gnomeExtensions.dash-to-plank
  • gnomeExtensions.ddterm
  • gnomeExtensions.deja-dup-backup-button
  • gnomeExtensions.desk-changer
  • gnomeExtensions.desktop-icons-neo
  • gnomeExtensions.desktop-icons-ng-ding
  • gnomeExtensions.desktop-lyric
  • gnomeExtensions.dim-on-battery-power
  • gnomeExtensions.disable-gestures-2021
  • gnomeExtensions.disable-menu-switching
  • gnomeExtensions.disable-unredirect
  • gnomeExtensions.disable-workspace-switch-animation-for-gnome-40
  • gnomeExtensions.disconnect-wifi
  • gnomeExtensions.discrete-brightness
  • gnomeExtensions.docker-integration
  • gnomeExtensions.downfall
  • gnomeExtensions.dual-shock-4-battery-percentage
  • gnomeExtensions.duckduckgo-search-provider
  • gnomeExtensions.dynamic-panel-transparency
  • gnomeExtensions.e-ink-mode
  • gnomeExtensions.easy-docker-containers
  • gnomeExtensions.eclipse
  • gnomeExtensions.eruption-profile-switcher
  • gnomeExtensions.espresso
  • gnomeExtensions.executor
  • gnomeExtensions.extension-list
  • gnomeExtensions.extensions-in-system-menu
  • gnomeExtensions.extensions-sync
  • gnomeExtensions.eye-extended
  • gnomeExtensions.favorites-menu
  • gnomeExtensions.fedora-linux-updates-indicator
  • gnomeExtensions.fixed-ime-list
  • gnomeExtensions.floating-dock
  • gnomeExtensions.fluorooms-top-bar
  • gnomeExtensions.fnlock-switch-thinkpad-compact-usb-keyboard
  • gnomeExtensions.focusli
  • gnomeExtensions.force-quit
  • gnomeExtensions.force-show-osk
  • gnomeExtensions.frippery-applications-menu
  • gnomeExtensions.full-battery-indicator
  • gnomeExtensions.fullscreen-avoider
  • gnomeExtensions.fullscreen-hot-corner
  • gnomeExtensions.fullscreen-notifications
  • gnomeExtensions.fullscreen-on-new-workspace
  • gnomeExtensions.fuzzy-app-search
  • gnomeExtensions.fuzzy-clock
  • gnomeExtensions.gamemode
  • gnomeExtensions.gesture-improvements
  • gnomeExtensions.gitlab-extension
  • gnomeExtensions.gmail-message-tray
  • gnomeExtensions.gnome-40-plat-workspace
  • gnomeExtensions.gnome-40-ui-improvements
  • gnomeExtensions.gnome-bedtime
  • gnomeExtensions.gnome-citeurl-search-provider
  • gnomeExtensions.gnome-hdate
  • gnomeExtensions.gnome-toggle
  • gnomeExtensions.go-to-last-workspace
  • gnomeExtensions.gold-price-monitor
  • gnomeExtensions.google-earth-wallpaper
  • gnomeExtensions.google-search-provider
  • gnomeExtensions.gsnap
  • gnomeExtensions.gtile
  • gnomeExtensions.gtk-title-bar
  • gnomeExtensions.guillotine
  • gnomeExtensions.haguichi-indicator
  • gnomeExtensions.harddisk-led
  • gnomeExtensions.hibernate-status-button
  • gnomeExtensions.hide-activities-button
  • gnomeExtensions.hide-activities-button-2
  • gnomeExtensions.hide-clock
  • gnomeExtensions.hide-keyboard-layout
  • gnomeExtensions.hide-panel
  • gnomeExtensions.hide-top-bar
  • gnomeExtensions.hide-universal-access
  • gnomeExtensions.hide-workspace-thumbnails
  • gnomeExtensions.historymanager-prefix-search
  • gnomeExtensions.home-assistant-extension
  • gnomeExtensions.hot-edge
  • gnomeExtensions.hotel-manager
  • gnomeExtensions.hplip-menu
  • gnomeExtensions.hue-lights
  • gnomeExtensions.ibus-font-setting
  • gnomeExtensions.ibus-tweaker
  • gnomeExtensions.icinga-checker
  • gnomeExtensions.ideapad
  • gnomeExtensions.ideapad-mode
  • gnomeExtensions.improved-osk
  • gnomeExtensions.improved-workspace-indicator
  • gnomeExtensions.internet-radio
  • gnomeExtensions.internet-speed-meter
  • gnomeExtensions.iqair-gnome-extension
  • gnomeExtensions.jiggle
  • gnomeExtensions.just-perfection
  • gnomeExtensions.kerberos-login
  • gnomeExtensions.kernel-indicator
  • gnomeExtensions.keyman
  • gnomeExtensions.kimpanel
  • gnomeExtensions.kitchen-timer
  • gnomeExtensions.kitsch
  • gnomeExtensions.krypto
  • gnomeExtensions.kube-config
  • gnomeExtensions.kubectl-extension
  • gnomeExtensions.lan-ip-address
  • gnomeExtensions.launch-new-instance
  • gnomeExtensions.light-dict
  • gnomeExtensions.lock-keys
  • gnomeExtensions.lock-keys-2
  • gnomeExtensions.lock-screen
  • gnomeExtensions.logo-menu
  • gnomeExtensions.lunar-calendar
  • gnomeExtensions.lyrics-finder
  • gnomeExtensions.macbook-battery-percentage-corrector
  • gnomeExtensions.mailnag
  • gnomeExtensions.material-shell
  • gnomeExtensions.maxi
  • gnomeExtensions.maximize-to-empty-workspace
  • gnomeExtensions.maximize-to-workspace-with-history
  • gnomeExtensions.messaging-menu
  • gnomeExtensions.middle-click-to-close-in-overview
  • gnomeExtensions.minimalist-calendar-3
  • gnomeExtensions.minimize-all
  • gnomeExtensions.minimize-shelf
  • gnomeExtensions.miniview
  • gnomeExtensions.monitor-window-switcher
  • gnomeExtensions.mounter
  • gnomeExtensions.move-clock
  • gnomeExtensions.move-workspace-switcher-popup
  • gnomeExtensions.move-ws-switcher-popup
  • gnomeExtensions.mpris-indicator-button
  • gnomeExtensions.multiclock
  • gnomeExtensions.mumbleping
  • gnomeExtensions.mute-spotify-ads
  • gnomeExtensions.myhiddentopbar
  • gnomeExtensions.nasa-apod
  • gnomeExtensions.native-window-placement
  • gnomeExtensions.net-speed-simplified
  • gnomeExtensions.netspeed
  • gnomeExtensions.new-mail-indicator
  • gnomeExtensions.night-light-slider
  • gnomeExtensions.no-overview
  • gnomeExtensions.noannoyance
  • gnomeExtensions.noannoyance-2
  • gnomeExtensions.non-blocking-switcher
  • gnomeExtensions.nordvpn-connect
  • gnomeExtensions.nothing-to-say
  • gnomeExtensions.notification-banner-position
  • gnomeExtensions.notification-centerselenium-h
  • gnomeExtensions.notification-counter
  • gnomeExtensions.notification-timeout
  • gnomeExtensions.notifications-to-file
  • gnomeExtensions.obmin
  • gnomeExtensions.openweather
  • gnomeExtensions.optimus-manager-indicator
  • gnomeExtensions.overview-navigation
  • gnomeExtensions.panel-favorites
  • gnomeExtensions.panel-osd
  • gnomeExtensions.panel-scroll
  • gnomeExtensions.panel-world-clock-lite
  • gnomeExtensions.password-calculator
  • gnomeExtensions.pause-night-light
  • gnomeExtensions.persian-calendar
  • gnomeExtensions.persistent-email-notifications
  • gnomeExtensions.pixel-saver
  • gnomeExtensions.places-status-indicator
  • gnomeExtensions.print-website
  • gnomeExtensions.printers
  • gnomeExtensions.private-switcher
  • gnomeExtensions.proxy-switcher
  • gnomeExtensions.quake-mode
  • gnomeExtensions.quick-menu
  • gnomeExtensions.random-wallpaper
  • gnomeExtensions.rdesktop-launcher
  • gnomeExtensions.reading-strip
  • gnomeExtensions.recent-items
  • gnomeExtensions.remmina-search-provider
  • gnomeExtensions.removable-drive-menu
  • gnomeExtensions.remove-alttab-delay-v2
  • gnomeExtensions.remove-app-menu
  • gnomeExtensions.remove-rounded-corners
  • gnomeExtensions.replace-activities-text
  • gnomeExtensions.resource-monitor
  • gnomeExtensions.right-click-down
  • gnomeExtensions.ripple-remove
  • gnomeExtensions.round-robin-tab-order
  • gnomeExtensions.run-or-raise
  • gnomeExtensions.runcat
  • gnomeExtensions.screen-autorotate
  • gnomeExtensions.screen-lock
  • gnomeExtensions.screen-word-translate
  • gnomeExtensions.screenshot-directory
  • gnomeExtensions.screenshot-locations
  • gnomeExtensions.screenshot-tool
  • gnomeExtensions.screenshot-window-sizer
  • gnomeExtensions.scroll-panel
  • gnomeExtensions.scrovol
  • gnomeExtensions.section-todo-list
  • gnomeExtensions.sensory-perception
  • gnomeExtensions.sermon
  • gnomeExtensions.settingscenter
  • gnomeExtensions.shamsi-calendar
  • gnomeExtensions.shell-configurator
  • gnomeExtensions.shortcuts-for-apt
  • gnomeExtensions.show-application-view-when-workspace-empty
  • gnomeExtensions.show-applications-instead-of-overview
  • gnomeExtensions.show-desktop-applet
  • gnomeExtensions.show-desktop-button
  • gnomeExtensions.showtime
  • gnomeExtensions.showtime-horizontal
  • gnomeExtensions.shu-zhi
  • gnomeExtensions.shutdowntimer
  • gnomeExtensions.shutdowntimer-2
  • gnomeExtensions.simple-net-speed
  • gnomeExtensions.simply-workspaces
  • gnomeExtensions.slinger
  • gnomeExtensions.snap-manager
  • gnomeExtensions.snowy
  • gnomeExtensions.soft-brightness
  • gnomeExtensions.somafm-internet-radio
  • gnomeExtensions.spin-down-hard-disk
  • gnomeExtensions.spotify-artwork-fixer
  • gnomeExtensions.ss-subscriber
  • gnomeExtensions.ssh-search-provider-reborn
  • gnomeExtensions.status-area-horizontal-spacing
  • gnomeExtensions.stocks-extension
  • gnomeExtensions.switch-two-layouts
  • gnomeExtensions.switch-workspace
  • gnomeExtensions.switcher
  • gnomeExtensions.syncthing-icon
  • gnomeExtensions.syncthing-indicator
  • gnomeExtensions.syspeek-gs
  • gnomeExtensions.system-action-hibernate
  • gnomeExtensions.system-monitor-2
  • gnomeExtensions.system-monitor-next
  • gnomeExtensions.systemd-manager
  • gnomeExtensions.task-widget
  • gnomeExtensions.taskbar-updated
  • gnomeExtensions.thanatophobia
  • gnomeExtensions.the-circles-desktop-widget
  • gnomeExtensions.tiling-assistant
  • gnomeExtensions.time-awareness
  • gnomeExtensions.time-tracker
  • gnomeExtensions.timepp
  • gnomeExtensions.timezone
  • gnomeExtensions.todotxt
  • gnomeExtensions.tofu-menu
  • gnomeExtensions.toggle-alacritty
  • gnomeExtensions.toggle-night-light
  • gnomeExtensions.top-bar-organizer
  • gnomeExtensions.top-panel-notification-icons
  • gnomeExtensions.top-panel-workspace-scroll
  • gnomeExtensions.topiconsfix
  • gnomeExtensions.tp_wattmeter
  • gnomeExtensions.transcodeappsearch
  • gnomeExtensions.translate-clipboard
  • gnomeExtensions.transparent-shell
  • gnomeExtensions.transparent-top-bar
  • gnomeExtensions.transparent-top-bar-adjustable-transparency
  • gnomeExtensions.transparent-top-panel
  • gnomeExtensions.transparent-window-moving
  • gnomeExtensions.tray-icons
  • gnomeExtensions.tray-icons-reloaded
  • gnomeExtensions.true-color-invert
  • gnomeExtensions.tuned-profile-switcher
  • gnomeExtensions.tweaks-in-system-menu
  • gnomeExtensions.twitchlive-panel
  • gnomeExtensions.ubuntu-appearance-gnome-40
  • gnomeExtensions.umi-coin-rate
  • gnomeExtensions.unblank
  • gnomeExtensions.unity-like-app-switcher
  • gnomeExtensions.unix-timestamp-clock
  • gnomeExtensions.unlock-dialog-background
  • gnomeExtensions.unmaximize-double-click-panel
  • gnomeExtensions.user-id-in-top-panel
  • gnomeExtensions.user-stylesheet-font
  • gnomeExtensions.user-themes
  • gnomeExtensions.user-themes-x
  • gnomeExtensions.utcclock
  • gnomeExtensions.vertical-overview
  • gnomeExtensions.vertical-window-list
  • gnomeExtensions.virtualbox-applet
  • gnomeExtensions.vitals
  • gnomeExtensions.vlan-switcher
  • gnomeExtensions.volume-mixer
  • gnomeExtensions.vpn-and-snx-indicator
  • gnomeExtensions.wacom-indicator
  • gnomeExtensions.wandering-pixel
  • gnomeExtensions.weather-in-the-clock
  • gnomeExtensions.weeks-start-on-monday-again
  • gnomeExtensions.wg-indicator
  • gnomeExtensions.window-is-ready-remover
  • gnomeExtensions.window-list
  • gnomeExtensions.window-switcher-current-workspace-first
  • gnomeExtensions.windownavigator
  • gnomeExtensions.wintile-windows-10-window-tiling-for-gnome
  • gnomeExtensions.wireguard-indicator
  • gnomeExtensions.wireless-hid
  • gnomeExtensions.worksets
  • gnomeExtensions.workspace-indicator
  • gnomeExtensions.workspace-indicator-2
  • gnomeExtensions.workspace-switch-wraparound
  • gnomeExtensions.workspaces-bar
  • gnomeExtensions.x11-gestures
  • gnomeExtensions.you2ber
4 suggestions:
  • warning: stale-substitute

    Stale substituteInPlace detected.
    substituteStream(): WARNING: pattern 'gjs' doesn't match anything in file 'saveDlg.js'
    Near pkgs/desktops/gnome/extensions/buildGnomeExtension.nix:47:0:

       |
    47 |       description = builtins.head (lib.splitString "\n" description);
       | ^
    
  • warning: stale-substitute

    Stale substituteInPlace detected.
    substituteStream(): WARNING: pattern 'gjs' doesn't match anything in file 'prefs.js'
    Near pkgs/desktops/gnome/extensions/buildGnomeExtension.nix:47:0:

       |
    47 |       description = builtins.head (lib.splitString "\n" description);
       | ^
    
  • warning: unused-argument

    Unused argument: name.
    Near pkgs/desktops/gnome/extensions/buildGnomeExtension.nix:9:5:

      |
    9 |     name,
      |     ^
    
  • warning: unused-argument

    Unused argument: pkgs.
    Near pkgs/desktops/gnome/extensions/buildGnomeExtension.nix:1:3:

      |
    1 | { pkgs, lib, stdenv, fetchzip }:
      |   ^
    

@jtojnar
Copy link
Contributor

jtojnar commented Sep 8, 2021

This looks good to me. It should work fine with patch files too and I would say the usual advice on choosing files vs. seding applies. (Though here the benefit of using git to rebase patches is diminished by the built extensions possibly having different directory structure.)

@piegamesde
Copy link
Member Author

My convention proposal for patches with more than one file:

  • Have a folder named something like patch-$UUID for every extension
  • It contains the necessary files and a patch.nix, which is imported from extensionPatches.nix (maybe call it default.nix instead?).
  • The signature of patch.nix is a function from derivation attrset to derivation attrset, old -> new, so that it can be plugged into overrideAttrs. There may be an outer callPackage layer for dependencies.
  • The convention is enforced by adding some examples that look like this and then cargo cult.

We want the pname to match a potential automatic packaging (if the extension is updated to support a more recent
GNOME version) as closely as possible.
@maralorn
Copy link
Member

I think this is a good change.

Setting the install phase and using dontBuild gives us the most flexibility and minimizes surprises for people stumbling over this.

I am not totally convinced by the filename extensionPatches.nix because we will probably do arbitrary overrides in there. Not only patches. (Also in general the patches won‘t literally be in that file.) So I would call it overrides.nix or something similar. I am not against merging in this state, but you can take it into consideration.

@nixos-discourse
Copy link

This pull request has been mentioned on NixOS Discourse. There might be relevant details there:

https://discourse.nixos.org/t/easy-way-to-add-paths-to-gi-typelib-path/15240/2

@maralorn
Copy link
Member

If no one else merges or raises concerns, I will merge this in 48h. Please ping me, if I forget.

Comment on lines +1 to +5
{
lib,
ddcutil,
gjs,
}:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
{
lib,
ddcutil,
gjs,
}:
{ lib
, ddcutil
, gjs
}:

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we had this discussion more than once in the past. Until nixpkgs settles on some coding style that is enforced automatically, I will keep it like this.

mkdir -p $out/share/gnome-shell/extensions/
cp -r -T $src $out/share/gnome-shell/extensions/${uuid}
cp -r -T . $out/share/gnome-shell/extensions/${uuid}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not use install?

@nixos-discourse
Copy link

This pull request has been mentioned on NixOS Discourse. There might be relevant details there:

https://discourse.nixos.org/t/easy-way-to-add-paths-to-gi-typelib-path/15240/4

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

ddcutil gnome extension hard codes ddcutil path
6 participants