mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-04 01:34:27 +00:00 
			
		
		
		
	Backport #30878 by wxiaoguang Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
		@@ -7,7 +7,6 @@ package git
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"bytes"
 | 
						"bytes"
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"errors"
 | 
					 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"net/url"
 | 
						"net/url"
 | 
				
			||||||
@@ -63,32 +62,6 @@ func IsRepoURLAccessible(ctx context.Context, url string) bool {
 | 
				
			|||||||
	return err == nil
 | 
						return err == nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetObjectFormatOfRepo returns the hash type of repository at a given path
 | 
					 | 
				
			||||||
func GetObjectFormatOfRepo(ctx context.Context, repoPath string) (ObjectFormat, error) {
 | 
					 | 
				
			||||||
	var stdout, stderr strings.Builder
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	err := NewCommand(ctx, "hash-object", "--stdin").Run(&RunOpts{
 | 
					 | 
				
			||||||
		Dir:    repoPath,
 | 
					 | 
				
			||||||
		Stdout: &stdout,
 | 
					 | 
				
			||||||
		Stderr: &stderr,
 | 
					 | 
				
			||||||
		Stdin:  &strings.Reader{},
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if stderr.Len() > 0 {
 | 
					 | 
				
			||||||
		return nil, errors.New(stderr.String())
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	h, err := NewIDFromString(strings.TrimRight(stdout.String(), "\n"))
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return h.Type(), nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// InitRepository initializes a new Git repository.
 | 
					// InitRepository initializes a new Git repository.
 | 
				
			||||||
func InitRepository(ctx context.Context, repoPath string, bare bool, objectFormatName string) error {
 | 
					func InitRepository(ctx context.Context, repoPath string, bare bool, objectFormatName string) error {
 | 
				
			||||||
	err := os.MkdirAll(repoPath, os.ModePerm)
 | 
						err := os.MkdirAll(repoPath, os.ModePerm)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,7 @@ package repository
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"code.gitea.io/gitea/models/db"
 | 
						"code.gitea.io/gitea/models/db"
 | 
				
			||||||
	git_model "code.gitea.io/gitea/models/git"
 | 
						git_model "code.gitea.io/gitea/models/git"
 | 
				
			||||||
@@ -36,6 +37,15 @@ func SyncRepoBranches(ctx context.Context, repoID, doerID int64) (int64, error)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func SyncRepoBranchesWithRepo(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, doerID int64) (int64, error) {
 | 
					func SyncRepoBranchesWithRepo(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, doerID int64) (int64, error) {
 | 
				
			||||||
 | 
						objFmt, err := gitRepo.GetObjectFormat()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, fmt.Errorf("GetObjectFormat: %w", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, err = db.GetEngine(ctx).ID(repo.ID).Update(&repo_model.Repository{ObjectFormatName: objFmt.Name()})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, fmt.Errorf("UpdateRepository: %w", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	allBranches := container.Set[string]{}
 | 
						allBranches := container.Set[string]{}
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		branches, _, err := gitRepo.GetBranchNames(0, 0)
 | 
							branches, _, err := gitRepo.GetBranchNames(0, 0)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										31
									
								
								modules/repository/branch_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								modules/repository/branch_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					// Copyright 2024 The Gitea Authors. All rights reserved.
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: MIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package repository
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"code.gitea.io/gitea/models/db"
 | 
				
			||||||
 | 
						git_model "code.gitea.io/gitea/models/git"
 | 
				
			||||||
 | 
						repo_model "code.gitea.io/gitea/models/repo"
 | 
				
			||||||
 | 
						"code.gitea.io/gitea/models/unittest"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestSyncRepoBranches(t *testing.T) {
 | 
				
			||||||
 | 
						assert.NoError(t, unittest.PrepareTestDatabase())
 | 
				
			||||||
 | 
						_, err := db.GetEngine(db.DefaultContext).ID(1).Update(&repo_model.Repository{ObjectFormatName: "bad-fmt"})
 | 
				
			||||||
 | 
						assert.NoError(t, db.TruncateBeans(db.DefaultContext, &git_model.Branch{}))
 | 
				
			||||||
 | 
						assert.NoError(t, err)
 | 
				
			||||||
 | 
						repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
 | 
				
			||||||
 | 
						assert.Equal(t, "bad-fmt", repo.ObjectFormatName)
 | 
				
			||||||
 | 
						_, err = SyncRepoBranches(db.DefaultContext, 1, 0)
 | 
				
			||||||
 | 
						assert.NoError(t, err)
 | 
				
			||||||
 | 
						repo = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
 | 
				
			||||||
 | 
						assert.Equal(t, "sha1", repo.ObjectFormatName)
 | 
				
			||||||
 | 
						branch, err := git_model.GetBranch(db.DefaultContext, 1, "master")
 | 
				
			||||||
 | 
						assert.NoError(t, err)
 | 
				
			||||||
 | 
						assert.EqualValues(t, "master", branch.Name)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -195,6 +195,10 @@ func adoptRepository(ctx context.Context, repoPath string, u *user_model.User, r
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	defer gitRepo.Close()
 | 
						defer gitRepo.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if _, err = repo_module.SyncRepoBranchesWithRepo(ctx, repo, gitRepo, 0); err != nil {
 | 
				
			||||||
 | 
							return fmt.Errorf("SyncRepoBranches: %w", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err = repo_module.SyncReleasesWithTags(ctx, repo, gitRepo); err != nil {
 | 
						if err = repo_module.SyncReleasesWithTags(ctx, repo, gitRepo); err != nil {
 | 
				
			||||||
		return fmt.Errorf("SyncReleasesWithTags: %w", err)
 | 
							return fmt.Errorf("SyncReleasesWithTags: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user