code: func Key(repo string) (string, error) {
  
  	var u *url.URL
  	var err error
  	var strip bool
  	if m := scpSyntaxRe.FindStringSubmatch(repo); m != nil {
  		// Match SCP-like syntax and convert it to a URL.
  		// Eg, "git@github.com:user/repo" becomes
  		// "ssh://git@github.com/user/repo".
  		u = &url.URL{
  			Scheme: "ssh",
  			User:   url.User(m[1]),
  			Host:   m[2],
  			Path:   "/" + m[3],
  		}
  		strip = true
  	} else {
  		u, err = url.Parse(repo)
  		if err != nil {
  			return "", err
  		}
  	}
  
  	if strip {
  		u.Scheme = ""
  	}
  
  	var key string
  	if u.Scheme != "" {
  		key = u.Scheme + "-"
  	}
  	if u.User != nil && u.User.Username() != "" {
  		key = key + u.User.Username() + "-"
  	}
  	key = key + u.Host
  	if u.Path != "" {
  		key = key + strings.Replace(u.Path, "/", "-", -1)
  	}
  
  	key = strings.Replace(key, ":", "-", -1)
  
  	return key, nil
  }
docs: // Key generates a cache key based on a url or scp string. The key is file
  // system safe.