code: func (f *File) Download(config *api.Config) (*git.SourceInfo, error) {
  	config.WorkingSourceDir = filepath.Join(config.WorkingDir, constants.Source)
  
  	copySrc := config.Source.LocalPath()
  	if len(config.ContextDir) > 0 {
  		copySrc = filepath.Join(copySrc, config.ContextDir)
  	}
  
  	glog.V(1).Infof("Copying sources from %q to %q", copySrc, config.WorkingSourceDir)
  	absWorkingSourceDir, err := filepath.Abs(config.WorkingSourceDir)
  	if err != nil {
  		return nil, err
  	}
  	absCopySrc, err := filepath.Abs(copySrc)
  	if err != nil {
  		return nil, err
  	}
  	if filepath.HasPrefix(absWorkingSourceDir, absCopySrc) {
  		return nil, RecursiveCopyError{error: fmt.Errorf("recursive copy requested, source directory %q contains the target directory %q", copySrc, config.WorkingSourceDir)}
  	}
  
  	if copySrc != config.WorkingSourceDir {
  		f.KeepSymlinks(config.KeepSymlinks)
  		err := f.CopyContents(copySrc, config.WorkingSourceDir)
  		if err != nil {
  			return nil, err
  		}
  	}
  
  	return &git.SourceInfo{
  		Location:   config.Source.LocalPath(),
  		ContextDir: config.ContextDir,
  	}, nil
  }
docs: // Download copies sources from a local directory into the working directory.
  // Caller guarantees that config.Source.IsLocal() is true.