Files snapshot from new-commit-view

./js_templates/commits.ts

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
8230d6 Tucker McKnight
913bff Tucker McKnight
8a5d0a Tucker McKnight
913bff Tucker McKnight
913bff Tucker McKnight
8a5d0a Tucker McKnight
913bff Tucker McKnight
913bff Tucker McKnight
913bff Tucker McKnight
99f634 Tucker McKnight
913bff Tucker McKnight
913bff Tucker McKnight
913bff Tucker McKnight
99f634 Tucker McKnight
99f634 Tucker McKnight
99f634 Tucker McKnight
99f634 Tucker McKnight
99f634 Tucker McKnight
99f634 Tucker McKnight
99f634 Tucker McKnight
8a5d0a Tucker McKnight
8a5d0a Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
be1c77 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
99f634 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
0dfdda Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
99f634 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
be1c77 Tucker McKnight
b30bd9 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
b1c071 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
d05ed8 Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
d05ed8 Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
c02110 Tucker McKnight
bfcbfe Tucker McKnight
c02110 Tucker McKnight
c02110 Tucker McKnight
c02110 Tucker McKnight
c02110 Tucker McKnight
d05ed8 Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
d05ed8 Tucker McKnight
d05ed8 Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
bfcbfe Tucker McKnight
d05ed8 Tucker McKnight
bfcbfe Tucker McKnight
d05ed8 Tucker McKnight
d05ed8 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
99f634 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
be1c77 Tucker McKnight
b30bd9 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
b1c071 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
8230d6 Tucker McKnight
651585 Tucker McKnight
8a5d0a Tucker McKnight
8a5d0a Tucker McKnight
913bff Tucker McKnight
import m from 'mithril'
import {NavHelper} from './helpers/nav.ts'
import htmlPage from './common/htmlPage.ts'

export default async (
  reposConfig: any,
  eleventyConfig: any,
  data: any,
) => {
  const pagesJustForRef = eleventyConfig.getFilter("pagesJustForRef")
  const slugify = eleventyConfig.getFilter("slugify")
  const date = eleventyConfig.getFilter("date")

  const nav = NavHelper({
    reposConfig,
    slugify,
    currentRepoName: data.patchPage.repoName,
    currentRefName: data.patchPage.refName,
    currentRefType: data.patchPage.type,
  })

  const pageContent = [
    m('div', {class: "row mt-3 mb-1"},
      m('div', {class: "col"},
        m('p', {class: "d-inline-block"}, [
          'Showing commits from ',
          m('span', {class: "font-monospace me-2"}, data.patchPage.refName),
          m('a', {
            class: "btn btn-outline-primary badge shadow-none",
            href: nav.rssFeed()
          }, [
            m('img', {
              src: `${nav.rootPath()}frontend/img/rss-icon.svg`,
              style: "width: 11px; margin-right: 5px;"
            }),
            'RSS',
          ])
        ])
      )
    ),
    m('nav', 
      m('ul', {class: "pagination"},
        pagesJustForRef(
          data.paginatedPatches,
          data.patchPage.repoName,
          data.patchPage.refName,
          data.patchPage.type,
        ).map((pageObj) => {
          return m('li', {class: "page-item"},
            m('a', {
              class: `page-link ${pageObj.pageNumber === data.patchPage.pageNumber ? 'active' : ''}`,
              href: `${nav.commits(pageObj.pageNumber)}`,
            }, pageObj.pageNumber)
          )
        })
      )
    ),
    m('div', {class: "container"}, data.patchPage.commits.map((commit) => {
      // Map of fileExtension => [lines_deleted, lines_added]
      const languageCounts = new Map<string, [number, number]>()

      commit.diffs.forEach((diff) => {
        const fileParts = diff.fileName.split(".")
        const fileExtension = fileParts[fileParts.length - 1]
        const currentCounts = languageCounts.get(fileExtension) || [0, 0]
        currentCounts[0] = currentCounts[0] + diff.removed
        currentCounts[1] = currentCounts[1] + diff.added
        languageCounts.set(fileExtension, currentCounts)
      })

      let totalDiffSizePerExtension = []
      // see which languages have the largest change
      // totalDiffSizePerExtension = [{extension: 'html', total: '50'}]
      for (const entry of languageCounts) {
        totalDiffSizePerExtension.push({ extension: entry[0], total: entry[1][0] + entry[1][1] })
      }

      totalDiffSizePerExtension = totalDiffSizePerExtension.toSorted((a, b) => {
        return b.total - a.total
      })

      const numOfTopLanguages = Math.min(3, totalDiffSizePerExtension.filter(a => a.total).length)
      const topLanguagePercentages = totalDiffSizePerExtension.slice(0, numOfTopLanguages)
      const otherLanguageDiffs = totalDiffSizePerExtension.slice(numOfTopLanguages).reduce((totals, current) => {
        totals[0] += languageCounts.get(current.extension)[0]
        totals[1] += languageCounts.get(current.extension)[1]
        return totals
      }, [0, 0])

      return [
        m('div', {class: "commit row py-2 my-2"}, [
          m('div', {class: "col-md-auto col-12 commit-date"}, [
            m('span', {class: "date mb-1 me-2 font-monospace d-inline-block text-nowrap"}, date(commit.date).split(' ').slice(1).join(' ')),
            commit.isMerge ? m('span', {class: 'badge rounded-pill bg-warning me-1'}, 'merge') : null,
            // TODO: if this commit has any tags, list them here
            // m('span', {class: "bg-danger mb-1 badge rounded-pill d-inline-block"}, 'v1.2')
          ]),
          m('div', { class: 'col' }, [
            m('div', { class: 'row' }, [
              m('div', {class: "col-12 col-md-8"}, [
                m('div', {class: "row mb-1"},
                  m('a', {href: nav.commit(commit.hash), class: "commit-msg"}, commit.message.split('\n').slice(0, 1))
                ),
                m('div', {class: "row mb-3 mb-lg-0"}, [
                  m('div', {class: "col d-flex flex-direction-row align-items-center flex-wrap"}, [
                    m('span', {class: "author me-2"}, commit.author),
                    // TODO: if the user has a verified website, put it here
                    // m('span', {class: "bg-primary badge rounded-pill me-2"}, 'tuckerm.us'),
                  ])
                ])
              ]),
              m('div', {class: "col-12 col-md-4 d-flex"}, [
                m('div', { class: "d-flex flex-column" }, topLanguagePercentages.map((topLangPercent) => {
                  return m('div', {
                    class: 'font-monospace small',
                    style: 'height: 1rem;'
                  }, topLangPercent.extension)
                }).concat(otherLanguageDiffs[0] > 0 || otherLanguageDiffs[1] > 0
                  ? m('div', {
                      class: 'font-monospace small',
                      style: 'height: 1rem;'
                  }, `other ${otherLanguageDiffs[0]} ${otherLanguageDiffs[1]}`)
                  : null,
                )),
                m('div', {
                  class: "d-flex flex-column flex-grow-1"
                }, topLanguagePercentages.map((topLangPercent) => {
                  const langDiffs = languageCounts.get(topLangPercent.extension)
                  // TODO: make the average commit size adjustable
                  const adjustedLength = Math.min(langDiffs[0] + langDiffs[1], 100)
                  return m('div', {
                    style: `height: 1rem; width: ${adjustedLength}%; background: black;`
                  })
                }))
              ]),
            ]),
          ]),
          m('div', {class: 'col-12 col-md-auto'}, [
            m('div', {class: "input-group mb-2 flex-nowrap"}, [
              m('span', {class: "font-monospace input-group-text border-info text-white text-bg-dark overflow-scroll"}, commit.hash.slice(0, 6)),
              m('button', {'data-copy-text': commit.hash, class: "btn btn-sm btn-info shadow-none copy-button"}, 'Copy')
            ])
          ]),
        ]),
      ]
    })),
    m('nav',
      m('ul', {class: "pagination"},
        pagesJustForRef(
          data.paginatedPatches,
          data.patchPage.repoName,
          data.patchPage.refName,
          data.patchPage.type,
        ).map((pageObj) => {
          return m('li', {class: "page-item"},
            m('a', {
              class: `page-link ${pageObj.pageNumber === data.patchPage.pageNumber ? 'active' : ''}`,
              href: `${nav.commits(pageObj.pageNumber)}`,
            }, pageObj.pageNumber)
          )
        })
      )
    )
  ]

  return await htmlPage(reposConfig, eleventyConfig, data, pageContent)
}