tickets
All repositories: gitoria
2.9 KB
// import.hl — import AntColony ticket files into the RUNNING app, over its JSON API.//// bin/hybriel import.hl// TICKETS_IMPORT_DIR=/some/dir TICKETS_URL=http://127.0.0.1:8350 bin/hybriel import.hl//// WRITES NEED A TOKEN (ticket #7): TICKETS_TOKEN = an API token (log in with ident, /you →// "Create a token"); the imported tickets are opened by that token's user.//// A ticket file is `project:` and `subject:` header lines, a blank line, the summary// (hard-wrapped lines are joined into paragraphs, blank line = new paragraph —// ticketfile.hl).// Each file is POSTed to /api/tickets with `source` = its file name; the app answers a// known source with the ticket it already has (200, existed) instead of a second one// (201), so running this twice imports nothing twice. Going through the API (not the// tables) means the running server stays the only writer and open browsers see the// imported tickets arrive live.import { listDir, readFile } from 'hl:fs'import { env } from 'hl:proc'import { fetch } from 'hl:fetch'import { parse } from './ticketfile.hl'static dir = env('TICKETS_IMPORT_DIR') != null ? env('TICKETS_IMPORT_DIR') : './import/tickets'static base = env('TICKETS_URL') != null ? env('TICKETS_URL') : 'http://127.0.0.1:8350'static token = env('TICKETS_TOKEN') != null ? env('TICKETS_TOKEN') : ''if (token == '') { console.log('import: TICKETS_TOKEN is not set — API writes need a token (log in, /you → Create a token)') }// a > b for two strings (strings order by code point, hybriel#2; still no list sort())static after = (a, b) => { return a > b }// file names, sorted, so an empty store numbers each project's tickets in file ordernames = []for (n of listDir(dir)) {let name = hlTypeName(n) == 'String' ? n : n.nameif (name.endsWith('.md')) { names.push(name) }}let i = 1while (i < names.length) {let cur = names[i]let j = i - 1while (j >= 0 && after(names[j], cur)) {names[j + 1] = names[j]j = j - 1}names[j + 1] = curi = i + 1}created = 0existed = 0failed = 0for (name of names) {let t = parse(readFile(dir + '/' + name))if (t.error != null) {console.log('SKIP ' + name + ': ' + t.error)failed = failed + 1} else {let res = fetch(base + '/api/tickets', { method = 'POST' headers = { authorization = 'Bearer ' + token } json = { project = t.project subject = t.subject summary = t.summary source = name } })if (res.status == 201) {created = created + 1let tk = res.json().ticketconsole.log('NEW ' + name + ' → ' + tk.project + ' ' + tk.ref)} else if (res.status == 200) {existed = existed + 1let tk = res.json().ticketconsole.log('HAVE ' + name + ' = ' + tk.project + ' ' + tk.ref)} else {failed = failed + 1console.log('FAIL ' + name + ': ' + res.status + ' ' + res.text())}}}console.log('import: ' + created + ' new, ' + existed + ' already there, ' + failed + ' failed (' + dir + ' → ' + base + ')')
Branches
- mainmain branch
Latest commits
- d3db6139tickets: Hybriel master 190aa11d (fc838894 GC correctness, #126 closure scopes, #127); gate 249/0, connect 60/0mre
- bce182e3tickets: Hybriel master 7eea0d32 (#126 memory, #48 lambda copies its argument); migrate.hl lambdas take &logmre
- 4137be0fantcolony#40: mission references point to the moved missionsmre
- 9bfba36aantcolony#40: history (LOG.md), worker briefs (missions/) and reports moved here from antcolony, numbered per project; old numbers in antcolony docs/mission-map.mdmre
- c7bd2645tickets: Hybriel master 73267707 (#122 fixed); compactNow workaround removed (#110 covered)mre
- 2ab91ee9tickets: gate checks rows appear once (session sync); re-vendor to ff51cf46 stopped on hybriel#122, stays 837fe120mre
- e01c2b1dtickets#24: installable app (manifest, service worker, offline list), own icon; gate waits for the hello's pongmre
- 752fbb7fdeploy.sh: back up live storage/.sessions/.env before every deploy (newest 5 kept)mre
- 38bdd5e4deploy.sh: never send .git or .gitignore to Byrodinmre
- f12fa1bcState of 2026-09-27, before the move to gitoriamre