grim/hgkeeper
Clone
Summary
Browse
Changes
Graph
Use Alpine for Dockerfile
12 months ago, aklitzing
274e125f308b
Use Alpine for Dockerfile
Also use mercurial from Alpine repository as it is up-to-date and enables
rust extensions and chg binary.
This decreases the size of docker image.
Reviewed at https://reviews.imfreedom.org/r/2454/
package
hgweb
import
(
"embed"
"net/http"
"net/http/cgi"
"os"
"path/filepath"
"text/template"
"keep.imfreedom.org/grim/hgkeeper/access"
)
type
HGWeb
struct
{
configPath
string
cgiPath
string
}
//go:embed files/*
var
files
embed
.
FS
func
New
()
*
HGWeb
{
return
&
HGWeb
{}
}
func
(
hgw
*
HGWeb
)
createConfig
()
error
{
configPath
,
err
:=
os
.
CreateTemp
(
""
,
"hgkeeper-hgweb-*.config"
)
if
err
!=
nil
{
return
err
}
defer
configPath
.
Close
()
contents
,
err
:=
files
.
ReadFile
(
"files/hgweb.config"
)
if
err
!=
nil
{
return
err
}
t
:=
template
.
Must
(
template
.
New
(
"hgweb-config"
).
Parse
(
string
(
contents
)))
data
:=
map
[
string
]
string
{
"HGWEB_ACCESS_CONFIG"
:
access
.
HgwebConfigPath
(),
"SITE_HGRC"
:
filepath
.
Join
(
access
.
AdminRepoPath
(),
"site.hgrc"
),
"GLOBAL_HGRC"
:
filepath
.
Join
(
access
.
AdminRepoPath
(),
"config/hgrc"
),
}
if
err
:=
t
.
Execute
(
configPath
,
data
);
err
!=
nil
{
return
err
}
hgw
.
configPath
=
configPath
.
Name
()
return
nil
}
func
(
hgw
*
HGWeb
)
createCGI
()
error
{
cgiPath
,
err
:=
os
.
CreateTemp
(
""
,
"hgkeeper-hgweb-*.cgi"
)
if
err
!=
nil
{
return
err
}
defer
cgiPath
.
Close
()
// make the cgi file executable
if
err
:=
cgiPath
.
Chmod
(
0755
);
err
!=
nil
{
return
err
}
// create a template based for the cgi file
contents
,
err
:=
files
.
ReadFile
(
"files/hgweb.cgi"
)
if
err
!=
nil
{
return
err
}
t
:=
template
.
Must
(
template
.
New
(
"cgi"
).
Parse
(
string
(
contents
)))
// create our data
data
:=
map
[
string
]
string
{
"HGWEB_CONFIG"
:
hgw
.
configPath
,
}
if
err
:=
t
.
Execute
(
cgiPath
,
data
);
err
!=
nil
{
return
err
}
hgw
.
cgiPath
=
cgiPath
.
Name
()
return
nil
}
func
(
hgw
*
HGWeb
)
Handler
()
(
http
.
Handler
,
error
)
{
if
err
:=
hgw
.
createConfig
();
err
!=
nil
{
return
nil
,
err
}
if
err
:=
hgw
.
createCGI
();
err
!=
nil
{
return
nil
,
err
}
return
&
cgi
.
Handler
{
Path
:
hgw
.
cgiPath
},
nil
}
func
(
hgw
*
HGWeb
)
Close
()
error
{
if
err
:=
os
.
Remove
(
hgw
.
cgiPath
);
err
!=
nil
{
return
err
}
if
err
:=
os
.
Remove
(
hgw
.
configPath
);
err
!=
nil
{
return
err
}
return
nil
}