Add tupctime utility

This commit is contained in:
Christopher Monsanto
2020-04-29 06:07:48 -04:00
parent 27d8fb8903
commit 7316c0573e
4 changed files with 473 additions and 0 deletions

401
pnpm-lock.yaml generated
View File

@@ -8,6 +8,13 @@ importers:
commander: ^5.0.0
make-promises-safe: ^5.1.0
spritesmith: ^3.4.0
tools/tupctime:
dependencies:
better-sqlite3: 7.0.1
debug: 4.1.1
specifiers:
better-sqlite3: ^7.0.1
debug: ^4.1.1
lockfileVersion: 5.1
packages:
/ajv/6.12.0:
@@ -19,6 +26,23 @@ packages:
dev: false
resolution:
integrity: sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==
/ansi-regex/2.1.1:
dev: false
engines:
node: '>=0.10.0'
resolution:
integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
/aproba/1.2.0:
dev: false
resolution:
integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
/are-we-there-yet/1.1.5:
dependencies:
delegates: 1.0.0
readable-stream: 2.3.7
dev: false
resolution:
integrity: sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
/asn1/0.2.4:
dependencies:
safer-buffer: 2.1.2
@@ -47,20 +71,58 @@ packages:
dev: false
resolution:
integrity: sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==
/base64-js/1.3.1:
dev: false
resolution:
integrity: sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==
/bcrypt-pbkdf/1.0.2:
dependencies:
tweetnacl: 0.14.5
dev: false
resolution:
integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
/better-sqlite3/7.0.1:
dependencies:
bindings: 1.5.0
prebuild-install: 5.3.3
tar: 4.4.10
dev: false
requiresBuild: true
resolution:
integrity: sha512-fsVcoGXxnseNajbfFbth0BKnDWebPY6x77UWfrBHApCKq1yo41DlWnFsffOsLpjkQ4VKgDU5C3aUtiw3wGGU0Q==
/bin-pack/1.0.2:
dev: false
resolution:
integrity: sha1-wqAU7b8L7XCjKSBi7UZXe5YSBnk=
/bindings/1.5.0:
dependencies:
file-uri-to-path: 1.0.0
dev: false
resolution:
integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
/bl/4.0.2:
dependencies:
buffer: 5.6.0
inherits: 2.0.4
readable-stream: 3.6.0
dev: false
resolution:
integrity: sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==
/buffer/5.6.0:
dependencies:
base64-js: 1.3.1
ieee754: 1.1.13
dev: false
resolution:
integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==
/caseless/0.12.0:
dev: false
resolution:
integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
/chownr/1.1.4:
dev: false
resolution:
integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
/clone-stats/0.0.1:
dev: false
resolution:
@@ -71,6 +133,12 @@ packages:
node: '>=0.8'
resolution:
integrity: sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
/code-point-at/1.1.0:
dev: false
engines:
node: '>=0.10.0'
resolution:
integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
/combined-stream/1.0.8:
dependencies:
delayed-stream: 1.0.0
@@ -95,6 +163,10 @@ packages:
'0': node >= 0.8
resolution:
integrity: sha1-cIl4Yk2FavQaWnQd790mHadSwmY=
/console-control-strings/1.1.0:
dev: false
resolution:
integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
/contentstream/1.0.0:
dependencies:
readable-stream: 1.0.34
@@ -125,12 +197,43 @@ packages:
dev: false
resolution:
integrity: sha1-GK6XmmoMqZSwYlhTkW0mYruuCxo=
/debug/4.1.1:
dependencies:
ms: 2.1.2
dev: false
resolution:
integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
/decompress-response/4.2.1:
dependencies:
mimic-response: 2.1.0
dev: false
engines:
node: '>=8'
resolution:
integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==
/deep-extend/0.6.0:
dev: false
engines:
node: '>=4.0.0'
resolution:
integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
/delayed-stream/1.0.0:
dev: false
engines:
node: '>=0.4.0'
resolution:
integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
/delegates/1.0.0:
dev: false
resolution:
integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
/detect-libc/1.0.3:
dev: false
engines:
node: '>=0.10'
hasBin: true
resolution:
integrity: sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
/ecc-jsbn/0.1.2:
dependencies:
jsbn: 0.1.1
@@ -138,6 +241,18 @@ packages:
dev: false
resolution:
integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
/end-of-stream/1.4.4:
dependencies:
once: 1.4.0
dev: false
resolution:
integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
/expand-template/2.0.3:
dev: false
engines:
node: '>=6'
resolution:
integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
/extend/3.0.2:
dev: false
resolution:
@@ -156,6 +271,10 @@ packages:
dev: false
resolution:
integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
/file-uri-to-path/1.0.0:
dev: false
resolution:
integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
/first-chunk-stream/1.0.0:
dev: false
engines:
@@ -176,6 +295,29 @@ packages:
node: '>= 0.12'
resolution:
integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
/fs-constants/1.0.0:
dev: false
resolution:
integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
/fs-minipass/1.2.7:
dependencies:
minipass: 2.9.0
dev: false
resolution:
integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
/gauge/2.7.4:
dependencies:
aproba: 1.2.0
console-control-strings: 1.1.0
has-unicode: 2.0.1
object-assign: 4.1.1
signal-exit: 3.0.3
string-width: 1.0.2
strip-ansi: 3.0.1
wide-align: 1.1.3
dev: false
resolution:
integrity: sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
/get-pixels/3.3.2:
dependencies:
data-uri-to-buffer: 0.0.3
@@ -206,6 +348,10 @@ packages:
node: '>= 0.8.0'
resolution:
integrity: sha1-iitP6MqJWkjjoLbLs0CgpqNXGJk=
/github-from-package/0.0.0:
dev: false
resolution:
integrity: sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=
/graceful-fs/4.2.3:
dev: false
resolution:
@@ -225,6 +371,10 @@ packages:
node: '>=6'
resolution:
integrity: sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==
/has-unicode/2.0.1:
dev: false
resolution:
integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
/http-signature/1.2.0:
dependencies:
assert-plus: 1.0.0
@@ -236,10 +386,18 @@ packages:
npm: '>=1.3.7'
resolution:
integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
/ieee754/1.1.13:
dev: false
resolution:
integrity: sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
/inherits/2.0.4:
dev: false
resolution:
integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
/ini/1.3.5:
dev: false
resolution:
integrity: sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
/iota-array/1.0.0:
dev: false
resolution:
@@ -248,6 +406,14 @@ packages:
dev: false
resolution:
integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
/is-fullwidth-code-point/1.0.0:
dependencies:
number-is-nan: 1.0.1
dev: false
engines:
node: '>=0.10.0'
resolution:
integrity: sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
/is-typedarray/1.0.0:
dev: false
resolution:
@@ -329,6 +495,48 @@ packages:
node: '>= 0.6'
resolution:
integrity: sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==
/mimic-response/2.1.0:
dev: false
engines:
node: '>=8'
resolution:
integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==
/minimist/1.2.5:
dev: false
resolution:
integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
/minipass/2.9.0:
dependencies:
safe-buffer: 5.2.0
yallist: 3.1.1
dev: false
resolution:
integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
/minizlib/1.3.3:
dependencies:
minipass: 2.9.0
dev: false
resolution:
integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
/mkdirp-classic/0.5.2:
dev: false
resolution:
integrity: sha512-ejdnDQcR75gwknmMw/tx02AuRs8jCtqFoFqDZMjiNxsu85sRIJVXDKHuLYvUUPRBUtV2FpSZa9bL1BUa3BdR2g==
/mkdirp/0.5.5:
dependencies:
minimist: 1.2.5
dev: false
hasBin: true
resolution:
integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
/ms/2.1.2:
dev: false
resolution:
integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
/napi-build-utils/1.0.2:
dev: false
resolution:
integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==
/ndarray-ops/1.2.2:
dependencies:
cwise-compiler: 1.1.3
@@ -349,12 +557,37 @@ packages:
dev: false
resolution:
integrity: sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ==
/node-abi/2.16.0:
dependencies:
semver: 5.7.1
dev: false
resolution:
integrity: sha512-+sa0XNlWDA6T+bDLmkCUYn6W5k5W6BPRL6mqzSCs6H/xUgtl4D5x2fORKDzopKiU6wsyn/+wXlRXwXeSp+mtoA==
/node-bitmap/0.0.1:
dev: false
engines:
node: '>=v0.6.5'
resolution:
integrity: sha1-GA6scAPgxwdhjvMTaPYvhLKmkJE=
/noop-logger/0.1.1:
dev: false
resolution:
integrity: sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=
/npmlog/4.1.2:
dependencies:
are-we-there-yet: 1.1.5
console-control-strings: 1.1.0
gauge: 2.7.4
set-blocking: 2.0.0
dev: false
resolution:
integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
/number-is-nan/1.0.1:
dev: false
engines:
node: '>=0.10.0'
resolution:
integrity: sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
/oauth-sign/0.9.0:
dev: false
resolution:
@@ -363,10 +596,22 @@ packages:
dev: false
resolution:
integrity: sha1-u0SKR3X7les0p4H5CLusLfI9u1s=
/object-assign/4.1.1:
dev: false
engines:
node: '>=0.10.0'
resolution:
integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
/omggif/1.0.10:
dev: false
resolution:
integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==
/once/1.4.0:
dependencies:
wrappy: 1.0.2
dev: false
resolution:
integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
/parse-data-uri/0.2.0:
dependencies:
data-uri-to-buffer: 0.0.3
@@ -405,6 +650,29 @@ packages:
node: '>=4.0.0'
resolution:
integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==
/prebuild-install/5.3.3:
dependencies:
detect-libc: 1.0.3
expand-template: 2.0.3
github-from-package: 0.0.0
minimist: 1.2.5
mkdirp: 0.5.5
napi-build-utils: 1.0.2
node-abi: 2.16.0
noop-logger: 0.1.1
npmlog: 4.1.2
pump: 3.0.0
rc: 1.2.8
simple-get: 3.1.0
tar-fs: 2.0.1
tunnel-agent: 0.6.0
which-pm-runs: 1.0.0
dev: false
engines:
node: '>=6'
hasBin: true
resolution:
integrity: sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==
/process-nextick-args/1.0.7:
dev: false
resolution:
@@ -417,6 +685,13 @@ packages:
dev: false
resolution:
integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
/pump/3.0.0:
dependencies:
end-of-stream: 1.4.4
once: 1.4.0
dev: false
resolution:
integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
/punycode/2.1.1:
dev: false
engines:
@@ -429,6 +704,16 @@ packages:
node: '>=0.6'
resolution:
integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
/rc/1.2.8:
dependencies:
deep-extend: 0.6.0
ini: 1.3.5
minimist: 1.2.5
strip-json-comments: 2.0.1
dev: false
hasBin: true
resolution:
integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
/readable-stream/1.0.34:
dependencies:
core-util-is: 1.0.2
@@ -470,6 +755,16 @@ packages:
dev: false
resolution:
integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
/readable-stream/3.6.0:
dependencies:
inherits: 2.0.4
string_decoder: 1.3.0
util-deprecate: 1.0.2
dev: false
engines:
node: '>= 6'
resolution:
integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
/replace-ext/0.0.1:
dev: false
engines:
@@ -533,6 +828,31 @@ packages:
hasBin: true
resolution:
integrity: sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=
/semver/5.7.1:
dev: false
hasBin: true
resolution:
integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
/set-blocking/2.0.0:
dev: false
resolution:
integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
/signal-exit/3.0.3:
dev: false
resolution:
integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
/simple-concat/1.0.0:
dev: false
resolution:
integrity: sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=
/simple-get/3.1.0:
dependencies:
decompress-response: 4.2.1
once: 1.4.0
simple-concat: 1.0.0
dev: false
resolution:
integrity: sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==
/spritesmith/3.4.0:
dependencies:
concat-stream: 1.5.2
@@ -562,6 +882,16 @@ packages:
hasBin: true
resolution:
integrity: sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
/string-width/1.0.2:
dependencies:
code-point-at: 1.1.0
is-fullwidth-code-point: 1.0.0
strip-ansi: 3.0.1
dev: false
engines:
node: '>=0.10.0'
resolution:
integrity: sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
/string_decoder/0.10.31:
dev: false
resolution:
@@ -572,6 +902,20 @@ packages:
dev: false
resolution:
integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
/string_decoder/1.3.0:
dependencies:
safe-buffer: 5.2.0
dev: false
resolution:
integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
/strip-ansi/3.0.1:
dependencies:
ansi-regex: 2.1.1
dev: false
engines:
node: '>=0.10.0'
resolution:
integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
/strip-bom-stream/1.0.0:
dependencies:
first-chunk-stream: 1.0.0
@@ -589,6 +933,45 @@ packages:
node: '>=0.10.0'
resolution:
integrity: sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
/strip-json-comments/2.0.1:
dev: false
engines:
node: '>=0.10.0'
resolution:
integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo=
/tar-fs/2.0.1:
dependencies:
chownr: 1.1.4
mkdirp-classic: 0.5.2
pump: 3.0.0
tar-stream: 2.1.2
dev: false
resolution:
integrity: sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==
/tar-stream/2.1.2:
dependencies:
bl: 4.0.2
end-of-stream: 1.4.4
fs-constants: 1.0.0
inherits: 2.0.4
readable-stream: 3.6.0
dev: false
resolution:
integrity: sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==
/tar/4.4.10:
dependencies:
chownr: 1.1.4
fs-minipass: 1.2.7
minipass: 2.9.0
minizlib: 1.3.3
mkdirp: 0.5.5
safe-buffer: 5.2.0
yallist: 3.1.1
dev: false
engines:
node: '>=4.5'
resolution:
integrity: sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==
/through/2.3.8:
dev: false
resolution:
@@ -673,9 +1056,27 @@ packages:
node: '>= 0.9'
resolution:
integrity: sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=
/which-pm-runs/1.0.0:
dev: false
resolution:
integrity: sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=
/wide-align/1.1.3:
dependencies:
string-width: 1.0.2
dev: false
resolution:
integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
/wrappy/1.0.2:
dev: false
resolution:
integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
/xtend/4.0.2:
dev: false
engines:
node: '>=0.4'
resolution:
integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
/yallist/3.1.1:
dev: false
resolution:
integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==

View File

@@ -1,2 +1,3 @@
packages:
- 'tools/sprites'
- 'tools/tupctime'

70
tools/tupctime/index.js Normal file
View File

@@ -0,0 +1,70 @@
const fs = require('fs');
const pathlib = require('path');
const Database = require('better-sqlite3');
const debug = require('debug')('tupctime');
const start = process.argv[2];
if (start === undefined) {
throw new Error("Pass in directory containing tup db.");
}
process.chdir(start);
while (true) {
if (fs.existsSync('.tup')) {
break;
}
if (process.cwd() === '/') {
throw new Error("Can't find tup root.");
}
process.chdir('..');
}
const db = new Database('.tup/db');
const TUP_DB_FILE = 0;
const TUP_DB_DIR = 2;
const TUP_DB_GENERATED = 4;
const TUP_DB_GENERATED_DIR = 7;
// ^ and $ are virtual directories for environment variables
const traversalQuery = db.prepare(`
SELECT id, type, mtime as ctime, name
FROM node
WHERE dir = ?
AND type IN (${TUP_DB_FILE}, ${TUP_DB_DIR}, ${TUP_DB_GENERATED}, ${TUP_DB_GENERATED_DIR})
AND name NOT IN ('^', '$')`);
const updateQuery = db.prepare(`UPDATE node SET mtime = ? WHERE id = ?`);
function update() {
const stack = [{isDir: true, id: 0, path: "."}];
let item;
while (item = stack.pop()) {
if (!fs.existsSync(item.path)) {
debug(`Ignoring ${item.path}`);
continue;
}
if (item.isDir) {
for (const {id, type, ctime, name} of traversalQuery.iterate(item.id)) {
const isDir = [TUP_DB_DIR, TUP_DB_GENERATED_DIR].includes(type);
const path = pathlib.join(item.path, name);
stack.push({isDir, id, ctime: BigInt(ctime), path});
}
} else {
// bigint calculation is necessary to avoid rounding errors/spurious update
const ctime = fs.lstatSync(item.path, {bigint: true}).ctimeMs / 1000n;
if (ctime !== item.ctime) {
debug(`Updating ${item.path}: ${ctime}, ${item.ctime}`);
if (updateQuery.run(ctime, item.id).changes !== 1)
throw new Error(`Couldn't update ${path}`);
}
}
}
}
db.transaction(update)();

View File

@@ -0,0 +1 @@
{"dependencies":{"better-sqlite3":"^7.0.1","debug":"^4.1.1"}}