diff options
-rw-r--r-- | patch/RULES | 68 |
1 files changed, 67 insertions, 1 deletions
diff --git a/patch/RULES b/patch/RULES index 15bc818..ab5f102 100644 --- a/patch/RULES +++ b/patch/RULES @@ -1,11 +1,17 @@ { "file": - { "doc": ["Replace a file, logically in pace, by a patched version"] + { "doc": ["Replace a file, logically in place, by a patched version"] , "target_fields": ["src", "patch"] + , "string_fields": ["patch-part"] , "config_vars": ["PATCH"] , "field_doc": { "src": ["The single source file to patch, typically an explict file reference."] , "patch": ["The patch to apply."] + , "patch-part": + [ "If the patch contains hunks for multiple files, only apply hunks for" + , "the specified file path. Individual directory components are joined" + , "with \"/\". Note that the patch must be provided in unified format." + ] } , "artifacts_doc": ["The patched file, staged to the position the of the original file"] @@ -29,6 +35,66 @@ , "body": {"type": "CALL_EXPRESSION", "name": "stage_field"} } ] + , [ "patch-part" + , { "type": "join" + , "separator": "\\/" + , "$1": {"type": "FIELD", "name": "patch-part"} + } + ] + , [ "splitpatch" + , { "type": "BLOB" + , "data": + { "type": "join" + , "separator": "\n" + , "$1": + [ "set -e" + , { "type": "join" + , "$1": + [ { "type": "join_cmd" + , "$1": + [ "sed" + , "-n" + , { "type": "join" + , "$1": + [ "/^--- " + , {"type": "var", "name": "patch-part"} + , "/," + , "/^[^-+@\\ ]\\|^---\\ /p" + ] + } + ] + } + , " $1 | sed '$d' > patch" + ] + } + ] + } + } + ] + , [ "patch" + , { "type": "if" + , "cond": {"type": "var", "name": "patch-part"} + , "then": + { "type": "ACTION" + , "inputs": + { "type": "map_union" + , "$1": + [ { "type": "to_subdir" + , "subdir": "in" + , "$1": {"type": "var", "name": "patch"} + } + , { "type": "singleton_map" + , "key": "splitpatch" + , "value": {"type": "var", "name": "splitpatch"} + } + ] + } + , "outs": ["patch"] + , "cmd": ["sh", "./splitpatch", "in/patch"] + } + , "else": {"type": "var", "name": "patch"} + } + ] , [ "inputs" , { "type": "map_union" , "$1": |