From daa78703abcd467936fb498a1ca4deb85a2fe419 Mon Sep 17 00:00:00 2001 From: Mitch Riedstra Date: Fri, 6 Jan 2017 18:06:34 -0500 Subject: Added an archive library and ability to package steam games --- .gitignore | 5 ++++ archive/archive.go | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ main.go | 24 ++++++++------- steam/package.go | 26 ++++++++++++++++ steam/steam.go | 4 ++- 5 files changed, 135 insertions(+), 12 deletions(-) create mode 100644 archive/archive.go create mode 100644 steam/package.go diff --git a/.gitignore b/.gitignore index 5c852d5..6a07f59 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,7 @@ config.yml bin +test*.go +*.tar +*.tar.* +*.tgz +*.tbz2 diff --git a/archive/archive.go b/archive/archive.go new file mode 100644 index 0000000..2fe039d --- /dev/null +++ b/archive/archive.go @@ -0,0 +1,88 @@ +package archive + +import ( + "archive/tar" + "path/filepath" + + "fmt" + "io" + "os" +) + +type Archive struct { + Output, Input string + file *os.File + writer *tar.Writer +} + +func (a *Archive) Tar() error { + var err error + if a.file, err = os.Create(a.Output); err != nil { + return err + } + + defer a.file.Close() + + a.writer = tar.NewWriter(a.file) + defer a.writer.Close() + + if err := filepath.Walk(a.Input, a.tarWalkfn()); err != nil { + return err + } + + fmt.Fprintln(os.Stderr, "done, remove me later") + return nil + +} + +func (a *Archive) tarWalkfn() filepath.WalkFunc { + // This is an interesting trick to get around scoping issues + return func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + if info.IsDir() { + return nil + } + // fmt.Fprintf(os.Stderr, "%s: Fileinfo: %s", path, info.IsDir()) + + f, err := os.Open(path) + if err != nil { + return err + } + // defer f.Close() + + h := &tar.Header{ + Name: path, + Size: info.Size(), + Mode: int64(info.Mode()), + ModTime: info.ModTime(), + } + + // h, err := tar.FileInfoHeader(info, "") + if err != nil { + return err + } + + err = a.writer.WriteHeader(h) + if err != nil { + /* + fmt.Fprintf(os.Stderr, "This header has a problem: %s\n", h) + fmt.Fprintln(os.Stderr, "FUCK this error") + fmt.Fprintln(os.Stderr, err) + */ + // fmt.Fprintln(os.Stderr, "Here!") + return err + } + + _, err = io.Copy(a.writer, f) + if err != nil { + fmt.Fprintln(os.Stderr, "here") + fmt.Fprintln(os.Stderr, f.Name()) + return err + } + + return nil + } +} diff --git a/main.go b/main.go index 4fec4df..617be4d 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,8 @@ import ( "fmt" "git.riedstra.us/mitch/steam-export/config" "git.riedstra.us/mitch/steam-export/steam" + + "os" ) func main() { @@ -21,16 +23,16 @@ func main() { fmt.Println(libs) } - // fmt.Println(libs[0].Games[20]) - - /* - str, err := libs[0].FindACF(libs[0].Games[20]) - // str, err := libs[0].FindACF("/.") - if err != nil { - fmt.Println(err) - } else { - fmt.Println(str) - } - */ + fmt.Println("------") + + fmt.Println(libs[0].Games[0]) + + working_dir, _ := os.Getwd() + fmt.Println(working_dir) + + // vvvvvvv + // _ = libs[0].PackageGame(libs[0].Games[0]) + // Duke Nukem 3d + _ = libs[2].PackageGame(libs[2].Games[8]) } diff --git a/steam/package.go b/steam/package.go new file mode 100644 index 0000000..690ac4a --- /dev/null +++ b/steam/package.go @@ -0,0 +1,26 @@ +package steam + +import ( + "git.riedstra.us/mitch/steam-export/archive" + "os" +) + +func (l *Library) PackageGame(g string) error { + working_dir, err := os.Getwd() + if err != nil { + return err + } + output := working_dir + "/" + g + ".tar" + + os.Chdir(l.Folder + common) + input := g + a := archive.Archive{Output: output, Input: input} + err = a.Tar() + if err != nil { + return err + } + + os.Chdir(working_dir) + + return nil +} diff --git a/steam/steam.go b/steam/steam.go index 1f764f2..5214cc1 100644 --- a/steam/steam.go +++ b/steam/steam.go @@ -20,6 +20,8 @@ type Library struct { Games []string } +var common string = "/common" + func ProcessMultipleLibraries(r []string) ([]*Library, error) { var libs []*Library for _, i := range r { @@ -36,7 +38,7 @@ func ProcessMultipleLibraries(r []string) ([]*Library, error) { // Populate the "Folder" and "Games" fields based on the provided directory func (s *Library) ProcessLibrary(r string) error { if hasCommon(r) { - dirs, err := ioutil.ReadDir(r + "/common") + dirs, err := ioutil.ReadDir(r + common) if err != nil { return err } -- cgit v1.2.3