瀏覽代碼

Refactor pssToFoo() functions

Previously each call to an external command had two functions.
PassToFoo() and PassToFooCapture(). These functions are always similar
and end up with duplicated code.

So instead have the passToFoo() functions return the cmd itself and
create small helper functions show() and capture() which will run the
command and either forward it to std{out,err,in} or capture the output

Also the saveVCSInfo() function which was called after every makepkg
call is now only called after the pacman -U succeeds.
morganamilo 6 年之前
父節點
當前提交
473a2de225
共有 5 個文件被更改,包括 62 次插入133 次删除
  1. 3 3
      clean.go
  2. 29 101
      cmd.go
  3. 9 14
      download.go
  4. 20 14
      install.go
  5. 1 1
      query.go

+ 3 - 3
clean.go

@@ -49,7 +49,7 @@ func cleanRemove(pkgNames []string) (err error) {
 	arguments := makeArguments()
 	arguments.addArg("R")
 	arguments.addTarget(pkgNames...)
-	err = passToPacman(arguments)
+	err = show(passToPacman(arguments))
 	return err
 }
 
@@ -67,7 +67,7 @@ func syncClean(parser *arguments) error {
 		}
 	}
 
-	err := passToPacman(parser)
+	err := show(passToPacman(parser))
 	if err != nil {
 		return err
 	}
@@ -185,7 +185,7 @@ func cleanUntracked() error {
 		dir := filepath.Join(config.BuildDir, file.Name())
 
 		if shouldUseGit(dir) {
-			err = passToGit(dir, "clean", "-fx")
+			err = show(passToGit(dir, "clean", "-fx"))
 			if err != nil {
 				return err
 			}

+ 29 - 101
cmd.go

@@ -175,9 +175,9 @@ func handleCmd() (err error) {
 	case "V", "version":
 		handleVersion()
 	case "D", "database":
-		err = passToPacman(cmdArgs)
+		err = show(passToPacman(cmdArgs))
 	case "F", "files":
-		err = passToPacman(cmdArgs)
+		err = show(passToPacman(cmdArgs))
 	case "Q", "query":
 		err = handleQuery()
 	case "R", "remove":
@@ -185,9 +185,9 @@ func handleCmd() (err error) {
 	case "S", "sync":
 		err = handleSync()
 	case "T", "deptest":
-		err = passToPacman(cmdArgs)
+		err = show(passToPacman(cmdArgs))
 	case "U", "upgrade":
-		err = passToPacman(cmdArgs)
+		err = show(passToPacman(cmdArgs))
 	case "G", "getpkgbuild":
 		err = handleGetpkgbuild()
 	case "P", "print":
@@ -209,7 +209,7 @@ func handleQuery() error {
 	if cmdArgs.existsArg("u", "upgrades") {
 		err = printUpdateList(cmdArgs)
 	} else {
-		err = passToPacman(cmdArgs)
+		err = show(passToPacman(cmdArgs))
 	}
 
 	return err
@@ -221,7 +221,7 @@ func handleHelp() error {
 		return nil
 	}
 
-	return passToPacman(cmdArgs)
+	return show(passToPacman(cmdArgs))
 }
 
 //this function should only set config options
@@ -436,7 +436,7 @@ func handleSync() (err error) {
 		arguments.delArg("i", "info")
 		arguments.delArg("l", "list")
 		arguments.clearTargets()
-		err = passToPacman(arguments)
+		err = show(passToPacman(arguments))
 		if err != nil {
 			return
 		}
@@ -453,9 +453,9 @@ func handleSync() (err error) {
 	} else if cmdArgs.existsArg("c", "clean") {
 		err = syncClean(cmdArgs)
 	} else if cmdArgs.existsArg("l", "list") {
-		err = passToPacman(cmdArgs)
+		err = show(passToPacman(cmdArgs))
 	} else if cmdArgs.existsArg("c", "clean") {
-		err = passToPacman(cmdArgs)
+		err = show(passToPacman(cmdArgs))
 	} else if cmdArgs.existsArg("i", "info") {
 		err = syncInfo(targets)
 	} else if cmdArgs.existsArg("u", "sysupgrade") {
@@ -469,7 +469,7 @@ func handleSync() (err error) {
 
 func handleRemove() (err error) {
 	removeVCSPackage(cmdArgs.targets)
-	err = passToPacman(cmdArgs)
+	err = show(passToPacman(cmdArgs))
 	return
 }
 
@@ -579,41 +579,29 @@ func numberMenu(pkgS []string, flags []string) (err error) {
 	return err
 }
 
-// passToPacman outsources execution to pacman binary without modifications.
-func passToPacman(args *arguments) error {
-	var cmd *exec.Cmd
-	argArr := make([]string, 0)
-
-	if args.needRoot() {
-		argArr = append(argArr, "sudo")
-	}
-
-	argArr = append(argArr, config.PacmanBin)
-	argArr = append(argArr, cmdArgs.formatGlobals()...)
-	argArr = append(argArr, args.formatArgs()...)
-	if config.NoConfirm {
-		argArr = append(argArr, "--noconfirm")
-	}
-
-	argArr = append(argArr, "--")
-
-	argArr = append(argArr, args.targets...)
-
-	cmd = exec.Command(argArr[0], argArr[1:]...)
-
+func show(cmd *exec.Cmd) error {
 	cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
 	err := cmd.Run()
-
 	if err != nil {
 		return fmt.Errorf("")
 	}
 	return nil
 }
 
-//passToPacman but return the output instead of showing the user
-func passToPacmanCapture(args *arguments) (string, string, error) {
+func capture(cmd *exec.Cmd) (string, string, error) {
 	var outbuf, errbuf bytes.Buffer
-	var cmd *exec.Cmd
+
+	cmd.Stdout = &outbuf
+	cmd.Stderr = &errbuf
+	err := cmd.Run()
+	stdout := outbuf.String()
+	stderr := errbuf.String()
+
+	return stdout, stderr, err
+}
+
+// passToPacman outsources execution to pacman binary without modifications.
+func passToPacman(args *arguments) *exec.Cmd {
 	argArr := make([]string, 0)
 
 	if args.needRoot() {
@@ -631,20 +619,11 @@ func passToPacmanCapture(args *arguments) (string, string, error) {
 
 	argArr = append(argArr, args.targets...)
 
-	cmd = exec.Command(argArr[0], argArr[1:]...)
-	cmd.Stdout = &outbuf
-	cmd.Stderr = &errbuf
-
-	err := cmd.Run()
-	stdout := outbuf.String()
-	stderr := errbuf.String()
-
-	return stdout, stderr, err
+	return exec.Command(argArr[0], argArr[1:]...)
 }
 
 // passToMakepkg outsources execution to makepkg binary without modifications.
-func passToMakepkg(dir string, args ...string) (err error) {
-
+func passToMakepkg(dir string, args ...string) *exec.Cmd {
 	if config.NoConfirm {
 		args = append(args)
 	}
@@ -653,42 +632,11 @@ func passToMakepkg(dir string, args ...string) (err error) {
 	args = append(args, mflags...)
 
 	cmd := exec.Command(config.MakepkgBin, args...)
-	cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
 	cmd.Dir = dir
-	err = cmd.Run()
-	if err == nil {
-		_ = saveVCSInfo()
-	}
-	return
+	return cmd
 }
 
-func passToMakepkgCapture(dir string, args ...string) (string, string, error) {
-	var outbuf, errbuf bytes.Buffer
-
-	if config.NoConfirm {
-		args = append(args)
-	}
-
-	mflags := strings.Fields(config.MFlags)
-	args = append(args, mflags...)
-
-	cmd := exec.Command(config.MakepkgBin, args...)
-	cmd.Dir = dir
-	cmd.Stdout = &outbuf
-	cmd.Stderr = &errbuf
-
-	err := cmd.Run()
-	stdout := outbuf.String()
-	stderr := errbuf.String()
-
-	if err == nil {
-		_ = saveVCSInfo()
-	}
-
-	return stdout, stderr, err
-}
-
-func passToGit(dir string, _args ...string) (err error) {
+func passToGit(dir string, _args ...string) *exec.Cmd {
 	gitflags := strings.Fields(config.GitFlags)
 	args := []string{"-C", dir}
 	args = append(args, gitflags...)
@@ -696,25 +644,5 @@ func passToGit(dir string, _args ...string) (err error) {
 
 	cmd := exec.Command(config.GitBin, args...)
 	cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
-	err = cmd.Run()
-	return
-}
-
-func passToGitCapture(dir string, _args ...string) (string, string, error) {
-	var outbuf, errbuf bytes.Buffer
-	gitflags := strings.Fields(config.GitFlags)
-	args := []string{"-C", dir}
-	args = append(args, gitflags...)
-	args = append(args, _args...)
-
-	cmd := exec.Command(config.GitBin, args...)
-	cmd.Dir = dir
-	cmd.Stdout = &outbuf
-	cmd.Stderr = &errbuf
-
-	err := cmd.Run()
-	stdout := outbuf.String()
-	stderr := errbuf.String()
-
-	return stdout, stderr, err
+	return cmd
 }

+ 9 - 14
download.go

@@ -45,19 +45,14 @@ func downloadFile(path string, url string) (err error) {
 }
 
 func gitHasDiff(path string, name string) (bool, error) {
-	stdout, stderr, err := passToGitCapture(filepath.Join(path, name), "rev-parse", "HEAD")
+	stdout, stderr, err := capture(passToGit(filepath.Join(path, name), "rev-parse", "HEAD", "HEAD@{upstream}"))
 	if err != nil {
 		return false, fmt.Errorf("%s%s", stderr, err)
 	}
 
-	head := strings.TrimSpace(stdout)
-
-	stdout, stderr, err = passToGitCapture(filepath.Join(path, name), "rev-parse", "HEAD@{upstream}")
-	if err != nil {
-		return false, fmt.Errorf("%s%s", stderr, err)
-	}
-
-	upstream := strings.TrimSpace(stdout)
+	lines := strings.Split(stdout, "\n")
+	head := lines[0]
+	upstream := lines[1]
 
 	return head != upstream, nil
 }
@@ -65,7 +60,7 @@ func gitHasDiff(path string, name string) (bool, error) {
 func gitDownload(url string, path string, name string) (bool, error) {
 	_, err := os.Stat(filepath.Join(path, name, ".git"))
 	if os.IsNotExist(err) {
-		err = passToGit(path, "clone", url, name)
+		err = show(passToGit(path, "clone", url, name))
 		if err != nil {
 			return false, fmt.Errorf("error cloning %s", name)
 		}
@@ -75,7 +70,7 @@ func gitDownload(url string, path string, name string) (bool, error) {
 		return false, fmt.Errorf("error reading %s", filepath.Join(path, name, ".git"))
 	}
 
-	err = passToGit(filepath.Join(path, name), "fetch")
+	err = show(passToGit(filepath.Join(path, name), "fetch"))
 	if err != nil {
 		return false, fmt.Errorf("error fetching %s", name)
 	}
@@ -84,12 +79,12 @@ func gitDownload(url string, path string, name string) (bool, error) {
 }
 
 func gitMerge(url string, path string, name string) error {
-	err := passToGit(filepath.Join(path, name), "reset", "--hard", "HEAD")
+	err := show(passToGit(filepath.Join(path, name), "reset", "--hard", "HEAD"))
 	if err != nil {
 		return fmt.Errorf("error resetting %s", name)
 	}
 
-	err = passToGit(filepath.Join(path, name), "merge", "--no-edit", "--ff")
+	err = show(passToGit(filepath.Join(path, name), "merge", "--no-edit", "--ff"))
 	if err != nil {
 		return fmt.Errorf("error merging %s", name)
 	}
@@ -98,7 +93,7 @@ func gitMerge(url string, path string, name string) error {
 }
 
 func gitDiff(path string, name string) error {
-	err := passToGit(filepath.Join(path, name), "diff", "HEAD..HEAD@{upstream}")
+	err := show(passToGit(filepath.Join(path, name), "diff", "HEAD..HEAD@{upstream}"))
 
 	return err
 }

+ 20 - 14
install.go

@@ -48,7 +48,7 @@ func install(parser *arguments) error {
 				arguments.delArg("i", "info")
 				arguments.delArg("l", "list")
 				arguments.clearTargets()
-				err = passToPacman(arguments)
+				err = show(passToPacman(arguments))
 				if err != nil {
 					return fmt.Errorf("Error installing repo packages")
 				}
@@ -105,7 +105,7 @@ func install(parser *arguments) error {
 			}
 
 			if parser.existsArg("y", "refresh") || parser.existsArg("u", "sysupgrade") || len(arguments.targets) > 0 {
-				err = passToPacman(arguments)
+				err = show(passToPacman(arguments))
 				if err != nil {
 					return fmt.Errorf("Error installing repo packages")
 				}
@@ -204,7 +204,7 @@ func install(parser *arguments) error {
 		parser.op = "S"
 		parser.delArg("y", "refresh")
 		parser.options["ignore"] = arguments.options["ignore"]
-		return passToPacman(parser)
+		return show(passToPacman(parser))
 	}
 
 	if len(dp.Aur) > 0 && 0 == os.Geteuid() {
@@ -340,7 +340,7 @@ func install(parser *arguments) error {
 	}
 
 	if len(arguments.targets) > 0 || arguments.existsArg("u") {
-		err := passToPacman(arguments)
+		err := show(passToPacman(arguments))
 		if err != nil {
 			return fmt.Errorf("Error installing repo packages")
 		}
@@ -364,14 +364,14 @@ func install(parser *arguments) error {
 		}
 
 		if len(depArguments.targets) > 0 {
-			_, stderr, err := passToPacmanCapture(depArguments)
+			_, stderr, err := capture(passToPacman(depArguments))
 			if err != nil {
 				return fmt.Errorf("%s%s", stderr, err)
 			}
 		}
 
 		if len(expArguments.targets) > 0 {
-			_, stderr, err := passToPacmanCapture(expArguments)
+			_, stderr, err := capture(passToPacman(expArguments))
 			if err != nil {
 				return fmt.Errorf("%s%s", stderr, err)
 			}
@@ -398,7 +398,7 @@ func install(parser *arguments) error {
 
 		oldValue := config.NoConfirm
 		config.NoConfirm = true
-		err = passToPacman(removeArguments)
+		err = show(passToPacman(removeArguments))
 		config.NoConfirm = oldValue
 
 		if err != nil {
@@ -449,7 +449,7 @@ nextpkg:
 }
 
 func parsePackageList(dir string) (map[string]string, string, error) {
-	stdout, stderr, err := passToMakepkgCapture(dir, "--packagelist")
+	stdout, stderr, err := capture(passToMakepkg(dir, "--packagelist"))
 
 	if err != nil {
 		return nil, "", fmt.Errorf("%s%s", stderr, err)
@@ -677,7 +677,7 @@ func showPkgBuildDiffs(pkgs []*rpc.Pkg, srcinfos map[string]*gosrc.Srcinfo, base
 			} else {
 				args = append(args, "--color=never")
 			}
-			err := passToGit(dir, args...)
+			err := show(passToGit(dir, args...))
 			if err != nil {
 				return err
 			}
@@ -838,7 +838,7 @@ func downloadPkgBuildsSources(pkgs []*rpc.Pkg, bases map[string][]*rpc.Pkg, inco
 			args = append(args, "--ignorearch")
 		}
 
-		err = passToMakepkg(dir, args...)
+		err = show(passToMakepkg(dir, args...))
 		if err != nil {
 			return fmt.Errorf("Error downloading sources: %s", cyan(formatPkgbase(pkg, bases)))
 		}
@@ -861,7 +861,7 @@ func buildInstallPkgBuilds(dp *depPool, do *depOrder, srcinfos map[string]*gosrc
 		}
 
 		//pkgver bump
-		err := passToMakepkg(dir, args...)
+		err := show(passToMakepkg(dir, args...))
 		if err != nil {
 			return fmt.Errorf("Error making: %s", pkg.Name)
 		}
@@ -899,7 +899,7 @@ func buildInstallPkgBuilds(dp *depPool, do *depOrder, srcinfos map[string]*gosrc
 				args = append(args, "--ignorearch")
 			}
 
-			err := passToMakepkg(dir, args...)
+			err := show(passToMakepkg(dir, args...))
 			if err != nil {
 				return fmt.Errorf("Error making: %s", pkg.Name)
 			}
@@ -973,17 +973,23 @@ func buildInstallPkgBuilds(dp *depPool, do *depOrder, srcinfos map[string]*gosrc
 			}
 		}
 
-		err = passToPacman(arguments)
+		err = show(passToPacman(arguments))
 		if err != nil {
 			return err
 		}
 
+
 		for _, pkg := range do.Bases[pkg.PackageBase] {
 			updateVCSData(pkg.Name, srcinfo.Source)
 		}
 
+		err = saveVCSInfo()
+		if err != nil {
+			fmt.Println(err)
+		}
+
 		if len(depArguments.targets) > 0 {
-			_, stderr, err := passToPacmanCapture(depArguments)
+			_, stderr, err := capture(passToPacman(depArguments))
 			if err != nil {
 				return fmt.Errorf("%s%s", stderr, err)
 			}

+ 1 - 1
query.go

@@ -229,7 +229,7 @@ func syncInfo(pkgS []string) (err error) {
 		arguments := cmdArgs.copy()
 		arguments.clearTargets()
 		arguments.addTarget(repoS...)
-		err = passToPacman(arguments)
+		err = show(passToPacman(arguments))
 
 		if err != nil {
 			return