}
}
} 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
}
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() {