Index

resty-gitweb / master

A git web interface for Lua/OpenResty (you're on it right now!)

Latest Commit

{#}TimeHashSubjectAuthor#(+)(-)GPG?
1224 Jan 2021 17:05dda0daeNew HTML generatorJosh Stockin114G

Blob @ resty-gitweb / git / list_refs.lua

text/plain1660 bytesdownload raw
1-- resty-gitweb@git/list_refs.lua
2-- Lists named references/revisions (branches, tags)
3
4-- Copyright (c) 2020 Joshua 'joshuas3' Stockin
5-- <https://git.joshstock.in/resty-gitweb>
6-- This software is licensed under the MIT License.
7
8local ffi = require("ffi")
9local git2_error = require("git/git2_error")
10
11_M = function(repo_obj)
12 -- List refs
13 local refs = ffi.new("git_strarray")
14 local err = git2.git_reference_list(ffi.cast("git_strarray*", refs), repo_obj)
15
16 local ret = {}
17 ret.heads = {}
18 ret.tags = {}
19
20 for i = 0, tonumber(refs.count)-1 do
21
22 local name = ffi.string(refs.strings[i])
23
24 local dest
25 local prefix_len
26 if name:match("^refs/heads/") then
27 dest = ret.heads
28 prefix_len = 12
29 elseif name:match("^refs/tags/") then
30 dest = ret.tags
31 prefix_len = 11
32 end
33
34 if dest then
35 local oid = ffi.new("git_oid")
36 local err = git2.git_reference_name_to_id(ffi.cast("git_oid*", oid), repo_obj, refs.strings[i])
37
38 -- Format oid as SHA1 hash
39 local hash = ffi.new("char[41]") -- SHA1 length (40 chars) + \0
40 local err = git2.git_oid_fmt(hash, ffi.cast("git_oid*", oid))
41 hash = ffi.string(hash)
42
43 local ref = {}
44 ref.name = string.sub(name, prefix_len, string.len(name))
45 ref.full = name
46 ref.hash = hash
47 ref.shorthash = string.sub(hash, 1, 7)
48 table.insert(dest, ref)
49 end
50
51 end
52
53 if refs then
54 git2.git_strarray_free(ffi.cast("git_strarray*", refs))
55 end
56
57 return ret
58end
59
60return _M
61