diff --git a/repos.go b/repos.go index 5ed668e..92499d9 100644 --- a/repos.go +++ b/repos.go @@ -63,6 +63,15 @@ func newRepoService(c *Client) *RepoService { } } +// Migrate imports a remote git repository into Forgejo. +func (s *RepoService) Migrate(ctx context.Context, opts *types.MigrateRepoOptions) (*types.Repository, error) { + var out types.Repository + if err := s.client.Post(ctx, "/api/v1/repos/migrate", opts, &out); err != nil { + return nil, err + } + return &out, nil +} + // ListOrgRepos returns all repositories for an organisation. func (s *RepoService) ListOrgRepos(ctx context.Context, org string) ([]types.Repository, error) { path := ResolvePath("/api/v1/orgs/{org}/repos", pathParams("org", org)) diff --git a/repos_test.go b/repos_test.go index e0497f4..7c0343e 100644 --- a/repos_test.go +++ b/repos_test.go @@ -99,6 +99,45 @@ func TestRepoService_GetRunnerRegistrationToken_Good(t *testing.T) { } } +func TestRepoService_Migrate_Good(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + t.Errorf("expected POST, got %s", r.Method) + } + if r.URL.Path != "/api/v1/repos/migrate" { + t.Errorf("wrong path: %s", r.URL.Path) + http.NotFound(w, r) + return + } + var opts types.MigrateRepoOptions + if err := json.NewDecoder(r.Body).Decode(&opts); err != nil { + t.Fatalf("decode body: %v", err) + } + if opts.CloneAddr != "https://example.com/source.git" || opts.RepoName != "go-forge" || opts.RepoOwner != "core" { + t.Fatalf("got %#v", opts) + } + json.NewEncoder(w).Encode(types.Repository{ + ID: 99, + Name: opts.RepoName, + FullName: opts.RepoOwner + "/" + opts.RepoName, + }) + })) + defer srv.Close() + + f := NewForge(srv.URL, "tok") + repo, err := f.Repos.Migrate(context.Background(), &types.MigrateRepoOptions{ + CloneAddr: "https://example.com/source.git", + RepoName: "go-forge", + RepoOwner: "core", + }) + if err != nil { + t.Fatal(err) + } + if repo.ID != 99 || repo.Name != "go-forge" || repo.FullName != "core/go-forge" { + t.Fatalf("got %#v", repo) + } +} + func TestRepoService_ListTopics_Good(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet {