grim/hgkeeper
Clone
Summary
Browse
Changes
Graph
Add support for specifying which mercurial executable to use
14 months ago, Gary Kramlich
8275959b76f0
Add support for specifying which mercurial executable to use
package
http
import
(
"net/http"
"path/filepath"
log
"github.com/sirupsen/logrus"
"keep.imfreedom.org/grim/hgkeeper/hg"
"keep.imfreedom.org/grim/hgkeeper/hgweb"
)
type
Server
struct
{
listenAddr
string
server
*
http
.
Server
hgw
*
hgweb
.
HGWeb
externalHostname
string
externalPort
string
}
func
NewServer
(
listenAddr
string
,
disableHGWeb
bool
,
externalHostname
,
externalPort
string
)
(
*
Server
,
error
)
{
s
:=
&
Server
{
listenAddr
:
listenAddr
,
server
:
&
http
.
Server
{
Addr
:
listenAddr
,
},
externalHostname
:
externalHostname
,
externalPort
:
externalPort
,
}
if
!
disableHGWeb
{
s
.
hgw
=
hgweb
.
New
()
}
return
s
,
nil
}
func
(
s
*
Server
)
Listen
()
error
{
templatesDir
,
err
:=
hg
.
TemplatesDir
()
if
err
!=
nil
{
return
err
}
staticPath
:=
filepath
.
Join
(
templatesDir
,
"static"
)
log
.
Infof
(
"serving static files from %s"
,
staticPath
)
fileServer
:=
http
.
FileServer
(
http
.
Dir
(
staticPath
))
mux
:=
http
.
NewServeMux
()
mux
.
HandleFunc
(
"/hgk/health"
,
healthHandler
)
if
s
.
externalHostname
!=
""
{
mux
.
Handle
(
"/hgk/authorized_keys"
,
authorizedKeysHandler
(
s
.
externalHostname
,
s
.
externalPort
))
log
.
Infof
(
"added /hgk/authorized_keys endpoint with external hostname %s and export port %s"
,
s
.
externalHostname
,
s
.
externalPort
)
}
else
{
log
.
Infof
(
"no external hostname specified, not adding /hgk/authorized_keys endpoint"
)
}
mux
.
Handle
(
"/static/"
,
http
.
StripPrefix
(
"/static"
,
fileServer
))
if
s
.
hgw
!=
nil
{
log
.
Infof
(
"enabling HGWeb CGI server"
)
hgwHandler
,
err
:=
s
.
hgw
.
Handler
()
if
err
!=
nil
{
return
err
}
mux
.
Handle
(
"/"
,
hgwHandler
)
}
else
{
log
.
Infof
(
"not enabling HGWeb CGI server as requested"
)
}
s
.
server
.
Handler
=
Logger
(
mux
)
log
.
Infof
(
"http listening on %s"
,
s
.
listenAddr
)
return
s
.
server
.
ListenAndServe
()
}
func
(
s
*
Server
)
Close
()
{
if
s
.
hgw
!=
nil
{
if
err
:=
s
.
hgw
.
Close
();
err
!=
nil
{
log
.
Warnf
(
"failed to close hgweb: %v"
,
err
)
}
}
if
err
:=
s
.
server
.
Close
();
err
!=
nil
{
log
.
Warnf
(
"failed to shutdown http server: %v"
,
err
)
}
}