feat: add group and summary fields #69
| @@ -11,7 +11,7 @@ | ||||
|     <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"> | ||||
|         <text x="33.5" y="15" fill="#010101" fill-opacity=".3">coverage</text> | ||||
|         <text x="33.5" y="14">coverage</text> | ||||
|         <text x="86" y="15" fill="#010101" fill-opacity=".3">16.3%</text> | ||||
|         <text x="86" y="14">16.3%</text> | ||||
|         <text x="86" y="15" fill="#010101" fill-opacity=".3">16.4%</text> | ||||
|         <text x="86" y="14">16.4%</text> | ||||
|     </g> | ||||
| </svg> | ||||
|   | ||||
| Before Width: | Height: | Size: 926 B After Width: | Height: | Size: 926 B | 
							
								
								
									
										1
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								go.mod
									
									
									
									
									
								
							| @@ -45,6 +45,7 @@ require ( | ||||
|  | ||||
| require ( | ||||
| 	dario.cat/mergo v1.0.1 // indirect | ||||
| 	gitea.plemya-x.ru/Plemya-x/fakeroot v0.0.2-0.20250408104831-427aaa7713c3 // indirect | ||||
| 	github.com/AlekSi/pointer v1.2.0 // indirect | ||||
| 	github.com/Masterminds/goutils v1.1.1 // indirect | ||||
| 	github.com/Masterminds/semver/v3 v3.3.0 // indirect | ||||
|   | ||||
							
								
								
									
										2
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.sum
									
									
									
									
									
								
							| @@ -17,6 +17,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo | ||||
| dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= | ||||
| dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= | ||||
| dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= | ||||
| gitea.plemya-x.ru/Plemya-x/fakeroot v0.0.2-0.20250408104831-427aaa7713c3 h1:56BjRJJ2Sv50DfSvNUydUMJwwFuiBMWC1uYtH2GYjk8= | ||||
| gitea.plemya-x.ru/Plemya-x/fakeroot v0.0.2-0.20250408104831-427aaa7713c3/go.mod h1:iKQM6uttMJgE5CFrPw6SQqAV7TKtlJNICRAie/dTciw= | ||||
| github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= | ||||
| github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= | ||||
| github.com/AlekSi/pointer v1.2.0 h1:glcy/gc4h8HnG2Z3ZECSzZ1IX1x2JxRVuDzaJwQE0+w= | ||||
|   | ||||
| @@ -25,11 +25,11 @@ import ( | ||||
| 	"os" | ||||
| 	"os/exec" | ||||
| 	"runtime" | ||||
| 	"slices" | ||||
| 	"strings" | ||||
| 	"syscall" | ||||
| 	"time" | ||||
|  | ||||
| 	"gitea.plemya-x.ru/Plemya-x/fakeroot" | ||||
| 	"mvdan.cc/sh/v3/expand" | ||||
| 	"mvdan.cc/sh/v3/interp" | ||||
| ) | ||||
| @@ -54,7 +54,7 @@ func FakerootExecHandler(killTimeout time.Duration) interp.ExecHandlerFunc { | ||||
| 			Stderr: hc.Stderr, | ||||
| 		} | ||||
|  | ||||
| 		err = Apply(cmd) | ||||
| 		err = fakeroot.Apply(cmd) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -108,52 +108,6 @@ func FakerootExecHandler(killTimeout time.Duration) interp.ExecHandlerFunc { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func rootMap(m syscall.SysProcIDMap) bool { | ||||
| 	return m.ContainerID == 0 | ||||
| } | ||||
|  | ||||
| func Apply(cmd *exec.Cmd) error { | ||||
| 	uid := os.Getuid() | ||||
| 	gid := os.Getgid() | ||||
|  | ||||
| 	// If the user is already root, there's no need for fakeroot | ||||
| 	if uid == 0 { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	// Ensure SysProcAttr isn't nil | ||||
| 	if cmd.SysProcAttr == nil { | ||||
| 		cmd.SysProcAttr = &syscall.SysProcAttr{} | ||||
| 	} | ||||
|  | ||||
| 	// Create a new user namespace | ||||
| 	cmd.SysProcAttr.Cloneflags |= syscall.CLONE_NEWUSER | ||||
|  | ||||
| 	// If the command already contains a mapping for the root user, return an error | ||||
| 	if slices.ContainsFunc(cmd.SysProcAttr.UidMappings, rootMap) { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	// If the command already contains a mapping for the root group, return an error | ||||
| 	if slices.ContainsFunc(cmd.SysProcAttr.GidMappings, rootMap) { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	cmd.SysProcAttr.UidMappings = append(cmd.SysProcAttr.UidMappings, syscall.SysProcIDMap{ | ||||
| 		ContainerID: 0, | ||||
| 		HostID:      uid, | ||||
| 		Size:        1, | ||||
| 	}) | ||||
|  | ||||
| 	cmd.SysProcAttr.GidMappings = append(cmd.SysProcAttr.GidMappings, syscall.SysProcIDMap{ | ||||
| 		ContainerID: 0, | ||||
| 		HostID:      gid, | ||||
| 		Size:        1, | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // execEnv was extracted from github.com/mvdan/sh/interp/vars.go | ||||
| func execEnv(env expand.Environ) []string { | ||||
| 	list := make([]string, 0, 64) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user