aboutsummaryrefslogtreecommitdiffstats
path: root/gi-find-deps.sh
diff options
context:
space:
mode:
Diffstat (limited to 'gi-find-deps.sh')
-rwxr-xr-xgi-find-deps.sh85
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
+