diff --git a/repos.go b/repos.go index 51c4263..4898965 100644 --- a/repos.go +++ b/repos.go @@ -500,6 +500,16 @@ func (s *RepoService) Fork(ctx context.Context, owner, repo, org string) (*types return &out, nil } +// Generate creates a repository from a template repository. +func (s *RepoService) Generate(ctx context.Context, templateOwner, templateRepo string, opts *types.GenerateRepoOption) (*types.Repository, error) { + path := ResolvePath("/api/v1/repos/{template_owner}/{template_repo}/generate", pathParams("template_owner", templateOwner, "template_repo", templateRepo)) + var out types.Repository + if err := s.client.Post(ctx, path, opts, &out); err != nil { + return nil, err + } + return &out, nil +} + // ListForks returns all forks of a repository. func (s *RepoService) ListForks(ctx context.Context, owner, repo string) ([]types.Repository, error) { path := ResolvePath("/api/v1/repos/{owner}/{repo}/forks", pathParams("owner", owner, "repo", repo)) diff --git a/repos_test.go b/repos_test.go index 5755642..f3d0e4b 100644 --- a/repos_test.go +++ b/repos_test.go @@ -1278,4 +1278,41 @@ func TestRepoService_PathParamsAreEscaped_Good(t *testing.T) { t.Fatal(err) } }) + + t.Run("Generate", func(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + want := "/api/v1/repos/acme%20org/template%2Frepo/generate" + if r.URL.EscapedPath() != want { + t.Errorf("got path %q, want %q", r.URL.EscapedPath(), want) + http.NotFound(w, r) + return + } + if r.Method != http.MethodPost { + t.Errorf("expected POST, got %s", r.Method) + } + var body types.GenerateRepoOption + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + t.Fatalf("decode body: %v", err) + } + if body.Owner != "acme org" || body.Name != "generated repo" || !body.Private || !body.Topics { + t.Fatalf("got %#v", body) + } + json.NewEncoder(w).Encode(types.Repository{Name: body.Name, FullName: "acme org/" + body.Name}) + })) + defer srv.Close() + + f := NewForge(srv.URL, "tok") + repo, err := f.Repos.Generate(context.Background(), owner, "template/repo", &types.GenerateRepoOption{ + Owner: "acme org", + Name: "generated repo", + Private: true, + Topics: true, + }) + if err != nil { + t.Fatal(err) + } + if repo.Name != "generated repo" || repo.FullName != "acme org/generated repo" { + t.Fatalf("got %#v", repo) + } + }) }