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:
Dan Willhite
2016-05-27 10:46:34 -07:00
parent d3a3b72caa
commit 89ec809246
5 changed files with 111 additions and 25 deletions

View File

@@ -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)
}

View File

@@ -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)
}
}

View File

@@ -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

View File

@@ -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)

View File

@@ -49,3 +49,7 @@ func NewMapOfStringToRefOfCommit() types.Map {
func typeForSetOfRefOfCommit() *types.Type {
return types.MakeSetType(types.MakeRefType(commitType))
}
func CommitType() *types.Type {
return commitType
}