aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitch Riedstra <mitch@riedstra.us>2017-01-06 18:06:34 -0500
committerMitch Riedstra <mitch@riedstra.us>2017-01-06 18:06:34 -0500
commitdaa78703abcd467936fb498a1ca4deb85a2fe419 (patch)
tree3105a06622c45413d93b92cf3ff83fd02f204b09
parentc5d68db9fb5f831106ce3eb12048e8f9005e531b (diff)
downloadsteam-export-daa78703abcd467936fb498a1ca4deb85a2fe419.tar.gz
steam-export-daa78703abcd467936fb498a1ca4deb85a2fe419.tar.xz
Added an archive library and ability to package steam games
-rw-r--r--.gitignore5
-rw-r--r--archive/archive.go88
-rw-r--r--main.go24
-rw-r--r--steam/package.go26
-rw-r--r--steam/steam.go4
5 files changed, 135 insertions, 12 deletions
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
}