(List (Com {[LIT_CHARS set]} {[LIT_CHARS -eu]}) (= scope= flags=0 words=[] bindings=[('RELNOTES_TYPES', {[Array {[DQ [LIT_CHARS INC]]} {[DQ [LIT_CHARS NEW]]} {[DQ ]}]})]) (= scope= flags=0 words=[] bindings=[('RELNOTES_DESC', {[Array {[DQ [LIT_CHARS "Incompatible changes"]]} {[DQ [LIT_CHARS "New features"]]} {[DQ [LIT_CHARS "Important changes"]]}]})]) (FunctionDef get_last_release [] (List (= scope= flags=0 words=[] bindings=[('changelog', {[VarSub 1]})]) (AndOr OP_OR_IF (Com {[LIT_OTHER "["]} {[LIT_CHARS -f]} {[DQ [VarSub changelog]]} {[LIT_OTHER "]"]}) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('BASELINE_LINE', {[ComSub (Com {[LIT_CHARS grep]} {[LIT_CHARS -m]} {[LIT_CHARS 1]} {[LIT_CHARS -n]} {[SQ ]} {[DQ [VarSub changelog]]})]})]) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) (AndOr OP_OR_IF (Com {[LIT_OTHER "["]} {[LIT_CHARS -n]} {[DQ [VarSub BASELINE_LINE]]} {[LIT_OTHER "]"]}) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) (= scope= flags=0 words=[] bindings=[('BASELINE_LINENB', {[ComSub (Pipeline (Com {[LIT_CHARS echo]} {[DQ [VarSub BASELINE_LINE]]}) (Com {[LIT_CHARS cut]} {[LIT_CHARS -d]} {[DQ [LIT_CHARS ":"]]} {[LIT_CHARS -f]} {[LIT_CHARS 1]}) )]})]) (= scope= flags=0 words=[] bindings=[('BASELINE', {[ComSub (Pipeline (Com {[LIT_CHARS echo]} {[DQ [VarSub BASELINE_LINE]]}) (Com {[LIT_CHARS cut]} {[LIT_CHARS -d]} {[DQ [LIT_CHARS " "]]} {[LIT_CHARS -f]} {[LIT_CHARS 2]}) )]})]) (= scope= flags=0 words=[] bindings=[('CHERRYPICK_LINE', {[ArithSub {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[VarSub BASELINE_LINENB]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 3]}}}]})]) (= scope= flags=0 words=[] bindings=[('CHERRY_PICKS', {[ComSub (Pipeline (Com {[LIT_CHARS tail]} {[LIT_CHARS -n]} {[LIT_OTHER "+"] [VarSub CHERRYPICK_LINE]} {[DQ [VarSub changelog]]}) (Com {[LIT_CHARS grep]} {[LIT_CHARS -m]} {[LIT_CHARS 1]} {[DQ [LIT_CHARS "^"][LIT_OTHER "$"]]} {[LIT_CHARS -B999]}) (Com {[LIT_CHARS grep]} {[LIT_CHARS -E]} {[SQ ]}) (Com {[LIT_CHARS cut]} {[LIT_CHARS -d]} {[DQ [LIT_CHARS ":"]]} {[LIT_CHARS -f]} {[LIT_CHARS 1]}) (Com {[LIT_CHARS cut]} {[LIT_CHARS -d]} {[DQ [LIT_CHARS "+"]]} {[LIT_CHARS -f]} {[LIT_CHARS 2]}) )]})]) (Com {[LIT_CHARS echo]} {[VarSub BASELINE]} {[VarSub CHERRY_PICKS]}) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) ) (FunctionDef get_release_notes_commits [] (List (= scope= flags=0 words=[] bindings=[('baseline', {[VarSub 1]})]) (Com {[LIT_CHARS shift]}) (= scope= flags=0 words=[] bindings=[('cherry_picks', {[DQ [VarSub @]]})]) (= scope= flags=0 words=[] bindings=[('rollback_commits', {[ComSub (Pipeline (Com {[LIT_CHARS git]} {[LIT_CHARS log]} {[LIT_CHARS --oneline]} {[LIT_CHARS -E]} {[LIT_CHARS --grep] [LIT_OTHER "="] [SQ ]} {[VarSub baseline] [LIT_CHARS ..]}) (Com {[LIT_CHARS grep]} {[LIT_CHARS -E]} {[SQ ]}) )]})]) (= scope= flags=0 words=[] bindings=[('rollback_hashes', {[ComSub (Pipeline (Com {[LIT_CHARS echo]} {[DQ [VarSub rollback_commits]]}) (Com {[LIT_CHARS cut]} {[LIT_CHARS -d]} {[DQ [LIT_CHARS " "]]} {[LIT_CHARS -f]} {[LIT_CHARS 1]}) )]})]) (= scope= flags=0 words=[] bindings=[('rolledback_hashes', {[ComSub (Pipeline (Com {[LIT_CHARS echo]} {[DQ [VarSub rollback_commits]]}) (Com {[LIT_CHARS cut]} {[LIT_CHARS -d]} {[DQ [LIT_CHARS " "]]} {[LIT_CHARS -f]} {[LIT_CHARS 5]}) (Com {[LIT_CHARS sed]} {[LIT_CHARS -E]} {[SQ ]}) )]})]) (= scope= flags=0 words=[] bindings=[('exclude_hashes', {[ComSub (Pipeline (Com {[LIT_CHARS echo]} {[VarSub cherry_picks]} {[VarSub rollback_hashes]} {[VarSub rolledback_hashes]}) (Com {[LIT_CHARS xargs]} {[LIT_CHARS echo]}) (Com {[LIT_CHARS sed]} {[SQ ]}) )]})]) (Pipeline (Com {[LIT_CHARS git]} {[LIT_CHARS log]} {[LIT_CHARS --reverse]} {[LIT_CHARS --pretty] [LIT_OTHER "="] [LIT_CHARS format] [LIT_OTHER ":"] [LIT_OTHER "%"] [LIT_CHARS h]} {[VarSub baseline] [LIT_CHARS ..]} {[LIT_CHARS -E]} {[LIT_CHARS --grep] [LIT_OTHER "="] [SQ ]}) (Com {[LIT_CHARS grep]} {[LIT_CHARS -Ev]} {[DQ [LIT_CHARS "^("][VarSub exclude_hashes][LIT_CHARS ")"]]}) ) ) ) (FunctionDef extract_release_note [] (List (= scope= flags=0 words=[] bindings=[('relnote', {[DQ [ComSub (Pipeline (Com {[LIT_CHARS git]} {[LIT_CHARS show]} {[LIT_CHARS -s]} {[VarSub 1]} {[LIT_CHARS --pretty] [LIT_OTHER "="] [LIT_CHARS format] [LIT_OTHER ":"] [LIT_OTHER "%"] [LIT_CHARS B]}) (Com {[LIT_CHARS awk]} {[SQ ]}) )]]})]) (= scope= flags=0 words=[] bindings=[('regex', {[DQ [LIT_CHARS "^RELNOTES("][\ LIT_ESCAPED_CHAR "\\["][LIT_CHARS "([a-zA-Z]*)"][\ LIT_ESCAPED_CHAR "\\]"][LIT_CHARS ")?:[[:space:]]*([^[:space:]].*[^[:space:]])[[:space:]]*"][LIT_OTHER "$"]]})]) (If (DBracket {B2 BINARY_STRING_TILDE_EQUAL {[DQ [VarSub relnote]]} {[VarSub regex]}}) (List (= scope= flags=0 words=[] bindings=[('relnote_kind', {[VarSub BASH_REMATCH bracket_op=(Index {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 2]}})]})]) (= scope= flags=0 words=[] bindings=[('relnote_text', {[DQ [VarSub BASH_REMATCH bracket_op=(Index {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 3]}})]]})]) (If (DBracket {B! {B2 BINARY_STRING_TILDE_EQUAL {[DQ [ComSub (Pipeline (Com {[LIT_CHARS echo]} {[VarSub relnote_text]}) (Com {[LIT_CHARS awk]} {[SQ ]}) )]]} {[LIT_OTHER "^"] [LIT_CHARS "("] [LIT_CHARS none] [LIT_CHARS "|"] [LIT_CHARS n/a] [LIT_CHARS ")"] [LIT_OTHER "?"] [LIT_CHARS .] [LIT_OTHER "?"] [LIT_OTHER "$"]}}}) (Com {[LIT_CHARS eval]} {[DQ [LIT_CHARS RELNOTES_][VarSub relnote_kind][LIT_CHARS "+=("][\ LIT_ESCAPED_CHAR "\\\""][\ LIT_ESCAPED_CHAR "\\$"][LIT_CHARS "{relnote_text}"][\ LIT_ESCAPED_CHAR "\\\""][LIT_CHARS ")"]]}) ) ) ) ) ) (FunctionDef get_release_notes [] (List (For i [{[DQ [VarSub RELNOTES_TYPES bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}})]]}]) (Com {[LIT_CHARS eval]} {[DQ [LIT_CHARS RELNOTES_][VarSub i][LIT_CHARS "=()"]]}) ) (For i [{[VarSub @]}]) (Com {[LIT_CHARS extract_release_note]} {[VarSub i]}) ) ) ) (FunctionDef wrap_text [] (Pipeline (Com {[LIT_CHARS fold]} {[LIT_CHARS -s]} {[LIT_CHARS -w]} {[VarSub 1]}) (Com {[LIT_CHARS sed]} {[SQ ]}) ) ) (FunctionDef format_release_notes [] (List (= scope= flags=0 words=[{[LIT_CHARS i]}] bindings=[]) (ForExpr {A2 AS_OP_EQUAL {A Atom NODE_ARITH_WORD {[VarSub i]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}} {A2 AS_OP_LE {A Atom NODE_ARITH_WORD {[VarSub i]}} {A Atom NODE_ARITH_WORD {[VarSub #]}}} {A2 AS_OP_EQUAL {A Atom NODE_ARITH_WORD {[VarSub i]}} {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[VarSub i]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}}} (List (= scope= flags=0 words=[] bindings=[('relnote', {[DQ [VarSub i transform_ops=[(!ref)]]]})]) (= scope= flags=0 words=[] bindings=[('lines', {[ComSub (Pipeline (Com {[LIT_CHARS echo]} {[DQ [VarSub relnote]]}) (Com {[LIT_CHARS wrap_text]} {[LIT_CHARS 66]}) )]})]) (Pipeline (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS " - "][VarSub lines]]}) (Com {[LIT_CHARS head]} {[LIT_CHARS -1]}) ) (Pipeline (Com {[LIT_CHARS echo]} {[DQ [VarSub lines]]}) (Com {[LIT_CHARS tail]} {[LIT_CHARS -n]} {[LIT_OTHER "+"] [LIT_CHARS 2]}) (Com {[LIT_CHARS sed]} {[SQ ]}) ) ) ) ) ) (FunctionDef release_notes [] (List (= scope= flags=0 words=[{[LIT_CHARS i]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('commits', {[ComSub (Com {[LIT_CHARS get_release_notes_commits]} {[VarSub @]})]})]) (= scope= flags=0 words=[] bindings=[('length', {[DQ [VarSub RELNOTES_TYPES bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}}) transform_ops=[(#len)]]]})]) (Com {[LIT_CHARS get_release_notes]} {[DQ [VarSub commits]]}) (ForExpr {A2 AS_OP_EQUAL {A Atom NODE_ARITH_WORD {[VarSub i]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}}} {A2 AS_OP_LESS {A Atom NODE_ARITH_WORD {[VarSub i]}} {A Atom NODE_ARITH_WORD {[VarSub length]}}} {A2 AS_OP_EQUAL {A Atom NODE_ARITH_WORD {[VarSub i]}} {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[VarSub i]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}}} (List (= scope= flags=0 words=[] bindings=[('relnotes_title', {[DQ [VarSub RELNOTES_DESC bracket_op=(Index {A Atom NODE_ARITH_WORD {[VarSub i]}})]]})]) (= scope= flags=0 words=[] bindings=[('relnotes_type', {[VarSub RELNOTES_TYPES bracket_op=(Index {A Atom NODE_ARITH_WORD {[VarSub i]}})]})]) (= scope= flags=0 words=[] bindings=[('relnotes', {[DQ [LIT_CHARS RELNOTES_][VarSub relnotes_type][LIT_CHARS "[@]"]]})]) (= scope= flags=0 words=[] bindings=[('nb_relnotes', {[ComSub (Com {[LIT_CHARS eval]} {[DQ [LIT_CHARS "echo "][\ LIT_ESCAPED_CHAR "\\$"][LIT_CHARS "{#"][VarSub relnotes][LIT_CHARS "}"]]})]})]) (If (DParen {A2 AS_OP_GREAT {A Atom NODE_ARITH_WORD {[DQ [VarSub nb_relnotes]]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}}}) (List (Com {[LIT_CHARS echo]} {[DQ [VarSub relnotes_title][LIT_CHARS ":"]]}) (Com {[LIT_CHARS echo]}) (Com {[LIT_CHARS format_release_notes]} {[DQ [VarSub relnotes transform_ops=[(!ref)]]]}) (Com {[LIT_CHARS echo]}) ) ) ) ) ) ) (FunctionDef create_release_notes [] (List (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('last_release', {[ComSub (Com {[LIT_CHARS get_last_release]} {[DQ [VarSub 1]]})]})]) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Initial release."]]}) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) ) (AndOr OP_OR_IF (Com {[LIT_OTHER "["]} {[LIT_CHARS -n]} {[DQ [VarSub last_release]]} {[LIT_OTHER "]"]}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Initial release."]]}) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) ) (Com {[LIT_CHARS release_notes]} {[VarSub last_release]}) ) ) (FunctionDef create_revision_information [] (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Baseline: "][ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS rev-parse]} {[LIT_CHARS --short]} {[DQ [VarSub 1]]})]]}) (= scope= flags=0 words=[] bindings=[('first', {[LIT_CHARS 1]})]) (Com {[LIT_CHARS shift]}) (While (Com {[LIT_OTHER "["]} {[LIT_CHARS -n]} {[DQ [VarSub 1 test_op=VS_TEST_HYPHEN {}]]} {[LIT_OTHER "]"]}) (List (If (DBracket {B2 BINARY_INT_EQ {[DQ [VarSub first]]} {[LIT_CHARS 1]}}) (List (Com {[LIT_CHARS echo]} {[LIT_CHARS -e]} {[DQ [\ LIT_ESCAPED_CHAR "\\n"][LIT_CHARS "Cherry picks:"]]}) (= scope= flags=0 words=[] bindings=[('first', {[LIT_CHARS 0]})]) ) ) (= scope= flags=0 words=[] bindings=[('hash', {[DQ [ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS rev-parse]} {[LIT_CHARS --short]} {[DQ [VarSub 1]]})]]})]) (= scope= flags=0 words=[] bindings=[('subject', {[ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS show]} {[LIT_CHARS -s]} {[LIT_CHARS --pretty] [LIT_OTHER "="] [LIT_CHARS format] [LIT_OTHER ":"] [LIT_OTHER "%"] [LIT_CHARS s]} {[VarSub hash]})]})]) (= scope= flags=0 words=[] bindings=[('lines', {[ComSub (Pipeline (Com {[LIT_CHARS echo]} {[DQ [VarSub subject]]}) (Com {[LIT_CHARS wrap_text]} {[LIT_CHARS 56]}) )]})]) (Pipeline (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS " + "][VarSub hash][LIT_CHARS ": "][VarSub lines]]}) (Com {[LIT_CHARS head]} {[LIT_CHARS -1]}) ) (Pipeline (Com {[LIT_CHARS echo]} {[DQ [VarSub lines]]}) (Com {[LIT_CHARS tail]} {[LIT_CHARS -n]} {[LIT_OTHER "+"] [LIT_CHARS 2]}) (Com {[LIT_CHARS sed]} {[SQ ]}) ) (Com {[LIT_CHARS shift]}) ) ) ) ) )