From e43bca40eb0bb821c728ec0aae6ba9aa7812ac5b Mon Sep 17 00:00:00 2001 From: KoCoder Date: Sat, 28 Feb 2026 00:23:55 +0100 Subject: [PATCH] New: save wordcounts in PR Comment --- .gitea/workflows/word-count.yml | 13 +++- scripts/{gemini_review => }/go.mod | 0 scripts/{gemini_review => }/go.sum | 0 scripts/wordcount/main.go | 117 +++++++++++++++++++++++++++++ 4 files changed, 127 insertions(+), 3 deletions(-) rename scripts/{gemini_review => }/go.mod (100%) rename scripts/{gemini_review => }/go.sum (100%) create mode 100644 scripts/wordcount/main.go diff --git a/.gitea/workflows/word-count.yml b/.gitea/workflows/word-count.yml index 9f9a73e..1b5c6e8 100644 --- a/.gitea/workflows/word-count.yml +++ b/.gitea/workflows/word-count.yml @@ -13,7 +13,14 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Count words in Markdown files + - name: Run Gemini Review + env: + GITEA_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITEA_URL: ${{ github.server_url }} + GITHUB_REPOSITORY: ${{ github.repository }} + PR_NUMBER: ${{ github.event.pull_request.number }} run: | - echo "Counting words in all .md files..." - find . -name "*.md" -not -path "*/.*" -exec wc -w {} + | sort -rn + cd scripts/wordcount + go build -o wordcount_bin main.go + cd ../.. + ./scripts/wordcount/wordcount_bin diff --git a/scripts/gemini_review/go.mod b/scripts/go.mod similarity index 100% rename from scripts/gemini_review/go.mod rename to scripts/go.mod diff --git a/scripts/gemini_review/go.sum b/scripts/go.sum similarity index 100% rename from scripts/gemini_review/go.sum rename to scripts/go.sum diff --git a/scripts/wordcount/main.go b/scripts/wordcount/main.go new file mode 100644 index 0000000..762c907 --- /dev/null +++ b/scripts/wordcount/main.go @@ -0,0 +1,117 @@ +package main + +import ( + "fmt" + "io" + "log" + "os" + "strconv" + "strings" + + "code.gitea.io/sdk/gitea" +) + +func main() { + token := os.Getenv("GITEA_TOKEN") + baseURL := os.Getenv("GITEA_URL") + repoFullName := os.Getenv("GITHUB_REPOSITORY") + prNumberStr := os.Getenv("PR_NUMBER") + + if token == "" || prNumberStr == "" { + log.Fatal("Missing required environment variables: GEMINI_API_KEY, GITEA_TOKEN, GITHUB_REPOSITORY, PR_NUMBER") + } + + if baseURL == "" { + baseURL = "https://gitea.com" + } + + prNumber, err := strconv.ParseInt(prNumberStr, 10, 64) + if err != nil { + log.Fatalf("Invalid PR_NUMBER: %v", err) + } + + repoParts := strings.Split(repoFullName, "/") + if len(repoParts) != 2 { + log.Fatalf("Invalid GITHUB_REPOSITORY format: %s", repoFullName) + } + owner, repo := repoParts[0], repoParts[1] + + client, err := gitea.NewClient(baseURL, gitea.SetToken(token)) + if err != nil { + log.Fatalf("Failed to create Gitea client: %v", err) + } + + // Get PR files + files, _, err := client.ListPullRequestFiles(owner, repo, prNumber, gitea.ListPullRequestFilesOptions{}) + if err != nil { + log.Fatalf("Failed to get PR files: %v", err) + } + + var counts []string + for _, file := range files { + if !strings.HasSuffix(file.Filename, ".md") { + continue + } + + fmt.Printf("Reviewing file: %s\n", file.Filename) + content, err := readFile(file.Filename) + if err != nil { + fmt.Printf("Error reading file %s: %v\n", file.Filename, err) + continue + } + + count, err := countWordsInFile(content) + if err != nil { + fmt.Printf("Error getting review for %s: %v\n", file.Filename, err) + continue + } + + counts = append(counts, fmt.Sprintf("#### Review for `%s`\n\n%s", file.Filename, count)) + } + + if len(counts) > 0 { + commentBody := "### 🤖 Gemini Writing Review\n\n" + strings.Join(counts, "\n\n---\n\n") + _, _, err = client.CreateIssueComment(owner, repo, prNumber, gitea.CreateIssueCommentOption{ + Body: commentBody, + }) + if err != nil { + log.Fatalf("Failed to post PR comment: %v", err) + } + fmt.Println("Successfully posted review comments.") + } else { + fmt.Println("No Markdown files to review or no suggestions found.") + } +} + +func readFile(path string) (string, error) { + f, err := os.Open(path) + if err != nil { + return "", err + } + defer f.Close() + + content, err := io.ReadAll(f) + if err != nil { + return "", err + } + return string(content), nil +} + +func countWordsInFile(path string) (int, error) { + file, err := os.Open(path) + if err != nil { + return 0, err + } + defer file.Close() + + content, err := io.ReadAll(file) + if err != nil { + return 0, err + } + + return countWords(string(content)), nil +} + +func countWords(text string) int { + return len(strings.Fields(text)) +}