diff options
Diffstat (limited to 'gi-find-deps.sh')
-rwxr-xr-x | gi-find-deps.sh | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/gi-find-deps.sh b/gi-find-deps.sh new file mode 100755 index 0000000..5cb3905 --- /dev/null +++ b/gi-find-deps.sh @@ -0,0 +1,85 @@ +#!/bin/sh + +# Automatically find Provides and Requires for typelib() gobject-introspection bindings. +# can be started with -R (Requires) and -P (Provides) + +# Copyright 2011 by Dominique Leuenberger, Amsterdam, Netherlands (dimstar [at] opensuse.org) +# This file is released under the GPLv2 or later. + +function split_name_version { +base=$1 +tsymbol=${base%-*} +# Sometimes we get a Requires on Gdk.Settings.foo, bebause you can directly use imports.gi.Gdk.Settings.Foo in Javascript. +# We know that the symbol in this case is call Gdk, so we cut everything after the . away. +symbol=$(echo $tsymbol | awk -F. '{print $1}') +version=${base#*-} +# In case there is no '-' in the filename, then the split above 'fails' and version == symbol (thus: no version specified) +if [ "$tsymbol" = "$version" ]; then + unset version +fi +} + +function print_req_prov { +echo -n "typelib($symbol)" +if [ ! -z "$version" ]; then + echo " = ${version}" +else + echo "" +fi +} + +function find_provides { +while read file; do + case $file in + *.typelib) + split_name_version $(basename $file | sed 's,.typelib$,,') + print_req_prov + ;; + esac +done +} + +function find_requires { +# FIXME: There are multiple ways gi bindings can be imported. We only catch the 'basic' one +# Currently, we detect: +# - in python: +# . from gi.repository import foo [Unversioned requirement of 'foo'] +# . from gi.repository import foo-1.0 [versioned requirement] +# . And we do not stumble over: +# from gi.repository import foo as _bar +# from gi.repository import foo, bar +# - in JS: +# . imports.gi.foo; [unversioned requirement of 'foo'] +# . imports.gi.goo-1.0; [versioned requirement] +# . The imports can be listed on one line, and we catch them. +# Forms currently not detected: +# - js: imports.gi.versions.Gtk = '3.0'; +# - py: gi.require_version('Gtk', '3.0') + +while read file; do + case $file in + *.js) + for module in $(grep -h -P -o "imports.gi.([^\s'\";]+)" $file | grep -v "imports.gi.version" | sed 's,imports.gi.,,'); do + split_name_version $module + print_req_prov + done + ;; + *.py) + for module in $(grep -h -P "from gi.repository import (\w+)" $file | sed 's:#.*::' | sed -e 's,from gi.repository import,,' -r -e 's:\s+as\s+\w+::g' -e 's:,::g'); do + split_name_version $module + print_req_prov + done + ;; + esac +done +} + +case $1 in + -P) + find_provides + ;; + -R) + find_requires + ;; +esac + |