Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[no-release-notes] go/store/cmd/noms: Change root to use config.(*Resolver).GetDatabase. #7052

Merged
merged 3 commits into from
Nov 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 6 additions & 90 deletions go/store/cmd/noms/noms_root.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 <db-spec>",
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,
Expand All @@ -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
}

Expand All @@ -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
}

Expand All @@ -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
}
7 changes: 3 additions & 4 deletions go/store/cmd/noms/splunk.pl
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -46,6 +44,7 @@
}

if ($input eq "/") {
$root = `noms root $noms_dir`;
$hash = $root;
@stack = ($root);
next;
Expand Down
Loading