{ "file": { "doc": ["Replace a file, logically in place, by a patched version"] , "target_fields": ["src", "patch"] , "string_fields": ["patch-part"] , "config_vars": ["PATCH", "ENV"] , "field_doc": { "src": [ "The single source file to patch, typically an explicit 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"] , "runfiles_doc": ["Same as artifacts"] , "imports": { "stage_field": ["./", "..", "stage_singleton_field"] , "stage_artifact": ["./", "..", "stage_artifact_to_singleton_field"] } , "expression": { "type": "let*" , "bindings": [ [ "orig" , { "type": "let*" , "bindings": [["fieldname", "src"], ["location", "orig"]] , "body": {"type": "CALL_EXPRESSION", "name": "stage_field"} } ] , [ "patch" , { "type": "let*" , "bindings": [["fieldname", "patch"], ["location", "patch"]] , "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"] , "env": {"type": "var", "name": "ENV", "default": {"type": "empty_map"}} } , "else": {"type": "var", "name": "patch"} } ] , [ "inputs" , { "type": "map_union" , "$1": [{"type": "var", "name": "orig"}, {"type": "var", "name": "patch"}] } ] , [ "patched" , { "type": "ACTION" , "inputs": {"type": "var", "name": "inputs"} , "outs": ["patched"] , "cmd": [ {"type": "var", "name": "PATCH", "default": "patch"} , "-s" , "--read-only=ignore" , "--follow-symlinks" , "-o" , "patched" , "orig" , "patch" ] } ] , [ "result" , { "type": "let*" , "bindings": [ ["artifact", {"type": "var", "name": "patched"}] , ["fieldname", "src"] ] , "body": {"type": "CALL_EXPRESSION", "name": "stage_artifact"} } ] ] , "body": { "type": "RESULT" , "artifacts": {"type": "var", "name": "result"} , "runfiles": {"type": "var", "name": "result"} } } } }