Browse Source

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 years ago
parent
commit
473a2de225
5 changed files with 62 additions and 133 deletions
  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 := makeArguments()
 	arguments.addArg("R")
 	arguments.addArg("R")
 	arguments.addTarget(pkgNames...)
 	arguments.addTarget(pkgNames...)
-	err = passToPacman(arguments)
+	err = show(passToPacman(arguments))
 	return err
 	return err
 }
 }
 
 
@@ -67,7 +67,7 @@ func syncClean(parser *arguments) error {
 		}
 		}
 	}
 	}
 
 
-	err := passToPacman(parser)
+	err := show(passToPacman(parser))
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
@@ -185,7 +185,7 @@ func cleanUntracked() error {
 		dir := filepath.Join(config.BuildDir, file.Name())
 		dir := filepath.Join(config.BuildDir, file.Name())
 
 
 		if shouldUseGit(dir) {
 		if shouldUseGit(dir) {
-			err = passToGit(dir, "clean", "-fx")
+			err = show(passToGit(dir, "clean", "-fx"))
 			if err != nil {
 			if err != nil {
 				return err
 				return err
 			}
 			}

+ 29 - 101
cmd.go

@@ -175,9 +175,9 @@ func handleCmd() (err error) {
 	case "V", "version":
 	case "V", "version":
 		handleVersion()
 		handleVersion()
 	case "D", "database":
 	case "D", "database":
-		err = passToPacman(cmdArgs)
+		err = show(passToPacman(cmdArgs))
 	case "F", "files":
 	case "F", "files":
-		err = passToPacman(cmdArgs)
+		err = show(passToPacman(cmdArgs))
 	case "Q", "query":
 	case "Q", "query":
 		err = handleQuery()
 		err = handleQuery()
 	case "R", "remove":
 	case "R", "remove":
@@ -185,9 +185,9 @@ func handleCmd() (err error) {
 	case "S", "sync":
 	case "S", "sync":
 		err = handleSync()
 		err = handleSync()
 	case "T", "deptest":
 	case "T", "deptest":
-		err = passToPacman(cmdArgs)
+		err = show(passToPacman(cmdArgs))
 	case "U", "upgrade":
 	case "U", "upgrade":
-		err = passToPacman(cmdArgs)
+		err = show(passToPacman(cmdArgs))
 	case "G", "getpkgbuild":
 	case "G", "getpkgbuild":
 		err = handleGetpkgbuild()
 		err = handleGetpkgbuild()
 	case "P", "print":
 	case "P", "print":
@@ -209,7 +209,7 @@ func handleQuery() error {
 	if cmdArgs.existsArg("u", "upgrades") {
 	if cmdArgs.existsArg("u", "upgrades") {
 		err = printUpdateList(cmdArgs)
 		err = printUpdateList(cmdArgs)
 	} else {
 	} else {
-		err = passToPacman(cmdArgs)
+		err = show(passToPacman(cmdArgs))
 	}
 	}
 
 
 	return err
 	return err
@@ -221,7 +221,7 @@ func handleHelp() error {
 		return nil
 		return nil
 	}
 	}
 
 
-	return passToPacman(cmdArgs)
+	return show(passToPacman(cmdArgs))
 }
 }
 
 
 //this function should only set config options
 //this function should only set config options
@@ -436,7 +436,7 @@ func handleSync() (err error) {
 		arguments.delArg("i", "info")
 		arguments.delArg("i", "info")
 		arguments.delArg("l", "list")
 		arguments.delArg("l", "list")
 		arguments.clearTargets()
 		arguments.clearTargets()
-		err = passToPacman(arguments)
+		err = show(passToPacman(arguments))
 		if err != nil {
 		if err != nil {
 			return
 			return
 		}
 		}
@@ -453,9 +453,9 @@ func handleSync() (err error) {
 	} else if cmdArgs.existsArg("c", "clean") {
 	} else if cmdArgs.existsArg("c", "clean") {
 		err = syncClean(cmdArgs)
 		err = syncClean(cmdArgs)
 	} else if cmdArgs.existsArg("l", "list") {
 	} else if cmdArgs.existsArg("l", "list") {
-		err = passToPacman(cmdArgs)
+		err = show(passToPacman(cmdArgs))
 	} else if cmdArgs.existsArg("c", "clean") {
 	} else if cmdArgs.existsArg("c", "clean") {
-		err = passToPacman(cmdArgs)
+		err = show(passToPacman(cmdArgs))
 	} else if cmdArgs.existsArg("i", "info") {
 	} else if cmdArgs.existsArg("i", "info") {
 		err = syncInfo(targets)
 		err = syncInfo(targets)
 	} else if cmdArgs.existsArg("u", "sysupgrade") {
 	} else if cmdArgs.existsArg("u", "sysupgrade") {
@@ -469,7 +469,7 @@ func handleSync() (err error) {
 
 
 func handleRemove() (err error) {
 func handleRemove() (err error) {
 	removeVCSPackage(cmdArgs.targets)
 	removeVCSPackage(cmdArgs.targets)
-	err = passToPacman(cmdArgs)
+	err = show(passToPacman(cmdArgs))
 	return
 	return
 }
 }
 
 
@@ -579,41 +579,29 @@ func numberMenu(pkgS []string, flags []string) (err error) {
 	return err
 	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
 	cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
 	err := cmd.Run()
 	err := cmd.Run()
-
 	if err != nil {
 	if err != nil {
 		return fmt.Errorf("")
 		return fmt.Errorf("")
 	}
 	}
 	return nil
 	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 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)
 	argArr := make([]string, 0)
 
 
 	if args.needRoot() {
 	if args.needRoot() {
@@ -631,20 +619,11 @@ func passToPacmanCapture(args *arguments) (string, string, error) {
 
 
 	argArr = append(argArr, args.targets...)
 	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.
 // 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 {
 	if config.NoConfirm {
 		args = append(args)
 		args = append(args)
 	}
 	}
@@ -653,42 +632,11 @@ func passToMakepkg(dir string, args ...string) (err error) {
 	args = append(args, mflags...)
 	args = append(args, mflags...)
 
 
 	cmd := exec.Command(config.MakepkgBin, args...)
 	cmd := exec.Command(config.MakepkgBin, args...)
-	cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
 	cmd.Dir = dir
 	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)
 	gitflags := strings.Fields(config.GitFlags)
 	args := []string{"-C", dir}
 	args := []string{"-C", dir}
 	args = append(args, gitflags...)
 	args = append(args, gitflags...)
@@ -696,25 +644,5 @@ func passToGit(dir string, _args ...string) (err error) {
 
 
 	cmd := exec.Command(config.GitBin, args...)
 	cmd := exec.Command(config.GitBin, args...)
 	cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
 	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) {
 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 {
 	if err != nil {
 		return false, fmt.Errorf("%s%s", stderr, err)
 		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
 	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) {
 func gitDownload(url string, path string, name string) (bool, error) {
 	_, err := os.Stat(filepath.Join(path, name, ".git"))
 	_, err := os.Stat(filepath.Join(path, name, ".git"))
 	if os.IsNotExist(err) {
 	if os.IsNotExist(err) {
-		err = passToGit(path, "clone", url, name)
+		err = show(passToGit(path, "clone", url, name))
 		if err != nil {
 		if err != nil {
 			return false, fmt.Errorf("error cloning %s", name)
 			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"))
 		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 {
 	if err != nil {
 		return false, fmt.Errorf("error fetching %s", name)
 		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 {
 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 {
 	if err != nil {
 		return fmt.Errorf("error resetting %s", name)
 		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 {
 	if err != nil {
 		return fmt.Errorf("error merging %s", name)
 		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 {
 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
 	return err
 }
 }

+ 20 - 14
install.go

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