|
|
|
@@ -4,10 +4,13 @@ import ( |
|
|
|
"bufio" |
|
|
|
"bytes" |
|
|
|
"fmt" |
|
|
|
"net/url" |
|
|
|
"sort" |
|
|
|
"strconv" |
|
|
|
"strings" |
|
|
|
"time" |
|
|
|
|
|
|
|
Log "code.gitea.io/gitea/modules/log" |
|
|
|
) |
|
|
|
|
|
|
|
type RepoKPIStats struct { |
|
|
|
@@ -17,6 +20,7 @@ type RepoKPIStats struct { |
|
|
|
ContributorsAdded int64 |
|
|
|
CommitsAdded int64 |
|
|
|
CommitLinesModified int64 |
|
|
|
WikiPages int64 |
|
|
|
Authors []*UserKPITypeStats |
|
|
|
} |
|
|
|
|
|
|
|
@@ -31,7 +35,7 @@ type UserKPITypeStats struct { |
|
|
|
isNewContributor bool //是否是4个月内的新增贡献者 |
|
|
|
} |
|
|
|
|
|
|
|
func GetRepoKPIStats(repoPath string) (*RepoKPIStats, error) { |
|
|
|
func GetRepoKPIStats(repoPath string, wikiPath string) (*RepoKPIStats, error) { |
|
|
|
stats := &RepoKPIStats{} |
|
|
|
|
|
|
|
contributors, err := GetContributors(repoPath) |
|
|
|
@@ -76,6 +80,8 @@ func GetRepoKPIStats(repoPath string) (*RepoKPIStats, error) { |
|
|
|
if err != nil { |
|
|
|
return nil, fmt.Errorf("FillFromGit: %v", err) |
|
|
|
} |
|
|
|
|
|
|
|
setWikiPages(wikiPath, stats) |
|
|
|
return stats, nil |
|
|
|
|
|
|
|
} |
|
|
|
@@ -282,3 +288,82 @@ func getContributors(repoPath string, fromTime time.Time) ([]Contributor, error) |
|
|
|
} |
|
|
|
return nil, nil |
|
|
|
} |
|
|
|
|
|
|
|
func setWikiPages(wikiPath string, stats *RepoKPIStats) { |
|
|
|
wikiPages := 0 |
|
|
|
|
|
|
|
if wikiPath == "" { |
|
|
|
stats.WikiPages = int64(wikiPages) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
wikiRepo, commit, err := findWikiRepoCommit(wikiPath) |
|
|
|
if err != nil { |
|
|
|
if !IsErrNotExist(err) { |
|
|
|
Log.Warn("GetBranchCommit", err) |
|
|
|
} |
|
|
|
stats.WikiPages = int64(wikiPages) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
// Get page list. |
|
|
|
entries, err := commit.ListEntries() |
|
|
|
if err != nil { |
|
|
|
if wikiRepo != nil { |
|
|
|
wikiRepo.Close() |
|
|
|
} |
|
|
|
Log.Warn("GetBranchCommit", err) |
|
|
|
stats.WikiPages = int64(wikiPages) |
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
for _, entry := range entries { |
|
|
|
if !entry.IsRegular() { |
|
|
|
continue |
|
|
|
} |
|
|
|
|
|
|
|
wikiName, err := filenameToName(entry.Name()) |
|
|
|
if err != nil || wikiName == "_Sidebar" || wikiName == "_Footer" { |
|
|
|
continue |
|
|
|
} |
|
|
|
|
|
|
|
wikiPages += 1 |
|
|
|
|
|
|
|
} |
|
|
|
//确保wikiRepo用完被关闭 |
|
|
|
defer func() { |
|
|
|
if wikiRepo != nil { |
|
|
|
wikiRepo.Close() |
|
|
|
} |
|
|
|
}() |
|
|
|
stats.WikiPages = int64(wikiPages) |
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
func filenameToName(filename string) (string, error) { |
|
|
|
if !strings.HasSuffix(filename, ".md") { |
|
|
|
return "", fmt.Errorf("invalid file") |
|
|
|
} |
|
|
|
basename := filename[:len(filename)-3] |
|
|
|
unescaped, err := url.QueryUnescape(basename) |
|
|
|
if err != nil { |
|
|
|
return "", err |
|
|
|
} |
|
|
|
return strings.Replace(unescaped, "-", " ", -1), nil |
|
|
|
} |
|
|
|
|
|
|
|
func findWikiRepoCommit(wikiPath string) (*Repository, *Commit, error) { |
|
|
|
wikiRepo, err := OpenRepository(wikiPath) |
|
|
|
if err != nil { |
|
|
|
|
|
|
|
return nil, nil, err |
|
|
|
} |
|
|
|
|
|
|
|
commit, err := wikiRepo.GetBranchCommit("master") |
|
|
|
if err != nil { |
|
|
|
return wikiRepo, nil, err |
|
|
|
} |
|
|
|
return wikiRepo, commit, nil |
|
|
|
} |