Add 7z support to recursive_decompress.go
authorColin P. Mccabe <colin@cmccabe.xyz>
Thu, 23 Dec 2021 22:24:45 +0000 (14:24 -0800)
committerColin P. Mccabe <colin@cmccabe.xyz>
Thu, 9 Jun 2022 22:10:30 +0000 (15:10 -0700)
recursive_decompress.go

index a642fa7..89d3d74 100644 (file)
@@ -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() {