$ curl https://github.com/archlinux/mkinitcpio/commit/9ee1333a5f3302d7ddb004cf0909c94b4cff60ba.diff
diff --git a/functions b/functions
index 9539a60..f95fb92 100644
--- a/functions
+++ b/functions
@@ -625,6 +625,46 @@ add_binary() {
     return 0
 }
 
+add_udev_rule() {
+    # Add an udev rules file to the initcpio image. Dependencies on binaries
+    # will be discovered and added.
+    #   $1: path to rules file (or name of rules file)
+
+    local rules="$1" rule= key= value= binary=
+
+    if [[ ${rules:0:1} != '/' ]]; then
+        rules=$(PATH=/usr/lib/udev/rules.d:/lib/udev/rules.d type -P "$rules")
+    fi
+    if [[ -z $rules ]]; then
+        # complain about not found rules
+        return 1
+    fi
+
+    add_file "$rules" /usr/lib/udev/rules.d/"${rules##*/}"
+
+    while IFS=, read -ra rule; do
+        # skip empty lines, comments
+        [[ -z $rule || $rule = @(+([[:space:]])|#*) ]] && continue
+
+        for pair in "${rule[@]}"; do
+            IFS=' =' read -r key value <<< "$pair"
+            case $key in
+                RUN@({program}|+)|IMPORT{program}|ENV{REMOVE_CMD})
+                    # strip quotes
+                    binary=${value//[\"\']/}
+                    # just take the first word as the binary name
+                    binary=${binary%% *}
+                    [[ ${binary:0:1} == '$' ]] && continue
+                    if [[ ${binary:0:1} != '/' ]]; then
+                        binary=$(PATH=/usr/lib/udev:/lib/udev type -P "$binary")
+                    fi
+                    add_binary "$binary"
+                    ;;
+            esac
+        done
+    done <"$rules"
+}
+
 parse_config() {
     # parse key global variables set by the config file.
 
