11 // BitBucketDetector implements Detector to detect BitBucket URLs and turn
12 // them into URLs that the Git or Hg Getter can understand.
13 type BitBucketDetector struct{}
15 func (d *BitBucketDetector) Detect(src, _ string) (string, bool, error) {
20 if strings.HasPrefix(src, "bitbucket.org/") {
21 return d.detectHTTP(src)
27 func (d *BitBucketDetector) detectHTTP(src string) (string, bool, error) {
28 u, err := url.Parse("https://" + src)
30 return "", true, fmt.Errorf("error parsing BitBucket URL: %s", err)
33 // We need to get info on this BitBucket repository to determine whether
36 SCM string `json:"scm"`
38 infoUrl := "https://api.bitbucket.org/1.0/repositories" + u.Path
39 resp, err := http.Get(infoUrl)
41 return "", true, fmt.Errorf("error looking up BitBucket URL: %s", err)
43 if resp.StatusCode == 403 {
45 return "", true, fmt.Errorf(
46 "shorthand BitBucket URL can't be used for private repos, " +
47 "please use a full URL")
49 dec := json.NewDecoder(resp.Body)
50 if err := dec.Decode(&info); err != nil {
51 return "", true, fmt.Errorf("error looking up BitBucket URL: %s", err)
56 if !strings.HasSuffix(u.Path, ".git") {
60 return "git::" + u.String(), true, nil
62 return "hg::" + u.String(), true, nil
64 return "", true, fmt.Errorf("unknown BitBucket SCM type: %s", info.SCM)