From ad549a44997e21735119c1a8a761fdf13cc797e7 Mon Sep 17 00:00:00 2001 From: Boming Zhang Date: Tue, 18 Mar 2025 16:21:45 -0400 Subject: [PATCH] chore: only deps on go-judge/pb --- go.mod | 4 -- go.sum | 72 ++++++------------- internal/executor/dummy/executor.go | 3 +- internal/executor/local/executor.go | 11 ++- internal/parser/diff/parser.go | 3 +- internal/parser/healthcheck/parser.go | 3 +- internal/parser/resultstatus/parser.go | 3 +- internal/stage/file_error.go | 74 +++++++++++++++++++ internal/stage/model.go | 38 +--------- internal/stage/run_status.go | 99 ++++++++++++++++++++++++++ 10 files changed, 205 insertions(+), 105 deletions(-) create mode 100644 internal/stage/file_error.go create mode 100644 internal/stage/run_status.go diff --git a/go.mod b/go.mod index 321a7e0..13661a8 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,6 @@ go 1.24 toolchain go1.24.1 require ( - github.com/criyle/go-judge v1.9.2 github.com/criyle/go-judge/pb v1.0.0 github.com/go-git/go-git/v5 v5.14.0 github.com/jinzhu/copier v0.4.0 @@ -23,8 +22,6 @@ require ( github.com/Microsoft/go-winio v0.6.2 // indirect github.com/ProtonMail/go-crypto v1.1.6 // indirect github.com/cloudflare/circl v1.6.0 // indirect - github.com/creack/pty v1.1.24 // indirect - github.com/criyle/go-sandbox v0.11.2 // indirect github.com/cyphar/filepath-securejoin v0.4.1 // indirect github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 // indirect github.com/emirpasic/gods v1.18.1 // indirect @@ -41,7 +38,6 @@ require ( github.com/xanzy/ssh-agent v0.3.3 // indirect golang.org/x/crypto v0.36.0 // indirect golang.org/x/net v0.37.0 // indirect - golang.org/x/sync v0.12.0 // indirect golang.org/x/sys v0.31.0 // indirect golang.org/x/text v0.23.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 // indirect diff --git a/go.sum b/go.sum index fa4e19f..b254936 100644 --- a/go.sum +++ b/go.sum @@ -1,14 +1,10 @@ dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= -github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/ProtonMail/go-crypto v1.1.5 h1:eoAQfK2dwL+tFSFpr7TbOaPNUbPiJj4fLYwwGE1FQO4= -github.com/ProtonMail/go-crypto v1.1.5/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNxpLfdw= github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= @@ -17,18 +13,8 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/cloudflare/circl v1.6.0 h1:cr5JKic4HI+LkINy2lg3W2jF8sHCVTBncJr5gIIq7qk= github.com/cloudflare/circl v1.6.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= -github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= -github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= -github.com/criyle/go-judge v1.8.7 h1:HWg/xlQd7uxWtLoP7134lf+BDEUAp0cg/r9XlPyRQGk= -github.com/criyle/go-judge v1.8.7/go.mod h1:nH3cCXThwVGtPGJJtakR6zhmNYKiTrYALnQd4WEW32E= -github.com/criyle/go-judge v1.9.2 h1:PtX/pEPTHSFeqqOeOZ4WJVFPMFny/exhZ62+dYnI1OU= -github.com/criyle/go-judge v1.9.2/go.mod h1:91G9KzibnX/EJlb7PtlzazY9BMMpNIrs/YbczfQaeJU= github.com/criyle/go-judge/pb v1.0.0 h1:8A4zHPPCGCDTuFY1GW5Hqpg+8ETIwzgXxiRpYKKb2zA= github.com/criyle/go-judge/pb v1.0.0/go.mod h1:hjgixgK9NH9ktwc29xbXVdZDOlKfEkRkEbZ4W5bOMmw= -github.com/criyle/go-sandbox v0.10.6 h1:vyp+r7V2Vl5xY4Pt/2kYvRF5wu1NhMwLgmPKD0lXZ/o= -github.com/criyle/go-sandbox v0.10.6/go.mod h1:nZLj0b/45fZ/a+xWmWrPrcKSepnXu0iPAVF3xF54UEI= -github.com/criyle/go-sandbox v0.11.2 h1:u+GpAtIQZx9aFq7+xCtMFn8Uj7Sbok/971zi71Olhmo= -github.com/criyle/go-sandbox v0.11.2/go.mod h1:9IZSv7cxcDkVaPSRufhMPLUg+7M7lTPAt8hjd/iMKFo= github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s= github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= @@ -36,8 +22,8 @@ github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/elazarl/goproxy v1.4.0 h1:4GyuSbFa+s26+3rmYNSuUVsx+HgPrV1bk1jXI0l9wjM= -github.com/elazarl/goproxy v1.4.0/go.mod h1:X/5W/t+gzDyLfHW4DrMdpjqYjpXsURlBt9lpBDxZZZQ= +github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o= +github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8= @@ -52,8 +38,6 @@ github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UN github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.13.2 h1:7O7xvsK7K+rZPKW6AQR1YyNhfywkv7B8/FsP3ki6Zv0= -github.com/go-git/go-git/v5 v5.13.2/go.mod h1:hWdW5P4YZRjmpGHwRH2v3zkWcNl6HeXaXQEMGb3NJ9A= github.com/go-git/go-git/v5 v5.14.0 h1:/MD3lCrGjCen5WfEAzKg00MJJffKhC8gzS80ycmCi60= github.com/go-git/go-git/v5 v5.14.0/go.mod h1:Z5Xhoia5PcWA3NF8vRLURn9E5FRhSl7dGj9ItW3Wk5k= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= @@ -64,8 +48,8 @@ github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8J github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= @@ -98,8 +82,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= @@ -112,59 +96,43 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= -go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= -go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= -go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= -go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= -go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= -go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= -go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= -go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= -go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= +go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= +go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= +go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= +go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= +go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= +go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= +go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= +go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= -golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= -golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c= golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= -golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= -golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= -golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= -golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= +golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= +golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= -golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 h1:2duwAxN2+k0xLNpjnHTXoMUgnv6VPSp5fiqTuwSxjmI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb h1:TLPQVbx1GJ8VKZxz52VAxl1EBgKXXbTiU9Fc5fZeLn4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 h1:iK2jbkWL86DXjEx0qiHcRE9dE4/Ahua5k6V8OWFb//c= google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= -google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= -google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= diff --git a/internal/executor/dummy/executor.go b/internal/executor/dummy/executor.go index 9891182..ca4632b 100644 --- a/internal/executor/dummy/executor.go +++ b/internal/executor/dummy/executor.go @@ -1,7 +1,6 @@ package dummy import ( - "github.com/criyle/go-judge/envexec" "github.com/joint-online-judge/JOJ3/internal/stage" ) @@ -9,7 +8,7 @@ func (e *Dummy) Run(cmds []stage.Cmd) ([]stage.ExecutorResult, error) { var res []stage.ExecutorResult for range cmds { res = append(res, stage.ExecutorResult{ - Status: stage.Status(envexec.StatusAccepted), + Status: stage.StatusAccepted, ExitStatus: 0, Error: "", Time: 0, diff --git a/internal/executor/local/executor.go b/internal/executor/local/executor.go index 370c1cb..9eb3cd3 100644 --- a/internal/executor/local/executor.go +++ b/internal/executor/local/executor.go @@ -11,7 +11,6 @@ import ( "syscall" "time" - "github.com/criyle/go-judge/envexec" "github.com/joint-online-judge/JOJ3/internal/stage" ) @@ -23,7 +22,7 @@ func (e *Local) generateResult( stdoutBuffer, stderrBuffer bytes.Buffer, ) stage.ExecutorResult { result := stage.ExecutorResult{ - Status: stage.Status(envexec.StatusAccepted), + Status: stage.StatusAccepted, ExitStatus: processState.ExitCode(), Error: "", Time: func() uint64 { @@ -59,10 +58,10 @@ func (e *Local) generateResult( if err != nil { if exitErr, ok := err.(*exec.ExitError); ok { - result.Status = stage.Status(envexec.StatusNonzeroExitStatus) + result.Status = stage.StatusNonzeroExitStatus result.Error = exitErr.Error() } else { - result.Status = stage.Status(envexec.StatusInternalError) + result.Status = stage.StatusInternalError result.Error = err.Error() } } @@ -75,7 +74,7 @@ func (e *Local) generateResult( } if err := handleCopyOut(&result, cmd); err != nil { - result.Status = stage.Status(envexec.StatusFileError) + result.Status = stage.StatusFileError result.Error = err.Error() } @@ -146,7 +145,7 @@ func (e *Local) Run(cmds []stage.Cmd) ([]stage.ExecutorResult, error) { case <-time.After(duration): _ = execCmd.Process.Kill() result := stage.ExecutorResult{ - Status: stage.Status(envexec.StatusTimeLimitExceeded), + Status: stage.StatusTimeLimitExceeded, Error: "", Files: map[string]string{}, FileIDs: map[string]string{}, diff --git a/internal/parser/diff/parser.go b/internal/parser/diff/parser.go index 19da6c3..aed0324 100644 --- a/internal/parser/diff/parser.go +++ b/internal/parser/diff/parser.go @@ -6,7 +6,6 @@ import ( "os" "strings" - "github.com/criyle/go-judge/envexec" "github.com/joint-online-judge/JOJ3/internal/stage" ) @@ -37,7 +36,7 @@ func (*Diff) Run(results []stage.ExecutorResult, confAny any) ( score := 0 comment := "" if conf.FailOnNotAccepted && - result.Status != stage.Status(envexec.StatusAccepted) { + result.Status != stage.StatusAccepted { if conf.ForceQuitOnFailed { forceQuit = true } diff --git a/internal/parser/healthcheck/parser.go b/internal/parser/healthcheck/parser.go index 6113412..e2ee7fc 100644 --- a/internal/parser/healthcheck/parser.go +++ b/internal/parser/healthcheck/parser.go @@ -5,7 +5,6 @@ import ( "fmt" "log/slog" - "github.com/criyle/go-judge/envexec" "github.com/joint-online-judge/JOJ3/internal/stage" "github.com/joint-online-judge/JOJ3/pkg/healthcheck" ) @@ -14,7 +13,7 @@ func (*Healthcheck) parse(executorResult stage.ExecutorResult, conf Conf) (stage stdout := executorResult.Files[conf.Stdout] stderr := executorResult.Files[conf.Stderr] slog.Debug("healthcheck files", "stdout", stdout, "stderr", stderr) - if executorResult.Status != stage.Status(envexec.StatusAccepted) { + if executorResult.Status != stage.StatusAccepted { return stage.ParserResult{ Score: 0, Comment: fmt.Sprintf( diff --git a/internal/parser/resultstatus/parser.go b/internal/parser/resultstatus/parser.go index 9282246..89bc338 100644 --- a/internal/parser/resultstatus/parser.go +++ b/internal/parser/resultstatus/parser.go @@ -3,7 +3,6 @@ package resultstatus import ( "fmt" - "github.com/criyle/go-judge/envexec" "github.com/joint-online-judge/JOJ3/internal/stage" ) @@ -19,7 +18,7 @@ func (*ResultStatus) Run(results []stage.ExecutorResult, confAny any) ( var res []stage.ParserResult for _, result := range results { comment := conf.Comment - if result.Status != stage.Status(envexec.StatusAccepted) { + if result.Status != stage.StatusAccepted { score = 0 comment = fmt.Sprintf( "Unexpected executor status: `%s`.\n", result.Status, diff --git a/internal/stage/file_error.go b/internal/stage/file_error.go new file mode 100644 index 0000000..5bfed66 --- /dev/null +++ b/internal/stage/file_error.go @@ -0,0 +1,74 @@ +package stage + +import "fmt" + +// copied from https://github.com/criyle/go-judge/blob/master/envexec/cmd.go +// FileErrorType defines the location that file operation fails +type FileErrorType int + +// FileError enums +const ( + ErrCopyInOpenFile FileErrorType = iota + ErrCopyInCreateDir + ErrCopyInCreateFile + ErrCopyInCopyContent + ErrCopyOutOpen + ErrCopyOutNotRegularFile + ErrCopyOutSizeExceeded + ErrCopyOutCreateFile + ErrCopyOutCopyContent + ErrCollectSizeExceeded + ErrSymlink +) + +// FileError defines the location, file name and the detailed message for a failed file operation +type FileError struct { + Name string `json:"name"` + Type FileErrorType `json:"type"` + Message string `json:"message,omitempty"` +} + +var fileErrorString = []string{ + "CopyInOpenFile", + "CopyInCreateDir", + "CopyInCreateFile", + "CopyInCopyContent", + "CopyOutOpen", + "CopyOutNotRegularFile", + "CopyOutSizeExceeded", + "CopyOutCreateFile", + "CopyOutCopyContent", + "CollectSizeExceeded", +} + +var fileErrorStringReverse = make(map[string]FileErrorType) + +func (t FileErrorType) String() string { + v := int(t) + if v >= 0 && v < len(fileErrorString) { + return fileErrorString[v] + } + return "" +} + +// MarshalJSON encodes file error into json string +func (t FileErrorType) MarshalJSON() ([]byte, error) { + return []byte(`"` + t.String() + `"`), nil +} + +// UnmarshalJSON decodes file error from json string +func (t *FileErrorType) UnmarshalJSON(b []byte) error { + str := string(b) + v, ok := fileErrorStringReverse[str] + if ok { + return fmt.Errorf("%s is not file error type", str) + } + *t = v + return nil +} + +func init() { + for i, v := range fileErrorString { + fileErrorStringReverse[`"`+v+`"`] = FileErrorType(i) + } +} diff --git a/internal/stage/model.go b/internal/stage/model.go index 82fbe86..c8bf746 100644 --- a/internal/stage/model.go +++ b/internal/stage/model.go @@ -4,17 +4,9 @@ import ( "encoding/json" "fmt" "strconv" - - "github.com/criyle/go-judge/envexec" ) // copied from https://github.com/criyle/go-judge/blob/master/cmd/go-judge/model/model.go -// FileError defines the location, file name and the detailed message for a failed file operation -type FileError = envexec.FileError - -// FileErrorType defines the location that file operation fails -type FileErrorType = envexec.FileErrorType - // CmdFile defines file from multiple source including local / memory / cached or pipe collector type CmdFile struct { Src *string `json:"src"` @@ -82,30 +74,6 @@ type Request struct { PipeMapping []PipeMap `json:"pipeMapping"` } -// Status offers JSON marshal for envexec.Status -type Status envexec.Status - -// String converts status to string -func (s Status) String() string { - return envexec.Status(s).String() -} - -// MarshalJSON convert status into string -func (s Status) MarshalJSON() ([]byte, error) { - return []byte("\"" + envexec.Status(s).String() + "\""), nil -} - -// UnmarshalJSON convert string into status -func (s *Status) UnmarshalJSON(b []byte) error { - str := string(b) - v, err := envexec.StringToStatus(str) - if err != nil { - return err - } - *s = Status(v) - return nil -} - // ExecutorResult defines single command result type ExecutorResult struct { Status Status `json:"status"` @@ -171,10 +139,10 @@ func (r ExecutorResult) MarshalJSON() ([]byte, error) { func SummarizeExecutorResults(results []ExecutorResult) ExecutorResultSummary { var summary ExecutorResultSummary - summary.Status = Status(envexec.StatusAccepted) + summary.Status = StatusAccepted for _, result := range results { - if result.Status != Status(envexec.StatusAccepted) && - summary.Status == Status(envexec.StatusAccepted) { + if result.Status != StatusAccepted && + summary.Status == StatusAccepted { summary.Status = result.Status } if result.ExitStatus != 0 && summary.ExitStatus == 0 { diff --git a/internal/stage/run_status.go b/internal/stage/run_status.go new file mode 100644 index 0000000..b22eb07 --- /dev/null +++ b/internal/stage/run_status.go @@ -0,0 +1,99 @@ +package stage + +import ( + "fmt" +) + +// copied from https://github.com/criyle/go-judge/blob/master/envexec/run_status.go +// Status defines run task Status return status +type Status int + +// Defines run task Status result status +const ( + // not initialized status (as error) + StatusInvalid Status = iota + + // exit normally + StatusAccepted + StatusWrongAnswer + StatusPartiallyCorrect + + // exit with error + StatusMemoryLimitExceeded // MLE + StatusTimeLimitExceeded // TLE + StatusOutputLimitExceeded // OLE + StatusFileError // FE + StatusNonzeroExitStatus // NZS + StatusSignalled // SIG + StatusDangerousSyscall // DJS + + // StatusRuntimeError // RE + + // SPJ / interactor error + StatusJudgementFailed + StatusInvalidInteraction // interactor signals error + + // internal error including: cgroup init failed, container failed, etc + StatusInternalError +) + +var statusToString = []string{ + "Invalid", + "Accepted", + "Wrong Answer", + "Partially Correct", + "Memory Limit Exceeded", + "Time Limit Exceeded", + "Output Limit Exceeded", + "File Error", + "Nonzero Exit Status", + "Signalled", + "Dangerous Syscall", + "Judgement Failed", + "Invalid Interaction", + "Internal Error", + "CGroup Error", + "Container Error", +} + +// stringToStatus map string to corresponding Status +var stringToStatus = make(map[string]Status) + +func (s Status) String() string { + si := int(s) + if si < 0 || si >= len(statusToString) { + return statusToString[0] // invalid + } + return statusToString[si] +} + +// StringToStatus convert string to Status +func StringToStatus(s string) (Status, error) { + v, ok := stringToStatus[s] + if !ok { + return 0, fmt.Errorf("invalid string converting: %s", s) + } + return v, nil +} + +// MarshalJSON convert status into string +func (s Status) MarshalJSON() ([]byte, error) { + return []byte("\"" + Status(s).String() + "\""), nil +} + +// UnmarshalJSON convert string into status +func (s *Status) UnmarshalJSON(b []byte) error { + str := string(b) + v, err := StringToStatus(str) + if err != nil { + return err + } + *s = Status(v) + return nil +} + +func init() { + for i, v := range statusToString { + stringToStatus["\""+v+"\""] = Status(i) + } +}