import (
"bufio"
+ "crypto/md5"
"fmt"
+ "regexp"
"strings"
"time"
Name string `json:"name"`
CreatedAt time.Time `json:"created_at"`
ModifiedAt time.Time `json:"modified_at"`
- ModifiedByClientUUID *string `json:"modified_by_client_uuid"`
- ModifiedByUserUUID *string `json:"modified_by_user_uuid"`
+ ModifiedByClientUUID string `json:"modified_by_client_uuid"`
+ ModifiedByUserUUID string `json:"modified_by_user_uuid"`
PortableDataHash string `json:"portable_data_hash"`
ReplicationConfirmed *int `json:"replication_confirmed"`
ReplicationConfirmedAt *time.Time `json:"replication_confirmed_at"`
WritableBy []string `json:"writable_by,omitempty"`
FileCount int `json:"file_count"`
FileSizeTotal int64 `json:"file_size_total"`
- Version *int `json:"version"`
+ Version int `json:"version"`
PreserveVersion bool `json:"preserve_version"`
CurrentVersionUUID string `json:"current_version_uuid"`
- Description *string `json:"description"`
+ Description string `json:"description"`
}
func (c Collection) resourceName() string {
Offset int `json:"offset"`
Limit int `json:"limit"`
}
+
+var (
+ blkRe = regexp.MustCompile(`^ [0-9a-f]{32}\+\d+`)
+ tokRe = regexp.MustCompile(` ?[^ ]*`)
+)
+
+// PortableDataHash computes the portable data hash of the given
+// manifest.
+func PortableDataHash(mt string) string {
+ h := md5.New()
+ size := 0
+ _ = tokRe.ReplaceAllFunc([]byte(mt), func(tok []byte) []byte {
+ if m := blkRe.Find(tok); m != nil {
+ // write hash+size, ignore remaining block hints
+ tok = m
+ }
+ n, err := h.Write(tok)
+ if err != nil {
+ panic(err)
+ }
+ size += n
+ return nil
+ })
+ return fmt.Sprintf("%x+%d", h.Sum(nil), size)
+}