Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

vole
Clone

Read only, no credentials:

https://rodent.software/vole.git

Write over SSH with a registered key:

git clone ssh://git@rodent.software:2222/vole.git

A free and open-source forge that lives in your Git repo.

Show real accounts as repository contributors

a32a859a08276681497be390d6f7195098a97ab4 · Keenan Nemetz · 5d ago · parent 802e0e52

Show real accounts as repository contributors

Count contributors from the change and issue records instead of the author text in commits: changes merged, issues those changes fixed, issues the reporter opened that were fixed, and reviews that named the merged head. The overview lists accounts by that work with compact icon counts and full labels in tooltips. The shortlog-derived contributor table and its refresh path are gone.

server/web/static/vole.css +16−4

@@ -1155,9 +1155,16 @@ pre code { background: none; border: 0; padding: 0; font-size: inherit; }
1155 1155 .side-row .muted { font-size: calc(12.65px * var(--font-scale)); white-space: nowrap; }
1156 1156
1157 1157 .contributors { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 6px; }
1158 .contributors li { display: flex; align-items: center; gap: 8px; min-width: 0; }
1158 .contributors li { display: flex; align-items: center; flex-wrap: wrap; gap: 2px 8px; min-width: 0; }
1159 1159 .contributors .cname { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: calc(13.75px * var(--font-scale)); }
1160 1160 .contributors .muted { font-size: calc(12.65px * var(--font-scale)); }
1161 .contributors .contributor-stats { display: inline-flex; align-items: center; gap: 8px; color: var(--fg-muted); font-size: calc(12.65px * var(--font-scale)); }
1162 .contributors .contrib-stat { position: relative; display: inline-flex; align-items: center; gap: 3px; cursor: help; }
1163 .contributors .contrib-stat .icon { width: 13px; height: 13px; color: var(--fg-faint); }
1164 .contributors .contrib-stat:hover,
1165 .contributors .contrib-stat:focus-visible { color: var(--fg); outline: none; }
1166 .contributors .contrib-stat:hover .icon,
1167 .contributors .contrib-stat:focus-visible .icon { color: var(--accent); }
1161 1168
1162 1169 .lang { display: grid; grid-template-columns: 1fr auto; gap: 2px 8px; margin-bottom: 8px; font-size: calc(13.2px * var(--font-scale)); }
1163 1170 .lang .muted { font-size: calc(12.65px * var(--font-scale)); }
@@ -1928,7 +1935,8 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1928 1935 }
1929 1936 .help:hover,
1930 1937 .help:focus-visible { color: var(--accent); border-color: var(--accent); outline: none; }
1931 .help::after {
1938 .help::after,
1939 .contributors .contrib-stat::after {
1932 1940 content: attr(data-tip);
1933 1941 position: absolute;
1934 1942 top: 50%;
@@ -1955,7 +1963,10 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1955 1963 }
1956 1964 .help:hover::after,
1957 1965 .help:focus::after,
1958 .help:focus-visible::after { opacity: 1; visibility: visible; }
1966 .help:focus-visible::after,
1967 .contributors .contrib-stat:hover::after,
1968 .contributors .contrib-stat:focus::after,
1969 .contributors .contrib-stat:focus-visible::after { opacity: 1; visibility: visible; }
1959 1970 @media (prefers-reduced-motion: no-preference) {
1960 1971 .help::after { transition: opacity 120ms ease; }
1961 1972 }
@@ -2290,7 +2301,8 @@ article.comment.editing > .comment-snippet { display: none; }
2290 2301 .thread-side #request-aside { display: grid; grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr)); gap: 0 24px; }
2291 2302 .thread-side #request-sidebar { display: contents; }
2292 2303 .thread-side section:first-child { padding-top: 12px; }
2293 .help::after { top: calc(100% + 7px); right: auto; left: 0; transform: none; }
2304 .help::after,
2305 .contributors .contrib-stat::after { top: calc(100% + 7px); right: auto; left: 0; transform: none; }
2294 2306 .page-head { flex-wrap: wrap; }
2295 2307 .page-head-actions { width: 100%; justify-content: flex-start; }
2296 2308 }