grim/youtrack-import

ff8d512f4f72
Add support for auto linking tickets. Fixes YI-31
package trac
import (
"fmt"
"io/ioutil"
"net/url"
"path/filepath"
"strings"
"github.com/go-ini/ini"
"github.com/jmoiron/sqlx"
_ "github.com/lib/pq"
)
const (
_VERSION string = "Trac Environment Version 1"
)
type environment struct {
path string
cfg *ini.File
db *sqlx.DB
}
func NewEnvironment(path string) (*environment, error) {
e := &environment{
path: path,
}
var err error
if err = e.checkVersion(); err != nil {
return nil, err
}
if err = e.loadConfig(); err != nil {
return nil, err
}
driver, options, err := e.parseDatabase()
if err != nil {
return nil, err
}
db, err := sqlx.Connect(driver, options)
if err != nil {
return nil, err
}
e.db = db
return e, nil
}
func (e *environment) close() error {
return e.db.Close()
}
func (e *environment) checkVersion() error {
versionFile := filepath.Join(e.path, "VERSION")
data, err := ioutil.ReadFile(versionFile)
if err != nil {
return err
}
contents := string(data)
contents = strings.TrimSpace(contents)
if contents != _VERSION {
return fmt.Errorf("Unknown trac version %q", contents)
}
return nil
}
func (e *environment) loadConfig() error {
cfg, err := ini.Load(filepath.Join(e.path, "conf", "trac.ini"))
if err != nil {
return err
}
e.cfg = cfg
return nil
}
func (e *environment) parseDatabase() (string, string, error) {
dbUrl := e.cfg.Section("trac").Key("database").String()
uri, err := url.Parse(dbUrl)
if err != nil {
return "", "", err
}
switch uri.Scheme {
case "postgres":
qs := uri.Query()
// at some point, schema got removed, but you can get the same effect
// by using search path
if _, found := qs["schema"]; found {
qs.Add("search_path", qs.Get("schema"))
qs.Del("schema")
}
uri.RawQuery = qs.Encode()
return "postgres", uri.String(), nil
default:
return "", "", fmt.Errorf("Unknown database %q", uri.Scheme)
}
}