diff --git a/.gitignore b/.gitignore index 98e6ef6..4762cbb 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ *.db +*.tar +*.tar.gz diff --git a/Archive/Archive.go b/Archive/Archive.go index 8d0e0b3..ef8c24e 100644 --- a/Archive/Archive.go +++ b/Archive/Archive.go @@ -44,7 +44,6 @@ func Tar(source, target string) error { var ( tarfile, file *os.File tarball *tar.Writer - info os.FileInfo header *tar.Header e error ) @@ -58,16 +57,6 @@ func Tar(source, target string) error { tarball = tar.NewWriter(tarfile) defer tarball.Close() - info, e = os.Stat(source) - if e != nil { - return e - } - - var baseDir string - if info.IsDir() { - baseDir = filepath.Base(source) - } - return filepath.Walk(source, func(path string, info os.FileInfo, e error) error { if e != nil { @@ -79,14 +68,11 @@ func Tar(source, target string) error { return e } - if baseDir != "" { - header.Name = filepath.Join( - baseDir, - strings.TrimPrefix( - strings.Join(strings.Split(path, "/")[1:], "/"), - source, - ), - ) + // TODO change "/" to work cross platform + header.Name = strings.TrimPrefix(strings.TrimPrefix(path, source), "/") + + if header.Name == "" { + return nil } e = tarball.WriteHeader(header) diff --git a/Archive/Unarchive.go b/Archive/Unarchive.go index eaa2530..f609d89 100644 --- a/Archive/Unarchive.go +++ b/Archive/Unarchive.go @@ -69,7 +69,7 @@ func Untar(tarball, target string) error { return e } - path = "/" + strings.Join(strings.Split(header.Name, "/")[1:], "/") + path = filepath.Join(target, header.Name) info = header.FileInfo() if info.IsDir() { @@ -107,5 +107,10 @@ func UntarGzip(source, target string) error { return e } - return Untar(tarPath, target) + e = Untar(tarPath, target) + if e != nil { + return e + } + + return os.Remove(tarPath) } diff --git a/Client/Filesystem/CopyFile.go b/Client/Filesystem/CopyFile.go new file mode 100644 index 0000000..57519e8 --- /dev/null +++ b/Client/Filesystem/CopyFile.go @@ -0,0 +1,50 @@ +package Filesystem + +import ( + "fmt" + "io/fs" + "io/ioutil" + "os" + "path/filepath" +) + +func CopyFile(src, dest string) error { + var ( + input []byte + fileInfo fs.FileInfo + srcBasePath string + destBasePath string + e error + ) + + srcBasePath = filepath.Dir(src) + destBasePath = filepath.Dir(dest) + + fileInfo, e = os.Stat(srcBasePath) + if e != nil { + return e + } + + e = os.MkdirAll(destBasePath, fileInfo.Mode()) + if e != nil { + return e + } + + fileInfo, e = os.Stat(src) + if e != nil { + return e + } + + input, e = ioutil.ReadFile(src) + if e != nil { + return e + } + + e = ioutil.WriteFile(dest, input, fileInfo.Mode()) + if e != nil { + fmt.Println(e) + return e + } + + return nil +} diff --git a/Client/Package/CreatePackage.go b/Client/Package/CreatePackage.go index 31ab612..50e878f 100644 --- a/Client/Package/CreatePackage.go +++ b/Client/Package/CreatePackage.go @@ -3,9 +3,13 @@ package Package import ( "errors" "fmt" + "io/ioutil" + "os" + "path/filepath" "strconv" "strings" + "PackageManager/Archive" "PackageManager/Client/Filesystem" "PackageManager/Color" "PackageManager/Helper" @@ -13,17 +17,19 @@ import ( func CreatePackage() error { var ( - dirtyFiles map[int]string - newFiles map[int]string - pkgFiles map[int]string = make(map[int]string) - choices string - choicesSplit []string - filePath string - pkgName string - pkgVersion string - index int - ok bool - e error + dirtyFiles map[int]string + newFiles map[int]string + pkgFiles map[int]string = make(map[int]string) + choices string + choicesSplit []string + filePath string + pkgName string + pkgVersion string + pkgNameVersion string + tmpDir string + index int + ok bool + e error ) fmt.Println("Initialising package creation...") @@ -111,5 +117,27 @@ func CreatePackage() error { return errors.New("User aborted") } + pkgNameVersion = fmt.Sprintf("%s-%s", pkgName, pkgVersion) + + tmpDir, e = ioutil.TempDir("/tmp", pkgNameVersion) + if e != nil { + return e + } + defer os.RemoveAll(tmpDir) + + for _, file := range pkgFiles { + Filesystem.CopyFile(file, filepath.Join(tmpDir, file)) + } + + e = Archive.TarGzip(tmpDir, pkgNameVersion+".tar.gz") + if e != nil { + return e + } + + fmt.Printf( + Color.Green("\nSuccessfully created package %s\n"), + pkgNameVersion, + ) + return nil }