mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-10-31 06:21:11 +00:00 
			
		
		
		
	F3: Forgejo driver and CLI
user, topic, project, label, milestone, repository, pull_request, release, asset, comment, reaction, review providers Signed-off-by: Earl Warren <contact@earl-warren.org> Preserve file size when creating attachments Introduced inc6f5029708repoList.LoadAttributes has a ctx argument now Rename `repo.GetOwner` to `repo.LoadOwner`bd66fa586aupgrade to the latest gof3 (cherry picked from commitc770713656) [F3] ID remapping logic is in place, remove workaround (cherry picked from commitd0fee30167) [F3] it is experimental, do not enable by default (cherry picked from commitde325b21d0) (cherry picked from commit547e7b3c40) (cherry picked from commit820df3a56b) (cherry picked from commiteaba87689b) (cherry picked from commit1b86896b3b)
This commit is contained in:
		
					parent
					
						
							
								c240b34f59
							
						
					
				
			
			
				commit
				
					
						0046aac1c6
					
				
			
		
					 28 changed files with 2748 additions and 6 deletions
				
			
		
							
								
								
									
										157
									
								
								services/f3/driver/project.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								services/f3/driver/project.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,157 @@ | |||
| // SPDX-License-Identifier: MIT | ||||
| 
 | ||||
| package driver | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 
 | ||||
| 	"code.gitea.io/gitea/models/db" | ||||
| 	repo_model "code.gitea.io/gitea/models/repo" | ||||
| 	user_model "code.gitea.io/gitea/models/user" | ||||
| 	repo_module "code.gitea.io/gitea/modules/repository" | ||||
| 	repo_service "code.gitea.io/gitea/services/repository" | ||||
| 
 | ||||
| 	"lab.forgefriends.org/friendlyforgeformat/gof3/format" | ||||
| 	f3_util "lab.forgefriends.org/friendlyforgeformat/gof3/util" | ||||
| ) | ||||
| 
 | ||||
| type Project struct { | ||||
| 	repo_model.Repository | ||||
| } | ||||
| 
 | ||||
| func ProjectConverter(f *repo_model.Repository) *Project { | ||||
| 	return &Project{ | ||||
| 		Repository: *f, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (o Project) GetID() int64 { | ||||
| 	return o.ID | ||||
| } | ||||
| 
 | ||||
| func (o *Project) SetID(id int64) { | ||||
| 	o.ID = id | ||||
| } | ||||
| 
 | ||||
| func (o *Project) IsNil() bool { | ||||
| 	return o.ID == 0 | ||||
| } | ||||
| 
 | ||||
| func (o *Project) Equals(other *Project) bool { | ||||
| 	return (o.Name == other.Name) | ||||
| } | ||||
| 
 | ||||
| func (o *Project) ToFormat() *format.Project { | ||||
| 	return &format.Project{ | ||||
| 		Common:        format.NewCommon(o.ID), | ||||
| 		Name:          o.Name, | ||||
| 		Owner:         o.Owner.Name, | ||||
| 		IsPrivate:     o.IsPrivate, | ||||
| 		Description:   o.Description, | ||||
| 		CloneURL:      repo_model.ComposeHTTPSCloneURL(o.Owner.Name, o.Name), | ||||
| 		OriginalURL:   o.OriginalURL, | ||||
| 		DefaultBranch: o.DefaultBranch, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (o *Project) FromFormat(project *format.Project) { | ||||
| 	*o = Project{ | ||||
| 		Repository: repo_model.Repository{ | ||||
| 			ID:   project.GetID(), | ||||
| 			Name: project.Name, | ||||
| 			Owner: &user_model.User{ | ||||
| 				Name: project.Owner, | ||||
| 			}, | ||||
| 			IsPrivate:     project.IsPrivate, | ||||
| 			Description:   project.Description, | ||||
| 			OriginalURL:   project.OriginalURL, | ||||
| 			DefaultBranch: project.DefaultBranch, | ||||
| 		}, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| type ProjectProvider struct { | ||||
| 	g          *Forgejo | ||||
| 	milestones f3_util.NameIDMap | ||||
| 	labels     f3_util.NameIDMap | ||||
| } | ||||
| 
 | ||||
| func (o *ProjectProvider) ToFormat(ctx context.Context, project *Project) *format.Project { | ||||
| 	return project.ToFormat() | ||||
| } | ||||
| 
 | ||||
| func (o *ProjectProvider) FromFormat(ctx context.Context, p *format.Project) *Project { | ||||
| 	var project Project | ||||
| 	project.FromFormat(p) | ||||
| 	return &project | ||||
| } | ||||
| 
 | ||||
| func (o *ProjectProvider) GetObjects(ctx context.Context, user *User, page int) []*Project { | ||||
| 	repoList, _, err := repo_model.GetUserRepositories(&repo_model.SearchRepoOptions{ | ||||
| 		ListOptions: db.ListOptions{Page: page, PageSize: o.g.perPage}, | ||||
| 		Actor:       &user.User, | ||||
| 		Private:     true, | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		panic(fmt.Errorf("error while listing projects: %T %v", err, err)) | ||||
| 	} | ||||
| 	if err := repoList.LoadAttributes(ctx); err != nil { | ||||
| 		panic(nil) | ||||
| 	} | ||||
| 	return f3_util.ConvertMap[*repo_model.Repository, *Project](([]*repo_model.Repository)(repoList), ProjectConverter) | ||||
| } | ||||
| 
 | ||||
| func (o *ProjectProvider) ProcessObject(ctx context.Context, user *User, project *Project) { | ||||
| } | ||||
| 
 | ||||
| func (o *ProjectProvider) Get(ctx context.Context, user *User, exemplar *Project) *Project { | ||||
| 	var project *repo_model.Repository | ||||
| 	var err error | ||||
| 	if exemplar.GetID() > 0 { | ||||
| 		project, err = repo_model.GetRepositoryByID(ctx, exemplar.GetID()) | ||||
| 	} else if exemplar.Name != "" { | ||||
| 		project, err = repo_model.GetRepositoryByName(user.GetID(), exemplar.Name) | ||||
| 	} else { | ||||
| 		panic("GetID() == 0 and ProjectName == \"\"") | ||||
| 	} | ||||
| 	if repo_model.IsErrRepoNotExist(err) { | ||||
| 		return &Project{} | ||||
| 	} | ||||
| 	if err != nil { | ||||
| 		panic(fmt.Errorf("project %v %w", exemplar, err)) | ||||
| 	} | ||||
| 	if err := project.LoadOwner(ctx); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return ProjectConverter(project) | ||||
| } | ||||
| 
 | ||||
| func (o *ProjectProvider) Put(ctx context.Context, user *User, project *Project) *Project { | ||||
| 	repo, err := repo_module.CreateRepository(o.g.GetDoer(), &user.User, repo_module.CreateRepoOptions{ | ||||
| 		Name:        project.Name, | ||||
| 		Description: project.Description, | ||||
| 		OriginalURL: project.OriginalURL, | ||||
| 		IsPrivate:   project.IsPrivate, | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return o.Get(ctx, user, ProjectConverter(repo)) | ||||
| } | ||||
| 
 | ||||
| func (o *ProjectProvider) Delete(ctx context.Context, user *User, project *Project) *Project { | ||||
| 	if project.IsNil() { | ||||
| 		return project | ||||
| 	} | ||||
| 	if project.ID > 0 { | ||||
| 		project = o.Get(ctx, user, project) | ||||
| 	} | ||||
| 	if !project.IsNil() { | ||||
| 		err := repo_service.DeleteRepository(ctx, o.g.GetDoer(), &project.Repository, true) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 	} | ||||
| 	return project | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue