-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathl3build-tagging.lua
86 lines (72 loc) · 2.28 KB
/
l3build-tagging.lua
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
--[[
File l3build-tagging.lua Copyright (C) 2018-2024 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
license or (at your option) any later version. The latest version
of this license is in the file
https://www.latex-project.org/lppl.txt
This file is part of the "l3build bundle" (The Work in LPPL)
and all files in that bundle must be distributed together.
-----------------------------------------------------------------------
The development version of the bundle can be found at
https://github.com/latex3/l3build
for those people who are interested.
--]]
local pairs = pairs
local open = io.open
local os_date = os.date
local match = string.match
local gsub = string.gsub
function update_tag(filename,content,tagname,tagdate)
return content
end
function tag_hook(tagname,tagdate)
return 0
end
local function update_file_tag(file,tagname,tagdate)
local filename = basename(file)
print("Tagging ".. filename)
---@type file*?
local f = assert(open(file,"rb"))
---@cast f file*
local content = f:read("a")
f:close()
f = nil
-- Deal with Unix/Windows line endings
content = gsub(content .. (match(content,"\n$") and "" or "\n"),
"\r\n", "\n")
local updated_content = update_tag(filename,content,tagname,tagdate)
if content == updated_content then
return 0
else
local path = dirname(file)
ren(path,filename,filename .. ".bak")
f = assert(open(file,"w"))
-- Convert line ends back if required during write
-- Watch for the second return value!
f:write((gsub(updated_content,"\n",os_newline)))
f:close()
rm(path,filename .. ".bak")
end
return 0
end
function tag(tagnames)
local tagdate = options["date"] or os_date("%Y-%m-%d")
local tagname = nil
if tagnames then
tagname = tagnames[1]
end
local dirs = remove_duplicates({currentdir, sourcefiledir, docfiledir})
local errorlevel = 0
for _,dir in pairs(dirs) do
for _,filetype in pairs(tagfiles) do
for _,p in ipairs(tree(dir,filetype)) do
errorlevel = update_file_tag(dir .. "/" .. p.src,tagname,tagdate)
if errorlevel ~= 0 then
return errorlevel
end
end
end
end
return tag_hook(tagname,tagdate)
end