diff --git a/go/store/cmd/noms/noms_root.go b/go/store/cmd/noms/noms_root.go index 8086b7e231..b4885d9c62 100644 --- a/go/store/cmd/noms/noms_root.go +++ b/go/store/cmd/noms/noms_root.go @@ -25,21 +25,20 @@ import ( "context" "fmt" "os" - "strings" flag "github.com/juju/gnuflag" "github.com/dolthub/dolt/go/store/cmd/noms/util" "github.com/dolthub/dolt/go/store/config" "github.com/dolthub/dolt/go/store/d" - "github.com/dolthub/dolt/go/store/hash" + "github.com/dolthub/dolt/go/store/datas" "github.com/dolthub/dolt/go/store/types" ) var nomsRoot = &util.Command{ Run: runRoot, UsageLine: "root ", - Short: "Get or set the current root hash of the entire database", + Short: "Get the current root hash of the entire database", Long: "See Spelling Objects at https://github.com/attic-labs/noms/blob/master/doc/spelling.md for details on the database argument.", Flags: setupRootFlags, Nargs: 1, @@ -49,7 +48,6 @@ var updateRoot = "" func setupRootFlags() *flag.FlagSet { flagSet := flag.NewFlagSet("root", flag.ExitOnError) - flagSet.StringVar(&updateRoot, "update", "", "Replaces the entire database with the one with the given hash") return flagSet } @@ -60,70 +58,16 @@ func runRoot(ctx context.Context, args []string) int { } cfg := config.NewResolver() - cs, err := cfg.GetChunkStore(ctx, args[0]) - util.CheckErrorNoUsage(err) - defer cs.Close() - - currRoot, err := cs.Root(ctx) - - if err != nil { - fmt.Fprintln(os.Stderr, "error getting root.", err) - return 1 - } - - if updateRoot == "" { - fmt.Println(currRoot) - return 0 - } - - if updateRoot[0] == '#' { - updateRoot = updateRoot[1:] - } - h, ok := hash.MaybeParse(updateRoot) - if !ok { - fmt.Fprintf(os.Stderr, "Invalid hash: %s\n", h.String()) - return 1 - } - - // If BUG 3407 is correct, we might be able to just take cs and make a Database directly from that. - db, vrw, _, err := cfg.GetDatabase(ctx, args[0]) + db, _, _, err := cfg.GetDatabase(ctx, args[0]) util.CheckErrorNoUsage(err) defer db.Close() - v, err := vrw.ReadValue(ctx, h) - util.CheckErrorNoUsage(err) - if !validate(ctx, vrw.Format(), v) { - return 1 - } - - fmt.Println(`WARNING - -This operation replaces the entire database with the instance having the given -hash. The old database becomes eligible for GC. - -ANYTHING NOT SAVED WILL BE LOST - -Continue?`) - - var input string - n, err := fmt.Scanln(&input) - util.CheckErrorNoUsage(err) - if n != 1 || strings.ToLower(input) != "y" { - return 0 - } - - ok, err = cs.Commit(ctx, h, currRoot) - + currRoot, err := datas.ChunkStoreFromDatabase(db).Root(ctx) if err != nil { - fmt.Fprintf(os.Stderr, "commit error: %s", err.Error()) - return 1 - } - - if !ok { - fmt.Fprintln(os.Stderr, "Optimistic concurrency failure") + fmt.Fprintln(os.Stderr, "error getting root.", err) return 1 } - fmt.Printf("Success. Previous root was: %s\n", currRoot) + fmt.Println(currRoot) return 0 } @@ -141,31 +85,3 @@ func mustValue(v types.Value, err error) types.Value { d.PanicIfError(err) return v } - -func mustGetValue(v types.Value, ok bool, err error) types.Value { - d.PanicIfError(err) - d.PanicIfFalse(ok) - return v -} - -func mustSet(s types.Set, err error) types.Set { - d.PanicIfError(err) - return s -} - -func mustList(l types.List, err error) types.List { - d.PanicIfError(err) - return l -} - -func validate(ctx context.Context, nbf *types.NomsBinFormat, r types.Value) bool { - rootType := mustType(types.MakeMapType(types.PrimitiveTypeMap[types.StringKind], mustType(types.MakeRefType(types.PrimitiveTypeMap[types.ValueKind])))) - if isSub, err := types.IsValueSubtypeOf(nbf, r, rootType); err != nil { - panic(err) - } else if !isSub { - fmt.Fprintf(os.Stderr, "Root of database must be %s, but you specified: %s\n", mustString(rootType.Describe(ctx)), mustString(mustType(types.TypeOf(r)).Describe(ctx))) - return false - } - - return true -} diff --git a/go/store/cmd/noms/splunk.pl b/go/store/cmd/noms/splunk.pl index 251e135d79..da9219b8a7 100755 --- a/go/store/cmd/noms/splunk.pl +++ b/go/store/cmd/noms/splunk.pl @@ -12,11 +12,9 @@ print "Welcome to the splunk shell for exploring dolt repository storage.\n"; -my $manifest = `noms manifest $noms_dir`; -my $root = get_root($manifest); - -my $message = "Currently examining root.\nUse numeric labels to navigate the tree\n.. to back up a level, / to return to root.\nType quit or exit to exit.\n"; +my $root = `noms root $noms_dir`; +my $message = "Currently examining root.\nUse numeric labels to navigate the tree\n.. to back up a level, / to return reload root and return there.\nType quit or exit to exit.\n"; my $hash = $root; my @stack = ($root); @@ -46,6 +44,7 @@ } if ($input eq "/") { + $root = `noms root $noms_dir`; $hash = $root; @stack = ($root); next;