Commit 8e1573e

Eric Bower  ·  2026-05-16 09:26:14 -0400 EDT
parent ac17667
style: show total commit in log when truncated
2 files changed,  +37, -8
+6, -1
 1@@ -7,7 +7,12 @@
 2   <div class="group-2">
 3     <div class="box sticky flex items-center gap border-visited" style="margin: 0 !important;">
 4       <code>{{.RevData.Name}}</code>
 5-      <div><span class="font-bold">{{.NumCommits}}</span> commits</div>
 6+      <div>
 7+        <span class="font-bold">{{.NumCommits}}</span> commits
 8+        {{if and .TotalCommits (ne .NumCommits .TotalCommits)}}
 9+          <span class="text-sm">({{.NumCommits}} out of {{.TotalCommits}} generated)</span>
10+        {{end}}
11+      </div>
12     </div>
13 
14     {{range .Logs}}
+31, -7
 1@@ -10,8 +10,10 @@ import (
 2 	"io"
 3 	"log/slog"
 4 	"os"
 5+	"os/exec"
 6 	"path/filepath"
 7 	"sort"
 8+	"strconv"
 9 	"strings"
10 	"sync"
11 	"time"
12@@ -191,8 +193,9 @@ type TreePageData struct {
13 
14 type LogPageData struct {
15 	*PageData
16-	NumCommits int
17-	Logs       []*CommitData
18+	NumCommits   int
19+	TotalCommits int
20+	Logs         []*CommitData
21 }
22 
23 type FilePageData struct {
24@@ -484,7 +487,7 @@ func (c *Config) writeTree(data PageData, tree *TreeRoot) {
25 	})
26 }
27 
28-func (c *Config) writeLog(data PageData, logs []*CommitData) {
29+func (c *Config) writeLog(data PageData, logs []*CommitData, totalCommits int) {
30 	data.ActivePage = "commits"
31 	c.Logger.Info("writing log file", "revision", data.RevData.Name())
32 	c.writeHtml(&WriteData{
33@@ -492,9 +495,10 @@ func (c *Config) writeLog(data PageData, logs []*CommitData) {
34 		Subdir:   getLogBaseDir(data.RevData),
35 		Template: "html/log.page.tmpl",
36 		Data: &LogPageData{
37-			PageData:   &data,
38-			NumCommits: len(logs),
39-			Logs:       logs,
40+			PageData:     &data,
41+			NumCommits:   len(logs),
42+			TotalCommits: totalCommits,
43+			Logs:         logs,
44 		},
45 	})
46 }
47@@ -701,6 +705,23 @@ func getShortID(id string) string {
48 	return id[:7]
49 }
50 
51+// countCommits returns the total number of commits reachable from the given ref
52+func countCommits(repo *git.Repository, ref string) int {
53+	// git rev-list --count is the most efficient way to get total commit count
54+	cmd := exec.Command("git", "rev-list", "--count", ref)
55+	cmd.Dir = repo.Path() // run in the repo directory
56+	out, err := cmd.CombinedOutput()
57+	if err != nil {
58+		// fallback: if git command fails, return 0
59+		return 0
60+	}
61+	count, err := strconv.Atoi(strings.TrimSpace(string(out)))
62+	if err != nil {
63+		return 0
64+	}
65+	return count
66+}
67+
68 func (c *Config) writeRepo() *BranchOutput {
69 	c.Logger.Info("writing repo", "repoPath", c.RepoPath)
70 	repo, err := git.Open(c.RepoPath)
71@@ -1041,6 +1062,9 @@ func (c *Config) writeRevision(repo *git.Repository, pageData *PageData, refs []
72 		if pageSize == 0 {
73 			pageSize = 5000
74 		}
75+		// get total commit count (unlimited) for display
76+		totalCommits := countCommits(repo, pageData.RevData.ID())
77+
78 		commits, err := repo.CommitsByPage(pageData.RevData.ID(), 0, pageSize)
79 		bail(err)
80 
81@@ -1076,7 +1100,7 @@ func (c *Config) writeRevision(repo *git.Repository, pageData *PageData, refs []
82 			})
83 		}
84 
85-		c.writeLog(*pageData, logs)
86+		c.writeLog(*pageData, logs, totalCommits)
87 
88 		for _, cm := range logs {
89 			wg.Add(1)