forked from Plemya-x/ALR
		
	feat: add import info from alr-repo.toml
This commit is contained in:
		| @@ -0,0 +1,5 @@ | |||||||
|  | - name: alr-repo | ||||||
|  |   url: https://gitea.plemya-x.ru/Plemya-x/repo-for-tests | ||||||
|  |   ref: main | ||||||
|  |   mirrors: | ||||||
|  |   - https://github.com/example/example.git | ||||||
							
								
								
									
										40
									
								
								e2e-tests/issue_129_repo_toml_import_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								e2e-tests/issue_129_repo_toml_import_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | |||||||
|  | // ALR - Any Linux Repository | ||||||
|  | // Copyright (C) 2025 The ALR Authors | ||||||
|  | // | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // (at your option) any later version. | ||||||
|  | // | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | // GNU General Public License for more details. | ||||||
|  | // | ||||||
|  | // You should have received a copy of the GNU General Public License | ||||||
|  | // along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
|  |  | ||||||
|  | //go:build e2e | ||||||
|  |  | ||||||
|  | package e2etests_test | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"testing" | ||||||
|  |  | ||||||
|  | 	"go.alt-gnome.ru/capytest" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func TestE2EIssue129RepoTomlImportTest(t *testing.T) { | ||||||
|  | 	runMatrixSuite( | ||||||
|  | 		t, | ||||||
|  | 		"issue-129-repo-toml-import-test", | ||||||
|  | 		COMMON_SYSTEMS, | ||||||
|  | 		func(t *testing.T, r capytest.Runner) { | ||||||
|  | 			defaultPrepare(t, r) | ||||||
|  |  | ||||||
|  | 			r.Command("alr", "config", "get", "repos"). | ||||||
|  | 				ExpectStdoutMatchesSnapshot(). | ||||||
|  | 				Run(t) | ||||||
|  | 		}, | ||||||
|  | 	) | ||||||
|  | } | ||||||
| @@ -27,6 +27,7 @@ import ( | |||||||
| 	"os" | 	"os" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"text/template" | 	"text/template" | ||||||
|  | 	"unicode" | ||||||
|  |  | ||||||
| 	"golang.org/x/text/cases" | 	"golang.org/x/text/cases" | ||||||
| 	"golang.org/x/text/language" | 	"golang.org/x/text/language" | ||||||
| @@ -252,6 +253,8 @@ func argsGen(buf *bytes.Buffer, methods []MethodInfo) { | |||||||
| 			return strings.ToLower(s[:1]) + s[1:] | 			return strings.ToLower(s[:1]) + s[1:] | ||||||
| 		}, | 		}, | ||||||
| 		"zeroValue": func(typeName string) string { | 		"zeroValue": func(typeName string) string { | ||||||
|  | 			typeName = strings.TrimSpace(typeName) | ||||||
|  |  | ||||||
| 			switch typeName { | 			switch typeName { | ||||||
| 			case "string": | 			case "string": | ||||||
| 				return "\"\"" | 				return "\"\"" | ||||||
| @@ -263,9 +266,32 @@ func argsGen(buf *bytes.Buffer, methods []MethodInfo) { | |||||||
| 				return "0.0" | 				return "0.0" | ||||||
| 			case "bool": | 			case "bool": | ||||||
| 				return "false" | 				return "false" | ||||||
| 			default: | 			} | ||||||
|  |  | ||||||
|  | 			if strings.HasPrefix(typeName, "*") { | ||||||
| 				return "nil" | 				return "nil" | ||||||
| 			} | 			} | ||||||
|  | 			if strings.HasPrefix(typeName, "[]") || | ||||||
|  | 				strings.HasPrefix(typeName, "map[") || | ||||||
|  | 				strings.HasPrefix(typeName, "chan ") { | ||||||
|  | 				return "nil" | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			if typeName == "interface{}" { | ||||||
|  | 				return "nil" | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			// If external type: pkg.Type | ||||||
|  | 			if strings.Contains(typeName, ".") { | ||||||
|  | 				return typeName + "{}" | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			// If starts with uppercase — likely struct | ||||||
|  | 			if len(typeName) > 0 && unicode.IsUpper(rune(typeName[0])) { | ||||||
|  | 				return typeName + "{}" | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			return "nil" | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										15
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								go.mod
									
									
									
									
									
								
							| @@ -34,8 +34,8 @@ require ( | |||||||
| 	github.com/stretchr/testify v1.10.0 | 	github.com/stretchr/testify v1.10.0 | ||||||
| 	github.com/urfave/cli/v2 v2.25.7 | 	github.com/urfave/cli/v2 v2.25.7 | ||||||
| 	github.com/vmihailenco/msgpack/v5 v5.3.5 | 	github.com/vmihailenco/msgpack/v5 v5.3.5 | ||||||
| 	go.alt-gnome.ru/capytest v0.0.2 | 	go.alt-gnome.ru/capytest v0.0.3-0.20250706082755-f20413e052f9 | ||||||
| 	go.alt-gnome.ru/capytest/providers/podman v0.0.2 | 	go.alt-gnome.ru/capytest/providers/podman v0.0.3-0.20250706082755-f20413e052f9 | ||||||
| 	go.elara.ws/vercmp v0.0.0-20230622214216-0b2b067575c4 | 	go.elara.ws/vercmp v0.0.0-20230622214216-0b2b067575c4 | ||||||
| 	golang.org/x/crypto v0.36.0 | 	golang.org/x/crypto v0.36.0 | ||||||
| 	golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 | 	golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 | ||||||
| @@ -77,6 +77,9 @@ require ( | |||||||
| 	github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect | 	github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect | ||||||
| 	github.com/fatih/color v1.7.0 // indirect | 	github.com/fatih/color v1.7.0 // indirect | ||||||
| 	github.com/fsnotify/fsnotify v1.9.0 // indirect | 	github.com/fsnotify/fsnotify v1.9.0 // indirect | ||||||
|  | 	github.com/gkampitakis/ciinfo v0.3.2 // indirect | ||||||
|  | 	github.com/gkampitakis/go-diff v1.3.2 // indirect | ||||||
|  | 	github.com/gkampitakis/go-snaps v0.5.13 // indirect | ||||||
| 	github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect | 	github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect | ||||||
| 	github.com/go-logfmt/logfmt v0.6.0 // indirect | 	github.com/go-logfmt/logfmt v0.6.0 // indirect | ||||||
| 	github.com/go-viper/mapstructure/v2 v2.3.0 // indirect | 	github.com/go-viper/mapstructure/v2 v2.3.0 // indirect | ||||||
| @@ -101,7 +104,10 @@ require ( | |||||||
| 	github.com/klauspost/compress v1.17.11 // indirect | 	github.com/klauspost/compress v1.17.11 // indirect | ||||||
| 	github.com/klauspost/pgzip v1.2.6 // indirect | 	github.com/klauspost/pgzip v1.2.6 // indirect | ||||||
| 	github.com/knadh/koanf/maps v0.1.2 // indirect | 	github.com/knadh/koanf/maps v0.1.2 // indirect | ||||||
|  | 	github.com/kr/pretty v0.3.1 // indirect | ||||||
|  | 	github.com/kr/text v0.2.0 // indirect | ||||||
| 	github.com/lucasb-eyer/go-colorful v1.2.0 // indirect | 	github.com/lucasb-eyer/go-colorful v1.2.0 // indirect | ||||||
|  | 	github.com/maruel/natural v1.1.1 // indirect | ||||||
| 	github.com/mattn/go-colorable v0.1.13 // indirect | 	github.com/mattn/go-colorable v0.1.13 // indirect | ||||||
| 	github.com/mattn/go-localereader v0.0.1 // indirect | 	github.com/mattn/go-localereader v0.0.1 // indirect | ||||||
| 	github.com/mattn/go-runewidth v0.0.16 // indirect | 	github.com/mattn/go-runewidth v0.0.16 // indirect | ||||||
| @@ -120,6 +126,7 @@ require ( | |||||||
| 	github.com/pmezard/go-difflib v1.0.0 // indirect | 	github.com/pmezard/go-difflib v1.0.0 // indirect | ||||||
| 	github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect | 	github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect | ||||||
| 	github.com/rivo/uniseg v0.4.7 // indirect | 	github.com/rivo/uniseg v0.4.7 // indirect | ||||||
|  | 	github.com/rogpeppe/go-internal v1.13.1 // indirect | ||||||
| 	github.com/russross/blackfriday/v2 v2.1.0 // indirect | 	github.com/russross/blackfriday/v2 v2.1.0 // indirect | ||||||
| 	github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect | 	github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect | ||||||
| 	github.com/shopspring/decimal v1.3.1 // indirect | 	github.com/shopspring/decimal v1.3.1 // indirect | ||||||
| @@ -127,6 +134,10 @@ require ( | |||||||
| 	github.com/spf13/cast v1.7.1 // indirect | 	github.com/spf13/cast v1.7.1 // indirect | ||||||
| 	github.com/syndtr/goleveldb v1.0.0 // indirect | 	github.com/syndtr/goleveldb v1.0.0 // indirect | ||||||
| 	github.com/therootcompany/xz v1.0.1 // indirect | 	github.com/therootcompany/xz v1.0.1 // indirect | ||||||
|  | 	github.com/tidwall/gjson v1.18.0 // indirect | ||||||
|  | 	github.com/tidwall/match v1.1.1 // indirect | ||||||
|  | 	github.com/tidwall/pretty v1.2.1 // indirect | ||||||
|  | 	github.com/tidwall/sjson v1.2.5 // indirect | ||||||
| 	github.com/ulikunitz/xz v0.5.12 // indirect | 	github.com/ulikunitz/xz v0.5.12 // indirect | ||||||
| 	github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect | 	github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect | ||||||
| 	github.com/xanzy/ssh-agent v0.3.3 // indirect | 	github.com/xanzy/ssh-agent v0.3.3 // indirect | ||||||
|   | |||||||
							
								
								
									
										27
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								go.sum
									
									
									
									
									
								
							| @@ -104,6 +104,7 @@ github.com/connesc/cipherio v0.2.1 h1:FGtpTPMbKNNWByNrr9aEBtaJtXjqOzkIXNYJp6OEyc | |||||||
| github.com/connesc/cipherio v0.2.1/go.mod h1:ukY0MWJDFnJEbXMQtOcn2VmTpRfzcTz4OoVrWGGJZcA= | github.com/connesc/cipherio v0.2.1/go.mod h1:ukY0MWJDFnJEbXMQtOcn2VmTpRfzcTz4OoVrWGGJZcA= | ||||||
| github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= | github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= | ||||||
| github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= | github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= | ||||||
|  | github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= | ||||||
| github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= | github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= | ||||||
| github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= | github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= | ||||||
| github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= | github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= | ||||||
| @@ -134,6 +135,12 @@ github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7z | |||||||
| github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= | github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= | ||||||
| github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= | github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= | ||||||
| github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= | github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= | ||||||
|  | github.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs= | ||||||
|  | github.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo= | ||||||
|  | github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M= | ||||||
|  | github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk= | ||||||
|  | github.com/gkampitakis/go-snaps v0.5.13 h1:Hhjmvv1WboSCxkR9iU2mj5PQ8tsz/y8ECGrIbjjPF8Q= | ||||||
|  | github.com/gkampitakis/go-snaps v0.5.13/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc= | ||||||
| github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= | github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= | ||||||
| github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= | github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= | ||||||
| github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= | github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= | ||||||
| @@ -286,6 +293,8 @@ github.com/leonelquinteros/gotext v1.7.0 h1:jcJmF4AXqyamP7vuw2MMIKs+O3jAEmvrc5JQ | |||||||
| github.com/leonelquinteros/gotext v1.7.0/go.mod h1:qJdoQuERPpccw7L70uoU+K/BvTfRBHYsisCQyFLXyvw= | github.com/leonelquinteros/gotext v1.7.0/go.mod h1:qJdoQuERPpccw7L70uoU+K/BvTfRBHYsisCQyFLXyvw= | ||||||
| github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= | github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= | ||||||
| github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= | github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= | ||||||
|  | github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= | ||||||
|  | github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= | ||||||
| github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= | github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= | ||||||
| github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= | github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= | ||||||
| github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= | github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= | ||||||
| @@ -345,6 +354,7 @@ github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0 | |||||||
| github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= | github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= | ||||||
| github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= | github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= | ||||||
| github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= | github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= | ||||||
|  | github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= | ||||||
| github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= | ||||||
| github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | 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 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | ||||||
| @@ -358,6 +368,7 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ | |||||||
| github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= | github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= | ||||||
| github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= | github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= | ||||||
| github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | ||||||
|  | github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= | ||||||
| github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= | github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= | ||||||
| github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= | github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= | ||||||
| github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= | github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= | ||||||
| @@ -393,6 +404,16 @@ github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFd | |||||||
| github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= | github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= | ||||||
| github.com/therootcompany/xz v1.0.1 h1:CmOtsn1CbtmyYiusbfmhmkpAAETj0wBIH6kCYaX+xzw= | github.com/therootcompany/xz v1.0.1 h1:CmOtsn1CbtmyYiusbfmhmkpAAETj0wBIH6kCYaX+xzw= | ||||||
| github.com/therootcompany/xz v1.0.1/go.mod h1:3K3UH1yCKgBneZYhuQUvJ9HPD19UEXEI0BWbMn8qNMY= | github.com/therootcompany/xz v1.0.1/go.mod h1:3K3UH1yCKgBneZYhuQUvJ9HPD19UEXEI0BWbMn8qNMY= | ||||||
|  | github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= | ||||||
|  | github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= | ||||||
|  | github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= | ||||||
|  | github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= | ||||||
|  | github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= | ||||||
|  | github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= | ||||||
|  | github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= | ||||||
|  | github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= | ||||||
|  | github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= | ||||||
|  | github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= | ||||||
| github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= | github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= | ||||||
| github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc= | github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc= | ||||||
| github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= | github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= | ||||||
| @@ -413,8 +434,10 @@ gitlab.com/digitalxero/go-conventional-commit v1.0.7 h1:8/dO6WWG+98PMhlZowt/Yjui | |||||||
| gitlab.com/digitalxero/go-conventional-commit v1.0.7/go.mod h1:05Xc2BFsSyC5tKhK0y+P3bs0AwUtNuTp+mTpbCU/DZ0= | gitlab.com/digitalxero/go-conventional-commit v1.0.7/go.mod h1:05Xc2BFsSyC5tKhK0y+P3bs0AwUtNuTp+mTpbCU/DZ0= | ||||||
| go.alt-gnome.ru/capytest v0.0.2 h1:clmvIqmYS86hhA1rsvivSSPpfOFkJTpbn38EQP7I3E8= | go.alt-gnome.ru/capytest v0.0.2 h1:clmvIqmYS86hhA1rsvivSSPpfOFkJTpbn38EQP7I3E8= | ||||||
| go.alt-gnome.ru/capytest v0.0.2/go.mod h1:lvxPx3H6h+LPnStBFblgoT2wkjv0wbug3S14troykEg= | go.alt-gnome.ru/capytest v0.0.2/go.mod h1:lvxPx3H6h+LPnStBFblgoT2wkjv0wbug3S14troykEg= | ||||||
| go.alt-gnome.ru/capytest/providers/podman v0.0.2 h1:fTQ9fmYiONgL8dJvyMB+irCfuojIVaomnqto6bl6HjU= | go.alt-gnome.ru/capytest v0.0.3-0.20250706082755-f20413e052f9 h1:NST+V5LV/eLgs0p6PsuvfHiZ4UrIWqftCdifO8zgg0g= | ||||||
| go.alt-gnome.ru/capytest/providers/podman v0.0.2/go.mod h1:Wpq1Ny3eMzADJpMJArA2TZGZbsviUBmawtEPcxnoerg= | go.alt-gnome.ru/capytest v0.0.3-0.20250706082755-f20413e052f9/go.mod h1:qiM8LARP+JBZr5mrDoVylOoqjrN0MAzvZ21NR9qMc0Y= | ||||||
|  | go.alt-gnome.ru/capytest/providers/podman v0.0.3-0.20250706082755-f20413e052f9 h1:VZclgdJxARvhZ6PIWWW2hQ6Ge4XeE36pzUr/U/y62bE= | ||||||
|  | go.alt-gnome.ru/capytest/providers/podman v0.0.3-0.20250706082755-f20413e052f9/go.mod h1:Wpq1Ny3eMzADJpMJArA2TZGZbsviUBmawtEPcxnoerg= | ||||||
| go.elara.ws/vercmp v0.0.0-20230622214216-0b2b067575c4 h1:Ep54XceQlKhcCHl9awG+wWP4kz4kIP3c3Lzw/Gc/zwY= | go.elara.ws/vercmp v0.0.0-20230622214216-0b2b067575c4 h1:Ep54XceQlKhcCHl9awG+wWP4kz4kIP3c3Lzw/Gc/zwY= | ||||||
| go.elara.ws/vercmp v0.0.0-20230622214216-0b2b067575c4/go.mod h1:/7PNW7nFnDR5W7UXZVc04gdVLR/wBNgkm33KgIz0OBk= | go.elara.ws/vercmp v0.0.0-20230622214216-0b2b067575c4/go.mod h1:/7PNW7nFnDR5W7UXZVc04gdVLR/wBNgkm33KgIz0OBk= | ||||||
| go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= | go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= | ||||||
|   | |||||||
							
								
								
									
										37
									
								
								internal.go
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								internal.go
									
									
									
									
									
								
							| @@ -84,6 +84,43 @@ func InternalBuildCmd() *cli.Command { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func InternalReposCmd() *cli.Command { | ||||||
|  | 	return &cli.Command{ | ||||||
|  | 		Name:     "_internal-repos", | ||||||
|  | 		HideHelp: true, | ||||||
|  | 		Hidden:   true, | ||||||
|  | 		Action: utils.RootNeededAction(func(ctx *cli.Context) error { | ||||||
|  | 			logger.SetupForGoPlugin() | ||||||
|  |  | ||||||
|  | 			if err := utils.ExitIfCantDropCapsToAlrUser(); err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			deps, err := appbuilder. | ||||||
|  | 				New(ctx.Context). | ||||||
|  | 				WithConfig(). | ||||||
|  | 				WithDB(). | ||||||
|  | 				WithReposNoPull(). | ||||||
|  | 				Build() | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 			defer deps.Defer() | ||||||
|  |  | ||||||
|  | 			pluginCfg := build.GetPluginServeCommonConfig() | ||||||
|  | 			pluginCfg.Plugins = map[string]plugin.Plugin{ | ||||||
|  | 				"repos": &build.ReposExecutorPlugin{ | ||||||
|  | 					Impl: build.NewRepos( | ||||||
|  | 						deps.Repos, | ||||||
|  | 					), | ||||||
|  | 				}, | ||||||
|  | 			} | ||||||
|  | 			plugin.Serve(pluginCfg) | ||||||
|  | 			return nil | ||||||
|  | 		}), | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| func InternalInstallCmd() *cli.Command { | func InternalInstallCmd() *cli.Command { | ||||||
| 	return &cli.Command{ | 	return &cli.Command{ | ||||||
| 		Name:     "_internal-installer", | 		Name:     "_internal-installer", | ||||||
|   | |||||||
| @@ -24,6 +24,7 @@ import ( | |||||||
| 	"strings" | 	"strings" | ||||||
| 	"sync" | 	"sync" | ||||||
|  |  | ||||||
|  | 	"github.com/hashicorp/go-hclog" | ||||||
| 	"github.com/hashicorp/go-plugin" | 	"github.com/hashicorp/go-plugin" | ||||||
|  |  | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/logger" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/logger" | ||||||
| @@ -32,6 +33,7 @@ import ( | |||||||
| var pluginMap = map[string]plugin.Plugin{ | var pluginMap = map[string]plugin.Plugin{ | ||||||
| 	"script-executor": &ScriptExecutorPlugin{}, | 	"script-executor": &ScriptExecutorPlugin{}, | ||||||
| 	"installer":       &InstallerExecutorPlugin{}, | 	"installer":       &InstallerExecutorPlugin{}, | ||||||
|  | 	"repos":           &ReposExecutorPlugin{}, | ||||||
| } | } | ||||||
|  |  | ||||||
| var HandshakeConfig = plugin.HandshakeConfig{ | var HandshakeConfig = plugin.HandshakeConfig{ | ||||||
| @@ -57,6 +59,19 @@ func setCommonCmdEnv(cmd *exec.Cmd) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func GetPluginServeCommonConfig() *plugin.ServeConfig { | ||||||
|  | 	return &plugin.ServeConfig{ | ||||||
|  | 		HandshakeConfig: HandshakeConfig, | ||||||
|  | 		Logger: hclog.New(&hclog.LoggerOptions{ | ||||||
|  | 			Name:        "plugin", | ||||||
|  | 			Output:      os.Stderr, | ||||||
|  | 			Level:       hclog.Trace, | ||||||
|  | 			JSONFormat:  true, | ||||||
|  | 			DisableTime: true, | ||||||
|  | 		}), | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| func GetSafeInstaller() (InstallerExecutor, func(), error) { | func GetSafeInstaller() (InstallerExecutor, func(), error) { | ||||||
| 	return getSafeExecutor[InstallerExecutor]("_internal-installer", "installer") | 	return getSafeExecutor[InstallerExecutor]("_internal-installer", "installer") | ||||||
| } | } | ||||||
| @@ -65,6 +80,10 @@ func GetSafeScriptExecutor() (ScriptExecutor, func(), error) { | |||||||
| 	return getSafeExecutor[ScriptExecutor]("_internal-safe-script-executor", "script-executor") | 	return getSafeExecutor[ScriptExecutor]("_internal-safe-script-executor", "script-executor") | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func GetSafeReposExecutor() (ReposExecutor, func(), error) { | ||||||
|  | 	return getSafeExecutor[ReposExecutor]("_internal-repos", "repos") | ||||||
|  | } | ||||||
|  |  | ||||||
| func getSafeExecutor[T any](subCommand, pluginName string) (T, func(), error) { | func getSafeExecutor[T any](subCommand, pluginName string) (T, func(), error) { | ||||||
| 	var err error | 	var err error | ||||||
|  |  | ||||||
|   | |||||||
| @@ -21,9 +21,10 @@ import ( | |||||||
|  |  | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/manager" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/manager" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/alrsh" | 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/alrsh" | ||||||
|  | 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| //go:generate go run ../../generators/plugin-generator InstallerExecutor ScriptExecutor | //go:generate go run ../../generators/plugin-generator InstallerExecutor ScriptExecutor ReposExecutor | ||||||
|  |  | ||||||
| // The Executors interfaces must use context.Context as the first parameter, | // The Executors interfaces must use context.Context as the first parameter, | ||||||
| // because the plugin-generator cannot generate code without it. | // because the plugin-generator cannot generate code without it. | ||||||
| @@ -53,3 +54,7 @@ type ScriptExecutor interface { | |||||||
| 		basePkg string, | 		basePkg string, | ||||||
| 	) ([]*BuiltDep, error) | 	) ([]*BuiltDep, error) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type ReposExecutor interface { | ||||||
|  | 	PullOneAndUpdateFromConfig(ctx context.Context, repo *types.Repo) (types.Repo, error) | ||||||
|  | } | ||||||
|   | |||||||
| @@ -24,6 +24,7 @@ import ( | |||||||
| 	"context" | 	"context" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/manager" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/manager" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/alrsh" | 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/alrsh" | ||||||
|  | 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types" | ||||||
| 	"github.com/hashicorp/go-plugin" | 	"github.com/hashicorp/go-plugin" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -67,6 +68,26 @@ func (p *ScriptExecutorPlugin) Server(*plugin.MuxBroker) (interface{}, error) { | |||||||
| 	return &ScriptExecutorRPCServer{Impl: p.Impl}, nil | 	return &ScriptExecutorRPCServer{Impl: p.Impl}, nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type ReposExecutorPlugin struct { | ||||||
|  | 	Impl ReposExecutor | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type ReposExecutorRPCServer struct { | ||||||
|  | 	Impl ReposExecutor | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type ReposExecutorRPC struct { | ||||||
|  | 	client *rpc.Client | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (p *ReposExecutorPlugin) Client(b *plugin.MuxBroker, c *rpc.Client) (interface{}, error) { | ||||||
|  | 	return &ReposExecutorRPC{client: c}, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (p *ReposExecutorPlugin) Server(*plugin.MuxBroker) (interface{}, error) { | ||||||
|  | 	return &ReposExecutorRPCServer{Impl: p.Impl}, nil | ||||||
|  | } | ||||||
|  |  | ||||||
| type InstallerExecutorInstallLocalArgs struct { | type InstallerExecutorInstallLocalArgs struct { | ||||||
| 	Paths []string | 	Paths []string | ||||||
| 	Opts  *manager.Opts | 	Opts  *manager.Opts | ||||||
| @@ -316,3 +337,33 @@ func (s *ScriptExecutorRPCServer) ExecuteSecondPass(args *ScriptExecutorExecuteS | |||||||
| 	} | 	} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type ReposExecutorPullOneAndUpdateFromConfigArgs struct { | ||||||
|  | 	Repo *types.Repo | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type ReposExecutorPullOneAndUpdateFromConfigResp struct { | ||||||
|  | 	Result0 types.Repo | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *ReposExecutorRPC) PullOneAndUpdateFromConfig(ctx context.Context, repo *types.Repo) (types.Repo, error) { | ||||||
|  | 	var resp *ReposExecutorPullOneAndUpdateFromConfigResp | ||||||
|  | 	err := s.client.Call("Plugin.PullOneAndUpdateFromConfig", &ReposExecutorPullOneAndUpdateFromConfigArgs{ | ||||||
|  | 		Repo: repo, | ||||||
|  | 	}, &resp) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return types.Repo{}, err | ||||||
|  | 	} | ||||||
|  | 	return resp.Result0, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *ReposExecutorRPCServer) PullOneAndUpdateFromConfig(args *ReposExecutorPullOneAndUpdateFromConfigArgs, resp *ReposExecutorPullOneAndUpdateFromConfigResp) error { | ||||||
|  | 	result0, err := s.Impl.PullOneAndUpdateFromConfig(context.Background(), args.Repo) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	*resp = ReposExecutorPullOneAndUpdateFromConfigResp{ | ||||||
|  | 		Result0: result0, | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										37
									
								
								internal/build/repos_executor.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								internal/build/repos_executor.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | // ALR - Any Linux Repository | ||||||
|  | // Copyright (C) 2025 The ALR Authors | ||||||
|  | // | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // (at your option) any later version. | ||||||
|  | // | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | // GNU General Public License for more details. | ||||||
|  | // | ||||||
|  | // You should have received a copy of the GNU General Public License | ||||||
|  | // along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
|  |  | ||||||
|  | package build | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  |  | ||||||
|  | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/repos" | ||||||
|  | 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type reposExecutor struct{ r *repos.Repos } | ||||||
|  |  | ||||||
|  | func NewRepos(r *repos.Repos) ReposExecutor { | ||||||
|  | 	return &reposExecutor{r} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (r *reposExecutor) PullOneAndUpdateFromConfig(ctx context.Context, repo *types.Repo) (types.Repo, error) { | ||||||
|  | 	if err := r.r.PullOneAndUpdateFromConfig(ctx, repo); err != nil { | ||||||
|  | 		return *repo, err | ||||||
|  | 	} | ||||||
|  | 	return *repo, nil | ||||||
|  | } | ||||||
| @@ -68,7 +68,7 @@ func (rs *Repos) Pull(ctx context.Context, repos []types.Repo) error { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for _, repo := range repos { | 	for _, repo := range repos { | ||||||
| 		err := rs.pullRepo(ctx, repo) | 		err := rs.pullRepo(ctx, &repo, false) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| @@ -77,7 +77,16 @@ func (rs *Repos) Pull(ctx context.Context, repos []types.Repo) error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func (rs *Repos) pullRepo(ctx context.Context, repo types.Repo) error { | func (rs *Repos) PullOneAndUpdateFromConfig(ctx context.Context, repo *types.Repo) error { | ||||||
|  | 	err := rs.pullRepo(ctx, repo, true) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (rs *Repos) pullRepo(ctx context.Context, repo *types.Repo, updateRepoFromToml bool) error { | ||||||
| 	urls := []string{repo.URL} | 	urls := []string{repo.URL} | ||||||
| 	urls = append(urls, repo.Mirrors...) | 	urls = append(urls, repo.Mirrors...) | ||||||
|  |  | ||||||
| @@ -88,7 +97,7 @@ func (rs *Repos) pullRepo(ctx context.Context, repo types.Repo) error { | |||||||
| 			slog.Info(gotext.Get("Trying mirror"), "repo", repo.Name, "mirror", repoURL) | 			slog.Info(gotext.Get("Trying mirror"), "repo", repo.Name, "mirror", repoURL) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		err := rs.pullRepoFromURL(ctx, repoURL, repo) | 		err := rs.pullRepoFromURL(ctx, repoURL, repo, updateRepoFromToml) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			lastErr = err | 			lastErr = err | ||||||
| 			slog.Warn(gotext.Get("Failed to pull from URL"), "repo", repo.Name, "url", repoURL, "error", err) | 			slog.Warn(gotext.Get("Failed to pull from URL"), "repo", repo.Name, "url", repoURL, "error", err) | ||||||
| @@ -149,7 +158,7 @@ func readGitRepo(repoDir, repoUrl string) (*git.Repository, bool, error) { | |||||||
| 	return r, true, nil | 	return r, true, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func (rs *Repos) pullRepoFromURL(ctx context.Context, rawRepoUrl string, repo types.Repo) error { | func (rs *Repos) pullRepoFromURL(ctx context.Context, rawRepoUrl string, repo *types.Repo, update bool) error { | ||||||
| 	repoURL, err := url.Parse(rawRepoUrl) | 	repoURL, err := url.Parse(rawRepoUrl) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("invalid URL %s: %w", rawRepoUrl, err) | 		return fmt.Errorf("invalid URL %s: %w", rawRepoUrl, err) | ||||||
| @@ -214,12 +223,12 @@ func (rs *Repos) pullRepoFromURL(ctx context.Context, rawRepoUrl string, repo ty | |||||||
| 	// empty. In this case, we need to update the DB fully | 	// empty. In this case, we need to update the DB fully | ||||||
| 	// rather than just incrementally. | 	// rather than just incrementally. | ||||||
| 	if rs.db.IsEmpty() || freshGit { | 	if rs.db.IsEmpty() || freshGit { | ||||||
| 		err = rs.processRepoFull(ctx, repo, repoDir) | 		err = rs.processRepoFull(ctx, *repo, repoDir) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		err = rs.processRepoChanges(ctx, repo, r, w, old, new) | 		err = rs.processRepoChanges(ctx, *repo, r, w, old, new) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| @@ -247,6 +256,18 @@ func (rs *Repos) pullRepoFromURL(ctx context.Context, rawRepoUrl string, repo ty | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if update { | ||||||
|  | 		if repoCfg.Repo.URL != "" { | ||||||
|  | 			repo.URL = repoCfg.Repo.URL | ||||||
|  | 		} | ||||||
|  | 		if repoCfg.Repo.Ref != "" { | ||||||
|  | 			repo.Ref = repoCfg.Repo.Ref | ||||||
|  | 		} | ||||||
|  | 		if len(repoCfg.Repo.Mirrors) > 0 { | ||||||
|  | 			repo.Mirrors = repoCfg.Repo.Mirrors | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -407,27 +407,27 @@ msgstr "" | |||||||
| msgid "ERROR" | msgid "ERROR" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: internal/repos/pull.go:88 | #: internal/repos/pull.go:97 | ||||||
| msgid "Trying mirror" | msgid "Trying mirror" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: internal/repos/pull.go:94 | #: internal/repos/pull.go:103 | ||||||
| msgid "Failed to pull from URL" | msgid "Failed to pull from URL" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: internal/repos/pull.go:158 | #: internal/repos/pull.go:167 | ||||||
| msgid "Pulling repository" | msgid "Pulling repository" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: internal/repos/pull.go:195 | #: internal/repos/pull.go:204 | ||||||
| msgid "Repository up to date" | msgid "Repository up to date" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: internal/repos/pull.go:230 | #: internal/repos/pull.go:239 | ||||||
| msgid "Git repository does not appear to be a valid ALR repo" | msgid "Git repository does not appear to be a valid ALR repo" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: internal/repos/pull.go:246 | #: internal/repos/pull.go:255 | ||||||
| msgid "" | msgid "" | ||||||
| "ALR repo's minimum ALR version is greater than the current version. Try " | "ALR repo's minimum ALR version is greater than the current version. Try " | ||||||
| "updating ALR if something doesn't work." | "updating ALR if something doesn't work." | ||||||
| @@ -481,11 +481,11 @@ msgstr "" | |||||||
| msgid "Enable interactive questions and prompts" | msgid "Enable interactive questions and prompts" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: main.go:147 | #: main.go:148 | ||||||
| msgid "Show help" | msgid "Show help" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: main.go:151 | #: main.go:152 | ||||||
| msgid "Error while running app" | msgid "Error while running app" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -517,44 +517,44 @@ msgstr "" | |||||||
| msgid "Pull all repositories that have changed" | msgid "Pull all repositories that have changed" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: repo.go:41 | #: repo.go:42 | ||||||
| msgid "Manage repos" | msgid "Manage repos" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: repo.go:55 repo.go:625 | #: repo.go:56 repo.go:625 | ||||||
| msgid "Remove an existing repository" | msgid "Remove an existing repository" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: repo.go:57 repo.go:521 | #: repo.go:58 repo.go:521 | ||||||
| msgid "<name>" | msgid "<name>" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: repo.go:102 repo.go:465 repo.go:568 | #: repo.go:103 repo.go:465 repo.go:568 | ||||||
| msgid "Repo \"%s\" does not exist" | msgid "Repo \"%s\" does not exist" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: repo.go:109 | #: repo.go:110 | ||||||
| msgid "Error removing repo directory" | msgid "Error removing repo directory" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: repo.go:113 repo.go:180 repo.go:253 repo.go:316 repo.go:389 repo.go:504 | #: repo.go:114 repo.go:195 repo.go:253 repo.go:316 repo.go:389 repo.go:504 | ||||||
| #: repo.go:576 | #: repo.go:576 | ||||||
| msgid "Error saving config" | msgid "Error saving config" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: repo.go:132 | #: repo.go:133 | ||||||
| msgid "Error removing packages from database" | msgid "Error removing packages from database" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: repo.go:143 repo.go:595 | #: repo.go:144 repo.go:595 | ||||||
| msgid "Add a new repository" | msgid "Add a new repository" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: repo.go:144 repo.go:270 repo.go:345 repo.go:402 | #: repo.go:145 repo.go:270 repo.go:345 repo.go:402 | ||||||
| msgid "<name> <url>" | msgid "<name> <url>" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: repo.go:169 | #: repo.go:170 | ||||||
| msgid "Repo \"%s\" already exists" | msgid "Repo \"%s\" already exists" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
|   | |||||||
| @@ -421,27 +421,27 @@ msgstr "" | |||||||
| msgid "ERROR" | msgid "ERROR" | ||||||
| msgstr "ОШИБКА" | msgstr "ОШИБКА" | ||||||
|  |  | ||||||
| #: internal/repos/pull.go:88 | #: internal/repos/pull.go:97 | ||||||
| msgid "Trying mirror" | msgid "Trying mirror" | ||||||
| msgstr "Пробую зеркало" | msgstr "Пробую зеркало" | ||||||
|  |  | ||||||
| #: internal/repos/pull.go:94 | #: internal/repos/pull.go:103 | ||||||
| msgid "Failed to pull from URL" | msgid "Failed to pull from URL" | ||||||
| msgstr "Не удалось извлечь из URL" | msgstr "Не удалось извлечь из URL" | ||||||
|  |  | ||||||
| #: internal/repos/pull.go:158 | #: internal/repos/pull.go:167 | ||||||
| msgid "Pulling repository" | msgid "Pulling repository" | ||||||
| msgstr "Скачивание репозитория" | msgstr "Скачивание репозитория" | ||||||
|  |  | ||||||
| #: internal/repos/pull.go:195 | #: internal/repos/pull.go:204 | ||||||
| msgid "Repository up to date" | msgid "Repository up to date" | ||||||
| msgstr "Репозиторий уже обновлён" | msgstr "Репозиторий уже обновлён" | ||||||
|  |  | ||||||
| #: internal/repos/pull.go:230 | #: internal/repos/pull.go:239 | ||||||
| msgid "Git repository does not appear to be a valid ALR repo" | msgid "Git repository does not appear to be a valid ALR repo" | ||||||
| msgstr "Репозиторий Git не поддерживается репозиторием ALR" | msgstr "Репозиторий Git не поддерживается репозиторием ALR" | ||||||
|  |  | ||||||
| #: internal/repos/pull.go:246 | #: internal/repos/pull.go:255 | ||||||
| msgid "" | msgid "" | ||||||
| "ALR repo's minimum ALR version is greater than the current version. Try " | "ALR repo's minimum ALR version is greater than the current version. Try " | ||||||
| "updating ALR if something doesn't work." | "updating ALR if something doesn't work." | ||||||
| @@ -497,11 +497,11 @@ msgstr "Аргументы, которые будут переданы мене | |||||||
| msgid "Enable interactive questions and prompts" | msgid "Enable interactive questions and prompts" | ||||||
| msgstr "Включение интерактивных вопросов и запросов" | msgstr "Включение интерактивных вопросов и запросов" | ||||||
|  |  | ||||||
| #: main.go:147 | #: main.go:148 | ||||||
| msgid "Show help" | msgid "Show help" | ||||||
| msgstr "Показать справку" | msgstr "Показать справку" | ||||||
|  |  | ||||||
| #: main.go:151 | #: main.go:152 | ||||||
| msgid "Error while running app" | msgid "Error while running app" | ||||||
| msgstr "Ошибка при запуске приложения" | msgstr "Ошибка при запуске приложения" | ||||||
|  |  | ||||||
| @@ -533,44 +533,44 @@ msgstr "%s %s загружается — %s/с\n" | |||||||
| msgid "Pull all repositories that have changed" | msgid "Pull all repositories that have changed" | ||||||
| msgstr "Скачать все изменённые репозитории" | msgstr "Скачать все изменённые репозитории" | ||||||
|  |  | ||||||
| #: repo.go:41 | #: repo.go:42 | ||||||
| msgid "Manage repos" | msgid "Manage repos" | ||||||
| msgstr "Управление репозиториями" | msgstr "Управление репозиториями" | ||||||
|  |  | ||||||
| #: repo.go:55 repo.go:625 | #: repo.go:56 repo.go:625 | ||||||
| msgid "Remove an existing repository" | msgid "Remove an existing repository" | ||||||
| msgstr "Удалить существующий репозиторий" | msgstr "Удалить существующий репозиторий" | ||||||
|  |  | ||||||
| #: repo.go:57 repo.go:521 | #: repo.go:58 repo.go:521 | ||||||
| msgid "<name>" | msgid "<name>" | ||||||
| msgstr "<имя>" | msgstr "<имя>" | ||||||
|  |  | ||||||
| #: repo.go:102 repo.go:465 repo.go:568 | #: repo.go:103 repo.go:465 repo.go:568 | ||||||
| msgid "Repo \"%s\" does not exist" | msgid "Repo \"%s\" does not exist" | ||||||
| msgstr "Репозитория \"%s\" не существует" | msgstr "Репозитория \"%s\" не существует" | ||||||
|  |  | ||||||
| #: repo.go:109 | #: repo.go:110 | ||||||
| msgid "Error removing repo directory" | msgid "Error removing repo directory" | ||||||
| msgstr "Ошибка при удалении каталога репозитория" | msgstr "Ошибка при удалении каталога репозитория" | ||||||
|  |  | ||||||
| #: repo.go:113 repo.go:180 repo.go:253 repo.go:316 repo.go:389 repo.go:504 | #: repo.go:114 repo.go:195 repo.go:253 repo.go:316 repo.go:389 repo.go:504 | ||||||
| #: repo.go:576 | #: repo.go:576 | ||||||
| msgid "Error saving config" | msgid "Error saving config" | ||||||
| msgstr "Ошибка при сохранении конфигурации" | msgstr "Ошибка при сохранении конфигурации" | ||||||
|  |  | ||||||
| #: repo.go:132 | #: repo.go:133 | ||||||
| msgid "Error removing packages from database" | msgid "Error removing packages from database" | ||||||
| msgstr "Ошибка при удалении пакетов из базы данных" | msgstr "Ошибка при удалении пакетов из базы данных" | ||||||
|  |  | ||||||
| #: repo.go:143 repo.go:595 | #: repo.go:144 repo.go:595 | ||||||
| msgid "Add a new repository" | msgid "Add a new repository" | ||||||
| msgstr "Добавить новый репозиторий" | msgstr "Добавить новый репозиторий" | ||||||
|  |  | ||||||
| #: repo.go:144 repo.go:270 repo.go:345 repo.go:402 | #: repo.go:145 repo.go:270 repo.go:345 repo.go:402 | ||||||
| msgid "<name> <url>" | msgid "<name> <url>" | ||||||
| msgstr "<имя> <url>" | msgstr "<имя> <url>" | ||||||
|  |  | ||||||
| #: repo.go:169 | #: repo.go:170 | ||||||
| msgid "Repo \"%s\" already exists" | msgid "Repo \"%s\" already exists" | ||||||
| msgstr "Репозиторий \"%s\" уже существует" | msgstr "Репозиторий \"%s\" уже существует" | ||||||
|  |  | ||||||
|   | |||||||
| @@ -131,11 +131,11 @@ func EnsureIsAlrUser() error { | |||||||
| 	} | 	} | ||||||
| 	newUid := syscall.Getuid() | 	newUid := syscall.Getuid() | ||||||
| 	if newUid != uid { | 	if newUid != uid { | ||||||
| 		return errors.New("new uid don't matches requested") | 		return errors.New("uid don't matches requested") | ||||||
| 	} | 	} | ||||||
| 	newGid := syscall.Getgid() | 	newGid := syscall.Getgid() | ||||||
| 	if newGid != gid { | 	if newGid != gid { | ||||||
| 		return errors.New("new gid don't matches requested") | 		return errors.New("gid don't matches requested") | ||||||
| 	} | 	} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								main.go
									
									
									
									
									
								
							| @@ -88,6 +88,7 @@ func GetApp() *cli.App { | |||||||
| 			InternalBuildCmd(), | 			InternalBuildCmd(), | ||||||
| 			InternalInstallCmd(), | 			InternalInstallCmd(), | ||||||
| 			InternalMountCmd(), | 			InternalMountCmd(), | ||||||
|  | 			InternalReposCmd(), | ||||||
| 		}, | 		}, | ||||||
| 		Before: func(c *cli.Context) error { | 		Before: func(c *cli.Context) error { | ||||||
| 			if trimmed := strings.TrimSpace(c.String("pm-args")); trimmed != "" { | 			if trimmed := strings.TrimSpace(c.String("pm-args")); trimmed != "" { | ||||||
|   | |||||||
| @@ -22,6 +22,7 @@ package dl | |||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"errors" | 	"errors" | ||||||
|  | 	"fmt" | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 	"path" | 	"path" | ||||||
| 	"strconv" | 	"strconv" | ||||||
| @@ -149,6 +150,7 @@ func (d *GitDownloader) Update(opts Options) (bool, error) { | |||||||
| 	u.Scheme = strings.TrimPrefix(u.Scheme, "git+") | 	u.Scheme = strings.TrimPrefix(u.Scheme, "git+") | ||||||
|  |  | ||||||
| 	query := u.Query() | 	query := u.Query() | ||||||
|  | 	rev := query.Get("~rev") | ||||||
| 	query.Del("~rev") | 	query.Del("~rev") | ||||||
|  |  | ||||||
| 	depthStr := query.Get("~depth") | 	depthStr := query.Get("~depth") | ||||||
| @@ -177,6 +179,48 @@ func (d *GitDownloader) Update(opts Options) (bool, error) { | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	// First, we do a fetch to get all the revisions. | ||||||
|  | 	fo := &git.FetchOptions{ | ||||||
|  | 		Depth:    depth, | ||||||
|  | 		Progress: opts.Progress, | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	m, err := getManifest(opts.Destination) | ||||||
|  | 	manifestOK := err == nil | ||||||
|  |  | ||||||
|  | 	err = r.Fetch(fo) | ||||||
|  | 	if err != nil && !errors.Is(err, git.NoErrAlreadyUpToDate) { | ||||||
|  | 		return false, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// If a revision is specified, switch to it. | ||||||
|  | 	if rev != "" { | ||||||
|  | 		// We are trying to find the revision as a hash of the commit | ||||||
|  | 		hash, err := r.ResolveRevision(plumbing.Revision(rev)) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return false, fmt.Errorf("failed to resolve revision %s: %w", rev, err) | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		err = w.Checkout(&git.CheckoutOptions{ | ||||||
|  | 			Hash: *hash, | ||||||
|  | 		}) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return false, fmt.Errorf("failed to checkout revision %s: %w", rev, err) | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if recursive == "true" { | ||||||
|  | 			submodules, err := w.Submodules() | ||||||
|  | 			if err == nil { | ||||||
|  | 				err = submodules.Update(&git.SubmoduleUpdateOptions{ | ||||||
|  | 					Init: true, | ||||||
|  | 				}) | ||||||
|  | 				if err != nil { | ||||||
|  | 					return false, fmt.Errorf("failed to update submodules %s: %w", rev, err) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
|  | 		// If the revision is not specified, we do a regular pull. | ||||||
| 		po := &git.PullOptions{ | 		po := &git.PullOptions{ | ||||||
| 			Depth:             depth, | 			Depth:             depth, | ||||||
| 			Progress:          opts.Progress, | 			Progress:          opts.Progress, | ||||||
| @@ -187,9 +231,6 @@ func (d *GitDownloader) Update(opts Options) (bool, error) { | |||||||
| 			po.RecurseSubmodules = git.DefaultSubmoduleRecursionDepth | 			po.RecurseSubmodules = git.DefaultSubmoduleRecursionDepth | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 	m, err := getManifest(opts.Destination) |  | ||||||
| 	manifestOK := err == nil |  | ||||||
|  |  | ||||||
| 		err = w.Pull(po) | 		err = w.Pull(po) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			if errors.Is(err, git.NoErrAlreadyUpToDate) { | 			if errors.Is(err, git.NoErrAlreadyUpToDate) { | ||||||
| @@ -197,6 +238,7 @@ func (d *GitDownloader) Update(opts Options) (bool, error) { | |||||||
| 			} | 			} | ||||||
| 			return false, err | 			return false, err | ||||||
| 		} | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	err = VerifyHashFromLocal("", opts) | 	err = VerifyHashFromLocal("", opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|   | |||||||
| @@ -153,7 +153,7 @@ func TestGitDownloaderUpdate(t *testing.T) { | |||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
|  |  | ||||||
| 		updated, err := d.Update(dl.Options{ | 		updated, err := d.Update(dl.Options{ | ||||||
| 			URL:           "git+https://gitea.plemya-x.ru/Plemya-x/repo-for-tests.git~rev=test-update-git-downloader", | 			URL:           "git+https://gitea.plemya-x.ru/Plemya-x/repo-for-tests.git?~rev=test-update-git-downloader", | ||||||
| 			Destination:   dest, | 			Destination:   dest, | ||||||
| 			Hash:          hsh, | 			Hash:          hsh, | ||||||
| 			HashAlgorithm: "sha256", | 			HashAlgorithm: "sha256", | ||||||
|   | |||||||
| @@ -23,5 +23,8 @@ package types | |||||||
| type RepoConfig struct { | type RepoConfig struct { | ||||||
| 	Repo struct { | 	Repo struct { | ||||||
| 		MinVersion string   `toml:"minVersion"` | 		MinVersion string   `toml:"minVersion"` | ||||||
|  | 		URL        string   `toml:"url"` | ||||||
|  | 		Ref        string   `toml:"ref"` | ||||||
|  | 		Mirrors    []string `toml:"mirrors"` | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										34
									
								
								repo.go
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								repo.go
									
									
									
									
									
								
							| @@ -29,6 +29,7 @@ import ( | |||||||
| 	"github.com/urfave/cli/v2" | 	"github.com/urfave/cli/v2" | ||||||
| 	"golang.org/x/exp/slices" | 	"golang.org/x/exp/slices" | ||||||
|  |  | ||||||
|  | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/build" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils" | ||||||
| 	appbuilder "gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils/app_builder" | 	appbuilder "gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils/app_builder" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils" | ||||||
| @@ -169,10 +170,24 @@ func AddRepoCmd() *cli.Command { | |||||||
| 					return cliutils.FormatCliExit(gotext.Get("Repo \"%s\" already exists", repo.Name), nil) | 					return cliutils.FormatCliExit(gotext.Get("Repo \"%s\" already exists", repo.Name), nil) | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			reposSlice = append(reposSlice, types.Repo{ |  | ||||||
|  | 			newRepo := types.Repo{ | ||||||
| 				Name: name, | 				Name: name, | ||||||
| 				URL:  repoURL, | 				URL:  repoURL, | ||||||
| 			}) | 			} | ||||||
|  |  | ||||||
|  | 			r, close, err := build.GetSafeReposExecutor() | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 			defer close() | ||||||
|  |  | ||||||
|  | 			newRepo, err = r.PullOneAndUpdateFromConfig(c.Context, &newRepo) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			reposSlice = append(reposSlice, newRepo) | ||||||
| 			cfg.SetRepos(reposSlice) | 			cfg.SetRepos(reposSlice) | ||||||
|  |  | ||||||
| 			err = cfg.System.Save() | 			err = cfg.System.Save() | ||||||
| @@ -180,21 +195,6 @@ func AddRepoCmd() *cli.Command { | |||||||
| 				return cliutils.FormatCliExit(gotext.Get("Error saving config"), err) | 				return cliutils.FormatCliExit(gotext.Get("Error saving config"), err) | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			if err := utils.ExitIfCantDropCapsToAlrUserNoPrivs(); err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			deps, err = appbuilder. |  | ||||||
| 				New(ctx). |  | ||||||
| 				UseConfig(cfg). |  | ||||||
| 				WithDB(). |  | ||||||
| 				WithReposForcePull(). |  | ||||||
| 				Build() |  | ||||||
| 			if err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 			defer deps.Defer() |  | ||||||
|  |  | ||||||
| 			return nil | 			return nil | ||||||
| 		}), | 		}), | ||||||
| 	} | 	} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user