func (f *Folder) Trees2() ([]*Tree, error) { list, err := f.conn.list(f.comp.UUID+"/bucketdata/"+f.uuid+"/refs/logs/master/", "", 0) if err != nil { return nil, err } var out []*Tree for _, obj := range list.Contents { data, err := f.conn.cget(obj.Key) if err != nil { return nil, err } var l reflog if err := plist.Unmarshal(data, &l); err != nil { return nil, err } sc := hexScore(l.NewHeadSHA1) if err != nil { return nil, err } data, err = f.comp.scget(sc) if err != nil { return nil, err } var com commit if err := unpack(data, &com); err != nil { return nil, err } var info folderInfo if err := plist.Unmarshal(com.BucketXML, &info); err != nil { return nil, err } t := &Tree{ Time: com.CreateTime, Path: info.LocalPath, Score: com.Tree.Score, commit: com, comp: f.comp, folder: f, info: info, } out = append(out, t) } return out, nil }
// Folders returns a list of the folders that have been backed up on the computer. func (c *Computer) Folders() ([]*Folder, error) { // Each folder is a file under computer/buckets/. list, err := c.conn.list(c.UUID+"/buckets/", "", 0) if err != nil { return nil, err } var out []*Folder for _, obj := range list.Contents { data, err := c.conn.bget(obj.Key) if err != nil { return nil, err } var info folderInfo if err := plist.Unmarshal(data, &info); err != nil { return nil, err } out = append(out, &Folder{ Path: info.LocalPath, uuid: info.BucketUUID, comp: c, conn: c.conn, }) } return out, nil }
// Computers returns a list of the computers with backups available on the S3 server. func (c *Conn) Computers() ([]*Computer, error) { // Each backup is a top-level directory with a computerinfo file in it. list, err := c.list("", "/", 0) if err != nil { return nil, err } var out []*Computer for _, p := range list.CommonPrefixes { data, err := c.bget(p + "computerinfo") if err != nil { continue } var info computerInfo if err := plist.Unmarshal(data, &info); err != nil { return nil, err } comp := &Computer{ Name: info.ComputerName, User: info.UserName, UUID: p[:len(p)-1], conn: c, index: map[score]ientry{}, } salt, err := c.cget(p + "salt") if err != nil { return nil, err } comp.crypto.salt = salt out = append(out, comp) } return out, nil }
// Trees returns a list of the individual backup snapshots for the folder. // Note that different trees from the same Folder might have different Paths // if the folder was "relocated" using the Arq interface. func (f *Folder) Trees() ([]*Tree, error) { data, err := f.conn.bget(f.comp.UUID + "/bucketdata/" + f.uuid + "/refs/heads/master") if err != nil { return nil, err } sc := hexScore(string(data)) if err != nil { return nil, err } var out []*Tree for { data, err = f.comp.scget(sc) if err != nil { return nil, err } var com commit if err := unpack(data, &com); err != nil { return nil, err } var info folderInfo if err := plist.Unmarshal(com.BucketXML, &info); err != nil { return nil, err } t := &Tree{ Time: com.CreateTime, Path: info.LocalPath, Score: com.Tree.Score, commit: com, comp: f.comp, folder: f, info: info, } out = append(out, t) if len(com.ParentCommits) == 0 { break } sc = com.ParentCommits[0].Score } for i, n := 0, len(out)-1; i < n-i; i++ { out[i], out[n-i] = out[n-i], out[i] } return out, nil }