func Test_Transport_FetchSpec(t *testing.T) { // t.Skip() root := "Spec" halt, tree, ml, _, tr := seed(t, root) defer halt() mx, err := ml.FeedManifests(true, true, true, lists.NewFileList().ListDir(tree.CWD)...) assert.NoError(t, err) err = tr.Upload(mx) assert.NoError(t, err) // make spec nameMap := map[string]proto.ID{} for name, m := range mx { nameMap[name] = m.ID } spec1, err := proto.NewSpec(time.Now().UnixNano(), nameMap, []string{}) assert.NoError(t, err) err = tr.UploadSpec(spec1) assert.NoError(t, err) spec2, err := tr.GetSpec(spec1.ID) assert.NoError(t, err) assert.Equal(t, spec1.ID, spec2.ID) }
func Test_Proto_Spec1(t *testing.T) { m1, err := proto.NewFromManifest(fixtures.CleanInput(`BAR:MANIFEST id ac934d9a88b42aa3b40ef7c81a9dee1aad5a2cddccb00ae6abab9c38095fc15c size 1234 id ac934d9a88b42aa3b40ef7c81a9dee1aad5a2cddccb00ae6abab9c38095fc15c size 1234 offset 0 `)) assert.NoError(t, err) m2, err := proto.NewFromManifest(fixtures.CleanInput(`BAR:MANIFEST id ac934d9a88b42aa3b40ef7c81a9dee1aad5a2cddccb00ae6abab9c38095fc15c size 1234 id ac934d9a88b42aa3b40ef7c81a9dee1aad5a2cddccb00ae6abab9c38095fc15c size 1234 offset 0 `)) assert.NoError(t, err) spec, err := proto.NewSpec(time.Now().UnixNano(), map[string]proto.ID{ "file/1": m1.ID, "file/2": m2.ID, }, []string{}) // hand-made fixture var sorted sort.StringSlice sorted = append(sorted, "file/2") sorted = append(sorted, "file/1") sorted.Sort() hasher := sha3.New256() var id []byte err = m1.ID.Decode(id) assert.NoError(t, err) _, err = hasher.Write([]byte(sorted[0])) _, err = hasher.Write(id) _, err = hasher.Write([]byte(sorted[1])) _, err = hasher.Write(id) assert.Equal(t, spec.ID, proto.ID(hex.EncodeToString(hasher.Sum(nil)))) }
func (c *SpecExportCmd) Run(args ...string) (err error) { var mod *model.Model if mod, err = model.New(c.WD, c.UseGit, c.ChunkSize, c.PoolSize); err != nil { return } feed := lists.NewFileList(args...).ListDir(c.WD) isDirty, dirty, err := mod.Check(feed...) if err != nil { return } if isDirty { err = fmt.Errorf("dirty files in working tree %s", dirty) return } if c.UseGit { // filter by attrs feed, err = mod.Git.FilterByAttr("bar", feed...) } blobs, err := mod.FeedManifests(true, true, true, feed...) if err != nil { return } // make specmap nameMap := map[string]proto.ID{} for name, m := range blobs { nameMap[name] = m.ID } spec, err := proto.NewSpec(time.Now().UnixNano(), nameMap, []string{}) if err != nil { return } if c.DoCC { ccName := fmt.Sprintf("bar-spec-%d-%s.json", time.Now().UnixNano(), spec.ID) logx.Infof("storing carbon copy to %s", ccName) ccf, err := os.Create(lists.OSFromSlash(lists.OSJoin(c.WD, ccName))) if err != nil { return err } defer ccf.Close() if err = json.NewEncoder(ccf).Encode(&spec); err != nil { return err } } if !c.Upload { err = json.NewEncoder(c.Stdout).Encode(&spec) return } trans := transport.NewTransport(mod, "", c.Endpoint, c.PoolSize) if err = trans.UploadSpec(spec); err != nil { return } fmt.Fprint(c.Stdout, spec.ID) return }