(command.CommandList children: [ (C {<Id.KW_Set set>} {<-e>}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.Pipeline children: [ (command.Simple words: [{<command>} {<-v>} {<curl>}] redirects: [ (redir op: <Id.Redir_AndGreat '&>'> loc: (redir_loc.Fd fd:1) arg: {<'/dev/null'>} ) ] do_fork: T ) ] negated: T ) terminator: <Id.Op_Semi _> ) ] action: [ (command.Simple words: [{<echo>} {(SQ <'error: "curl" not found!'>)}] redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})] do_fork: T ) (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>}) ] spids: [22 37] ) ] ) (command.ShFunction name: usage body: (BraceGroup children: [ (C {<echo>} {(DQ <'usage: '> ($ Id.VSub_Number '$0') <' dir image[:tag][@image-id] ...'>)}) (C {<echo>} {(DQ <' ie: '> ($ Id.VSub_Number '$0') <' /tmp/hello-world hello-world'>)}) (C {<echo>} {(DQ <' '> ($ Id.VSub_Number '$0') <' /tmp/debian-jessie debian:jessie'>)}) (C {<echo>} { (DQ <' '> ($ Id.VSub_Number '$0') < ' /tmp/old-hello-world hello-world@ef872312fe1bbc5e05aae626791a47ee9b032efa8f3bda39cc0be7b56bfe59b9' > ) } ) (C {<echo>} { (DQ <' '> ($ Id.VSub_Number '$0') < ' /tmp/old-debian debian:latest@f6fab3b798be3174f45aa1eb731f8182705555f89c9026d8c1ef230cbf8301dd' > ) } ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_Number '$1'))} {<Id.Lit_RBracket ']'>}) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {(DQ ($ Id.VSub_Number '$1'))} ) ] ) ] ) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:dir) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$1'))} spids: [130] ) ] ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {<shift>}) (command.Simple words: [{<usage>} {<1>}] redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})] do_fork: T ) ] ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {<Id.Lit_LBracket '['>} {($ Id.VSub_Pound '$#')} {<-gt>} {<0>} {<-a>} {(DQ ($ Id.VSub_DollarName '$dir'))} {<Id.Lit_RBracket ']'>} ) (command.Simple words: [{<usage>} {<2>}] redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})] do_fork: T ) ] ) (C {<mkdir>} {<-p>} {(DQ ($ Id.VSub_DollarName '$dir'))}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:images) op: assign_op.Equal rhs: {(sh_array_literal left:<Id.Op_LParen _>)} spids: [187] ) ] ) (C {<rm>} {<-f>} {(DQ ($ Id.VSub_DollarName '$dir')) <'/tags-'> <Id.Lit_Star '*'> <.tmp>}) (command.WhileUntil keyword: <Id.KW_While while> cond: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {($ Id.VSub_Pound '$#')} {<-gt>} {<0>} {<Id.Lit_RBracket ']'>}) terminator: <Id.Op_Semi _> ) ] body: (command.DoGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:imageTag) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$1'))} spids: [222] ) ] ) (C {<shift>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:image) op: assign_op.Equal rhs: { (DQ (braced_var_sub token: <Id.VSub_Name imageTag> suffix_op: (suffix_op.Unary op_id:Id.VOp1_DPercent arg_word:{<'[:@]*'>}) ) ) } spids: [231] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:tag) op: assign_op.Equal rhs: { (DQ (braced_var_sub token: <Id.VSub_Name imageTag> suffix_op: (suffix_op.Unary op_id:Id.VOp1_Pound arg_word:{<'*:'>}) ) ) } spids: [241] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:imageId) op: assign_op.Equal rhs: { (DQ (braced_var_sub token: <Id.VSub_Name tag> suffix_op: (suffix_op.Unary op_id:Id.VOp1_DPound arg_word:{<'*@'>}) ) ) } spids: [251] ) ] ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$imageId'))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName '$tag'))} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:imageId) op: assign_op.Equal rhs: (word.Empty) spids: [278] ) ] ) ] ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$tag'))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName '$imageTag'))} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:tag) op: assign_op.Equal rhs: {(SQ <latest>)} spids: [298] ) ] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:tag) op: assign_op.Equal rhs: { (DQ (braced_var_sub token: <Id.VSub_Name tag> suffix_op: (suffix_op.Unary op_id:Id.VOp1_Percent arg_word:{<'@*'>}) ) ) } spids: [304] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:imageFile) op: assign_op.Equal rhs: { (DQ (braced_var_sub token: <Id.VSub_Name image> suffix_op: (suffix_op.PatSub pat: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\/'>)} replace: {<_>} replace_mode: Id.Lit_Slash ) ) ) } spids: [315] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:token) op: assign_op.Equal rhs: { (DQ (command_sub left_token: <Id.Left_DollarParen '$('> child: (command.Pipeline children: [ (C {<curl>} {<-sSL>} {<-o>} {<'/dev/null'>} {<-D->} {<-H>} {(SQ <'X-Docker-Token: true'>)} {(DQ <'https://index.docker.io/v1/repositories/'> ($ Id.VSub_DollarName '$image') <'/images'>)} ) (C {<tr>} {<-d>} {(SQ <'\\r'>)}) (C {<awk>} {<-F>} {(SQ <': *'>)} {(SQ <'$1 == "X-Docker-Token" { print $2 }'>)} ) ] negated: F ) ) ) } spids: [332] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$imageId'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:imageId) op: assign_op.Equal rhs: { (DQ (command_sub left_token: <Id.Left_DollarParen '$('> child: (C {<curl>} {<-sSL>} {<-H>} {(DQ <'Authorization: Token '> ($ Id.VSub_DollarName '$token'))} { (DQ <'https://registry-1.docker.io/v1/repositories/'> ($ Id.VSub_DollarName '$image') <'/tags/'> ($ Id.VSub_DollarName '$tag') ) } ) ) ) } spids: [401] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:imageId) op: assign_op.Equal rhs: { (DQ (braced_var_sub token: <Id.VSub_Name imageId> suffix_op: (suffix_op.PatSub pat: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>)} replace: {} replace_mode: Id.Lit_Slash ) ) ) } spids: [425] ) ] ) ] spids: [385 398] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ancestryJson) op: assign_op.Equal rhs: { (DQ (command_sub left_token: <Id.Left_DollarParen '$('> child: (C {<curl>} {<-sSL>} {<-H>} {(DQ <'Authorization: Token '> ($ Id.VSub_DollarName '$token'))} {(DQ <'https://registry-1.docker.io/v1/images/'> ($ Id.VSub_DollarName '$imageId') <'/ancestry'>)} ) ) ) } spids: [441] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} { (DQ (braced_var_sub token: <Id.VSub_Name ancestryJson> suffix_op: (suffix_op.Slice begin: {<Id.Lit_Digits 0>} length: {<Id.Lit_Digits 1>} ) ) ) } {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(SQ <'['>)} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] action: [ (command.Simple words: [ {<echo>} { (DQ <'error: /v1/images/'> ($ Id.VSub_DollarName '$imageId') <'/ancestry returned something unexpected:'> ) } ] redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})] do_fork: T ) (command.Simple words: [{<echo>} {(DQ <' '> ($ Id.VSub_DollarName '$ancestryJson'))}] redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})] do_fork: T ) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {<1>} ) ] spids: [464 488] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:IFS) op: assign_op.Equal rhs: {(SQ <','>)} spids: [523] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ancestry) op: assign_op.Equal rhs: { (sh_array_literal left: <Id.Op_LParen _> words: [ { (braced_var_sub token: <Id.VSub_Name ancestryJson> suffix_op: (suffix_op.PatSub pat: {<'['> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\['>) (word_part.EscapedLiteral token: <Id.Lit_EscapedChar '\\]'> ) <' '> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <']'> } replace: {} replace_mode: Id.Lit_Slash ) ) } ] ) } spids: [529] ) ] ) (C {<unset>} {<IFS>}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-s>} { (DQ ($ Id.VSub_DollarName '$dir') <'/tags-'> ($ Id.VSub_DollarName '$imageFile') <.tmp> ) } {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] action: [ (command.Simple words: [{<echo>} {<-n>} {(SQ <', '>)}] redirects: [ (redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: { (DQ ($ Id.VSub_DollarName '$dir') <'/tags-'> ($ Id.VSub_DollarName '$imageFile') <.tmp> ) } ) ] do_fork: T ) ] spids: [554 570] ) ] else_action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:images) op: assign_op.Equal rhs: { (sh_array_literal left: <Id.Op_LParen _> words: [ { (DQ (braced_var_sub token: <Id.VSub_Name images> bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At) ) ) } {(DQ ($ Id.VSub_DollarName '$image'))} ] ) } spids: [594] ) ] ) ] ) (command.Simple words: [ {<echo>} {<-n>} {(SQ <'"'>) (DQ ($ Id.VSub_DollarName '$tag')) (SQ <'": "'>) (DQ ($ Id.VSub_DollarName '$imageId')) (SQ <'"'>) } ] redirects: [ (redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: { (DQ ($ Id.VSub_DollarName '$dir') <'/tags-'> ($ Id.VSub_DollarName '$imageFile') <.tmp> ) } ) ] do_fork: T ) (C {<echo>} { (DQ <'Downloading \''> ($ Id.VSub_DollarName '$imageTag') <'\' ('> (braced_var_sub token: <Id.VSub_Name ancestry> prefix_op: (Id.VSub_Pound) bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At) ) <' layers)...'> ) } ) (command.ForEach iter_name: imageId iter_words: [ { (DQ (braced_var_sub token: <Id.VSub_Name ancestry> bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At) ) ) } ] do_arg_iter: F body: (command.DoGroup children: [ (C {<mkdir>} {<-p>} {(DQ ($ Id.VSub_DollarName '$dir') <'/'> ($ Id.VSub_DollarName '$imageId'))} ) (command.Simple words: [{<echo>} {(SQ <1.0>)}] redirects: [ (redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: { (DQ ($ Id.VSub_DollarName '$dir') <'/'> ($ Id.VSub_DollarName '$imageId') <'/VERSION'> ) } ) ] do_fork: T ) (C {<curl>} {<-sSL>} {<-H>} {(DQ <'Authorization: Token '> ($ Id.VSub_DollarName '$token'))} {(DQ <'https://registry-1.docker.io/v1/images/'> ($ Id.VSub_DollarName '$imageId') <'/json'>)} {<-o>} { (DQ ($ Id.VSub_DollarName '$dir') <'/'> ($ Id.VSub_DollarName '$imageId') <'/json'> ) } ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-f>} { (DQ ($ Id.VSub_DollarName '$dir') <'/'> ($ Id.VSub_DollarName '$imageId') <'/layer.tar'> ) } {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] action: [ (C {<echo>} { (DQ <'skipping existing '> (braced_var_sub token: <Id.VSub_Name imageId> suffix_op: (suffix_op.Slice begin: {<Id.Lit_Digits 0>} length: {<Id.Lit_Digits 12>} ) ) ) } ) (command.ControlFlow token: <Id.ControlFlow_Continue continue> ) ] spids: [751 767] ) ] ) (C {<curl>} {<-SL>} {<--progress>} {<-H>} {(DQ <'Authorization: Token '> ($ Id.VSub_DollarName '$token'))} {(DQ <'https://registry-1.docker.io/v1/images/'> ($ Id.VSub_DollarName '$imageId') <'/layer'>)} {<-o>} { (DQ ($ Id.VSub_DollarName '$dir') <'/'> ($ Id.VSub_DollarName '$imageId') <'/layer.tar'> ) } ) ] ) ) (C {<echo>}) ] ) ) (command.Simple words: [{<echo>} {<-n>} {(SQ <'{'>)}] redirects: [ (redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {(DQ ($ Id.VSub_DollarName '$dir') <'/repositories'>)} ) ] do_fork: T ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:firstImage) op: assign_op.Equal rhs: {<1>} spids: [849] ) ] ) (command.ForEach iter_name: image iter_words: [ { (DQ (braced_var_sub token: <Id.VSub_Name images> bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At) ) ) } ] do_arg_iter: F body: (command.DoGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:imageFile) op: assign_op.Equal rhs: { (DQ (braced_var_sub token: <Id.VSub_Name image> suffix_op: (suffix_op.PatSub pat: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\/'>)} replace: {<_>} replace_mode: Id.Lit_Slash ) ) ) } spids: [871] ) ] ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$firstImage'))} {<Id.Lit_RBracket ']'>} ) (command.Simple words: [{<echo>} {<-n>} {(SQ <','>)}] redirects: [ (redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(DQ ($ Id.VSub_DollarName '$dir') <'/repositories'>)} ) ] do_fork: T ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:firstImage) op: assign_op.Equal rhs: (word.Empty) spids: [914] ) ] ) (command.Simple words: [ {<echo>} {<-n>} { (single_quoted left: <Id.Left_SingleQuoteC '$\''> tokens: [<Id.Char_OneChar '\\n'> <Id.Char_OneChar '\\t'>] ) } ] redirects: [ (redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(DQ ($ Id.VSub_DollarName '$dir') <'/repositories'>)} ) ] do_fork: T ) (command.Simple words: [ {<echo>} {<-n>} {(SQ <'"'>) (DQ ($ Id.VSub_DollarName '$image')) (SQ <'": { '>) (DQ (command_sub left_token: <Id.Left_DollarParen '$('> child: (C {<cat>} { (DQ ($ Id.VSub_DollarName '$dir') <'/tags-'> ($ Id.VSub_DollarName '$imageFile') <.tmp> ) } ) ) ) (SQ <' }'>) } ] redirects: [ (redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(DQ ($ Id.VSub_DollarName '$dir') <'/repositories'>)} ) ] do_fork: T ) ] ) ) (command.Simple words: [ {<echo>} {<-n>} { (single_quoted left: <Id.Left_SingleQuoteC '$\''> tokens: [<Id.Char_OneChar '\\n'> <Id.Char_Literals '}'> <Id.Char_OneChar '\\n'>] ) } ] redirects: [ (redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(DQ ($ Id.VSub_DollarName '$dir') <'/repositories'>)} ) ] do_fork: T ) (C {<rm>} {<-f>} {(DQ ($ Id.VSub_DollarName '$dir')) <'/tags-'> <Id.Lit_Star '*'> <.tmp>}) (C {<echo>} {(DQ <'Download of images into \''> ($ Id.VSub_DollarName '$dir') <'\' complete.'>)}) (C {<echo>} {(DQ <'Use something like the following to load the result into a Docker daemon:'>)}) (C {<echo>} {(DQ <' tar -cC \''> ($ Id.VSub_DollarName '$dir') <'\' . | docker load'>)}) ] )