code: func (p *printer) steps(steps []*pb.Step) {
  	maxNameWidth := 0
  	for _, s := range steps {
  		if w := utf8.RuneCountInString(s.Name); w > maxNameWidth {
  			maxNameWidth = w
  		}
  	}
  
  	for _, s := range steps {
  		p.f("%sStep ", ansiStatus[s.Status])
  		p.fw(maxNameWidth+5, "%q", s.Name)
  		p.fw(10, "%s", s.Status)
  
  		// Print duration.
  		durString := ""
  		if start, err := ptypes.Timestamp(s.StartTime); err == nil {
  			var stepDur time.Duration
  			if end, err := ptypes.Timestamp(s.EndTime); err == nil {
  				stepDur = end.Sub(start)
  			} else {
  				now := p.nowFn()
  				stepDur = now.Sub(start.In(now.Location()))
  			}
  			durString = truncateDuration(stepDur).String()
  		}
  		p.fw(10, "%s", durString)
  
  		// Print log names.
  		// Do not print log URLs because they are very long and
  		// bb has `log` subcommand.
  		if len(s.Logs) > 0 {
  			p.f("Logs: ")
  			for i, l := range s.Logs {
  				if i > 0 {
  					p.f(", ")
  				}
  				p.f("%q", l.Name)
  			}
  		}
  
  		p.f("%s\n", ansi.Reset)
  
  		p.indent.Level += 2
  		if s.SummaryMarkdown != "" {
  			// TODO(nodir): transform lists of links to look like logs
  			p.summary(s.SummaryMarkdown)
  		}
  		p.indent.Level -= 2
  	}
  }
docs: // steps print steps.