[GITEA] Avoid conflicts of issue and PR numbers in GitLab migration (#1790)
Closes #1789. The bug was due to the fact that GitLab does not guarantee that issue numbers are created sequentially: some identifiers can be skipped. Therefore, the new pull requests numbers should not be offset by the number of issues, but by the maximum issue number. See for instance https://gitlab.com/troyengel/archbuild/-/issues/?sort=created_date&state=all&first_page_size=20, where there is only a singe issue with number "2". Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/1790 Co-authored-by: Antonin Delpeuch <antonin@delpeuch.eu> Co-committed-by: Antonin Delpeuch <antonin@delpeuch.eu> (cherry picked from commit2c185c39fe
) (cherry picked from commit8f68dc4c9c
) (cherry picked from commit7e932b7fca
)
This commit is contained in:
parent
f0746e648d
commit
6bbe75ecf8
10 changed files with 263 additions and 11 deletions
|
@ -57,17 +57,18 @@ func (f *GitlabDownloaderFactory) GitServiceType() structs.GitServiceType {
|
||||||
|
|
||||||
// GitlabDownloader implements a Downloader interface to get repository information
|
// GitlabDownloader implements a Downloader interface to get repository information
|
||||||
// from gitlab via go-gitlab
|
// from gitlab via go-gitlab
|
||||||
// - issueCount is incremented in GetIssues() to ensure PR and Issue numbers do not overlap,
|
// - maxIssueNumber is the maximum issue number seen, updated in GetIssues() to ensure PR and Issue numbers do not overlap,
|
||||||
// because Gitlab has individual Issue and Pull Request numbers.
|
// because Gitlab has individual Issue and Pull Request numbers.
|
||||||
|
// Note that because some issue numbers may be skipped, this number may be greater than the total number of issues
|
||||||
type GitlabDownloader struct {
|
type GitlabDownloader struct {
|
||||||
base.NullDownloader
|
base.NullDownloader
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
client *gitlab.Client
|
client *gitlab.Client
|
||||||
baseURL string
|
baseURL string
|
||||||
repoID int
|
repoID int
|
||||||
repoName string
|
repoName string
|
||||||
issueCount int64
|
maxIssueNumber int64
|
||||||
maxPerPage int
|
maxPerPage int
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGitlabDownloader creates a gitlab Downloader via gitlab API
|
// NewGitlabDownloader creates a gitlab Downloader via gitlab API
|
||||||
|
@ -450,8 +451,8 @@ func (g *GitlabDownloader) GetIssues(page, perPage int) ([]*base.Issue, bool, er
|
||||||
Context: gitlabIssueContext{IsMergeRequest: false},
|
Context: gitlabIssueContext{IsMergeRequest: false},
|
||||||
})
|
})
|
||||||
|
|
||||||
// increment issueCount, to be used in GetPullRequests()
|
// update maxIssueNumber, to be used in GetPullRequests()
|
||||||
g.issueCount++
|
g.maxIssueNumber = max(g.maxIssueNumber, int64(issue.IID))
|
||||||
}
|
}
|
||||||
|
|
||||||
return allIssues, len(issues) < perPage, nil
|
return allIssues, len(issues) < perPage, nil
|
||||||
|
@ -608,7 +609,7 @@ func (g *GitlabDownloader) GetPullRequests(page, perPage int) ([]*base.PullReque
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the PR ID to the Issue Count because PR and Issues share ID space in Gitea
|
// Add the PR ID to the Issue Count because PR and Issues share ID space in Gitea
|
||||||
newPRNumber := g.issueCount + int64(pr.IID)
|
newPRNumber := g.maxIssueNumber + int64(pr.IID)
|
||||||
|
|
||||||
allPRs = append(allPRs, &base.PullRequest{
|
allPRs = append(allPRs, &base.PullRequest{
|
||||||
Title: pr.Title,
|
Title: pr.Title,
|
||||||
|
|
|
@ -334,6 +334,49 @@ func TestGitlabDownloadRepo(t *testing.T) {
|
||||||
}, rvs)
|
}, rvs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGitlabSkippedIssueNumber(t *testing.T) {
|
||||||
|
// If a GitLab access token is provided, this test will make HTTP requests to the live gitlab.com instance.
|
||||||
|
// When doing so, the responses from gitlab.com will be saved as test data files.
|
||||||
|
// If no access token is available, those cached responses will be used instead.
|
||||||
|
gitlabPersonalAccessToken := os.Getenv("GITLAB_READ_TOKEN")
|
||||||
|
fixturePath := "./testdata/gitlab/skipped_issue_number"
|
||||||
|
server := unittest.NewMockWebServer(t, "https://gitlab.com", fixturePath, gitlabPersonalAccessToken != "")
|
||||||
|
defer server.Close()
|
||||||
|
|
||||||
|
downloader, err := NewGitlabDownloader(context.Background(), server.URL, "troyengel/archbuild", "", "", gitlabPersonalAccessToken)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("NewGitlabDownloader is nil: %v", err)
|
||||||
|
}
|
||||||
|
repo, err := downloader.GetRepoInfo()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assertRepositoryEqual(t, &base.Repository{
|
||||||
|
Name: "archbuild",
|
||||||
|
Owner: "troyengel",
|
||||||
|
Description: "Arch packaging and build files",
|
||||||
|
CloneURL: server.URL + "/troyengel/archbuild.git",
|
||||||
|
OriginalURL: server.URL + "/troyengel/archbuild",
|
||||||
|
DefaultBranch: "master",
|
||||||
|
}, repo)
|
||||||
|
|
||||||
|
issues, isEnd, err := downloader.GetIssues(1, 10)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.True(t, isEnd)
|
||||||
|
|
||||||
|
// the only issue in this repository has number 2
|
||||||
|
assert.EqualValues(t, 1, len(issues))
|
||||||
|
assert.EqualValues(t, 2, issues[0].Number)
|
||||||
|
assert.EqualValues(t, "vpn unlimited errors", issues[0].Title)
|
||||||
|
|
||||||
|
prs, _, err := downloader.GetPullRequests(1, 10)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
// the only merge request in this repository has number 1,
|
||||||
|
// but we offset it by the maximum issue number so it becomes
|
||||||
|
// pull request 3 in Forgejo
|
||||||
|
assert.EqualValues(t, 1, len(prs))
|
||||||
|
assert.EqualValues(t, 3, prs[0].Number)
|
||||||
|
assert.EqualValues(t, "Review", prs[0].Title)
|
||||||
|
}
|
||||||
|
|
||||||
func gitlabClientMockSetup(t *testing.T) (*http.ServeMux, *httptest.Server, *gitlab.Client) {
|
func gitlabClientMockSetup(t *testing.T) (*http.ServeMux, *httptest.Server, *gitlab.Client) {
|
||||||
// mux is the HTTP request multiplexer used with the test server.
|
// mux is the HTTP request multiplexer used with the test server.
|
||||||
mux := http.NewServeMux()
|
mux := http.NewServeMux()
|
||||||
|
|
22
services/migrations/testdata/gitlab/skipped_issue_number/_api_v4_projects_6590996
vendored
Normal file
22
services/migrations/testdata/gitlab/skipped_issue_number/_api_v4_projects_6590996
vendored
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
X-Runtime: 0.088022
|
||||||
|
Strict-Transport-Security: max-age=31536000
|
||||||
|
Ratelimit-Observed: 3
|
||||||
|
Cache-Control: max-age=0, private, must-revalidate
|
||||||
|
Etag: W/"03ce4f6ce1c1e8c5a31df8a44cf2fbdd"
|
||||||
|
Gitlab-Lb: haproxy-main-11-lb-gprd
|
||||||
|
Content-Security-Policy: default-src 'none'
|
||||||
|
Ratelimit-Limit: 2000
|
||||||
|
X-Gitlab-Meta: {"correlation_id":"b57b226f741f9140a1fea54f65cb5cfd","version":"1"}
|
||||||
|
Referrer-Policy: strict-origin-when-cross-origin
|
||||||
|
Ratelimit-Remaining: 1997
|
||||||
|
Ratelimit-Resettime: Thu, 30 Nov 2023 08:24:53 GMT
|
||||||
|
Set-Cookie: _cfuvid=V0ToiOTUW0XbtWq7BirwVNfL1_YP1POMrLBnDSEWS0M-1701332633965-0-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None
|
||||||
|
X-Content-Type-Options: nosniff
|
||||||
|
X-Frame-Options: SAMEORIGIN
|
||||||
|
Gitlab-Sv: localhost
|
||||||
|
Content-Type: application/json
|
||||||
|
Vary: Origin, Accept-Encoding
|
||||||
|
Ratelimit-Reset: 1701332693
|
||||||
|
Cf-Cache-Status: MISS
|
||||||
|
|
||||||
|
{"id":6590996,"description":"Arch packaging and build files","name":"archbuild","name_with_namespace":"Troy Engel / archbuild","path":"archbuild","path_with_namespace":"troyengel/archbuild","created_at":"2018-06-03T22:53:17.388Z","default_branch":"master","tag_list":[],"topics":[],"ssh_url_to_repo":"git@gitlab.com:troyengel/archbuild.git","http_url_to_repo":"https://gitlab.com/troyengel/archbuild.git","web_url":"https://gitlab.com/troyengel/archbuild","readme_url":"https://gitlab.com/troyengel/archbuild/-/blob/master/README.md","forks_count":0,"avatar_url":null,"star_count":0,"last_activity_at":"2020-12-13T18:09:32.071Z","namespace":{"id":1452515,"name":"Troy Engel","path":"troyengel","kind":"user","full_path":"troyengel","parent_id":null,"avatar_url":"https://secure.gravatar.com/avatar/b226c267929f1bcfcc446e75a025591c?s=80\u0026d=identicon","web_url":"https://gitlab.com/troyengel"},"container_registry_image_prefix":"registry.gitlab.com/troyengel/archbuild","_links":{"self":"https://gitlab.com/api/v4/projects/6590996","issues":"https://gitlab.com/api/v4/projects/6590996/issues","merge_requests":"https://gitlab.com/api/v4/projects/6590996/merge_requests","repo_branches":"https://gitlab.com/api/v4/projects/6590996/repository/branches","labels":"https://gitlab.com/api/v4/projects/6590996/labels","events":"https://gitlab.com/api/v4/projects/6590996/events","members":"https://gitlab.com/api/v4/projects/6590996/members","cluster_agents":"https://gitlab.com/api/v4/projects/6590996/cluster_agents"},"packages_enabled":null,"empty_repo":false,"archived":true,"visibility":"public","owner":{"id":1215848,"username":"troyengel","name":"Troy Engel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/b226c267929f1bcfcc446e75a025591c?s=80\u0026d=identicon","web_url":"https://gitlab.com/troyengel"},"resolve_outdated_diff_discussions":false,"issues_enabled":true,"merge_requests_enabled":true,"wiki_enabled":true,"jobs_enabled":true,"snippets_enabled":true,"container_registry_enabled":true,"service_desk_enabled":true,"can_create_merge_request_in":false,"issues_access_level":"enabled","repository_access_level":"enabled","merge_requests_access_level":"enabled","forking_access_level":"enabled","wiki_access_level":"enabled","builds_access_level":"enabled","snippets_access_level":"enabled","pages_access_level":"enabled","analytics_access_level":"enabled","container_registry_access_level":"enabled","security_and_compliance_access_level":"private","releases_access_level":"enabled","environments_access_level":"enabled","feature_flags_access_level":"enabled","infrastructure_access_level":"enabled","monitor_access_level":"enabled","model_experiments_access_level":"enabled","emails_disabled":false,"emails_enabled":true,"shared_runners_enabled":true,"lfs_enabled":false,"creator_id":1215848,"import_status":"finished","open_issues_count":0,"description_html":"\u003cp data-sourcepos=\"1:1-1:30\" dir=\"auto\"\u003eArch packaging and build files\u003c/p\u003e","updated_at":"2022-07-13T21:32:12.624Z","ci_config_path":null,"public_jobs":true,"shared_with_groups":[],"only_allow_merge_if_pipeline_succeeds":false,"allow_merge_on_skipped_pipeline":null,"request_access_enabled":false,"only_allow_merge_if_all_discussions_are_resolved":false,"remove_source_branch_after_merge":null,"printing_merge_request_link_enabled":true,"merge_method":"merge","squash_option":"default_off","enforce_auth_checks_on_uploads":true,"suggestion_commit_message":null,"merge_commit_template":null,"squash_commit_template":null,"issue_branch_template":null,"autoclose_referenced_issues":true,"external_authorization_classification_label":"","requirements_enabled":false,"requirements_access_level":"enabled","security_and_compliance_enabled":false,"compliance_frameworks":[],"permissions":{"project_access":null,"group_access":null}}
|
|
@ -0,0 +1,29 @@
|
||||||
|
Link: <https://gitlab.com/api/v4/projects/6590996/issues?id=6590996&order_by=created_at&page=1&per_page=10&sort=asc&state=all&with_labels_details=false>; rel="first", <https://gitlab.com/api/v4/projects/6590996/issues?id=6590996&order_by=created_at&page=1&per_page=10&sort=asc&state=all&with_labels_details=false>; rel="last"
|
||||||
|
Ratelimit-Observed: 4
|
||||||
|
Ratelimit-Remaining: 1996
|
||||||
|
Gitlab-Lb: haproxy-main-04-lb-gprd
|
||||||
|
Vary: Origin, Accept-Encoding
|
||||||
|
Content-Security-Policy: default-src 'none'
|
||||||
|
X-Next-Page:
|
||||||
|
Ratelimit-Reset: 1701332694
|
||||||
|
Etag: W/"f50a70d0fc1465a289d231f80806ced7"
|
||||||
|
X-Gitlab-Meta: {"correlation_id":"47afd74254dd7946d2b2bded87448c60","version":"1"}
|
||||||
|
X-Page: 1
|
||||||
|
X-Prev-Page:
|
||||||
|
Referrer-Policy: strict-origin-when-cross-origin
|
||||||
|
Ratelimit-Resettime: Thu, 30 Nov 2023 08:24:54 GMT
|
||||||
|
Cf-Cache-Status: MISS
|
||||||
|
X-Total: 1
|
||||||
|
X-Total-Pages: 1
|
||||||
|
Strict-Transport-Security: max-age=31536000
|
||||||
|
Content-Type: application/json
|
||||||
|
X-Frame-Options: SAMEORIGIN
|
||||||
|
Ratelimit-Limit: 2000
|
||||||
|
Gitlab-Sv: localhost
|
||||||
|
Set-Cookie: _cfuvid=YDWTZ5VoSuLBDZgKsBnXMyYxz.0rHJ9TBYXv5zBj24Q-1701332634294-0-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None
|
||||||
|
Cache-Control: max-age=0, private, must-revalidate
|
||||||
|
X-Content-Type-Options: nosniff
|
||||||
|
X-Per-Page: 10
|
||||||
|
X-Runtime: 0.179458
|
||||||
|
|
||||||
|
[{"id":11201348,"iid":2,"project_id":6590996,"title":"vpn unlimited errors","description":"updated version to 2.8.0, build and tried running `vpnu-arch`:\n\n```\nvpn-unlimited: /usr/lib/libcurl.so.3: no version information available (required by /usr/lib/libvpnu_rpc.so.1)\nvpn-unlimited: /usr/lib/libssl.so.1.0.0: no version information available (required by /usr/lib/libvpnu_enc.so.1)\nvpn-unlimited: symbol lookup error: /usr/lib/libvpnu_rpc.so.1: undefined symbol: _ZNK4Json5Value8asStringEv\n```\n","state":"closed","created_at":"2016-03-26T16:41:12.000Z","updated_at":"2016-03-27T12:19:27.000Z","closed_at":null,"closed_by":null,"labels":[],"milestone":null,"assignees":[],"author":{"id":10273,"username":"brauliobo","name":"Bráulio Bhavamitra","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/cd3fcb7a417c8acb989fc320b604a2a8?s=80\u0026d=identicon","web_url":"https://gitlab.com/brauliobo"},"type":"ISSUE","assignee":null,"user_notes_count":1,"merge_requests_count":0,"upvotes":0,"downvotes":0,"due_date":null,"confidential":false,"discussion_locked":null,"issue_type":"issue","web_url":"https://gitlab.com/troyengel/archbuild/-/issues/2","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null},"task_completion_status":{"count":0,"completed_count":0},"blocking_issues_count":0,"has_tasks":true,"task_status":"0 of 0 checklist items completed","_links":{"self":"https://gitlab.com/api/v4/projects/6590996/issues/2","notes":"https://gitlab.com/api/v4/projects/6590996/issues/2/notes","award_emoji":"https://gitlab.com/api/v4/projects/6590996/issues/2/award_emoji","project":"https://gitlab.com/api/v4/projects/6590996","closed_as_duplicate_of":null},"references":{"short":"#2","relative":"#2","full":"troyengel/archbuild#2"},"severity":"UNKNOWN","moved_to_id":null,"service_desk_reply_to":null}]
|
|
@ -0,0 +1,31 @@
|
||||||
|
Gitlab-Sv: localhost
|
||||||
|
X-Content-Type-Options: nosniff
|
||||||
|
Gitlab-Lb: haproxy-main-25-lb-gprd
|
||||||
|
X-Total-Pages: 1
|
||||||
|
Referrer-Policy: strict-origin-when-cross-origin
|
||||||
|
Ratelimit-Observed: 5
|
||||||
|
Ratelimit-Remaining: 1995
|
||||||
|
Content-Security-Policy: default-src 'none'
|
||||||
|
X-Gitlab-Meta: {"correlation_id":"eeab46d836341bd4cb18e3d2e82abf97","version":"1"}
|
||||||
|
Ratelimit-Limit: 2000
|
||||||
|
Accept-Ranges: bytes
|
||||||
|
Content-Type: application/json
|
||||||
|
X-Page: 1
|
||||||
|
X-Frame-Options: SAMEORIGIN
|
||||||
|
X-Prev-Page:
|
||||||
|
Cf-Cache-Status: MISS
|
||||||
|
X-Total: 0
|
||||||
|
Ratelimit-Resettime: Thu, 30 Nov 2023 08:24:54 GMT
|
||||||
|
Link: <https://gitlab.com/api/v4/projects/6590996/issues/2/award_emoji?id=6590996&issue_iid=2&page=1&per_page=10>; rel="first", <https://gitlab.com/api/v4/projects/6590996/issues/2/award_emoji?id=6590996&issue_iid=2&page=1&per_page=10>; rel="last"
|
||||||
|
X-Per-Page: 10
|
||||||
|
Set-Cookie: _cfuvid=c5HuTPxOuSXdHSuVrXQALS.uV7WvAYfc5Mc_143EAB8-1701332634513-0-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None
|
||||||
|
Content-Length: 2
|
||||||
|
Vary: Origin, Accept-Encoding
|
||||||
|
Cache-Control: max-age=0, private, must-revalidate
|
||||||
|
Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5"
|
||||||
|
X-Runtime: 0.069269
|
||||||
|
Strict-Transport-Security: max-age=31536000
|
||||||
|
Ratelimit-Reset: 1701332694
|
||||||
|
X-Next-Page:
|
||||||
|
|
||||||
|
[]
|
|
@ -0,0 +1,29 @@
|
||||||
|
Vary: Origin, Accept-Encoding
|
||||||
|
Strict-Transport-Security: max-age=31536000
|
||||||
|
Gitlab-Sv: localhost
|
||||||
|
X-Content-Type-Options: nosniff
|
||||||
|
X-Prev-Page:
|
||||||
|
Ratelimit-Reset: 1701332694
|
||||||
|
Cache-Control: max-age=0, private, must-revalidate
|
||||||
|
Ratelimit-Limit: 2000
|
||||||
|
Referrer-Policy: strict-origin-when-cross-origin
|
||||||
|
Ratelimit-Observed: 6
|
||||||
|
Ratelimit-Resettime: Thu, 30 Nov 2023 08:24:54 GMT
|
||||||
|
Cf-Cache-Status: MISS
|
||||||
|
Content-Type: application/json
|
||||||
|
Content-Security-Policy: default-src 'none'
|
||||||
|
Etag: W/"1a50811aa3cccb2e6a404a976422a83a"
|
||||||
|
X-Total: 1
|
||||||
|
Ratelimit-Remaining: 1994
|
||||||
|
Set-Cookie: _cfuvid=u.zumTkG1ayCnh_OwrT9Q1Fl3MXV9Gh98W.ma4WN2Xs-1701332634745-0-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None
|
||||||
|
Link: <https://gitlab.com/api/v4/projects/6590996/merge_requests?id=6590996&order_by=created_at&page=1&per_page=10&sort=desc&state=all&view=simple&with_labels_details=false&with_merge_status_recheck=false>; rel="first", <https://gitlab.com/api/v4/projects/6590996/merge_requests?id=6590996&order_by=created_at&page=1&per_page=10&sort=desc&state=all&view=simple&with_labels_details=false&with_merge_status_recheck=false>; rel="last"
|
||||||
|
X-Frame-Options: SAMEORIGIN
|
||||||
|
X-Page: 1
|
||||||
|
X-Total-Pages: 1
|
||||||
|
Gitlab-Lb: haproxy-main-05-lb-gprd
|
||||||
|
X-Gitlab-Meta: {"correlation_id":"907f9e1f94131ea7a6d1405100a8cc4b","version":"1"}
|
||||||
|
X-Next-Page:
|
||||||
|
X-Per-Page: 10
|
||||||
|
X-Runtime: 0.078413
|
||||||
|
|
||||||
|
[{"id":10518914,"iid":1,"project_id":6590996,"title":"Review","description":"*Created by: cgtx*\n\n### remove patch from makedepends\n- patch is in base-devel\n- The group base-devel is assumed to be already installed when building with makepkg. Members of \"base-devel\" should not be included in makedepends arrays.\n- https://wiki.archlinux.org/index.php/Pkgbuild#makedepends\n### remove python2 from makedepends\n- python2 is a dependency of python2-setuptools. It is redundant to list it again.\n- You do not need to list packages that your software depends on if other packages your software depends on already have those packages listed in their dependency.\n- https://wiki.archlinux.org/index.php/Pkgbuild#depends\n### more simple find/delete command\n- just because\n","state":"merged","created_at":"2014-12-12T15:01:32.000Z","updated_at":"2014-12-12T15:28:38.000Z","web_url":"https://gitlab.com/troyengel/archbuild/-/merge_requests/1"}]
|
|
@ -0,0 +1,22 @@
|
||||||
|
Ratelimit-Observed: 7
|
||||||
|
Set-Cookie: _cfuvid=_b9GQEo3CBPMs9QmGE89dBdOmbSTfnYjZlzValULQPs-1701332635000-0-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None
|
||||||
|
Strict-Transport-Security: max-age=31536000
|
||||||
|
Ratelimit-Resettime: Thu, 30 Nov 2023 08:24:54 GMT
|
||||||
|
Gitlab-Lb: haproxy-main-50-lb-gprd
|
||||||
|
Gitlab-Sv: localhost
|
||||||
|
X-Gitlab-Meta: {"correlation_id":"da44cd0303a4e62cc52ed8de3b2adf14","version":"1"}
|
||||||
|
Referrer-Policy: strict-origin-when-cross-origin
|
||||||
|
Ratelimit-Remaining: 1993
|
||||||
|
Etag: W/"f6299e7e884cb8df8109256c086eb4e7"
|
||||||
|
X-Runtime: 0.107573
|
||||||
|
Content-Type: application/json
|
||||||
|
Ratelimit-Reset: 1701332694
|
||||||
|
X-Frame-Options: SAMEORIGIN
|
||||||
|
Cache-Control: max-age=0, private, must-revalidate
|
||||||
|
X-Content-Type-Options: nosniff
|
||||||
|
Ratelimit-Limit: 2000
|
||||||
|
Cf-Cache-Status: MISS
|
||||||
|
Content-Security-Policy: default-src 'none'
|
||||||
|
Vary: Origin, Accept-Encoding
|
||||||
|
|
||||||
|
{"id":10518914,"iid":1,"project_id":6590996,"title":"Review","description":"*Created by: cgtx*\n\n### remove patch from makedepends\n- patch is in base-devel\n- The group base-devel is assumed to be already installed when building with makepkg. Members of \"base-devel\" should not be included in makedepends arrays.\n- https://wiki.archlinux.org/index.php/Pkgbuild#makedepends\n### remove python2 from makedepends\n- python2 is a dependency of python2-setuptools. It is redundant to list it again.\n- You do not need to list packages that your software depends on if other packages your software depends on already have those packages listed in their dependency.\n- https://wiki.archlinux.org/index.php/Pkgbuild#depends\n### more simple find/delete command\n- just because\n","state":"merged","created_at":"2014-12-12T15:01:32.000Z","updated_at":"2014-12-12T15:28:38.000Z","merged_by":null,"merge_user":null,"merged_at":null,"closed_by":null,"closed_at":null,"target_branch":"master","source_branch":"cgtx:review","user_notes_count":1,"upvotes":0,"downvotes":0,"author":{"id":1215848,"username":"troyengel","name":"Troy Engel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/b226c267929f1bcfcc446e75a025591c?s=80\u0026d=identicon","web_url":"https://gitlab.com/troyengel"},"assignees":[],"assignee":null,"reviewers":[],"source_project_id":6590996,"target_project_id":6590996,"labels":[],"draft":false,"work_in_progress":false,"milestone":null,"merge_when_pipeline_succeeds":false,"merge_status":"cannot_be_merged","detailed_merge_status":"not_open","sha":"9006fee398299beed8f5d5086f8e6008ffc02280","merge_commit_sha":null,"squash_commit_sha":null,"discussion_locked":null,"should_remove_source_branch":null,"force_remove_source_branch":null,"prepared_at":"2014-12-12T15:01:32.000Z","reference":"!1","references":{"short":"!1","relative":"!1","full":"troyengel/archbuild!1"},"web_url":"https://gitlab.com/troyengel/archbuild/-/merge_requests/1","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null},"squash":false,"squash_on_merge":false,"task_completion_status":{"count":0,"completed_count":0},"has_conflicts":true,"blocking_discussions_resolved":true,"approvals_before_merge":null,"subscribed":false,"changes_count":"1","latest_build_started_at":null,"latest_build_finished_at":null,"first_deployed_to_production_at":null,"pipeline":null,"head_pipeline":null,"diff_refs":{"base_sha":"6edcf8fc09f6c44213c892f5108d34a5255a47e1","head_sha":"9006fee398299beed8f5d5086f8e6008ffc02280","start_sha":"6edcf8fc09f6c44213c892f5108d34a5255a47e1"},"merge_error":null,"first_contribution":false,"user":{"can_merge":false}}
|
|
@ -0,0 +1,31 @@
|
||||||
|
Link: <https://gitlab.com/api/v4/projects/6590996/merge_requests/1/award_emoji?id=6590996&merge_request_iid=1&page=1&per_page=10>; rel="first", <https://gitlab.com/api/v4/projects/6590996/merge_requests/1/award_emoji?id=6590996&merge_request_iid=1&page=1&per_page=10>; rel="last"
|
||||||
|
Set-Cookie: _cfuvid=qK29tijoyp0AdVoHf9Lqjc8Y28h4jplJDW9hOFLfq28-1701332635229-0-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None
|
||||||
|
Cache-Control: max-age=0, private, must-revalidate
|
||||||
|
Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5"
|
||||||
|
Ratelimit-Observed: 8
|
||||||
|
Gitlab-Sv: localhost
|
||||||
|
Content-Length: 2
|
||||||
|
Gitlab-Lb: haproxy-main-16-lb-gprd
|
||||||
|
X-Total: 0
|
||||||
|
Ratelimit-Remaining: 1992
|
||||||
|
Ratelimit-Reset: 1701332695
|
||||||
|
Ratelimit-Limit: 2000
|
||||||
|
Vary: Origin, Accept-Encoding
|
||||||
|
X-Frame-Options: SAMEORIGIN
|
||||||
|
Content-Type: application/json
|
||||||
|
X-Content-Type-Options: nosniff
|
||||||
|
X-Next-Page:
|
||||||
|
X-Page: 1
|
||||||
|
Strict-Transport-Security: max-age=31536000
|
||||||
|
Accept-Ranges: bytes
|
||||||
|
Content-Security-Policy: default-src 'none'
|
||||||
|
X-Per-Page: 10
|
||||||
|
X-Total-Pages: 1
|
||||||
|
Referrer-Policy: strict-origin-when-cross-origin
|
||||||
|
Ratelimit-Resettime: Thu, 30 Nov 2023 08:24:55 GMT
|
||||||
|
Cf-Cache-Status: MISS
|
||||||
|
X-Gitlab-Meta: {"correlation_id":"eb59d63fed23cdbec69308570cc49c3e","version":"1"}
|
||||||
|
X-Runtime: 0.065972
|
||||||
|
X-Prev-Page:
|
||||||
|
|
||||||
|
[]
|
22
services/migrations/testdata/gitlab/skipped_issue_number/_api_v4_projects_troyengel%2Farchbuild
vendored
Normal file
22
services/migrations/testdata/gitlab/skipped_issue_number/_api_v4_projects_troyengel%2Farchbuild
vendored
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
Ratelimit-Resettime: Thu, 30 Nov 2023 08:24:53 GMT
|
||||||
|
Gitlab-Lb: haproxy-main-41-lb-gprd
|
||||||
|
Cache-Control: max-age=0, private, must-revalidate
|
||||||
|
Referrer-Policy: strict-origin-when-cross-origin
|
||||||
|
Cf-Cache-Status: MISS
|
||||||
|
X-Content-Type-Options: nosniff
|
||||||
|
Set-Cookie: _cfuvid=r78xThY2IPR6QvHnea1t_L7DbvuQp4.HWOiG1cKTWUg-1701332633720-0-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None
|
||||||
|
Ratelimit-Limit: 2000
|
||||||
|
Strict-Transport-Security: max-age=31536000
|
||||||
|
Vary: Origin, Accept-Encoding
|
||||||
|
X-Gitlab-Meta: {"correlation_id":"4c3e0f8b5858454b6e138ecae9902a8d","version":"1"}
|
||||||
|
X-Runtime: 0.097047
|
||||||
|
Ratelimit-Observed: 2
|
||||||
|
Ratelimit-Remaining: 1998
|
||||||
|
X-Frame-Options: SAMEORIGIN
|
||||||
|
Content-Security-Policy: default-src 'none'
|
||||||
|
Etag: W/"03ce4f6ce1c1e8c5a31df8a44cf2fbdd"
|
||||||
|
Content-Type: application/json
|
||||||
|
Gitlab-Sv: localhost
|
||||||
|
Ratelimit-Reset: 1701332693
|
||||||
|
|
||||||
|
{"id":6590996,"description":"Arch packaging and build files","name":"archbuild","name_with_namespace":"Troy Engel / archbuild","path":"archbuild","path_with_namespace":"troyengel/archbuild","created_at":"2018-06-03T22:53:17.388Z","default_branch":"master","tag_list":[],"topics":[],"ssh_url_to_repo":"git@gitlab.com:troyengel/archbuild.git","http_url_to_repo":"https://gitlab.com/troyengel/archbuild.git","web_url":"https://gitlab.com/troyengel/archbuild","readme_url":"https://gitlab.com/troyengel/archbuild/-/blob/master/README.md","forks_count":0,"avatar_url":null,"star_count":0,"last_activity_at":"2020-12-13T18:09:32.071Z","namespace":{"id":1452515,"name":"Troy Engel","path":"troyengel","kind":"user","full_path":"troyengel","parent_id":null,"avatar_url":"https://secure.gravatar.com/avatar/b226c267929f1bcfcc446e75a025591c?s=80\u0026d=identicon","web_url":"https://gitlab.com/troyengel"},"container_registry_image_prefix":"registry.gitlab.com/troyengel/archbuild","_links":{"self":"https://gitlab.com/api/v4/projects/6590996","issues":"https://gitlab.com/api/v4/projects/6590996/issues","merge_requests":"https://gitlab.com/api/v4/projects/6590996/merge_requests","repo_branches":"https://gitlab.com/api/v4/projects/6590996/repository/branches","labels":"https://gitlab.com/api/v4/projects/6590996/labels","events":"https://gitlab.com/api/v4/projects/6590996/events","members":"https://gitlab.com/api/v4/projects/6590996/members","cluster_agents":"https://gitlab.com/api/v4/projects/6590996/cluster_agents"},"packages_enabled":null,"empty_repo":false,"archived":true,"visibility":"public","owner":{"id":1215848,"username":"troyengel","name":"Troy Engel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/b226c267929f1bcfcc446e75a025591c?s=80\u0026d=identicon","web_url":"https://gitlab.com/troyengel"},"resolve_outdated_diff_discussions":false,"issues_enabled":true,"merge_requests_enabled":true,"wiki_enabled":true,"jobs_enabled":true,"snippets_enabled":true,"container_registry_enabled":true,"service_desk_enabled":true,"can_create_merge_request_in":false,"issues_access_level":"enabled","repository_access_level":"enabled","merge_requests_access_level":"enabled","forking_access_level":"enabled","wiki_access_level":"enabled","builds_access_level":"enabled","snippets_access_level":"enabled","pages_access_level":"enabled","analytics_access_level":"enabled","container_registry_access_level":"enabled","security_and_compliance_access_level":"private","releases_access_level":"enabled","environments_access_level":"enabled","feature_flags_access_level":"enabled","infrastructure_access_level":"enabled","monitor_access_level":"enabled","model_experiments_access_level":"enabled","emails_disabled":false,"emails_enabled":true,"shared_runners_enabled":true,"lfs_enabled":false,"creator_id":1215848,"import_status":"finished","open_issues_count":0,"description_html":"\u003cp data-sourcepos=\"1:1-1:30\" dir=\"auto\"\u003eArch packaging and build files\u003c/p\u003e","updated_at":"2022-07-13T21:32:12.624Z","ci_config_path":null,"public_jobs":true,"shared_with_groups":[],"only_allow_merge_if_pipeline_succeeds":false,"allow_merge_on_skipped_pipeline":null,"request_access_enabled":false,"only_allow_merge_if_all_discussions_are_resolved":false,"remove_source_branch_after_merge":null,"printing_merge_request_link_enabled":true,"merge_method":"merge","squash_option":"default_off","enforce_auth_checks_on_uploads":true,"suggestion_commit_message":null,"merge_commit_template":null,"squash_commit_template":null,"issue_branch_template":null,"autoclose_referenced_issues":true,"external_authorization_classification_label":"","requirements_enabled":false,"requirements_access_level":"enabled","security_and_compliance_enabled":false,"compliance_frameworks":[],"permissions":{"project_access":null,"group_access":null}}
|
22
services/migrations/testdata/gitlab/skipped_issue_number/_api_v4_version
vendored
Normal file
22
services/migrations/testdata/gitlab/skipped_issue_number/_api_v4_version
vendored
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
Ratelimit-Observed: 1
|
||||||
|
X-Gitlab-Meta: {"correlation_id":"aa75720bd9c597c7f2f886a4042d1f80","version":"1"}
|
||||||
|
Etag: W/"4e5c0a031c3aacb6ba0a3c19e67d7592"
|
||||||
|
X-Content-Type-Options: nosniff
|
||||||
|
Ratelimit-Limit: 2000
|
||||||
|
Ratelimit-Resettime: Thu, 30 Nov 2023 08:24:53 GMT
|
||||||
|
X-Runtime: 0.039899
|
||||||
|
Ratelimit-Remaining: 1999
|
||||||
|
Set-Cookie: _cfuvid=7OAEitQ3J0BOxrXk2pMBApFg1KFnz5aBVqOY7mHwLRk-1701332633452-0-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None
|
||||||
|
Content-Security-Policy: default-src 'none'
|
||||||
|
Gitlab-Sv: localhost
|
||||||
|
Cf-Cache-Status: MISS
|
||||||
|
Vary: Origin, Accept-Encoding
|
||||||
|
X-Frame-Options: SAMEORIGIN
|
||||||
|
Cache-Control: max-age=0, private, must-revalidate
|
||||||
|
Strict-Transport-Security: max-age=31536000
|
||||||
|
Referrer-Policy: strict-origin-when-cross-origin
|
||||||
|
Ratelimit-Reset: 1701332693
|
||||||
|
Gitlab-Lb: haproxy-main-39-lb-gprd
|
||||||
|
Content-Type: application/json
|
||||||
|
|
||||||
|
{"version":"16.7.0-pre","revision":"acd848a9228","kas":{"enabled":true,"externalUrl":"wss://kas.gitlab.com","version":"v16.7.0-rc2"},"enterprise":true}
|
Loading…
Reference in a new issue