diff --git a/cook.sh b/cook.sh
index 9a20c173aea9b21da5616a3cacca441207e5ac93..7fb8c9deabda6c474b3aafb4ff43694301f26a38 100755
--- a/cook.sh
+++ b/cook.sh
@@ -101,6 +101,14 @@ function op {
             fi
             popd > /dev/null
             ;;
+        gitversion)
+            if [ -d build/.git ]
+            then
+                echo "$(op $1 version)-$(git -C build rev-parse --short HEAD)"
+            else
+                op $1 version
+            fi
+            ;;
         update)
             pushd build > /dev/null
             skip="0"
diff --git a/update-all.sh b/update-all.sh
new file mode 100755
index 0000000000000000000000000000000000000000..18a41e85c2acb1556bccc56d1c211d39ab59b00e
--- /dev/null
+++ b/update-all.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+set -e
+
+for recipe in `ls -1 recipes`
+do
+    if [ ! -f "recipes/$recipe/stage.tar" ]
+    then
+        echo "$recipe: building..."
+        ./cook.sh $recipe dist
+    else
+        oldver=$(./cook.sh $recipe gitversion)
+        ./cook.sh $recipe update
+        newver=$(./cook.sh $recipe gitversion)
+        if [ "$oldver" = "$newver" ]
+        then
+            echo "$recipe: up to date (version $newver)."
+        else
+            echo "$recipe: updating $oldver -> $newver..."
+    	    ./cook.sh $recipe dist
+        fi
+    fi
+done