From: Colin P. Mccabe Date: Thu, 23 Dec 2021 22:24:45 +0000 (-0800) Subject: Add 7z support to recursive_decompress.go X-Git-Url: http://www.club.cc.cmu.edu/~cmccabe/cgi-bin/gitweb.cgi?p=cmccabe-bin;a=commitdiff_plain;h=f1eae14fa3fc60b16263f1f308716ac12cf587e8 Add 7z support to recursive_decompress.go --- diff --git a/recursive_decompress.go b/recursive_decompress.go index a642fa7..89d3d74 100644 --- a/recursive_decompress.go +++ b/recursive_decompress.go @@ -28,13 +28,12 @@ func processPath(curPath string) error { } } } else { - tarBaseName := tarBaseName(curPath) - if tarBaseName != "" { - err = applyTarOn(curPath) - if err != nil { - return err - } - err = processPath(filepath.Join(filepath.Dir(curPath), tarBaseName)) + extractedBaseName, err := extractIfPossible(curPath) + if err != nil { + return err + } + if extractedBaseName != "" { + err = processPath(filepath.Join(filepath.Dir(curPath), extractedBaseName)) if err != nil { return err } @@ -50,23 +49,50 @@ func processPath(curPath string) error { return nil } -func tarBaseName(curPath string) string { +func extractIfPossible(curPath string) (string, error) { if strings.HasSuffix(curPath, ".tgz") { - return filepath.Base(curPath[:len(curPath)-4]) + return extractTgz(curPath) + } else if strings.HasSuffix(curPath, ".7z") { + return extract7z(curPath) } - return "" + return "", nil } -func applyTarOn(curPath string) error { +func extractTgz(curPath string) (string, error) { fmt.Printf("== decompressing tar file %s\n", curPath) cmd := exec.Command("tar", "xvf", filepath.Base(curPath)) cmd.Dir = filepath.Dir(curPath) //cmd.Stdout = os.Stdout err := cmd.Run() if err != nil { - return fmt.Errorf("error running tar xvf on %s: %s", curPath, err.Error()) + return "", fmt.Errorf("error running tar xvf on %s: %s", curPath, err.Error()) } - return nil + return filepath.Base(curPath[:len(curPath) - len(".tgz")]), nil +} + +func extract7z(curPath string) (string, error) { + fmt.Printf("== decompressing 7z file %s\n", curPath) + extractedBaseName := curPath[:len(curPath) - len(".7z")] + err := os.Mkdir(extractedBaseName, 0755) + if err != nil { + return "", fmt.Errorf("unable to mkdir '%s': %s", extractedBaseName, err.Error()) + } + absCurPath, err := filepath.Abs(curPath) + if err != nil { + return "", fmt.Errorf("unable to get absolute path for '%s': %s", curPath, err.Error()) + } + absExtractedBaseName, err := filepath.Abs(extractedBaseName) + if err != nil { + return "", fmt.Errorf("unable to get absolute path for '%s': %s", extractedBaseName, err.Error()) + } + cmd := exec.Command("7z", "x", absCurPath) + cmd.Dir = absExtractedBaseName + cmd.Stdout = os.Stdout + err = cmd.Run() + if err != nil { + return "", fmt.Errorf("error running 7z on %s: %s", curPath, err.Error()) + } + return extractedBaseName, nil } func main() {