Add support for +describe Change-Id: Ide90f4a77822184c4b3b2873ea1dad71ea5b62b5
diff --git a/gitiles/client.go b/gitiles/client.go index de60c5c..7fec489 100644 --- a/gitiles/client.go +++ b/gitiles/client.go
@@ -15,6 +15,10 @@ // Package gitiles is a client library for the Gitiles source viewer. package gitiles +// The gitiles command set is defined here: +// +// https://gerrit.googlesource.com/gitiles/+/7c07a4a68ece6009909206482e0728dbbf0be77d/java/com/google/gitiles/ViewFilter.java#47 + import ( "bytes" "encoding/base64" @@ -321,3 +325,43 @@ err := s.service.getJSON(&jsonURL, &c) return &c, err } + +// Options for Describe. +const ( + // Return a ref that contains said commmit + DescribeContains = "contains" + + // Return any type of ref + DescribeAll = "all" + + // Only return a tag ref + DescribeTags = "tags" + + // The default for 'contains': return annotated tags + DescribeAnnotatedTags = "" +) + +// Describe describes a possibly shortened commit hash as a ref that +// is visible to the caller. Currently, only the 'contains' flavor is +// implemented, so options must always include 'contains'. +func (s *RepoService) Describe(revision string, options ...string) (string, error) { + jsonURL := s.service.addr + jsonURL.Path = path.Join(jsonURL.Path, s.Name, "+describe", revision) + jsonURL.RawQuery = "format=JSON&" + strings.Join(options, "&") + + result := map[string]string{} + err := s.service.getJSON(&jsonURL, &result) + if err != nil { + return "", err + } + + if len(result) != 1 { + return "", fmt.Errorf("gitiles: got map %v, want just one entry", result) + } + + for _, v := range result { + return v, nil + } + + panic("unreachable.") +}
diff --git a/gitiles/prod_test.go b/gitiles/prod_test.go index 8ee9f87..c4fc68a 100644 --- a/gitiles/prod_test.go +++ b/gitiles/prod_test.go
@@ -59,3 +59,25 @@ t.Fatal("did not find 'mux.go', got %v", names) } } + +func TestProductionDescribe(t *testing.T) { + gs, err := NewService(Options{ + Address: "https://gerrit.googlesource.com", + }) + if err != nil { + t.Fatal(err) + } + + repo := gs.NewRepoService("gitiles") + if err != nil { + t.Fatal(err) + } + got, err := repo.Describe("9de65953ec", DescribeContains) + if err != nil { + t.Fatal(err) + } + + if want := "v0.1-6~361"; want != got { + t.Fatalf("got %v, want %v", got, want) + } +}