mirror of
https://github.com/dolthub/dolt.git
synced 2026-02-10 18:49:02 -06:00
Arg enhancements to noms-log.
Added -n arg to limit number of commits that are displayed. Changed dataspec arg to valuespec arg so that sha1's can be used as starting commit.
This commit is contained in:
@@ -159,6 +159,7 @@ func (spec DatasetSpec) Value() (datas.Database, types.Value, error) {
|
||||
|
||||
commit, ok := dataset.MaybeHead()
|
||||
if !ok {
|
||||
dataset.Database().Close()
|
||||
return nil, nil, fmt.Errorf("No head value for dataset: %s", spec.DatasetName)
|
||||
}
|
||||
|
||||
|
||||
@@ -5,15 +5,34 @@
|
||||
package util
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"os"
|
||||
"flag"
|
||||
"fmt"
|
||||
"os"
|
||||
)
|
||||
|
||||
func CheckError(err error) {
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "error: %s\n", err)
|
||||
flag.Usage()
|
||||
os.Exit(-1)
|
||||
}
|
||||
type Exiter interface {
|
||||
Exit(code int)
|
||||
}
|
||||
|
||||
type nomsExiter struct{}
|
||||
|
||||
func (e nomsExiter) Exit(code int) {
|
||||
os.Exit(code)
|
||||
}
|
||||
|
||||
var UtilExiter Exiter = nomsExiter{}
|
||||
|
||||
func CheckError(err error) {
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "error: %s\n", err)
|
||||
flag.Usage()
|
||||
UtilExiter.Exit(-1)
|
||||
}
|
||||
}
|
||||
|
||||
func CheckErrorNoUsage(err error) {
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "error: %s\n", err)
|
||||
UtilExiter.Exit(-1)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"math"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
@@ -23,6 +24,7 @@ import (
|
||||
var (
|
||||
color = flag.Int("color", -1, "value of 1 forces color on, 2 forces color off")
|
||||
maxLines = flag.Int("max-lines", 10, "max number of lines to show per commit (-1 for all lines)")
|
||||
maxCommits = flag.Int("n", 0, "max number of commits to display (0 for all commits)")
|
||||
showHelp = flag.Bool("help", false, "show help text")
|
||||
showGraph = flag.Bool("graph", false, "show ascii-based commit hierarcy on left side of output")
|
||||
stdoutIsTty = flag.Int("stdout-is-tty", -1, "value of 1 forces tty ouput, 0 forces non-tty output (provided for use by other programs)")
|
||||
@@ -33,7 +35,8 @@ var (
|
||||
func main() {
|
||||
flag.Usage = func() {
|
||||
fmt.Fprintln(os.Stderr, "Displays the history of a Noms dataset\n")
|
||||
fmt.Fprintln(os.Stderr, "Usage: noms log <dataset>")
|
||||
fmt.Fprintln(os.Stderr, "Usage: noms log <commitObject>")
|
||||
fmt.Fprintln(os.Stderr, "commitObject must be a dataset or object spec that refers to a commit.")
|
||||
flag.PrintDefaults()
|
||||
fmt.Fprintf(os.Stderr, "\nSee \"Spelling Objects\" at https://github.com/attic-labs/noms/blob/master/doc/spelling.md for details on the object argument.\n\n")
|
||||
}
|
||||
@@ -50,23 +53,31 @@ func main() {
|
||||
|
||||
useColor = shouldUseColor()
|
||||
|
||||
spec, err := flags.ParseDatasetSpec(flag.Arg(0))
|
||||
util.CheckError(err)
|
||||
dataset, err := spec.Dataset()
|
||||
spec, err := flags.ParsePathSpec(flag.Arg(0))
|
||||
util.CheckError(err)
|
||||
database, value, err := spec.Value()
|
||||
if err != nil {
|
||||
util.CheckErrorNoUsage(err)
|
||||
}
|
||||
defer database.Close()
|
||||
|
||||
origCommit, ok := dataset.MaybeHead()
|
||||
|
||||
if ok {
|
||||
iter := NewCommitIterator(dataset.Database(), origCommit)
|
||||
for ln, ok := iter.Next(); ok; ln, ok = iter.Next() {
|
||||
if printCommit(ln) != nil {
|
||||
break
|
||||
}
|
||||
}
|
||||
origCommit, ok := value.(types.Struct)
|
||||
if !ok || !origCommit.Type().Equals(datas.CommitType()) {
|
||||
util.CheckError(fmt.Errorf("%s does not reference a Commit object", spec))
|
||||
}
|
||||
|
||||
iter := NewCommitIterator(database, origCommit)
|
||||
displayed := 0
|
||||
if *maxCommits <= 0 {
|
||||
*maxCommits = math.MaxInt32
|
||||
}
|
||||
for ln, ok := iter.Next(); ok && displayed < *maxCommits; ln, ok = iter.Next() {
|
||||
if printCommit(ln) != nil {
|
||||
break
|
||||
}
|
||||
displayed++
|
||||
}
|
||||
|
||||
dataset.Database().Close()
|
||||
}
|
||||
|
||||
// Prints the information for one commit in the log, including ascii graph on left side of commits if
|
||||
|
||||
@@ -10,13 +10,28 @@ import (
|
||||
|
||||
"github.com/attic-labs/noms/clients/go/flags"
|
||||
"github.com/attic-labs/noms/clients/go/test_util"
|
||||
"github.com/attic-labs/noms/clients/go/util"
|
||||
"github.com/attic-labs/noms/dataset"
|
||||
"github.com/attic-labs/noms/types"
|
||||
"github.com/attic-labs/testify/assert"
|
||||
"github.com/attic-labs/testify/suite"
|
||||
)
|
||||
|
||||
type testExiter struct{}
|
||||
type exitError struct {
|
||||
code int
|
||||
}
|
||||
|
||||
func (e exitError) Error() string {
|
||||
return fmt.Sprintf("Exiting with code: %d", e.code)
|
||||
}
|
||||
|
||||
func (testExiter) Exit(code int) {
|
||||
panic(exitError{code})
|
||||
}
|
||||
|
||||
func TestNomsShow(t *testing.T) {
|
||||
util.UtilExiter = testExiter{}
|
||||
suite.Run(t, &nomsShowTestSuite{})
|
||||
}
|
||||
|
||||
@@ -29,7 +44,7 @@ func testCommitInResults(s *nomsShowTestSuite, spec string, i int) {
|
||||
s.NoError(err)
|
||||
ds, err := sp.Dataset()
|
||||
s.NoError(err)
|
||||
ds, err = ds.Commit(types.Number(1))
|
||||
ds, err = ds.Commit(types.Number(i))
|
||||
s.NoError(err)
|
||||
commit := ds.Head()
|
||||
fmt.Printf("commit hash: %s, type: %s\n", commit.Hash(), commit.Type().Name())
|
||||
@@ -46,7 +61,7 @@ func (s *nomsShowTestSuite) TestNomsLog() {
|
||||
ds, err := sp.Dataset()
|
||||
s.NoError(err)
|
||||
ds.Database().Close()
|
||||
s.Equal("", s.Run(main, []string{spec}))
|
||||
s.Panics(func() { s.Run(main, []string{spec}) })
|
||||
|
||||
testCommitInResults(s, spec, 1)
|
||||
testCommitInResults(s, spec, 2)
|
||||
@@ -68,6 +83,42 @@ func mergeDatasets(ds1, ds2 dataset.Dataset, v string) (dataset.Dataset, error)
|
||||
return ds1.CommitWithParents(types.NewString(v), types.NewSet(ds1.HeadRef(), ds2.HeadRef()))
|
||||
}
|
||||
|
||||
func (s *nomsShowTestSuite) TestNArg() {
|
||||
spec := fmt.Sprintf("ldb:%s", s.LdbDir)
|
||||
dsName := "nArgTest"
|
||||
dbSpec, err := flags.ParseDatabaseSpec(spec)
|
||||
s.NoError(err)
|
||||
db, err := dbSpec.Database()
|
||||
s.NoError(err)
|
||||
|
||||
ds := dataset.NewDataset(db, dsName)
|
||||
|
||||
ds, err = addCommit(ds, "1")
|
||||
h1 := ds.Head().Hash()
|
||||
s.NoError(err)
|
||||
ds, err = addCommit(ds, "2")
|
||||
s.NoError(err)
|
||||
h2 := ds.Head().Hash()
|
||||
ds, err = addCommit(ds, "3")
|
||||
s.NoError(err)
|
||||
h3 := ds.Head().Hash()
|
||||
db.Close()
|
||||
|
||||
dsSpec := fmt.Sprintf("ldb:%s:%s", s.LdbDir, dsName)
|
||||
s.NotContains(s.Run(main, []string{"-n=1", dsSpec}), h1.String())
|
||||
res := s.Run(main, []string{"-n=0", dsSpec})
|
||||
s.Contains(res, h3.String())
|
||||
s.Contains(res, h2.String())
|
||||
s.Contains(res, h1.String())
|
||||
|
||||
vSpec := fmt.Sprintf("ldb:%s:%s", s.LdbDir, h3)
|
||||
s.NotContains(s.Run(main, []string{"-n=1", vSpec}), h1.String())
|
||||
res = s.Run(main, []string{"-n=0", vSpec})
|
||||
s.Contains(res, h3.String())
|
||||
s.Contains(res, h2.String())
|
||||
s.Contains(res, h1.String())
|
||||
}
|
||||
|
||||
func (s *nomsShowTestSuite) TestNomsGraph1() {
|
||||
spec := fmt.Sprintf("ldb:%s", s.LdbDir)
|
||||
dbSpec, err := flags.ParseDatabaseSpec(spec)
|
||||
|
||||
@@ -49,3 +49,7 @@ func NewMapOfStringToRefOfCommit() types.Map {
|
||||
func typeForSetOfRefOfCommit() *types.Type {
|
||||
return types.MakeSetType(types.MakeRefType(commitType))
|
||||
}
|
||||
|
||||
func CommitType() *types.Type {
|
||||
return commitType
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user