screw-up 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,11 +1,11 @@
1
1
  /*!
2
2
  * name: screw-up
3
- * version: 1.6.0
3
+ * version: 1.7.0
4
4
  * description: Simply package metadata inserter on Vite plugin
5
5
  * author: Kouji Matsui (@kekyo@mi.kekyo.net)
6
6
  * license: MIT
7
7
  * repository.url: https://github.com/kekyo/screw-up.git
8
- * git.commit.hash: 10c04af9c9b127002592d48cbb6ec18cfe5048bb
8
+ * git.commit.hash: 0865d5a2d4d1e89be8dae4b6abeba1393a767707
9
9
  */
10
10
  import { existsSync } from "fs";
11
11
  import * as fs from "fs/promises";
@@ -13,8 +13,6 @@ import fs__default, { readFile } from "fs/promises";
13
13
  import path, { dirname, join } from "path";
14
14
  import { glob } from "glob";
15
15
  import * as git from "isomorphic-git";
16
- import crypto from "crypto";
17
- import os from "os";
18
16
  var Space_Separator = /[\u1680\u2000-\u200A\u202F\u205F\u3000]/;
19
17
  var ID_Start = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/;
20
18
  var ID_Continue = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/;
@@ -1653,397 +1651,195 @@ function requireDayjs_min() {
1653
1651
  }
1654
1652
  var dayjs_minExports = requireDayjs_min();
1655
1653
  const dayjs = /* @__PURE__ */ getDefaultExportFromCjs(dayjs_minExports);
1656
- const CLEANUP_DELETE_AGE_MS = 10 * 24 * 60 * 60 * 1e3;
1657
- const getCachePath = (repoPath) => {
1658
- const absoluteRepoPath = path.resolve(repoPath);
1659
- const pathHash = crypto.createHash("sha1").update(absoluteRepoPath).digest("hex");
1660
- return path.join(
1661
- os.homedir(),
1662
- ".cache",
1663
- "screw-up",
1664
- "tag-cache",
1665
- `${pathHash}.json`
1666
- );
1667
- };
1668
- const buildCacheValidation = async (repoPath) => {
1669
- const tags = await git.listTags({ fs: fs__default, dir: repoPath });
1670
- const tagListHash = crypto.createHash("sha256").update(tags.sort().join("\n")).digest("hex");
1671
- const validation = {
1672
- tagListHash,
1673
- tagCount: tags.length
1674
- };
1675
- try {
1676
- const packedRefsPath = path.join(repoPath, ".git", "packed-refs");
1677
- const stats = await fs__default.stat(packedRefsPath);
1678
- validation.packedRefsMtime = stats.mtimeMs;
1679
- } catch (e) {
1680
- }
1681
- try {
1682
- const refsTagsPath = path.join(repoPath, ".git", "refs", "tags");
1683
- const stats = await fs__default.stat(refsTagsPath);
1684
- validation.refsTagsMtime = stats.mtimeMs;
1685
- } catch (e) {
1686
- }
1687
- return validation;
1688
- };
1689
- const isCacheValid = async (cachedData, repoPath) => {
1654
+ const parsePackedRefs = async (packedRefsPath) => {
1690
1655
  try {
1691
- const currentTags = await git.listTags({ fs: fs__default, dir: repoPath });
1692
- if (currentTags.length !== cachedData.validation.tagCount) {
1693
- return false;
1694
- }
1695
- const tagListHash = crypto.createHash("sha256").update(currentTags.sort().join("\n")).digest("hex");
1696
- if (cachedData.validation.tagListHash !== tagListHash) {
1697
- return false;
1698
- }
1699
- if (cachedData.validation.packedRefsMtime !== void 0) {
1700
- try {
1701
- const packedRefsPath = path.join(repoPath, ".git", "packed-refs");
1702
- const stats = await fs__default.stat(packedRefsPath);
1703
- if (stats.mtimeMs > cachedData.timestamp) {
1704
- return false;
1656
+ const content = await fs__default.readFile(packedRefsPath, "utf-8");
1657
+ const lines = content.split("\n");
1658
+ const tags = [];
1659
+ for (const line2 of lines) {
1660
+ if (line2.startsWith("#") || !line2.trim()) continue;
1661
+ const match = line2.match(/^[0-9a-f]{40}\s+refs\/tags\/(.+)$/);
1662
+ if (match) {
1663
+ const tagName = match[1];
1664
+ if (!tagName.endsWith("^{}")) {
1665
+ tags.push(tagName);
1705
1666
  }
1706
- } catch (e) {
1707
1667
  }
1708
1668
  }
1709
- if (cachedData.validation.refsTagsMtime !== void 0) {
1710
- try {
1711
- const refsTagsPath = path.join(repoPath, ".git", "refs", "tags");
1712
- const stats = await fs__default.stat(refsTagsPath);
1713
- if (stats.mtimeMs > cachedData.timestamp) {
1714
- return false;
1715
- }
1716
- } catch (e) {
1717
- }
1669
+ return tags;
1670
+ } catch (error) {
1671
+ if (error.code === "ENOENT") {
1672
+ return [];
1718
1673
  }
1719
- return true;
1720
- } catch (e) {
1721
- return false;
1674
+ throw error;
1722
1675
  }
1723
1676
  };
1724
- const loadCachedTags = async (repoPath) => {
1677
+ const readLooseTags = async (refsTagsPath) => {
1725
1678
  try {
1726
- const cachePath = getCachePath(repoPath);
1727
- const data = await fs__default.readFile(cachePath, "utf-8");
1728
- const cachedData = JSON.parse(data);
1729
- if (cachedData.version !== "1.0.0") {
1730
- return null;
1731
- }
1732
- return cachedData;
1733
- } catch (e) {
1734
- return null;
1735
- }
1736
- };
1737
- const saveCachedTags = async (repoPath, tagCache, validation) => {
1738
- const cachePath = getCachePath(repoPath);
1739
- const cacheDir = path.dirname(cachePath);
1740
- await fs__default.mkdir(cacheDir, { recursive: true });
1741
- const randomSuffix = crypto.randomBytes(8).toString("hex");
1742
- const tempPath = cachePath.replace(".json", `_${randomSuffix}.json`);
1743
- const data = {
1744
- version: "1.0.0",
1745
- timestamp: Date.now(),
1746
- repository: {
1747
- path: repoPath
1748
- },
1749
- validation,
1750
- tagCache: {
1751
- commitToTags: Object.fromEntries(tagCache.commitToTags)
1679
+ const entries = await fs__default.readdir(refsTagsPath, { withFileTypes: true });
1680
+ const tags = [];
1681
+ for (const entry of entries) {
1682
+ if (entry.isFile()) {
1683
+ tags.push(entry.name);
1684
+ }
1752
1685
  }
1753
- };
1754
- try {
1755
- await fs__default.writeFile(tempPath, JSON.stringify(data, null, 2), "utf-8");
1756
- await fs__default.rename(tempPath, cachePath);
1686
+ return tags;
1757
1687
  } catch (error) {
1758
- try {
1759
- await fs__default.unlink(tempPath);
1760
- } catch (e) {
1688
+ if (error.code === "ENOENT") {
1689
+ return [];
1761
1690
  }
1762
1691
  throw error;
1763
1692
  }
1764
1693
  };
1765
- const reconstructTagCache = (cachedData) => {
1766
- return {
1767
- commitToTags: new Map(Object.entries(cachedData.tagCache.commitToTags)),
1768
- initialized: true
1769
- };
1694
+ const listTagsFast = async (repoPath) => {
1695
+ const gitDir = path.join(repoPath, ".git");
1696
+ const gitStat = await fs__default.stat(gitDir).catch(() => null);
1697
+ let actualGitDir = gitDir;
1698
+ if (gitStat == null ? void 0 : gitStat.isFile()) {
1699
+ const content = await fs__default.readFile(gitDir, "utf-8");
1700
+ const match = content.match(/^gitdir:\s*(.+)$/m);
1701
+ if (match) {
1702
+ actualGitDir = path.isAbsolute(match[1]) ? match[1] : path.join(repoPath, match[1]);
1703
+ }
1704
+ }
1705
+ const [packedTags, looseTags] = await Promise.all([
1706
+ parsePackedRefs(path.join(actualGitDir, "packed-refs")),
1707
+ readLooseTags(path.join(actualGitDir, "refs", "tags"))
1708
+ ]);
1709
+ const allTags = /* @__PURE__ */ new Set([...packedTags, ...looseTags]);
1710
+ return Array.from(allTags).sort();
1770
1711
  };
1771
- const cleanupOldCacheFiles = async (currentCachePath, currentTimestamp) => {
1772
- let deletedCount = 0;
1712
+ const resolveTagsBatchWithCommit = async (repoPath, tagNames, logger) => {
1713
+ const startTime = Date.now();
1714
+ const gitDir = path.join(repoPath, ".git");
1715
+ const result = /* @__PURE__ */ new Map();
1716
+ const gitStat = await fs__default.stat(gitDir).catch(() => null);
1717
+ let actualGitDir = gitDir;
1718
+ if (gitStat == null ? void 0 : gitStat.isFile()) {
1719
+ const content = await fs__default.readFile(gitDir, "utf-8");
1720
+ const match = content.match(/^gitdir:\s*(.+)$/m);
1721
+ if (match) {
1722
+ actualGitDir = path.isAbsolute(match[1]) ? match[1] : path.join(repoPath, match[1]);
1723
+ }
1724
+ }
1725
+ const tagSet = new Set(tagNames);
1726
+ const packedRefsStart = Date.now();
1773
1727
  try {
1774
- const cacheDir = path.dirname(currentCachePath);
1775
- const currentFileName = path.basename(currentCachePath);
1776
- const files = await fs__default.readdir(cacheDir);
1777
- await Promise.all(
1778
- files.map(async (fileName) => {
1779
- if (!fileName.endsWith(".json") || fileName === currentFileName) {
1780
- return;
1728
+ const content = await fs__default.readFile(
1729
+ path.join(actualGitDir, "packed-refs"),
1730
+ "utf-8"
1731
+ );
1732
+ const lines = content.split("\n");
1733
+ for (let i = 0; i < lines.length; i++) {
1734
+ const line2 = lines[i];
1735
+ if (line2.startsWith("#") || !line2.trim()) continue;
1736
+ const match = line2.match(/^([0-9a-f]{40})\s+refs\/tags\/(.+)$/);
1737
+ if (match && tagSet.has(match[2])) {
1738
+ const tagName = match[2];
1739
+ const oid = match[1];
1740
+ let commitOid = oid;
1741
+ if (i + 1 < lines.length && lines[i + 1].startsWith("^")) {
1742
+ commitOid = lines[i + 1].substring(1, 41);
1781
1743
  }
1782
- const filePath = path.join(cacheDir, fileName);
1744
+ result.set(tagName, { oid, commitOid });
1745
+ }
1746
+ }
1747
+ } catch (error) {
1748
+ if (error.code !== "ENOENT") {
1749
+ throw error;
1750
+ }
1751
+ }
1752
+ logger.debug(
1753
+ `[fast-tags] read packed-refs: ${Date.now() - packedRefsStart}ms`
1754
+ );
1755
+ const remainingTags = tagNames.filter((tag) => !result.has(tag));
1756
+ if (remainingTags.length > 0) {
1757
+ const looseRefsStart = Date.now();
1758
+ await Promise.all(
1759
+ remainingTags.map(async (tagName) => {
1760
+ const looseRefPath = path.join(actualGitDir, "refs", "tags", tagName);
1783
1761
  try {
1784
- const stats = await fs__default.stat(filePath);
1785
- const fileAge = currentTimestamp - stats.mtimeMs;
1786
- if (fileAge > CLEANUP_DELETE_AGE_MS) {
1787
- await fs__default.unlink(filePath);
1788
- deletedCount++;
1762
+ const hash = await fs__default.readFile(looseRefPath, "utf-8");
1763
+ const oid = hash.trim();
1764
+ let commitOid = oid;
1765
+ try {
1766
+ const { execSync } = require("child_process");
1767
+ const objectType = execSync(
1768
+ `git -C "${repoPath}" cat-file -t ${oid}`,
1769
+ { encoding: "utf-8" }
1770
+ ).trim();
1771
+ if (objectType === "tag") {
1772
+ const tagContent = execSync(
1773
+ `git -C "${repoPath}" cat-file -p ${oid}`,
1774
+ { encoding: "utf-8" }
1775
+ );
1776
+ const objectMatch = tagContent.match(/^object ([0-9a-f]{40})$/m);
1777
+ if (objectMatch) {
1778
+ commitOid = objectMatch[1];
1779
+ }
1780
+ }
1781
+ } catch (error) {
1782
+ logger.debug(
1783
+ `[fast-tags] Could not determine object type for ${tagName}: ${error}`
1784
+ );
1785
+ }
1786
+ result.set(tagName, { oid, commitOid });
1787
+ } catch (error) {
1788
+ if (error.code !== "ENOENT") {
1789
+ throw error;
1789
1790
  }
1790
- } catch (e) {
1791
1791
  }
1792
1792
  })
1793
1793
  );
1794
- } catch (e) {
1795
- }
1796
- return deletedCount;
1797
- };
1798
- const calculateTagDiff = (cachedTags, currentTagList) => {
1799
- const cachedTagNames = /* @__PURE__ */ new Set();
1800
- for (const tags of cachedTags.values()) {
1801
- for (const tag of tags) {
1802
- cachedTagNames.add(tag.name);
1803
- }
1804
- }
1805
- const currentSet = new Set(currentTagList);
1806
- const added = [];
1807
- const unchanged = [];
1808
- for (const tagName of currentTagList) {
1809
- if (cachedTagNames.has(tagName)) {
1810
- unchanged.push(tagName);
1811
- } else {
1812
- added.push(tagName);
1813
- }
1814
- }
1815
- const deleted = [];
1816
- for (const tagName of cachedTagNames) {
1817
- if (!currentSet.has(tagName)) {
1818
- deleted.push(tagName);
1819
- }
1820
- }
1821
- return { added, deleted, unchanged };
1822
- };
1823
- const removeTagsFromCache = (cache, tagNames) => {
1824
- const tagNamesToRemove = new Set(tagNames);
1825
- const newCache = /* @__PURE__ */ new Map();
1826
- for (const [commitHash, tags] of cache.entries()) {
1827
- const filteredTags = tags.filter((tag) => !tagNamesToRemove.has(tag.name));
1828
- if (filteredTags.length > 0) {
1829
- newCache.set(commitHash, filteredTags);
1830
- }
1831
- }
1832
- return newCache;
1833
- };
1834
- const addTagsToCache = (cache, newTags) => {
1835
- const newCache = new Map(cache);
1836
- for (const tag of newTags) {
1837
- const existing = newCache.get(tag.hash) || [];
1838
- const updated = [...existing, tag];
1839
- updated.sort((a, b) => a.name.localeCompare(b.name));
1840
- newCache.set(tag.hash, updated);
1841
- }
1842
- return newCache;
1843
- };
1844
- const updateTagsInCache = (cache, tagNames, updatedTags) => {
1845
- let newCache = removeTagsFromCache(cache, tagNames);
1846
- newCache = addTagsToCache(newCache, updatedTags);
1847
- return newCache;
1848
- };
1849
- const resolveTagToCommit = async (repoPath, tagOid) => {
1850
- var _a;
1851
- try {
1852
- const tagObject = await git.readTag({
1853
- fs: fs__default,
1854
- dir: repoPath,
1855
- oid: tagOid
1856
- });
1857
- if ((_a = tagObject == null ? void 0 : tagObject.tag) == null ? void 0 : _a.object) {
1858
- return tagObject.tag.object;
1859
- }
1860
- } catch (e) {
1794
+ logger.debug(
1795
+ `[fast-tags] read loose refs: ${Date.now() - looseRefsStart}ms`
1796
+ );
1861
1797
  }
1862
- return tagOid;
1863
- };
1864
- const getTagsInfo = async (repoPath, tagNames, parseVersion2) => {
1865
- const result = [];
1866
- await Promise.all(
1867
- tagNames.map(async (tagName) => {
1868
- try {
1869
- const oid = await git.resolveRef({
1870
- fs: fs__default,
1871
- dir: repoPath,
1872
- ref: `refs/tags/${tagName}`
1873
- });
1874
- const commitHash = await resolveTagToCommit(repoPath, oid);
1875
- const version2 = parseVersion2(tagName);
1876
- result.push({
1877
- name: tagName,
1878
- hash: commitHash,
1879
- version: version2
1880
- });
1881
- } catch (error) {
1882
- console.warn(`Failed to get info for tag ${tagName}:`, error);
1883
- }
1884
- })
1885
- );
1798
+ const totalTime = Date.now() - startTime;
1799
+ logger.debug(`[fast-tags] resolveTagsBatchWithCommit total: ${totalTime}ms`);
1800
+ logger.debug(`[fast-tags] Resolved ${result.size}/${tagNames.length} tags`);
1886
1801
  return result;
1887
1802
  };
1888
- const buildCompleteTagCache = async (repoPath, parseVersion2) => {
1803
+ const buildCompleteTagCache = async (repoPath, parseVersion2, logger) => {
1804
+ const totalStart = Date.now();
1889
1805
  const cache = /* @__PURE__ */ new Map();
1890
- const tags = await git.listTags({ fs: fs__default, dir: repoPath });
1891
- await Promise.all(
1892
- tags.map(async (tagName) => {
1893
- const oid = await git.resolveRef({
1894
- fs: fs__default,
1895
- dir: repoPath,
1896
- ref: `refs/tags/${tagName}`
1897
- });
1898
- const commitHash = await resolveTagToCommit(repoPath, oid);
1899
- const version2 = parseVersion2(tagName);
1900
- const tagInfo = {
1901
- name: tagName,
1902
- hash: commitHash,
1903
- version: version2
1904
- };
1905
- if (!cache.has(commitHash)) {
1906
- cache.set(commitHash, []);
1907
- }
1908
- cache.get(commitHash).push(tagInfo);
1909
- })
1806
+ const listStart = Date.now();
1807
+ const tags = await listTagsFast(repoPath);
1808
+ logger.debug(`[git-ops] listTagsFast: ${Date.now() - listStart}ms`);
1809
+ logger.debug(`[git-ops] Found ${tags.length} tags`);
1810
+ const resolveStart = Date.now();
1811
+ const tagData = await resolveTagsBatchWithCommit(repoPath, tags, logger);
1812
+ logger.debug(
1813
+ `[git-ops] resolveTagsBatchWithCommit: ${Date.now() - resolveStart}ms`
1910
1814
  );
1815
+ const buildStart = Date.now();
1816
+ for (const tagName of tags) {
1817
+ const data = tagData.get(tagName);
1818
+ if (!data) continue;
1819
+ const { commitOid } = data;
1820
+ const version2 = parseVersion2(tagName);
1821
+ const tagInfo = {
1822
+ name: tagName,
1823
+ hash: commitOid,
1824
+ version: version2
1825
+ };
1826
+ if (!cache.has(commitOid)) {
1827
+ cache.set(commitOid, []);
1828
+ }
1829
+ cache.get(commitOid).push(tagInfo);
1830
+ }
1831
+ logger.debug(`[git-ops] build cache map: ${Date.now() - buildStart}ms`);
1832
+ const sortStart = Date.now();
1911
1833
  for (const tags2 of cache.values()) {
1912
1834
  tags2.sort((a, b) => a.name.localeCompare(b.name));
1913
1835
  }
1914
- return cache;
1915
- };
1916
- const hasTagMoved = async (repoPath, tagName, cachedCommit) => {
1917
- try {
1918
- const oid = await git.resolveRef({
1919
- fs: fs__default,
1920
- dir: repoPath,
1921
- ref: `refs/tags/${tagName}`
1922
- });
1923
- const currentCommit = await resolveTagToCommit(repoPath, oid);
1924
- return currentCommit !== cachedCommit;
1925
- } catch (e) {
1926
- return true;
1927
- }
1928
- };
1929
- const findModifiedTags = async (repoPath, tagNames, cache) => {
1930
- const modified = [];
1931
- await Promise.all(
1932
- tagNames.map(async (tagName) => {
1933
- let cachedCommit;
1934
- for (const [commit, tags] of cache.entries()) {
1935
- const tag = tags.find((t) => t.name === tagName);
1936
- if (tag) {
1937
- cachedCommit = commit;
1938
- break;
1939
- }
1940
- }
1941
- if (cachedCommit) {
1942
- const moved = await hasTagMoved(repoPath, tagName, cachedCommit);
1943
- if (moved) {
1944
- modified.push(tagName);
1945
- }
1946
- }
1947
- })
1948
- );
1949
- return modified;
1950
- };
1951
- const loadOrBuildTagCache = async (repoPath, parseVersion2, logger) => {
1952
- const startTime = Date.now();
1953
- const cachedData = await loadCachedTags(repoPath);
1954
- const currentTags = await git.listTags({ fs: fs__default, dir: repoPath });
1955
- if (cachedData && await isCacheValid(cachedData, repoPath)) {
1956
- logger.debug(`Cache valid, performing differential update...`);
1957
- const cache = reconstructTagCache(cachedData);
1958
- const stats = await performDifferentialUpdate(
1959
- repoPath,
1960
- cache.commitToTags,
1961
- currentTags,
1962
- parseVersion2,
1963
- logger
1964
- );
1965
- const validation = await buildCacheValidation(repoPath);
1966
- await saveCachedTags(repoPath, cache, validation);
1967
- if (cachedData && Date.now() - cachedData.timestamp > 24 * 60 * 60 * 1e3) {
1968
- try {
1969
- const cachePath = getCachePath(repoPath);
1970
- const deletedCount = await cleanupOldCacheFiles(cachePath, Date.now());
1971
- if (deletedCount > 0) {
1972
- logger.debug(`Cleaned up ${deletedCount} old cache files`);
1973
- }
1974
- } catch (e) {
1975
- }
1976
- }
1977
- return {
1978
- cache,
1979
- stats: {
1980
- ...stats,
1981
- updateTime: Date.now() - startTime,
1982
- fullRebuild: false
1983
- }
1984
- };
1985
- } else {
1986
- logger.debug(`Cache invalid or missing, building from scratch...`);
1987
- const commitToTags = await buildCompleteTagCache(repoPath, parseVersion2);
1988
- const cache = {
1989
- commitToTags,
1990
- initialized: true
1991
- };
1992
- const validation = await buildCacheValidation(repoPath);
1993
- await saveCachedTags(repoPath, cache, validation);
1994
- return {
1995
- cache,
1996
- stats: {
1997
- added: currentTags.length,
1998
- deleted: 0,
1999
- modified: 0,
2000
- unchanged: 0,
2001
- totalTags: currentTags.length,
2002
- updateTime: Date.now() - startTime,
2003
- fullRebuild: true
2004
- }
2005
- };
2006
- }
2007
- };
2008
- async function performDifferentialUpdate(repoPath, cache, currentTags, parseVersion2, logger) {
2009
- const diff = calculateTagDiff(cache, currentTags);
1836
+ logger.debug(`[git-ops] sort tags: ${Date.now() - sortStart}ms`);
2010
1837
  logger.debug(
2011
- `Tag diff: +${diff.added.length} -${diff.deleted.length} =${diff.unchanged.length}`
1838
+ `[git-ops] buildCompleteTagCache total: ${Date.now() - totalStart}ms`
2012
1839
  );
2013
- const modified = await findModifiedTags(repoPath, diff.unchanged, cache);
2014
- logger.debug(`Found ${modified.length} modified tags`);
2015
- if (diff.deleted.length > 0) {
2016
- const newCache = removeTagsFromCache(cache, diff.deleted);
2017
- cache.clear();
2018
- for (const [k, v] of newCache) {
2019
- cache.set(k, v);
2020
- }
2021
- }
2022
- if (diff.added.length > 0) {
2023
- const newTags = await getTagsInfo(repoPath, diff.added, parseVersion2);
2024
- const newCache = addTagsToCache(cache, newTags);
2025
- cache.clear();
2026
- for (const [k, v] of newCache) {
2027
- cache.set(k, v);
2028
- }
2029
- }
2030
- if (modified.length > 0) {
2031
- const updatedTags = await getTagsInfo(repoPath, modified, parseVersion2);
2032
- const newCache = updateTagsInCache(cache, modified, updatedTags);
2033
- cache.clear();
2034
- for (const [k, v] of newCache) {
2035
- cache.set(k, v);
2036
- }
2037
- }
2038
- const unchangedCount = diff.unchanged.length - modified.length;
2039
- return {
2040
- added: diff.added.length,
2041
- deleted: diff.deleted.length,
2042
- modified: modified.length,
2043
- unchanged: unchangedCount,
2044
- totalTags: currentTags.length
2045
- };
2046
- }
1840
+ logger.debug(`[git-ops] Built cache with ${cache.size} unique commits`);
1841
+ return cache;
1842
+ };
2047
1843
  const parseVersionComponent = (value) => {
2048
1844
  const num = parseInt(value, 10);
2049
1845
  return num < 0 || num > 65535 ? void 0 : num;
@@ -2169,59 +1965,8 @@ const getCurrentCommit = async (repositoryPath) => {
2169
1965
  return void 0;
2170
1966
  }
2171
1967
  };
2172
- const getRelatedTagsFromCache = (cache, commitHash) => {
2173
- if (!cache.initialized) {
2174
- return [];
2175
- }
2176
- return cache.commitToTags.get(commitHash) || [];
2177
- };
2178
- const getRelatedTagsForVersioning = async (repositoryPath, commitHash) => {
2179
- try {
2180
- const tags = await git.listTags({ fs, dir: repositoryPath });
2181
- const tagInfos = [];
2182
- for (const tagName of tags) {
2183
- try {
2184
- const tagOid = await git.resolveRef({
2185
- fs,
2186
- dir: repositoryPath,
2187
- ref: `refs/tags/${tagName}`
2188
- });
2189
- if (tagOid === commitHash) {
2190
- const version2 = parseVersion(tagName);
2191
- if (version2 && isValidVersion(version2)) {
2192
- tagInfos.push({
2193
- name: tagName,
2194
- hash: commitHash,
2195
- version: version2
2196
- });
2197
- }
2198
- } else {
2199
- try {
2200
- const tagObject = await git.readTag({
2201
- fs,
2202
- dir: repositoryPath,
2203
- oid: tagOid
2204
- });
2205
- if (tagObject && tagObject.tag.object === commitHash) {
2206
- const version2 = parseVersion(tagName);
2207
- if (version2 && isValidVersion(version2)) {
2208
- tagInfos.push({
2209
- name: tagName,
2210
- hash: commitHash,
2211
- version: version2
2212
- });
2213
- }
2214
- }
2215
- } catch (e) {
2216
- }
2217
- }
2218
- } catch (e) {
2219
- }
2220
- }
2221
- return tagInfos;
2222
- } catch (e) {
2223
- return [];
2224
- }
1968
+ const getRelatedTagsFromMap = (commitToTags, commitHash) => {
1969
+ return commitToTags.get(commitHash) || [];
2225
1970
  };
2226
1971
  const getRelatedBranches = async (repositoryPath, commitHash) => {
2227
1972
  try {
@@ -2263,7 +2008,7 @@ const getModifiedFiles = async (repositoryPath) => {
2263
2008
  const formatModifiedFile = (modifiedFile) => {
2264
2009
  return `'${modifiedFile[0]}':${modifiedFile[1]}:${modifiedFile[2]}:${modifiedFile[3]}`;
2265
2010
  };
2266
- const lookupVersionLabelRecursive = async (cwd, commit, reachedCommits, tagCache) => {
2011
+ const lookupVersionLabelRecursive = async (cwd, commit, reachedCommits, commitToTags) => {
2267
2012
  const scheduledStack = [];
2268
2013
  let version2 = { major: 0, minor: 0, build: 1, original: "0.0.1" };
2269
2014
  let currentCommit = commit;
@@ -2272,7 +2017,7 @@ const lookupVersionLabelRecursive = async (cwd, commit, reachedCommits, tagCache
2272
2017
  version2 = reachedCommits.get(currentCommit.hash);
2273
2018
  break;
2274
2019
  }
2275
- const relatedTags = tagCache ? getRelatedTagsFromCache(tagCache, currentCommit.hash) : await getRelatedTagsForVersioning(cwd, currentCommit.hash);
2020
+ const relatedTags = getRelatedTagsFromMap(commitToTags, currentCommit.hash);
2276
2021
  const versionCandidates = relatedTags.filter((tag) => tag.version && isValidVersion(tag.version)).filter((tag) => tag.version.minor !== void 0).sort((a, b) => compareVersions(a.version, b.version));
2277
2022
  if (versionCandidates.length >= 1) {
2278
2023
  version2 = versionCandidates[0].version;
@@ -2308,7 +2053,7 @@ const lookupVersionLabelRecursive = async (cwd, commit, reachedCommits, tagCache
2308
2053
  cwd,
2309
2054
  parents[index],
2310
2055
  reachedCommits,
2311
- tagCache
2056
+ commitToTags
2312
2057
  );
2313
2058
  if (alternateParentVersion && compareVersions(alternateParentVersion, version2) < 0) {
2314
2059
  version2 = alternateParentVersion;
@@ -2321,19 +2066,27 @@ const lookupVersionLabelRecursive = async (cwd, commit, reachedCommits, tagCache
2321
2066
  return version2;
2322
2067
  };
2323
2068
  const getGitMetadata = async (repositoryPath, checkWorkingDirectoryStatus, logger) => {
2069
+ const startTime = Date.now();
2324
2070
  const metadata = {};
2325
2071
  let gitRootPath;
2326
2072
  try {
2327
2073
  gitRootPath = await git.findRoot({ fs, filepath: repositoryPath });
2328
2074
  } catch (e) {
2075
+ logger.debug(
2076
+ `[screw-up] Total getGitMetadata: ${Date.now() - startTime}ms`
2077
+ );
2329
2078
  return metadata;
2330
2079
  }
2331
2080
  try {
2332
2081
  const currentCommit = await getCurrentCommit(gitRootPath);
2333
2082
  if (!currentCommit) {
2083
+ logger.debug(
2084
+ `[screw-up] Total getGitMetadata: ${Date.now() - startTime}ms`
2085
+ );
2334
2086
  return metadata;
2335
2087
  }
2336
- const { cache: tagCache, stats } = await loadOrBuildTagCache(
2088
+ const buildStart = Date.now();
2089
+ const commitToTags = await buildCompleteTagCache(
2337
2090
  gitRootPath,
2338
2091
  (tagName) => {
2339
2092
  const version22 = parseVersion(tagName);
@@ -2341,21 +2094,16 @@ const getGitMetadata = async (repositoryPath, checkWorkingDirectoryStatus, logge
2341
2094
  },
2342
2095
  logger
2343
2096
  );
2344
- if (stats.fullRebuild) {
2345
- logger.debug(
2346
- `Built new tag cache: ${stats.totalTags} tags in ${stats.updateTime}ms`
2347
- );
2348
- } else {
2349
- logger.debug(
2350
- `Updated cache differentially: +${stats.added} -${stats.deleted} ~${stats.modified} =${stats.unchanged} (${stats.updateTime}ms)`
2351
- );
2352
- }
2097
+ logger.debug(
2098
+ `[screw-up] buildCompleteTagCache: ${Date.now() - buildStart}ms`
2099
+ );
2100
+ logger.debug(`Built tag map with ${commitToTags.size} commits`);
2353
2101
  const reachedCommits = /* @__PURE__ */ new Map();
2354
2102
  let version2 = await lookupVersionLabelRecursive(
2355
2103
  gitRootPath,
2356
2104
  currentCommit,
2357
2105
  reachedCommits,
2358
- tagCache
2106
+ commitToTags
2359
2107
  );
2360
2108
  const gitMetadata = { tags: [], branches: [] };
2361
2109
  metadata.git = gitMetadata;
@@ -2380,7 +2128,7 @@ const getGitMetadata = async (repositoryPath, checkWorkingDirectoryStatus, logge
2380
2128
  date: dayjs(currentCommit.date).format("YYYY-MM-DDTHH:mm:ssZ[Z]"),
2381
2129
  message: currentCommit.message
2382
2130
  };
2383
- const relatedTags = getRelatedTagsFromCache(tagCache, currentCommit.hash);
2131
+ const relatedTags = getRelatedTagsFromMap(commitToTags, currentCommit.hash);
2384
2132
  gitMetadata.tags = relatedTags.map((tag) => tag.name);
2385
2133
  const relatedBranches = await getRelatedBranches(
2386
2134
  gitRootPath,
@@ -2390,6 +2138,7 @@ const getGitMetadata = async (repositoryPath, checkWorkingDirectoryStatus, logge
2390
2138
  } catch (error) {
2391
2139
  logger.warn(`Failed to extract git metadata: ${error}`);
2392
2140
  }
2141
+ logger.debug(`[screw-up] Total getGitMetadata: ${Date.now() - startTime}ms`);
2393
2142
  return metadata;
2394
2143
  };
2395
2144
  const getFetchGitMetadata = (targetDir, checkWorkingDirectoryStatus, logger) => {
@@ -2406,11 +2155,11 @@ const getFetchGitMetadata = (targetDir, checkWorkingDirectoryStatus, logger) =>
2406
2155
  };
2407
2156
  };
2408
2157
  const name = "screw-up";
2409
- const version = "1.6.0";
2158
+ const version = "1.7.0";
2410
2159
  const author = "Kouji Matsui (@kekyo@mi.kekyo.net)";
2411
2160
  const license = "MIT";
2412
2161
  const repository_url = "https://github.com/kekyo/screw-up.git";
2413
- const git_commit_hash = "10c04af9c9b127002592d48cbb6ec18cfe5048bb";
2162
+ const git_commit_hash = "0865d5a2d4d1e89be8dae4b6abeba1393a767707";
2414
2163
  const packageMetadata = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
2415
2164
  __proto__: null,
2416
2165
  author,
@@ -2433,4 +2182,4 @@ export {
2433
2182
  resolvePackageMetadata as r,
2434
2183
  version as v
2435
2184
  };
2436
- //# sourceMappingURL=packageMetadata-LkGK6Bjw.js.map
2185
+ //# sourceMappingURL=packageMetadata-CTjfzPVl.js.map