code: func (s *Action) Version(ctx context.Context, c *cli.Context) error {
  	version := make(chan string, 1)
  	go s.checkVersion(ctx, version)
  
  	_ = s.Initialized(ctx, c)
  
  	cli.VersionPrinter(c)
  
  	cryptoVer := versionInfo(ctx, s.Store.Crypto(ctx, ""))
  	rcsVer := versionInfo(ctx, s.Store.RCS(ctx, ""))
  	storageVer := versionInfo(ctx, s.Store.Storage(ctx, ""))
  
  	tpl := "%-10s - %10s - %10s - %10s\n"
  	fmt.Fprintf(stdout, tpl, "<root>", cryptoVer, rcsVer, storageVer)
  
  	// report all used crypto, sync and fs backends
  	for _, mp := range s.Store.MountPoints() {
  		cv := versionInfo(ctx, s.Store.Crypto(ctx, mp))
  		rv := versionInfo(ctx, s.Store.RCS(ctx, mp))
  		sv := versionInfo(ctx, s.Store.Storage(ctx, mp))
  
  		if cv != cryptoVer || rv != rcsVer || sv != storageVer {
  			fmt.Fprintf(stdout, tpl, mp, cv, rv, sv)
  		}
  	}
  
  	fmt.Fprintf(stdout, "Available Crypto Backends: %s\n", strings.Join(backend.CryptoBackends(), ", "))
  	fmt.Fprintf(stdout, "Available RCS Backends: %s\n", strings.Join(backend.RCSBackends(), ", "))
  	fmt.Fprintf(stdout, "Available Storage Backends: %s\n", strings.Join(backend.StorageBackends(), ", "))
  
  	select {
  	case vi := <-version:
  		if vi != "" {
  			fmt.Fprintln(stdout, vi)
  		}
  	case <-time.After(2 * time.Second):
  		out.Error(ctx, "Version check timed out")
  	case <-ctx.Done():
  		return ExitError(ctx, ExitAborted, nil, "user aborted")
  	}
  
  	return nil
  }
docs: // Version prints the gopass version