code: func ToMiloBuild(c context.Context, b *bbv1.ApiCommonBuildMessage, fetchFull bool) (*ui.MiloBuildLegacy, error) {
  	mb, err := toMiloBuildInMemory(c, b)
  	if err != nil {
  		return nil, err
  	}
  
  	if !fetchFull {
  		return mb, nil
  	}
  
  	// Add step information from LogDog.  If this fails, we still have perfectly
  	// valid information from Buildbucket, so just annotate the build with the
  	// error and continue.
  	if b.StartedTs != 0 {
  		if addr, step, err := getStep(c, b); err == nil {
  			ub := rawpresentation.NewURLBuilder(addr)
  			mb.Components, mb.PropertyGroup = rawpresentation.SubStepsToUI(c, ub, step.Substep)
  		} else if b.Status == bbv1.StatusCompleted {
  			// TODO(hinoka): This might be better placed in a error butterbar.
  			mb.Components = append(mb.Components, &ui.BuildComponent{
  				Label:  ui.NewEmptyLink("Failed to fetch step information from LogDog"),
  				Text:   strings.Split(err.Error(), "\n"),
  				Status: model.InfraFailure,
  			})
  		}
  	}
  
  	// Add blame information.  If this fails, this add in a placeholder with an error.
  	mb.Blame = getBlameLegacy(c, b)
  
  	return mb, nil
  }
docs: // ToMiloBuild converts a raw buildbucket build to a milo build.
  //
  // Returns an error only on failure to reach buildbucket.
  // Other errors are surfaced in the returned build.
  //
  // TODO(hinoka): Some of this can be done concurrently. Investigate if this call
  // takes >500ms on average.
  // TODO(crbug.com/850113): stop loading steps from logdog.