4 files changed,
83 insertions(+),
8 deletions(-)
Author:
Oleksandr Smirnov
olexsmir@gmail.com
Committed at:
2026-03-12 13:50:45 +0200
Authored at:
2026-03-11 21:36:15 +0200
Change ID:
tzwvmypkpqsllkpslxrpwxukxorozyrt
Parent:
6309169
M
internal/git/diff.go
路路路 9 9 ) 10 10 11 11 type TextFragment struct { 12 - Header string 13 - Lines []gitdiff.Line 12 + Header string 13 + Lines []gitdiff.Line 14 + OldPosition int64 15 + NewPosition int64 14 16 } 15 17 16 18 type Diff struct { 路路路 70 72 71 73 for _, tf := range d.TextFragments { 72 74 diff.TextFragments = append(diff.TextFragments, TextFragment{ 73 - Header: tf.Header(), 74 - Lines: tf.Lines, 75 + Header: tf.Header(), 76 + Lines: tf.Lines, 77 + OldPosition: tf.OldPosition, 78 + NewPosition: tf.NewPosition, 75 79 }) 76 80 for _, l := range tf.Lines { 77 81 switch l.Op {
M
internal/handlers/handlers.go
路路路 73 73 74 74 var templateFuncs = template.FuncMap{ 75 75 "inc": func(n int) int { return n + 1 }, 76 + "inc64": func(n int64) int64 { return n + 1 }, 76 77 "humanizeRelTime": func(t time.Time) string { return humanize.Time(t) }, 77 78 "humanizeTime": func(t time.Time) string { return t.Format("2006-01-02 15:04:05 MST") }, 78 79 "urlencode": func(s string) string { return url.PathEscape(s) },
M
web/static/style.css
路路路 309 309 background: var(--light-gray); 310 310 } 311 311 312 +.diff pre { 313 + padding: 0; 314 + margin: 0; 315 +} 316 + 317 +.diff-line { 318 + display: flex; 319 +} 320 + 321 +.diff-line .line-number { 322 + flex-shrink: 0; 323 + user-select: none; 324 + -webkit-user-select: none; 325 + text-align: right; 326 + color: var(--gray); 327 + border-right: 1px solid var(--light-gray); 328 + padding: 0 0.5rem; 329 + min-width: 3rem; 330 +} 331 + 332 +.diff-line .line-number a { 333 + display: inline; 334 + padding: 0; 335 +} 336 + 337 +.diff-line > span:last-child { 338 + flex-grow: 1; 339 + padding: 0 0.5rem; 340 +} 341 + 342 +.diff-line:target { 343 + background: rgba(0, 0, 0, 0.05); 344 +} 345 + 346 +@media (prefers-color-scheme: dark) { 347 + .diff-line:target { 348 + background: rgba(255, 255, 255, 0.05); 349 + } 350 +} 351 + 312 352 .diff-stat { padding: 1rem 0 1rem 0; } 313 353 .diff-add { color: var(--diff-add); } 314 354 .diff-del { color: var(--diff-del); } 315 355 .diff-mod { color: var(--cyan); } 316 356 .diff-noop { color: var(--gray); } 357 +.diff-separator { 358 + justify-content: center; 359 + background: var(--medium-gray); 360 +} 317 361 318 362 .jump { margin-top: 0.5rem; } 319 363 .jump-table { margin-top: 0.25rem; }
M
web/templates/repo_commit.html
路路路 106 106 {{ else }} 107 107 <pre> 108 108 {{- range .TextFragments -}} 109 - <p>{{- .Header -}}</p> 109 + <span class="diff-line diff-noop diff-separator">路路路</span> 110 + {{- $o := .OldPosition -}} 111 + {{- $n := .NewPosition -}} 110 112 {{- range .Lines -}} 111 - {{- if eq .Op.String "+" -}}<span class="diff-add">{{ .String }}</span> 112 - {{- else if eq .Op.String "-" -}}<span class="diff-del">{{ .String }}</span> 113 - {{- else -}}<span class="diff-noop">{{ .String }}</span> 113 + {{- $op := .Op.String -}} 114 + 115 + {{- if eq $op "+" -}} 116 + <span class="diff-line diff-add" id="{{ $path }}-N{{ $n }}"> 117 + <span class="line-number"></span> 118 + <a class="line-number" href="#{{ $path }}-N{{ $n }}">{{ $n }}</a> 119 + <span>{{ .String }}</span> 120 + </span> 121 + {{- $n = inc64 $n -}} 122 + 123 + {{- else if eq $op "-" -}} 124 + <span class="diff-line diff-del" id="{{ $path }}-O{{ $o }}"> 125 + <a class="line-number" href="#{{ $path }}-O{{ $o }}">{{ $o }}</a> 126 + <span class="line-number"></span> 127 + <span>{{ .String }}</span> 128 + </span> 129 + {{- $o = inc64 $o -}} 130 + 131 + {{- else -}} 132 + <span class="diff-line diff-noop" id="{{ $path }}-L{{ $o }}"> 133 + <a class="line-number" href="#{{ $path }}-L{{ $o }}">{{ $o }}</a> 134 + <a class="line-number" href="#{{ $path }}-L{{ $o }}">{{ $n }}</a> 135 + <span>{{ .String }}</span> 136 + </span> 137 + {{- $o = inc64 $o -}} 138 + {{- $n = inc64 $n -}} 114 139 {{- end -}} 140 + 115 141 {{- end -}} 116 142 {{- end -}} 117 143 </pre>