mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-30 06:38:37 -04:00 
			
		
		
		
	Add support for migrating from Gitlab (#9084)
* First stab at a Gitlab migrations interface. * Modify JS to show migration for Gitlab * Properly strip out #gitlab tag from repo name * Working Gitlab migrations! Still need to figure out how to hide tokens/etc from showing up in opts.CloneAddr * Try #2 at trying to hide credentials. CloneAddr was being used as OriginalURL. Now passing OriginalURL through from the form and saving it. * Add go-gitlab dependency * Vendor go-gitlab * Use gitlab.BasicAuthClient Correct CloneURL. This should be functioning! Previous commits fixed "Migrated from" from including the migration credentials. * Replaced repoPath with repoID globally. RepoID is grabbed in NewGitlabDownloader * Logging touchup * Properly set private repo status. Properly set milestone deadline time. Consistently use Gitlab username for 'Name'. * Add go-gitlab vendor cache * Fix PR migrations: - Count of issues is kept to set a non-conflicting PR.ID - Bool is used to tell whether to fetch Issue or PR comments * Ensure merged PRs are closed and set with the proper time * Remove copyright and some commented code * Rip out '#gitlab' based self-hosted Gitlab support * Hide given credentials for migrated repos. CloneAddr was being saved as OriginalURL. Now passing OriginalURL through from the form and saving it in it's place * Use asset.URL directly, no point in parsing. Opened PRs should fall through to false. * Fix importing Milestones. Allow importing using Personal Tokens or anonymous access. * Fix Gitlab Milestone migration if DueDate isn't set * Empty Milestone due dates properly return nil, not zero time * Add GITLAB_READ_TOKEN to drone unit-test step * Add working gitlab_test.go. A Personal Access Token, given in env variable GITLAB_READ_TOKEN is required to run the test. * Fix linting issues * Add modified JS files * Remove pre-build JS files * Only merged PRs are marged as merged/closed * Test topics * Skip test if gitlab is inaccessible * Grab personal token from username, not password. Matches Github migration implementation * Add SetContext() to GitlabDownloader. * Checking Updated field in Issues. * Actually fetch Issue Updated time from Gitlab * Add Gitlab migration GetReviews() stub * Fix Patch and Clone URLs * check Updated too * fix mod * make vendor with go1.14 Co-authored-by: techknowlogick <techknowlogick@gitea.io> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: Lauris BH <lauris@nix.lv> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
		
							
								
								
									
										117
									
								
								vendor/github.com/xanzy/go-gitlab/event_parsing.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								vendor/github.com/xanzy/go-gitlab/event_parsing.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,117 @@ | ||||
| package gitlab | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| ) | ||||
|  | ||||
| // EventType represents a Gitlab event type. | ||||
| type EventType string | ||||
|  | ||||
| // List of available event types. | ||||
| const ( | ||||
| 	EventTypeBuild        EventType = "Build Hook" | ||||
| 	EventTypeIssue        EventType = "Issue Hook" | ||||
| 	EventTypeJob          EventType = "Job Hook" | ||||
| 	EventTypeMergeRequest EventType = "Merge Request Hook" | ||||
| 	EventTypeNote         EventType = "Note Hook" | ||||
| 	EventTypePipeline     EventType = "Pipeline Hook" | ||||
| 	EventTypePush         EventType = "Push Hook" | ||||
| 	EventTypeTagPush      EventType = "Tag Push Hook" | ||||
| 	EventTypeWikiPage     EventType = "Wiki Page Hook" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	noteableTypeCommit       = "Commit" | ||||
| 	noteableTypeMergeRequest = "MergeRequest" | ||||
| 	noteableTypeIssue        = "Issue" | ||||
| 	noteableTypeSnippet      = "Snippet" | ||||
| ) | ||||
|  | ||||
| type noteEvent struct { | ||||
| 	ObjectKind       string `json:"object_kind"` | ||||
| 	ObjectAttributes struct { | ||||
| 		NoteableType string `json:"noteable_type"` | ||||
| 	} `json:"object_attributes"` | ||||
| } | ||||
|  | ||||
| const eventTypeHeader = "X-Gitlab-Event" | ||||
|  | ||||
| // WebhookEventType returns the event type for the given request. | ||||
| func WebhookEventType(r *http.Request) EventType { | ||||
| 	return EventType(r.Header.Get(eventTypeHeader)) | ||||
| } | ||||
|  | ||||
| // ParseWebhook parses the event payload. For recognized event types, a | ||||
| // value of the corresponding struct type will be returned. An error will | ||||
| // be returned for unrecognized event types. | ||||
| // | ||||
| // Example usage: | ||||
| // | ||||
| // func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { | ||||
| //     payload, err := ioutil.ReadAll(r.Body) | ||||
| //     if err != nil { ... } | ||||
| //     event, err := gitlab.ParseWebhook(gitlab.WebhookEventType(r), payload) | ||||
| //     if err != nil { ... } | ||||
| //     switch event := event.(type) { | ||||
| //     case *gitlab.PushEvent: | ||||
| //         processPushEvent(event) | ||||
| //     case *gitlab.MergeEvent: | ||||
| //         processMergeEvent(event) | ||||
| //     ... | ||||
| //     } | ||||
| // } | ||||
| // | ||||
| func ParseWebhook(eventType EventType, payload []byte) (event interface{}, err error) { | ||||
| 	switch eventType { | ||||
| 	case EventTypeBuild: | ||||
| 		event = &BuildEvent{} | ||||
| 	case EventTypeIssue: | ||||
| 		event = &IssueEvent{} | ||||
| 	case EventTypeJob: | ||||
| 		event = &JobEvent{} | ||||
| 	case EventTypeMergeRequest: | ||||
| 		event = &MergeEvent{} | ||||
| 	case EventTypePipeline: | ||||
| 		event = &PipelineEvent{} | ||||
| 	case EventTypePush: | ||||
| 		event = &PushEvent{} | ||||
| 	case EventTypeTagPush: | ||||
| 		event = &TagEvent{} | ||||
| 	case EventTypeWikiPage: | ||||
| 		event = &WikiPageEvent{} | ||||
| 	case EventTypeNote: | ||||
| 		note := ¬eEvent{} | ||||
| 		err := json.Unmarshal(payload, note) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
|  | ||||
| 		if note.ObjectKind != "note" { | ||||
| 			return nil, fmt.Errorf("unexpected object kind %s", note.ObjectKind) | ||||
| 		} | ||||
|  | ||||
| 		switch note.ObjectAttributes.NoteableType { | ||||
| 		case noteableTypeCommit: | ||||
| 			event = &CommitCommentEvent{} | ||||
| 		case noteableTypeMergeRequest: | ||||
| 			event = &MergeCommentEvent{} | ||||
| 		case noteableTypeIssue: | ||||
| 			event = &IssueCommentEvent{} | ||||
| 		case noteableTypeSnippet: | ||||
| 			event = &SnippetCommentEvent{} | ||||
| 		default: | ||||
| 			return nil, fmt.Errorf("unexpected noteable type %s", note.ObjectAttributes.NoteableType) | ||||
| 		} | ||||
|  | ||||
| 	default: | ||||
| 		return nil, fmt.Errorf("unexpected event type: %s", eventType) | ||||
| 	} | ||||
|  | ||||
| 	if err := json.Unmarshal(payload, event); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return event, nil | ||||
| } | ||||
		Reference in New Issue
	
	Block a user