| 1 | -- pages/refs.lua |
| 2 | -- Refs page builder |
| 3 |
|
| 4 | -- Copyright (c) 2020 Joshua 'joshuas3' Stockin |
| 5 | -- <https://joshstock.in> |
| 6 |
|
| 7 | local utils = require("utils/utils") |
| 8 | local git = require("git/git_commands") |
| 9 |
|
| 10 | local builder = require("utils/builder") |
| 11 | local tabulate = require("utils/tabulate") |
| 12 | local nav = require("utils/nav") |
| 13 |
|
| 14 | local _M = function(repo, repo_dir, branch) |
| 15 | local build = builder:new() |
| 16 |
|
| 17 | -- Breadcrumb navigation and repository description |
| 18 | local breadcrumb_nav = { |
| 19 | {string.format("/%s", repo.name), repo.name}, |
| 20 | {string.format("/%s/refs", repo.name), "refs"}, |
| 21 | } |
| 22 | build:add("<h2>"..nav(breadcrumb_nav, " / ").."</h2>") |
| 23 | build:add("<p>"..repo.description.."</p>") |
| 24 |
|
| 25 | -- Navigation links |
| 26 | local navlinks = { |
| 27 | {string.format("/%s/download", repo.name), "Download"}, |
| 28 | {string.format("/%s/refs", repo.name), "<b>Refs</b>"}, |
| 29 | {string.format("/%s/log/%s", repo.name, branch.name), "Commit Log"}, |
| 30 | {string.format("/%s/tree/%s", repo.name, branch.name), "Files"} |
| 31 | } |
| 32 |
|
| 33 | for _, special in pairs(repo.specialfiles) do -- create nav items for special files |
| 34 | local split = string.split(special, " ") |
| 35 | table.insert(navlinks, { |
| 36 | string.format("/%s/blob/%s/%s", repo.name, branch.name, split[2]), |
| 37 | split[1] |
| 38 | }) |
| 39 | end |
| 40 |
|
| 41 | build:add([[<div class="nav">]]) |
| 42 | build:add(nav(navlinks)) |
| 43 | build:add("</div>") |
| 44 |
|
| 45 | -- Refs |
| 46 | local all_refs = git.list_refs(repo_dir) |
| 47 |
|
| 48 | -- Branches |
| 49 | if #all_refs.heads > 0 then |
| 50 | build:add("<h3>Branches</h3>") |
| 51 |
|
| 52 | local branches_table_data = {} |
| 53 | branches_table_data.class = "branches" |
| 54 | branches_table_data.headers = { |
| 55 | {"name", "Name"}, |
| 56 | {"ref", "Ref"}, |
| 57 | {"has", "Hash"} |
| 58 | } |
| 59 | branches_table_data.rows = {} |
| 60 |
|
| 61 | for _, b in pairs(all_refs.heads) do |
| 62 | table.insert(branches_table_data.rows, { |
| 63 | b.name ~= branch.name and b.name or b.name.." <b>(HEAD)</b>", |
| 64 | string.format([[<a href="/%s/tree/%s">%s</a>]], repo.name, b.name, b.full), |
| 65 | string.format([[<a href="/%s/commit/%s">%s</a>]], repo.name, b.hash, b.shorthash) |
| 66 | }) |
| 67 | end |
| 68 |
|
| 69 | build:add(tabulate(branches_table_data)) |
| 70 | end |
| 71 |
|
| 72 | -- Tags |
| 73 | if #all_refs.tags > 0 then |
| 74 | build:add("<h3>Tags</h3>") |
| 75 |
|
| 76 | local tags_table_data = {} |
| 77 | tags_table_data.class = "tags" |
| 78 | tags_table_data.headers = { |
| 79 | {"name", "Name"}, |
| 80 | {"ref", "Ref"}, |
| 81 | {"has", "Hash"} |
| 82 | } |
| 83 | tags_table_data.rows = {} |
| 84 | for _, t in pairs(all_refs.tags) do |
| 85 | table.insert(tags_table_data.rows, { |
| 86 | t.name ~= branch.name and t.name or t.name.." <b>(HEAD)</b>", |
| 87 | string.format([[<a href="/%s/tree/%s">%s</a>]], repo.name, t.name, t.full), |
| 88 | string.format([[<a href="/%s/commit/%s">%s</a>]], repo.name, t.hash, t.shorthash) |
| 89 | }) |
| 90 | end |
| 91 |
|
| 92 | build:add(tabulate(tags_table_data)) |
| 93 | end |
| 94 |
|
| 95 | return build |
| 96 | end |
| 97 |
|
| 98 | return _M |
| 99 |
|