github.com/google/go-github/v65@v65.0.0/github/migrations_source_import.go (about)

     1  // Copyright 2016 The go-github AUTHORS. All rights reserved.
     2  //
     3  // Use of this source code is governed by a BSD-style
     4  // license that can be found in the LICENSE file.
     5  
     6  package github
     7  
     8  import (
     9  	"context"
    10  	"fmt"
    11  )
    12  
    13  // Import represents a repository import request.
    14  type Import struct {
    15  	// The URL of the originating repository.
    16  	VCSURL *string `json:"vcs_url,omitempty"`
    17  	// The originating VCS type. Can be one of 'subversion', 'git',
    18  	// 'mercurial', or 'tfvc'. Without this parameter, the import job will
    19  	// take additional time to detect the VCS type before beginning the
    20  	// import. This detection step will be reflected in the response.
    21  	VCS *string `json:"vcs,omitempty"`
    22  	// VCSUsername and VCSPassword are only used for StartImport calls that
    23  	// are importing a password-protected repository.
    24  	VCSUsername *string `json:"vcs_username,omitempty"`
    25  	VCSPassword *string `json:"vcs_password,omitempty"`
    26  	// For a tfvc import, the name of the project that is being imported.
    27  	TFVCProject *string `json:"tfvc_project,omitempty"`
    28  
    29  	// LFS related fields that may be preset in the Import Progress response
    30  
    31  	// Describes whether the import has been opted in or out of using Git
    32  	// LFS. The value can be 'opt_in', 'opt_out', or 'undecided' if no
    33  	// action has been taken.
    34  	UseLFS *string `json:"use_lfs,omitempty"`
    35  	// Describes whether files larger than 100MB were found during the
    36  	// importing step.
    37  	HasLargeFiles *bool `json:"has_large_files,omitempty"`
    38  	// The total size in gigabytes of files larger than 100MB found in the
    39  	// originating repository.
    40  	LargeFilesSize *int `json:"large_files_size,omitempty"`
    41  	// The total number of files larger than 100MB found in the originating
    42  	// repository. To see a list of these files, call LargeFiles.
    43  	LargeFilesCount *int `json:"large_files_count,omitempty"`
    44  
    45  	// Identifies the current status of an import. An import that does not
    46  	// have errors will progress through these steps:
    47  	//
    48  	//     detecting - the "detection" step of the import is in progress
    49  	//         because the request did not include a VCS parameter. The
    50  	//         import is identifying the type of source control present at
    51  	//         the URL.
    52  	//     importing - the "raw" step of the import is in progress. This is
    53  	//         where commit data is fetched from the original repository.
    54  	//         The import progress response will include CommitCount (the
    55  	//         total number of raw commits that will be imported) and
    56  	//         Percent (0 - 100, the current progress through the import).
    57  	//     mapping - the "rewrite" step of the import is in progress. This
    58  	//         is where SVN branches are converted to Git branches, and
    59  	//         where author updates are applied. The import progress
    60  	//         response does not include progress information.
    61  	//     pushing - the "push" step of the import is in progress. This is
    62  	//         where the importer updates the repository on GitHub. The
    63  	//         import progress response will include PushPercent, which is
    64  	//         the percent value reported by git push when it is "Writing
    65  	//         objects".
    66  	//     complete - the import is complete, and the repository is ready
    67  	//         on GitHub.
    68  	//
    69  	// If there are problems, you will see one of these in the status field:
    70  	//
    71  	//     auth_failed - the import requires authentication in order to
    72  	//         connect to the original repository. Make an UpdateImport
    73  	//         request, and include VCSUsername and VCSPassword.
    74  	//     error - the import encountered an error. The import progress
    75  	//         response will include the FailedStep and an error message.
    76  	//         Contact GitHub support for more information.
    77  	//     detection_needs_auth - the importer requires authentication for
    78  	//         the originating repository to continue detection. Make an
    79  	//         UpdatImport request, and include VCSUsername and
    80  	//         VCSPassword.
    81  	//     detection_found_nothing - the importer didn't recognize any
    82  	//         source control at the URL.
    83  	//     detection_found_multiple - the importer found several projects
    84  	//         or repositories at the provided URL. When this is the case,
    85  	//         the Import Progress response will also include a
    86  	//         ProjectChoices field with the possible project choices as
    87  	//         values. Make an UpdateImport request, and include VCS and
    88  	//         (if applicable) TFVCProject.
    89  	Status        *string `json:"status,omitempty"`
    90  	CommitCount   *int    `json:"commit_count,omitempty"`
    91  	StatusText    *string `json:"status_text,omitempty"`
    92  	AuthorsCount  *int    `json:"authors_count,omitempty"`
    93  	Percent       *int    `json:"percent,omitempty"`
    94  	PushPercent   *int    `json:"push_percent,omitempty"`
    95  	URL           *string `json:"url,omitempty"`
    96  	HTMLURL       *string `json:"html_url,omitempty"`
    97  	AuthorsURL    *string `json:"authors_url,omitempty"`
    98  	RepositoryURL *string `json:"repository_url,omitempty"`
    99  	Message       *string `json:"message,omitempty"`
   100  	FailedStep    *string `json:"failed_step,omitempty"`
   101  
   102  	// Human readable display name, provided when the Import appears as
   103  	// part of ProjectChoices.
   104  	HumanName *string `json:"human_name,omitempty"`
   105  
   106  	// When the importer finds several projects or repositories at the
   107  	// provided URLs, this will identify the available choices. Call
   108  	// UpdateImport with the selected Import value.
   109  	ProjectChoices []*Import `json:"project_choices,omitempty"`
   110  }
   111  
   112  func (i Import) String() string {
   113  	return Stringify(i)
   114  }
   115  
   116  // SourceImportAuthor identifies an author imported from a source repository.
   117  //
   118  // GitHub API docs: https://docs.github.com/rest/migration/source_imports/#get-commit-authors
   119  type SourceImportAuthor struct {
   120  	ID         *int64  `json:"id,omitempty"`
   121  	RemoteID   *string `json:"remote_id,omitempty"`
   122  	RemoteName *string `json:"remote_name,omitempty"`
   123  	Email      *string `json:"email,omitempty"`
   124  	Name       *string `json:"name,omitempty"`
   125  	URL        *string `json:"url,omitempty"`
   126  	ImportURL  *string `json:"import_url,omitempty"`
   127  }
   128  
   129  func (a SourceImportAuthor) String() string {
   130  	return Stringify(a)
   131  }
   132  
   133  // LargeFile identifies a file larger than 100MB found during a repository import.
   134  //
   135  // GitHub API docs: https://docs.github.com/rest/migration/source_imports/#get-large-files
   136  type LargeFile struct {
   137  	RefName *string `json:"ref_name,omitempty"`
   138  	Path    *string `json:"path,omitempty"`
   139  	OID     *string `json:"oid,omitempty"`
   140  	Size    *int    `json:"size,omitempty"`
   141  }
   142  
   143  func (f LargeFile) String() string {
   144  	return Stringify(f)
   145  }
   146  
   147  // StartImport initiates a repository import.
   148  //
   149  // GitHub API docs: https://docs.github.com/rest/migrations/source-imports#start-an-import
   150  //
   151  //meta:operation PUT /repos/{owner}/{repo}/import
   152  func (s *MigrationService) StartImport(ctx context.Context, owner, repo string, in *Import) (*Import, *Response, error) {
   153  	u := fmt.Sprintf("repos/%v/%v/import", owner, repo)
   154  	req, err := s.client.NewRequest("PUT", u, in)
   155  	if err != nil {
   156  		return nil, nil, err
   157  	}
   158  
   159  	out := new(Import)
   160  	resp, err := s.client.Do(ctx, req, out)
   161  	if err != nil {
   162  		return nil, resp, err
   163  	}
   164  
   165  	return out, resp, nil
   166  }
   167  
   168  // ImportProgress queries for the status and progress of an ongoing repository import.
   169  //
   170  // GitHub API docs: https://docs.github.com/rest/migrations/source-imports#get-an-import-status
   171  //
   172  //meta:operation GET /repos/{owner}/{repo}/import
   173  func (s *MigrationService) ImportProgress(ctx context.Context, owner, repo string) (*Import, *Response, error) {
   174  	u := fmt.Sprintf("repos/%v/%v/import", owner, repo)
   175  	req, err := s.client.NewRequest("GET", u, nil)
   176  	if err != nil {
   177  		return nil, nil, err
   178  	}
   179  
   180  	out := new(Import)
   181  	resp, err := s.client.Do(ctx, req, out)
   182  	if err != nil {
   183  		return nil, resp, err
   184  	}
   185  
   186  	return out, resp, nil
   187  }
   188  
   189  // UpdateImport initiates a repository import.
   190  //
   191  // GitHub API docs: https://docs.github.com/rest/migrations/source-imports#update-an-import
   192  //
   193  //meta:operation PATCH /repos/{owner}/{repo}/import
   194  func (s *MigrationService) UpdateImport(ctx context.Context, owner, repo string, in *Import) (*Import, *Response, error) {
   195  	u := fmt.Sprintf("repos/%v/%v/import", owner, repo)
   196  	req, err := s.client.NewRequest("PATCH", u, in)
   197  	if err != nil {
   198  		return nil, nil, err
   199  	}
   200  
   201  	out := new(Import)
   202  	resp, err := s.client.Do(ctx, req, out)
   203  	if err != nil {
   204  		return nil, resp, err
   205  	}
   206  
   207  	return out, resp, nil
   208  }
   209  
   210  // CommitAuthors gets the authors mapped from the original repository.
   211  //
   212  // Each type of source control system represents authors in a different way.
   213  // For example, a Git commit author has a display name and an email address,
   214  // but a Subversion commit author just has a username. The GitHub Importer will
   215  // make the author information valid, but the author might not be correct. For
   216  // example, it will change the bare Subversion username "hubot" into something
   217  // like "hubot <hubot@12341234-abab-fefe-8787-fedcba987654>".
   218  //
   219  // This method and MapCommitAuthor allow you to provide correct Git author
   220  // information.
   221  //
   222  // GitHub API docs: https://docs.github.com/rest/migrations/source-imports#get-commit-authors
   223  //
   224  //meta:operation GET /repos/{owner}/{repo}/import/authors
   225  func (s *MigrationService) CommitAuthors(ctx context.Context, owner, repo string) ([]*SourceImportAuthor, *Response, error) {
   226  	u := fmt.Sprintf("repos/%v/%v/import/authors", owner, repo)
   227  	req, err := s.client.NewRequest("GET", u, nil)
   228  	if err != nil {
   229  		return nil, nil, err
   230  	}
   231  
   232  	var authors []*SourceImportAuthor
   233  	resp, err := s.client.Do(ctx, req, &authors)
   234  	if err != nil {
   235  		return nil, resp, err
   236  	}
   237  
   238  	return authors, resp, nil
   239  }
   240  
   241  // MapCommitAuthor updates an author's identity for the import. Your
   242  // application can continue updating authors any time before you push new
   243  // commits to the repository.
   244  //
   245  // GitHub API docs: https://docs.github.com/rest/migrations/source-imports#map-a-commit-author
   246  //
   247  //meta:operation PATCH /repos/{owner}/{repo}/import/authors/{author_id}
   248  func (s *MigrationService) MapCommitAuthor(ctx context.Context, owner, repo string, id int64, author *SourceImportAuthor) (*SourceImportAuthor, *Response, error) {
   249  	u := fmt.Sprintf("repos/%v/%v/import/authors/%v", owner, repo, id)
   250  	req, err := s.client.NewRequest("PATCH", u, author)
   251  	if err != nil {
   252  		return nil, nil, err
   253  	}
   254  
   255  	out := new(SourceImportAuthor)
   256  	resp, err := s.client.Do(ctx, req, out)
   257  	if err != nil {
   258  		return nil, resp, err
   259  	}
   260  
   261  	return out, resp, nil
   262  }
   263  
   264  // SetLFSPreference sets whether imported repositories should use Git LFS for
   265  // files larger than 100MB. Only the UseLFS field on the provided Import is
   266  // used.
   267  //
   268  // GitHub API docs: https://docs.github.com/rest/migrations/source-imports#update-git-lfs-preference
   269  //
   270  //meta:operation PATCH /repos/{owner}/{repo}/import/lfs
   271  func (s *MigrationService) SetLFSPreference(ctx context.Context, owner, repo string, in *Import) (*Import, *Response, error) {
   272  	u := fmt.Sprintf("repos/%v/%v/import/lfs", owner, repo)
   273  	req, err := s.client.NewRequest("PATCH", u, in)
   274  	if err != nil {
   275  		return nil, nil, err
   276  	}
   277  
   278  	out := new(Import)
   279  	resp, err := s.client.Do(ctx, req, out)
   280  	if err != nil {
   281  		return nil, resp, err
   282  	}
   283  
   284  	return out, resp, nil
   285  }
   286  
   287  // LargeFiles lists files larger than 100MB found during the import.
   288  //
   289  // GitHub API docs: https://docs.github.com/rest/migrations/source-imports#get-large-files
   290  //
   291  //meta:operation GET /repos/{owner}/{repo}/import/large_files
   292  func (s *MigrationService) LargeFiles(ctx context.Context, owner, repo string) ([]*LargeFile, *Response, error) {
   293  	u := fmt.Sprintf("repos/%v/%v/import/large_files", owner, repo)
   294  	req, err := s.client.NewRequest("GET", u, nil)
   295  	if err != nil {
   296  		return nil, nil, err
   297  	}
   298  
   299  	var files []*LargeFile
   300  	resp, err := s.client.Do(ctx, req, &files)
   301  	if err != nil {
   302  		return nil, resp, err
   303  	}
   304  
   305  	return files, resp, nil
   306  }
   307  
   308  // CancelImport stops an import for a repository.
   309  //
   310  // GitHub API docs: https://docs.github.com/rest/migrations/source-imports#cancel-an-import
   311  //
   312  //meta:operation DELETE /repos/{owner}/{repo}/import
   313  func (s *MigrationService) CancelImport(ctx context.Context, owner, repo string) (*Response, error) {
   314  	u := fmt.Sprintf("repos/%v/%v/import", owner, repo)
   315  	req, err := s.client.NewRequest("DELETE", u, nil)
   316  	if err != nil {
   317  		return nil, err
   318  	}
   319  
   320  	return s.client.Do(ctx, req, nil)
   321  }