about summary refs log tree commit diff
path: root/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2021-04-28 14:39:00 +0000
committerAlyssa Ross <hi@alyssa.is>2021-06-10 08:52:36 +0000
commit693e64ef7421374338ddb1dc12b9573feec75972 (patch)
tree2526ac075d248699c35d63e04499890ee4381f5f /nixpkgs/pkgs/applications/networking/instant-messengers/mikutter
parent7014df2256694d97093d6f2bb1db340d346dea88 (diff)
parent8e4fe32876ca15e3d5eb3ecd3ca0b224417f5f17 (diff)
downloadnixlib-693e64ef7421374338ddb1dc12b9573feec75972.tar
nixlib-693e64ef7421374338ddb1dc12b9573feec75972.tar.gz
nixlib-693e64ef7421374338ddb1dc12b9573feec75972.tar.bz2
nixlib-693e64ef7421374338ddb1dc12b9573feec75972.tar.lz
nixlib-693e64ef7421374338ddb1dc12b9573feec75972.tar.xz
nixlib-693e64ef7421374338ddb1dc12b9573feec75972.tar.zst
nixlib-693e64ef7421374338ddb1dc12b9573feec75972.zip
Merge commit '8e4fe32876ca15e3d5eb3ecd3ca0b224417f5f17'
Diffstat (limited to 'nixpkgs/pkgs/applications/networking/instant-messengers/mikutter')
-rw-r--r--nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/default.nix194
-rw-r--r--nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/Gemfile (renamed from nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/Gemfile)8
-rw-r--r--nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/Gemfile.lock (renamed from nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/Gemfile.lock)78
-rw-r--r--nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/gemset.nix (renamed from nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/gemset.nix)144
-rw-r--r--nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/plugin/gtk/Gemfile (renamed from nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/plugin/gtk/Gemfile)0
-rw-r--r--nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/plugin/image_file_cache/Gemfile (renamed from nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/plugin/image_file_cache/Gemfile)0
-rw-r--r--nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/plugin/photo_support/Gemfile (renamed from nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/plugin/photo_support/Gemfile)0
-rw-r--r--nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/plugin/uitranslator/Gemfile5
-rw-r--r--nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/mikutter.desktop9
-rw-r--r--nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/plugin/uitranslator/Gemfile6
-rw-r--r--nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/test_plugin.rb10
-rwxr-xr-xnixpkgs/pkgs/applications/networking/instant-messengers/mikutter/update.sh51
12 files changed, 310 insertions, 195 deletions
diff --git a/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/default.nix b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/default.nix
index be84342787d2..111a3ed091e1 100644
--- a/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/default.nix
+++ b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/default.nix
@@ -1,82 +1,160 @@
-{ lib, stdenv, fetchurl
-, bundlerEnv, ruby
-, alsaUtils, libnotify, which, wrapGAppsHook, gtk2, atk, gobject-introspection
+{ lib
+, stdenv
+, fetchurl
+, bundlerEnv
+, alsaUtils
+, atk
+, copyDesktopItems
+, gobject-introspection
+, gtk2
+, ruby
+, libicns
+, libnotify
+, makeDesktopItem
+, which
+, wrapGAppsHook
+, writeText
 }:
 
-# how to update:
-# find latest version at: http://mikutter.hachune.net/download#download
-# run these commands:
-#
-# wget http://mikutter.hachune.net/bin/mikutter.4.0.0.tar.gz
-# mkdir mikutter
-# cd mikutter
-# tar xvf ../mikutter.4.0.0.tar.gz
-# find . -not -name Gemfile -exec rm {} \;
-# find . -type d -exec rmdir -p --ignore-fail-on-non-empty {} \;
-# cd ..
-# mv mikutter/* .
-# rm mikutter.4.0.0.tar.gz
-# rm gemset.nix Gemfile.lock; nix-shell -p bundler bundix --run 'bundle lock && bundix'
-
-stdenv.mkDerivation rec {
+let
+  # NOTE: $out may have different values depending on context
+  mikutterPaths = rec {
+    optPrefixDir = "$out/opt/mikutter";
+    appPrefixDir = "$out/Applications/mikutter.app/Contents";
+    appBinDir = "${appPrefixDir}/MacOS";
+    appResourceDir = "${appPrefixDir}/Resources";
+    iconPath = "${optPrefixDir}/core/skin/data/icon.png";
+  };
+
+  gems = bundlerEnv {
+    name = "mikutter-gems"; # leave the version out to enable package reuse
+    gemdir = ./deps;
+    groups = [ "default" "plugin" ];
+    inherit ruby;
+
+    # Avoid the following error:
+    # > `<module:Moneta>': uninitialized constant Moneta::Builder (NameError)
+    #
+    # Related:
+    # https://github.com/NixOS/nixpkgs/pull/76510
+    # https://github.com/NixOS/nixpkgs/pull/76765
+    # https://github.com/NixOS/nixpkgs/issues/83442
+    # https://github.com/NixOS/nixpkgs/issues/106545
+    copyGemFiles = true;
+  };
+
+  mkDesktopItem = { description }:
+    makeDesktopItem {
+      name = "mikutter";
+      desktopName = "mikutter";
+      exec = "mikutter";
+      icon = "mikutter";
+      categories = "Network;";
+      comment = description;
+      extraDesktopEntries.Keywords = "Mastodon;";
+    };
+
+  mkInfoPlist = { version }:
+    writeText "Info.plist" (lib.generators.toPlist { } {
+      CFBundleName = "mikutter";
+      CFBundleDisplayName = "mikutter";
+      CFBundleExecutable = "mikutter";
+      CFBundleIconFile = "mikutter";
+      CFBundleIdentifier = "net.hachune.mikutter";
+      CFBundleInfoDictionaryVersion = "6.0";
+      CFBundlePackageType = "APPL";
+      CFBundleVersion = version;
+      CFBundleShortVersionString = version;
+    });
+
+  inherit (gems) wrappedRuby;
+in
+with mikutterPaths; stdenv.mkDerivation rec {
   pname = "mikutter";
-  version = "4.0.0";
+  version = "4.1.4";
 
   src = fetchurl {
-    url = "https://mikutter.hachune.net/bin/mikutter.${version}.tar.gz";
-    sha256 = "0nx14vlp7p69m2vw0s6kbiyymsfq0r2jd4nm0v5c4xb9avkpgc8g";
+    url = "https://mikutter.hachune.net/bin/mikutter-${version}.tar.gz";
+    sha256 = "05253nz4i1lmnq6czj48qdab2ny4vx2mznj6nsn2l1m2z6zqkwk3";
   };
 
-  buildInputs = [ alsaUtils libnotify which gtk2 ruby atk gobject-introspection ];
-  nativeBuildInputs = [ wrapGAppsHook ];
+  nativeBuildInputs = [ copyDesktopItems wrapGAppsHook ]
+    ++ lib.optionals stdenv.isDarwin [ libicns ];
+  buildInputs = [
+    atk
+    gtk2
+    gobject-introspection
+    libnotify
+    which # some plugins use it at runtime
+    wrappedRuby
+  ] ++ lib.optionals stdenv.isLinux [ alsaUtils ];
+
+  scriptPath = lib.makeBinPath (
+    [ wrappedRuby libnotify which ]
+    ++ lib.optionals stdenv.isLinux [ alsaUtils ]
+  );
 
-  unpackPhase = ''
-    mkdir source
-    cd source
-    unpackFile $src
+  postUnpack = ''
     rm -rf vendor
   '';
 
-  installPhase = let
-    env = bundlerEnv {
-      name = "mikutter-${version}-gems";
-      gemdir = ./.;
+  installPhase = ''
+    runHook preInstall
 
-      inherit ruby;
-    };
-  in ''
-    install -v -D -m644 README $out/share/doc/mikutter/README
-    install -v -D -m644 LICENSE $out/share/doc/mikutter/LICENSE
-    rm -v README LICENSE
-
-    cp -rv . $out
-    mkdir $out/bin/
-    # hack wrapGAppsHook wants a file not a symlink
-    mv $out/mikutter.rb $out/bin/mikutter
-
-    gappsWrapperArgs+=(
-      --prefix PATH : "${ruby}/bin:${alsaUtils}/bin:${libnotify}/bin"
-      --prefix GEM_HOME : "${env}/${env.ruby.gemPath}"
+    mkdir -p $out/bin ${optPrefixDir}
+
+    install -Dm644 README $out/share/doc/mikutter/README
+    install -Dm644 LICENSE $out/share/doc/mikutter/LICENSE
+    rm -r README LICENSE deployment
+
+    cp -r . ${optPrefixDir}
+
+    gappsWrapperArgsHook # FIXME: currently runs at preFixup
+    wrapGApp ${optPrefixDir}/mikutter.rb \
+      --prefix PATH : "${scriptPath}" \
       --set DISABLE_BUNDLER_SETUP 1
-    )
-      # --prefix GIO_EXTRA_MODULES : "$prefix/lib/gio/modules"
+    mv ${optPrefixDir}/mikutter.rb $out/bin/mikutter
+
+    install -Dm644 ${iconPath} $out/share/icons/hicolor/256x256/apps/mikutter.png
 
-    mkdir -p $out/share/mikutter $out/share/applications
-    ln -sv $out/core/skin $out/share/mikutter/skin
-    substituteAll ${./mikutter.desktop} $out/share/applications/mikutter.desktop
+    runHook postInstall
   '';
 
-  postFixup = ''
-    mv $out/bin/.mikutter-wrapped $out/mikutter.rb
-    substituteInPlace $out/bin/mikutter \
-      --replace "$out/bin/.mikutter-wrapped" "$out/mikutter.rb"
+  postInstall =
+    let
+      infoPlist = mkInfoPlist { inherit version; };
+    in
+    lib.optionalString stdenv.isDarwin ''
+      mkdir -p ${appBinDir} ${appResourceDir}
+      install -Dm644 ${infoPlist} ${appPrefixDir}/Info.plist
+      ln -s $out/bin/mikutter ${appBinDir}/mikutter
+      png2icns ${appResourceDir}/mikutter.icns ${iconPath}
+    '';
+
+  installCheckPhase = ''
+    runHook preInstallCheck
+
+    testDir="$(mktemp -d)"
+    install -Dm644 ${./test_plugin.rb} "$testDir/plugin/test_plugin/test_plugin.rb"
+
+    $out/bin/mikutter --confroot="$testDir" --plugin=test_plugin --debug
+
+    runHook postInstallCheck
   '';
 
+  desktopItems = [
+    (mkDesktopItem { inherit (meta) description; })
+  ];
+
+  doInstallCheck = true;
+  dontWrapGApps = true; # the target is placed outside of bin/
+
+  passthru.updateScript = [ ./update.sh version (toString ./.) ];
+
   meta = with lib; {
-    description = "An extensible Twitter client";
+    description = "An extensible Mastodon client";
     homepage = "https://mikutter.hachune.net";
     platforms = ruby.meta.platforms;
     license = licenses.mit;
-    broken = true;
   };
 }
diff --git a/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/Gemfile b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/Gemfile
index 216af305b4ad..fbe6a2f29c5d 100644
--- a/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/Gemfile
+++ b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/Gemfile
@@ -11,12 +11,12 @@ ruby '>= 2.5.0'
 
 group :default do
   gem 'addressable','>= 2.7.0', '< 2.8'
-  gem 'delayer','>= 1.0.1', '< 1.1'
-  gem 'delayer-deferred','>= 2.1.1', '< 2.2'
-  gem 'diva','>= 1.0.1', '< 1.1'
+  gem 'delayer','>= 1.1.2', '< 2.0'
+  gem 'delayer-deferred','>= 2.2.0', '< 3.0'
+  gem 'diva','>= 1.0.2', '< 2.0'
   gem 'memoist','>= 0.16.2', '< 0.17'
   gem 'oauth','>= 0.5.4'
-  gem 'pluggaloid','>= 1.2.0', '< 1.3'
+  gem 'pluggaloid','>= 1.5.0', '< 2.0'
   gem 'typed-array','>= 0.1.2', '< 0.2'
 end
 
diff --git a/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/Gemfile.lock b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/Gemfile.lock
index 63f9a63849b1..92568056d52a 100644
--- a/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/Gemfile.lock
+++ b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/Gemfile.lock
@@ -5,22 +5,23 @@ GEM
       public_suffix (>= 2.0.2, < 5.0)
     atk (3.4.1)
       glib2 (= 3.4.1)
-    cairo (1.16.4)
+    cairo (1.17.5)
       native-package-installer (>= 1.0.3)
       pkg-config (>= 1.2.2)
+      red-colors
     cairo-gobject (3.4.1)
       cairo (>= 1.16.2)
       glib2 (= 3.4.1)
-    crack (0.4.3)
-      safe_yaml (~> 1.0.0)
-    delayer (1.0.1)
-    delayer-deferred (2.1.1)
-      delayer (>= 1.0, < 2.0)
-    diva (1.0.1)
+    crack (0.4.5)
+      rexml
+    delayer (1.2.0)
+    delayer-deferred (2.2.0)
+      delayer (>= 1.1.2, < 2.0)
+    diva (1.0.2)
       addressable (>= 2.5.2, < 2.8)
     gdk_pixbuf2 (3.4.1)
       gio2 (= 3.4.1)
-    gettext (3.2.9)
+    gettext (3.3.7)
       locale (>= 2.0.5)
       text (>= 1.3.0)
     gio2 (3.4.1)
@@ -34,40 +35,38 @@ GEM
       atk (= 3.4.1)
       gdk_pixbuf2 (= 3.4.1)
       pango (= 3.4.1)
-    hashdiff (1.0.0)
+    hashdiff (1.0.1)
     httpclient (2.8.3)
     instance_storage (1.0.0)
-    io-console (0.5.3)
-    irb (1.2.1)
-      reline (>= 0.0.1)
-    locale (2.1.2)
+    locale (2.1.3)
     memoist (0.16.2)
-    mini_portile2 (2.4.0)
-    mocha (1.11.1)
-    moneta (1.2.1)
-    native-package-installer (1.0.9)
-    nokogiri (1.10.7)
-      mini_portile2 (~> 2.4.0)
-    oauth (0.5.4)
+    mini_portile2 (2.5.0)
+    mocha (1.12.0)
+    moneta (1.4.1)
+    native-package-installer (1.1.1)
+    nokogiri (1.11.3)
+      mini_portile2 (~> 2.5.0)
+      racc (~> 1.4)
+    oauth (0.5.6)
     pango (3.4.1)
       cairo-gobject (= 3.4.1)
       gobject-introspection (= 3.4.1)
-    pkg-config (1.4.0)
-    pluggaloid (1.2.0)
-      delayer (>= 1.0.0, < 2.0)
+    pkg-config (1.4.6)
+    pluggaloid (1.5.0)
+      delayer (>= 1.1.0, < 2.0)
       instance_storage (>= 1.0.0, < 2.0.0)
-    power_assert (1.1.5)
-    public_suffix (4.0.1)
-    rake (13.0.1)
-    reline (0.1.2)
-      io-console (~> 0.5)
-    ruby-prof (1.1.0)
-    safe_yaml (1.0.5)
-    test-unit (3.3.4)
+    power_assert (2.0.0)
+    public_suffix (4.0.6)
+    racc (1.5.2)
+    rake (13.0.3)
+    red-colors (0.1.1)
+    rexml (3.2.5)
+    ruby-prof (1.4.3)
+    test-unit (3.4.0)
       power_assert
     text (1.3.1)
     typed-array (0.1.2)
-    webmock (3.7.6)
+    webmock (3.12.2)
       addressable (>= 2.3.6)
       crack (>= 0.3.2)
       hashdiff (>= 0.4.0, < 2.0.0)
@@ -77,19 +76,18 @@ PLATFORMS
 
 DEPENDENCIES
   addressable (>= 2.7.0, < 2.8)
-  delayer (>= 1.0.1, < 1.1)
-  delayer-deferred (>= 2.1.1, < 2.2)
-  diva (>= 1.0.1, < 1.1)
-  gettext (>= 3.2.9, < 3.3)
+  delayer (>= 1.1.2, < 2.0)
+  delayer-deferred (>= 2.2.0, < 3.0)
+  diva (>= 1.0.2, < 2.0)
+  gettext (>= 3.3.5, < 3.4)
   gtk2 (= 3.4.1)
   httpclient
-  irb (>= 1.2.0, < 1.3)
   memoist (>= 0.16.2, < 0.17)
   mocha (>= 1.11.1)
   moneta
   nokogiri
   oauth (>= 0.5.4)
-  pluggaloid (>= 1.2.0, < 1.3)
+  pluggaloid (>= 1.5.0, < 2.0)
   rake (>= 13.0.1)
   ruby-prof (>= 1.1.0)
   test-unit (>= 3.3.4, < 4.0)
@@ -97,7 +95,7 @@ DEPENDENCIES
   webmock (>= 3.7.6)
 
 RUBY VERSION
-   ruby 2.7.0p0
+   ruby 2.6.6p146
 
 BUNDLED WITH
-   2.1.2
+   2.1.4
diff --git a/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/gemset.nix b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/gemset.nix
index 2bc4db978dda..b45a36c6fec0 100644
--- a/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/gemset.nix
+++ b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/gemset.nix
@@ -22,15 +22,15 @@
     version = "3.4.1";
   };
   cairo = {
-    dependencies = ["native-package-installer" "pkg-config"];
+    dependencies = ["native-package-installer" "pkg-config" "red-colors"];
     groups = ["default" "plugin"];
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "0yvv2lcbsybzbw1nrmfivmln23da4rndrs3av6ymjh0x3ww5h7p8";
+      sha256 = "0vbj9szp2xbnxqan8hppip8vm9fxpcmpx745y5fvg2scdh9f0p7s";
       type = "gem";
     };
-    version = "1.16.4";
+    version = "1.17.5";
   };
   cairo-gobject = {
     dependencies = ["cairo" "glib2"];
@@ -44,25 +44,25 @@
     version = "3.4.1";
   };
   crack = {
-    dependencies = ["safe_yaml"];
+    dependencies = ["rexml"];
     groups = ["default" "test"];
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "0abb0fvgw00akyik1zxnq7yv391va148151qxdghnzngv66bl62k";
+      sha256 = "1cr1kfpw3vkhysvkk3wg7c54m75kd68mbm9rs5azdjdq57xid13r";
       type = "gem";
     };
-    version = "0.4.3";
+    version = "0.4.5";
   };
   delayer = {
     groups = ["default"];
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "09p4rkh3dpdm1mhq721m4d6zvxqqp44kg7069s8l7kmaf7nv2nb3";
+      sha256 = "0iqf4i18i8rk3x7qgvkhbiqskf0xzdf733fjimrq6xkag2mq60bl";
       type = "gem";
     };
-    version = "1.0.1";
+    version = "1.2.0";
   };
   delayer-deferred = {
     dependencies = ["delayer"];
@@ -70,10 +70,10 @@
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "1mbdxn1hskjqf3zlj4waxl71ccvbj6lk81c99769paxw4fajwrgx";
+      sha256 = "0i2das3ncssacpqdgaf4as77vrxm7jfiizaja884fqv4rzv6s2sv";
       type = "gem";
     };
-    version = "2.1.1";
+    version = "2.2.0";
   };
   diva = {
     dependencies = ["addressable"];
@@ -81,10 +81,10 @@
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "182gws1zihhpl7r3m8jsf29maqg9xdhj46s9lidbldar8clpl23h";
+      sha256 = "05wl4wg57vvng4nrp4lzjq148v908xzq092kq93phwvyxs7jnw2g";
       type = "gem";
     };
-    version = "1.0.1";
+    version = "1.0.2";
   };
   gdk_pixbuf2 = {
     dependencies = ["gio2"];
@@ -103,10 +103,10 @@
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "0764vj7gacn0aypm2bf6m46dzjzwzrjlmbyx6qwwwzbmi94r40wr";
+      sha256 = "1fqlwq7i8ck1fjyhn19q3skvgrbz44q7gq51mlr0qym5rkj5f6rn";
       type = "gem";
     };
-    version = "3.2.9";
+    version = "3.3.7";
   };
   gio2 = {
     dependencies = ["gobject-introspection"];
@@ -157,10 +157,10 @@
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "18jqpbvidrlnq3xf0hkdbs00607jgz35lry6gjw4bcxgh52am2mk";
+      sha256 = "1nynpl0xbj0nphqx1qlmyggq58ms1phf5i03hk64wcc0a17x1m1c";
       type = "gem";
     };
-    version = "1.0.0";
+    version = "1.0.1";
   };
   httpclient = {
     groups = ["plugin"];
@@ -182,36 +182,15 @@
     };
     version = "1.0.0";
   };
-  io-console = {
-    groups = ["default" "plugin"];
-    platforms = [];
-    source = {
-      remotes = ["https://rubygems.org"];
-      sha256 = "0srn91ly4cc5qvyj3r87sc7v8dnm52qj1hczzxmysib6ffparngd";
-      type = "gem";
-    };
-    version = "0.5.3";
-  };
-  irb = {
-    dependencies = ["reline"];
-    groups = ["default" "plugin"];
-    platforms = [];
-    source = {
-      remotes = ["https://rubygems.org"];
-      sha256 = "1r1y8i46qd5izdszzzn5jxvwvq00m89rk0hm8cs8f21p7nlwmh5w";
-      type = "gem";
-    };
-    version = "1.2.1";
-  };
   locale = {
     groups = ["default" "plugin"];
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "1sls9bq4krx0fmnzmlbn64dw23c4d6pz46ynjzrn9k8zyassdd0x";
+      sha256 = "0997465kxvpxm92fiwc2b16l49mngk7b68g5k35ify0m3q0yxpdn";
       type = "gem";
     };
-    version = "2.1.2";
+    version = "2.1.3";
   };
   memoist = {
     groups = ["default"];
@@ -228,61 +207,61 @@
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "15zplpfw3knqifj9bpf604rb3wc1vhq6363pd6lvhayng8wql5vy";
+      sha256 = "1hdbpmamx8js53yk3h8cqy12kgv6ca06k0c9n3pxh6b6cjfs19x7";
       type = "gem";
     };
-    version = "2.4.0";
+    version = "2.5.0";
   };
   mocha = {
     groups = ["test"];
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "06i2q5qjr9mvjgjc8w41pdf3qalw340y33wjvzc0rp4a1cbbb7pp";
+      sha256 = "05yw6rwgjppq116jgqfg4pv4bql3ci4r2fmmg0m2c3sqib1bq41a";
       type = "gem";
     };
-    version = "1.11.1";
+    version = "1.12.0";
   };
   moneta = {
     groups = ["plugin"];
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "0q7fskfdc0h5dhl8aamg3ypybd6cyl4x0prh4803gj7hxr17jfm1";
+      sha256 = "0z25b4yysvnf2hi9jxnsiv3fvnicnzr2m70ci231av5093jfknc6";
       type = "gem";
     };
-    version = "1.2.1";
+    version = "1.4.1";
   };
   native-package-installer = {
     groups = ["default" "plugin"];
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "0piclgf6pw7hr10x57x0hn675djyna4sb3xc97yb9vh66wkx1fl0";
+      sha256 = "1ww1mq41q7rda975byjmq5dk8k13v8dawvm33370pbkrymd8syp8";
       type = "gem";
     };
-    version = "1.0.9";
+    version = "1.1.1";
   };
   nokogiri = {
-    dependencies = ["mini_portile2"];
+    dependencies = ["mini_portile2" "racc"];
     groups = ["plugin"];
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "0r0qpgf80h764k176yr63gqbs2z0xbsp8vlvs2a79d5r9vs83kln";
+      sha256 = "19d78mdg2lbz9jb4ph6nk783c9jbsdm8rnllwhga6pd53xffp6x0";
       type = "gem";
     };
-    version = "1.10.7";
+    version = "1.11.3";
   };
   oauth = {
     groups = ["default"];
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "1zszdg8q1b135z7l7crjj234k4j0m347hywp5kj6zsq7q78pw09y";
+      sha256 = "1zwd6v39yqfdrpg1p3d9jvzs9ljg55ana2p06m0l7qn5w0lgx1a0";
       type = "gem";
     };
-    version = "0.5.4";
+    version = "0.5.6";
   };
   pango = {
     dependencies = ["cairo-gobject" "gobject-introspection"];
@@ -300,10 +279,10 @@
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "1cxdpr2wlz9b587avlq04a1da5fz1vdw8jvr6lx23mcq7mqh2xcx";
+      sha256 = "1mjjy1grxr64znkffxsvprcckbrrnm40b6gbllnbm7jxslbr3gjl";
       type = "gem";
     };
-    version = "1.4.0";
+    version = "1.4.6";
   };
   pluggaloid = {
     dependencies = ["delayer" "instance_storage"];
@@ -311,71 +290,80 @@
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "1gv0rjjdic8c41gfr3kyyphvf0fmv5rzcf6qd57zjdfcn6fvi3hh";
+      sha256 = "0m3f940lf1bg01jin22by7hg9hs43y995isgcyqb6vbvlv51zj11";
       type = "gem";
     };
-    version = "1.2.0";
+    version = "1.5.0";
   };
   power_assert = {
     groups = ["default" "test"];
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "1dii0wkfa0jm8sk9b20zl1z4980dmrjh0zqnii058485pp3ws10s";
+      sha256 = "172qfmzwxdf82bmwgcb13hnz9i3p6i2s2nijxnx6r63kn3drjppr";
       type = "gem";
     };
-    version = "1.1.5";
+    version = "2.0.0";
   };
   public_suffix = {
     groups = ["default" "test"];
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "0xnfv2j2bqgdpg2yq9i2rxby0w2sc9h5iyjkpaas2xknwrgmhdb0";
+      sha256 = "1xqcgkl7bwws1qrlnmxgh8g4g9m10vg60bhlw40fplninb3ng6d9";
       type = "gem";
     };
-    version = "4.0.1";
+    version = "4.0.6";
+  };
+  racc = {
+    groups = ["default" "plugin"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "178k7r0xn689spviqzhvazzvxfq6fyjldxb3ywjbgipbfi4s8j1g";
+      type = "gem";
+    };
+    version = "1.5.2";
   };
   rake = {
     groups = ["test"];
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "0w6qza25bq1s825faaglkx1k6d59aiyjjk3yw3ip5sb463mhhai9";
+      sha256 = "1iik52mf9ky4cgs38fp2m8r6skdkq1yz23vh18lk95fhbcxb6a67";
       type = "gem";
     };
-    version = "13.0.1";
+    version = "13.0.3";
   };
-  reline = {
-    dependencies = ["io-console"];
+  red-colors = {
     groups = ["default" "plugin"];
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "0908ijrngc3wkn5iny7d0kxkp74w6ixk2nwzzngplplfla1vkp8x";
+      sha256 = "0ar2k7zvhr1215jx5di29hkg5h1798f1gypmq6v0sy9v35w6ijca";
       type = "gem";
     };
-    version = "0.1.2";
+    version = "0.1.1";
   };
-  ruby-prof = {
-    groups = ["test"];
+  rexml = {
+    groups = ["default" "test"];
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "18ga5f4h1fnwn0xh910kpnw4cg3lq3jqljd3h16bdw9pgc5ff7dn";
+      sha256 = "08ximcyfjy94pm1rhcx04ny1vx2sk0x4y185gzn86yfsbzwkng53";
       type = "gem";
     };
-    version = "1.1.0";
+    version = "3.2.5";
   };
-  safe_yaml = {
-    groups = ["default" "test"];
+  ruby-prof = {
+    groups = ["test"];
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "0j7qv63p0vqcd838i2iy2f76c3dgwzkiz1d1xkg7n0pbnxj2vb56";
+      sha256 = "1r3xalp91l07m0cwllcxjzg6nkviiqnxkcbgg5qnzsdji6rgy65m";
       type = "gem";
     };
-    version = "1.0.5";
+    version = "1.4.3";
   };
   test-unit = {
     dependencies = ["power_assert"];
@@ -383,10 +371,10 @@
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "0mrkpb6wz0cs1740kaca240k4ymmkbvb2v5xaxsy6vynqw8n0g6z";
+      sha256 = "1h0c323zfn4hdida4g58h8wnlh4kax438gyxlw20dd78kcp01i8m";
       type = "gem";
     };
-    version = "3.3.4";
+    version = "3.4.0";
   };
   text = {
     groups = ["default" "plugin"];
@@ -414,9 +402,9 @@
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "19xvs7gdf8r75bmyb17w9g367qxzqnlrmbdda1y36cn1vrlnf2l8";
+      sha256 = "038igpmkpmn0nw0k7s4db8x88af1nwcy7wzh9m9c9q4p74h7rii0";
       type = "gem";
     };
-    version = "3.7.6";
+    version = "3.12.2";
   };
 }
diff --git a/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/plugin/gtk/Gemfile b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/plugin/gtk/Gemfile
index 3306c29e3cbf..3306c29e3cbf 100644
--- a/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/plugin/gtk/Gemfile
+++ b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/plugin/gtk/Gemfile
diff --git a/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/plugin/image_file_cache/Gemfile b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/plugin/image_file_cache/Gemfile
index f86005fef078..f86005fef078 100644
--- a/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/plugin/image_file_cache/Gemfile
+++ b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/plugin/image_file_cache/Gemfile
diff --git a/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/plugin/photo_support/Gemfile b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/plugin/photo_support/Gemfile
index 66016eee9c46..66016eee9c46 100644
--- a/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/plugin/photo_support/Gemfile
+++ b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/plugin/photo_support/Gemfile
diff --git a/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/plugin/uitranslator/Gemfile b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/plugin/uitranslator/Gemfile
new file mode 100644
index 000000000000..08b4831dfc66
--- /dev/null
+++ b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/deps/plugin/uitranslator/Gemfile
@@ -0,0 +1,5 @@
+source 'https://rubygems.org'
+
+group :default do
+  gem 'gettext', '>= 3.3.5', '< 3.4'
+end
diff --git a/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/mikutter.desktop b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/mikutter.desktop
deleted file mode 100644
index 092f5f35cbf8..000000000000
--- a/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/mikutter.desktop
+++ /dev/null
@@ -1,9 +0,0 @@
-[Desktop Entry]
-Name=mikutter
-Comment=Twitter Client
-Type=Application
-Exec=@out@/bin/mikutter
-Icon=@out@/core/skin/data/icon.png
-Terminal=false
-Categories=Network;
-Keywords=Twitter;
diff --git a/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/plugin/uitranslator/Gemfile b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/plugin/uitranslator/Gemfile
deleted file mode 100644
index 14ebffd4e0ad..000000000000
--- a/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/plugin/uitranslator/Gemfile
+++ /dev/null
@@ -1,6 +0,0 @@
-source 'https://rubygems.org'
-
-group :default do
-  gem 'gettext', '>= 3.2.9', '< 3.3'
-  gem 'irb', '>= 1.2.0', '< 1.3'
-end
diff --git a/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/test_plugin.rb b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/test_plugin.rb
new file mode 100644
index 000000000000..b19c15cd304f
--- /dev/null
+++ b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/test_plugin.rb
@@ -0,0 +1,10 @@
+# Tests mikutter's event system.
+
+Plugin.create(:test_plugin) do
+  require 'logger'
+  Delayer.new do
+    log = Logger.new(STDOUT)
+    log.info("loaded test_plugin")
+    exit
+  end
+end
diff --git a/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/update.sh b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/update.sh
new file mode 100755
index 000000000000..142fd8ca9424
--- /dev/null
+++ b/nixpkgs/pkgs/applications/networking/instant-messengers/mikutter/update.sh
@@ -0,0 +1,51 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i bash -p bundler bundix curl jq common-updater-scripts
+# shellcheck shell=bash
+
+set -euo pipefail
+
+main() {
+    local currentVer="$1"
+    local scriptDir="$2"
+    local latestVer
+    local srcDir
+
+    if [[ -z "$UPDATE_NIX_ATTR_PATH" ]]; then
+        echo "[ERROR] Please run the following instead:" >&2
+        echo >&2
+        echo "    % nix-shell maintainers/scripts/update.nix --argstr path mikutter" >&2
+        exit 1
+    fi
+
+    latestVer="$(queryLatestVersion)"
+    if [[ "$currentVer" == "$latestVer" ]]; then
+        echo "[INFO] mikutter is already up to date" >&2
+        exit
+    fi
+
+    update-source-version "$UPDATE_NIX_ATTR_PATH" "$latestVer"
+
+    cd "$scriptDir"
+
+    rm -rf deps
+    mkdir deps
+    cd deps
+
+    srcDir="$(nix-build ../../../../../.. --no-out-link -A mikutter.src)"
+    tar xvf "$srcDir" --strip-components=1
+    find . -not -name Gemfile -exec rm {} \;
+    find . -type d -exec rmdir -p --ignore-fail-on-non-empty {} \; || true
+
+    bundle lock
+    bundix
+}
+
+queryLatestVersion() {
+    curl -sS 'https://mikutter.hachune.net/download.json?count=1' \
+        | jq -r '.[].version_string' \
+        | head -n1
+}
+
+main "$@"
+
+# vim:set ft=bash: