mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 09:24:36 +00:00
122 lines
3.9 KiB
Nim
122 lines
3.9 KiB
Nim
#
|
|
#
|
|
# The Nimrod Tester
|
|
# (c) Copyright 2014 Andreas Rumpf
|
|
#
|
|
# Look at license.txt for more info.
|
|
# All rights reserved.
|
|
|
|
import strutils, db_sqlite, os, osproc
|
|
|
|
var db: TDbConn
|
|
|
|
proc createDb() =
|
|
db.exec(sql"""
|
|
create table if not exists Machine(
|
|
id integer primary key,
|
|
name varchar(100) not null,
|
|
os varchar(20) not null,
|
|
cpu varchar(20) not null
|
|
);""")
|
|
|
|
db.exec(sql"""
|
|
create table if not exists [Commit](
|
|
id integer primary key,
|
|
hash varchar(256) not null,
|
|
branch varchar(50) not null
|
|
);""")
|
|
|
|
db.exec(sql"""
|
|
create table if not exists TestResult(
|
|
id integer primary key,
|
|
name varchar(100) not null,
|
|
category varchar(100) not null,
|
|
target varchar(20) not null,
|
|
action varchar(10) not null,
|
|
result varchar(30) not null,
|
|
[commit] int not null,
|
|
machine int not null,
|
|
expected varchar(10000) not null,
|
|
given varchar(10000) not null,
|
|
created timestamp not null default (DATETIME('now')),
|
|
|
|
foreign key ([commit]) references [commit](id),
|
|
foreign key (machine) references machine(id)
|
|
);""")
|
|
|
|
#db.exec(sql"""
|
|
# --create unique index if not exists TsstNameIx on TestResult(name);
|
|
# """, [])
|
|
|
|
type
|
|
MachineId* = distinct int64
|
|
CommitId = distinct int64
|
|
|
|
proc `$`*(id: MachineId): string {.borrow.}
|
|
proc `$`(id: CommitId): string {.borrow.}
|
|
|
|
var
|
|
thisMachine: MachineId
|
|
thisCommit: CommitId
|
|
|
|
proc `()`(cmd: string{lit}): string = cmd.execProcess.string.strip
|
|
|
|
proc getMachine*(db: TDbConn): MachineId =
|
|
var name = "hostname"()
|
|
if name.len == 0:
|
|
name = when defined(posix): getenv"HOSTNAME".string
|
|
else: getenv"COMPUTERNAME".string
|
|
if name.len == 0:
|
|
quit "cannot determine the machine name"
|
|
|
|
let id = db.getValue(sql"select id from Machine where name = ?", name)
|
|
if id.len > 0:
|
|
result = id.parseInt.MachineId
|
|
else:
|
|
result = db.insertId(sql"insert into Machine(name, os, cpu) values (?,?,?)",
|
|
name, system.hostOS, system.hostCPU).MachineId
|
|
|
|
proc getCommit(db: TDbConn): CommitId =
|
|
const commLen = "commit ".len
|
|
let hash = "git log -n 1"()[commLen..commLen+10]
|
|
let branch = "git symbolic-ref --short HEAD"()
|
|
if hash.len == 0 or branch.len == 0: quit "cannot determine git HEAD"
|
|
|
|
let id = db.getValue(sql"select id from [Commit] where hash = ? and branch = ?",
|
|
hash, branch)
|
|
if id.len > 0:
|
|
result = id.parseInt.CommitId
|
|
else:
|
|
result = db.insertId(sql"insert into [Commit](hash, branch) values (?, ?)",
|
|
hash, branch).CommitId
|
|
|
|
proc writeTestResult*(name, category, target,
|
|
action, result, expected, given: string) =
|
|
let id = db.getValue(sql"""select id from TestResult
|
|
where name = ? and category = ? and target = ? and
|
|
machine = ? and [commit] = ?""",
|
|
name, category, target,
|
|
thisMachine, thisCommit)
|
|
if id.len > 0:
|
|
db.exec(sql"""update TestResult
|
|
set action = ?, result = ?, expected = ?, given = ?
|
|
where id = ?""", action, result, expected, given, id)
|
|
else:
|
|
db.exec(sql"""insert into TestResult(name, category, target,
|
|
action,
|
|
result, expected, given,
|
|
[commit], machine)
|
|
values (?,?,?,?,?,?,?,?,?) """, name, category, target,
|
|
action,
|
|
result, expected, given,
|
|
thisCommit, thisMachine)
|
|
|
|
proc open*() =
|
|
db = open(connection="testament.db", user="testament", password="",
|
|
database="testament")
|
|
createDb()
|
|
thisMachine = getMachine(db)
|
|
thisCommit = getCommit(db)
|
|
|
|
proc close*() = close(db)
|