diff --git a/pkgs/applications/graphics/vimiv/default.nix b/pkgs/applications/graphics/vimiv/default.nix new file mode 100644 index 000000000000..bb8437153cad --- /dev/null +++ b/pkgs/applications/graphics/vimiv/default.nix @@ -0,0 +1,74 @@ +{ lib, python3Packages, fetchFromGitHub, imagemagick, librsvg, gtk3, jhead +, hicolor_icon_theme, defaultIconTheme + +# Test requirements +, dbus, xvfb_run, xdotool +}: + +python3Packages.buildPythonApplication rec { + name = "vimiv"; + version = "0.7.2"; + + src = fetchFromGitHub { + owner = "karlch"; + repo = "vimiv"; + rev = "v${version}"; + sha256 = "1g97ms84xk4ci4crq9wdc3744jnrqkq2qz9sg69lhm9sr5f68bw4"; + }; + + testimages = fetchFromGitHub { + owner = "karlch"; + repo = "vimiv"; + rev = "6f4d1372b27f2065c56eafdb521d230d9bb8f4e2"; + sha256 = "0a3aybzpms0381dz9japhm4c7j5klhmw91prcac6zaww6x34nmxb"; + }; + + patches = [ ./fixes.patch ]; + + postPatch = '' + patchShebangs scripts/install_icons.sh + sed -i -e 's,/usr,,g' -e '/setup\.py/d' Makefile scripts/install_icons.sh + + sed -i \ + -e 's,/etc/vimiv/\(vimivrc\|keys\.conf\),'"$out"'&,g' \ + man/* vimiv/parser.py + + sed -i \ + -e 's!"mogrify"!"${imagemagick}/bin/mogrify"!g' \ + -e '/cmd *=/s!"jhead"!"${jhead}/bin/jhead"!g' \ + vimiv/imageactions.py + ''; + + checkInputs = [ python3Packages.nose dbus.daemon xvfb_run xdotool ]; + buildInputs = [ hicolor_icon_theme defaultIconTheme librsvg ]; + propagatedBuildInputs = with python3Packages; [ pillow pygobject3 gtk3 ]; + + makeWrapperArgs = [ + "--prefix GI_TYPELIB_PATH : \"$GI_TYPELIB_PATH\"" + "--suffix XDG_DATA_DIRS : \"$XDG_ICON_DIRS:$out/share\"" + "--set GDK_PIXBUF_MODULE_FILE \"$GDK_PIXBUF_MODULE_FILE\"" + ]; + + postCheck = '' + # Some tests assume that the directory only contains one vimiv directory + rm -rf vimiv.egg-info vimiv.desktop + + # Re-use the wrapper args from the main program + makeWrapper "$SHELL" run-tests $makeWrapperArgs + + cp -Rd --no-preserve=mode "$testimages/testimages" vimiv/testimages + HOME="$(mktemp -d)" PATH="$out/bin:$PATH" \ + xvfb-run -s '-screen 0 800x600x24' dbus-run-session \ + --config-file=${dbus.daemon}/share/dbus-1/session.conf \ + ./run-tests -c 'python tests/main_test.py && nosetests -vx' + ''; + + postInstall = "make DESTDIR=\"$out\" install"; + + meta = { + homepage = "https://github.com/karlch/vimiv"; + description = "An image viewer with Vim-like keybindings"; + license = lib.licenses.mit; + platforms = lib.platforms.linux; + }; +} diff --git a/pkgs/applications/graphics/vimiv/fixes.patch b/pkgs/applications/graphics/vimiv/fixes.patch new file mode 100644 index 000000000000..09c06e43058a --- /dev/null +++ b/pkgs/applications/graphics/vimiv/fixes.patch @@ -0,0 +1,128 @@ +Patch submitted upstream at https://github.com/karlch/vimiv/pull/32 + +diff --git a/tests/main_test.py b/tests/main_test.py +index a1870e7..2edc86d 100644 +--- a/tests/main_test.py ++++ b/tests/main_test.py +@@ -15,7 +15,7 @@ class MainTest(TestCase): + + def test_main_until_quit(self): + """Run through vimiv main once.""" +- v_main.main(True) ++ v_main.main([], True) + + + if __name__ == '__main__': +diff --git a/vimiv/helpers.py b/vimiv/helpers.py +index 22f0115..bfaf016 100644 +--- a/vimiv/helpers.py ++++ b/vimiv/helpers.py +@@ -3,7 +3,6 @@ + """Wrappers around standard library functions used in vimiv.""" + + import os +-from subprocess import Popen, PIPE + from gi import require_version + require_version('Gtk', '3.0') + from gi.repository import Gtk +@@ -20,17 +19,17 @@ scrolltypes["K"] = (Gtk.ScrollType.START, False) + scrolltypes["L"] = (Gtk.ScrollType.END, True) + + # A list of all external commands +-external_commands = [] +-try: +- p = Popen('echo $PATH | tr \':\' \'\n\' | xargs -n 1 ls -1', +- stdout=PIPE, stderr=PIPE, shell=True) +- out, err = p.communicate() +- out = out.decode('utf-8').split() +- for cmd in sorted(list(set(out))): +- external_commands.append("!" + cmd) +-except: +- external_commands = [] +-external_commands = tuple(external_commands) ++pathenv = os.environ.get('PATH') ++if pathenv is not None: ++ executables = set() ++ for path in pathenv.split(':'): ++ try: ++ executables |= set(["!" + e for e in os.listdir(path)]) ++ except OSError: ++ continue ++ external_commands = tuple(sorted(list(executables))) ++else: ++ external_commands = () + + + def listdir_wrapper(path, show_hidden=False): +diff --git a/vimiv/imageactions.py b/vimiv/imageactions.py +index d92eb73..b9bc986 100644 +--- a/vimiv/imageactions.py ++++ b/vimiv/imageactions.py +@@ -157,8 +157,8 @@ class Thumbnails: + # Correct name + thumb_ext = ".thumbnail_%dx%d" % (self.thumbsize[0], + self.thumbsize[1]) +- outfile_ext = infile.split(".")[0] + thumb_ext + ".png" +- outfile_base = os.path.basename(outfile_ext) ++ infile_base = os.path.basename(infile) ++ outfile_base = infile_base.split(".")[0] + thumb_ext + ".png" + outfile = os.path.join(self.directory, outfile_base) + # Only if they aren't cached already + if outfile_base not in self.thumbnails: +diff --git a/vimiv/main.py b/vimiv/main.py +index a0e38cf..39f7407 100644 +--- a/vimiv/main.py ++++ b/vimiv/main.py +@@ -27,7 +27,7 @@ from vimiv.mark import Mark + from vimiv.information import Information + + +-def main(running_tests=False): ++def main(arguments, running_tests=False): + """Starting point for vimiv. + + Args: +@@ -36,7 +36,7 @@ def main(running_tests=False): + parser = get_args() + parse_dirs() + settings = parse_config() +- settings = parse_args(parser, settings) ++ settings = parse_args(parser, settings, arguments) + + args = settings["GENERAL"]["paths"] + +diff --git a/vimiv/parser.py b/vimiv/parser.py +index 874a538..9d5afce 100644 +--- a/vimiv/parser.py ++++ b/vimiv/parser.py +@@ -56,7 +56,7 @@ def get_args(): + return parser + + +-def parse_args(parser, settings, arguments=None): ++def parse_args(parser, settings, arguments): + """Parse the arguments and return the modified settings. + + Args: +@@ -66,10 +66,7 @@ def parse_args(parser, settings, arguments=None): + + Return: Modified settings after parsing the arguments. + """ +- if arguments: +- args = parser.parse_args(arguments) +- else: +- args = parser.parse_args() ++ args = parser.parse_args(arguments) + if args.show_version: + information = Information() + print(information.get_version()) +diff --git a/vimiv/vimiv b/vimiv/vimiv +index 5497e08..57f34f1 100755 +--- a/vimiv/vimiv ++++ b/vimiv/vimiv +@@ -5,4 +5,4 @@ import sys + import vimiv + + if __name__ == '__main__': +- sys.exit(vimiv.main.main()) ++ sys.exit(vimiv.main.main(sys.argv)) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 01d8593a676d..8fb9771d6fc4 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -14992,6 +14992,10 @@ in inherit (darwin.apple_sdk.frameworks) Carbon Cocoa; }; + vimiv = callPackage ../applications/graphics/vimiv { + inherit (gnome3) defaultIconTheme; + }; + macvim = callPackage ../applications/editors/vim/macvim.nix { stdenv = clangStdenv; ruby = ruby_2_2; }; vimHugeX = vim_configurable;