package steam import ( "archive/tar" "io" "os" "strings" "path/filepath" ) func (l *Library) ExtractUpdate(r io.Reader) error { if err := os.Chdir(l.Folder); err != nil { return err } // withinArchive := map[string]struct{}{} // onDisk, err := fileListing( treader := tar.NewReader(r) for { hdr, err := treader.Next() if err == io.EOF { // We've reached the end! Whoee break } if err != nil { return err } // Fix windows slashes... fileName := strings.Replace(hdr.Name, "\\", "/", -1) info := hdr.FileInfo() if info.IsDir() { // I don't like hard-coded permissions but it // it helps with overall platform compatibility if err = os.MkdirAll(fileName, 0775); err != nil { return err } continue } if err = os.MkdirAll(filepath.Dir(fileName), 0775); err != nil { return err } fi, err := os.Stat(fileName) if !os.IsNotExist(err) { // If the file in the archive is not newer, skip if !info.ModTime().After(fi.ModTime()) { continue } } // Create a file handle to work with f, err := os.OpenFile(fileName, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0664) if err != nil { return err } if _, err := io.Copy(f, treader); err != nil { return err } f.Close() } return nil }