mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	Use native git variants by default with go-git variants as build tag (#13673)
* Move last commit cache back into modules/git Signed-off-by: Andrew Thornton <art27@cantab.net> * Remove go-git from the interface for last commit cache Signed-off-by: Andrew Thornton <art27@cantab.net> * move cacheref to last_commit_cache Signed-off-by: Andrew Thornton <art27@cantab.net> * Remove go-git from routers/private/hook Signed-off-by: Andrew Thornton <art27@cantab.net> * Move FindLFSFiles to pipeline Signed-off-by: Andrew Thornton <art27@cantab.net> * Make no-go-git variants Signed-off-by: Andrew Thornton <art27@cantab.net> * Submodule RefID Signed-off-by: Andrew Thornton <art27@cantab.net> * fix issue with GetCommitsInfo Signed-off-by: Andrew Thornton <art27@cantab.net> * fix GetLastCommitForPaths Signed-off-by: Andrew Thornton <art27@cantab.net> * Improve efficiency Signed-off-by: Andrew Thornton <art27@cantab.net> * More efficiency Signed-off-by: Andrew Thornton <art27@cantab.net> * even faster Signed-off-by: Andrew Thornton <art27@cantab.net> * Reduce duplication * As per @lunny Signed-off-by: Andrew Thornton <art27@cantab.net> * attempt to fix drone Signed-off-by: Andrew Thornton <art27@cantab.net> * fix test-tags Signed-off-by: Andrew Thornton <art27@cantab.net> * default to use no-go-git variants and add gogit build tag Signed-off-by: Andrew Thornton <art27@cantab.net> * placate lint Signed-off-by: Andrew Thornton <art27@cantab.net> * as per @6543 Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: techknowlogick <techknowlogick@gitea.io>
This commit is contained in:
		
							
								
								
									
										113
									
								
								modules/git/repo_language_stats_gogit.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								modules/git/repo_language_stats_gogit.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,113 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved. | ||||
| // Use of this source code is governed by a MIT-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| // +build gogit | ||||
|  | ||||
| package git | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"io" | ||||
| 	"io/ioutil" | ||||
|  | ||||
| 	"code.gitea.io/gitea/modules/analyze" | ||||
|  | ||||
| 	"github.com/go-enry/go-enry/v2" | ||||
| 	"github.com/go-git/go-git/v5" | ||||
| 	"github.com/go-git/go-git/v5/plumbing" | ||||
| 	"github.com/go-git/go-git/v5/plumbing/object" | ||||
| ) | ||||
|  | ||||
| // GetLanguageStats calculates language stats for git repository at specified commit | ||||
| func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, error) { | ||||
| 	r, err := git.PlainOpen(repo.Path) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	rev, err := r.ResolveRevision(plumbing.Revision(commitID)) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	commit, err := r.CommitObject(*rev) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	tree, err := commit.Tree() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	sizes := make(map[string]int64) | ||||
| 	err = tree.Files().ForEach(func(f *object.File) error { | ||||
| 		if f.Size == 0 || enry.IsVendor(f.Name) || enry.IsDotFile(f.Name) || | ||||
| 			enry.IsDocumentation(f.Name) || enry.IsConfiguration(f.Name) { | ||||
| 			return nil | ||||
| 		} | ||||
|  | ||||
| 		// If content can not be read or file is too big just do detection by filename | ||||
| 		var content []byte | ||||
| 		if f.Size <= bigFileSize { | ||||
| 			content, _ = readFile(f, fileSizeLimit) | ||||
| 		} | ||||
| 		if enry.IsGenerated(f.Name, content) { | ||||
| 			return nil | ||||
| 		} | ||||
|  | ||||
| 		// TODO: Use .gitattributes file for linguist overrides | ||||
|  | ||||
| 		language := analyze.GetCodeLanguage(f.Name, content) | ||||
| 		if language == enry.OtherLanguage || language == "" { | ||||
| 			return nil | ||||
| 		} | ||||
|  | ||||
| 		// group languages, such as Pug -> HTML; SCSS -> CSS | ||||
| 		group := enry.GetLanguageGroup(language) | ||||
| 		if group != "" { | ||||
| 			language = group | ||||
| 		} | ||||
|  | ||||
| 		sizes[language] += f.Size | ||||
|  | ||||
| 		return nil | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	// filter special languages unless they are the only language | ||||
| 	if len(sizes) > 1 { | ||||
| 		for language := range sizes { | ||||
| 			langtype := enry.GetLanguageType(language) | ||||
| 			if langtype != enry.Programming && langtype != enry.Markup { | ||||
| 				delete(sizes, language) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return sizes, nil | ||||
| } | ||||
|  | ||||
| func readFile(f *object.File, limit int64) ([]byte, error) { | ||||
| 	r, err := f.Reader() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	defer r.Close() | ||||
|  | ||||
| 	if limit <= 0 { | ||||
| 		return ioutil.ReadAll(r) | ||||
| 	} | ||||
|  | ||||
| 	size := f.Size | ||||
| 	if limit > 0 && size > limit { | ||||
| 		size = limit | ||||
| 	} | ||||
| 	buf := bytes.NewBuffer(nil) | ||||
| 	buf.Grow(int(size)) | ||||
| 	_, err = io.Copy(buf, io.LimitReader(r, limit)) | ||||
| 	return buf.Bytes(), err | ||||
| } | ||||
		Reference in New Issue
	
	Block a user