Merge "playground: Change "profiles" directory to "runtime""
diff --git a/go/src/v.io/x/playground/pgadmin/main.go b/go/src/v.io/x/playground/pgadmin/main.go
index cbbdaf2..aa010ea 100644
--- a/go/src/v.io/x/playground/pgadmin/main.go
+++ b/go/src/v.io/x/playground/pgadmin/main.go
@@ -8,17 +8,16 @@
 
 import (
 	"flag"
-	"os"
 
-	"v.io/x/lib/cmdline"
+	"v.io/x/lib/cmdline2"
 	"v.io/x/lib/dbutil"
 )
 
 func main() {
-	os.Exit(cmdPGAdmin.Main())
+	cmdline2.Main(cmdPGAdmin)
 }
 
-var cmdPGAdmin = &cmdline.Command{
+var cmdPGAdmin = &cmdline2.Command{
 	Name:  "pgadmin",
 	Short: "Playground database management tool",
 	Long: `
@@ -26,7 +25,7 @@
 Supports database schema migration.
 TODO(ivanpi): bundle bootstrap
 `,
-	Children: []*cmdline.Command{cmdMigrate},
+	Children: []*cmdline2.Command{cmdMigrate},
 }
 
 var (
diff --git a/go/src/v.io/x/playground/pgadmin/migrate.go b/go/src/v.io/x/playground/pgadmin/migrate.go
index fcb2b25..2897726 100644
--- a/go/src/v.io/x/playground/pgadmin/migrate.go
+++ b/go/src/v.io/x/playground/pgadmin/migrate.go
@@ -19,7 +19,7 @@
 
 	"github.com/rubenv/sql-migrate"
 
-	"v.io/x/lib/cmdline"
+	"v.io/x/lib/cmdline2"
 	"v.io/x/lib/dbutil"
 )
 
@@ -32,28 +32,28 @@
 // TODO(ivanpi): Add status command and sanity checks (e.g. "skipped" migrations are incorrectly applied by rubenv/sql-migrate).
 // TODO(ivanpi): Guard against version skew corrupting data (e.g. add version check to client).
 
-var cmdMigrate = &cmdline.Command{
+var cmdMigrate = &cmdline2.Command{
 	Name:  "migrate",
 	Short: "Database schema migrations",
 	Long: `
 See github.com/rubenv/sql-migrate
 ` + mysqlWarning,
-	Children: []*cmdline.Command{cmdMigrateUp, cmdMigrateDown},
+	Children: []*cmdline2.Command{cmdMigrateUp, cmdMigrateDown},
 }
 
-var cmdMigrateUp = &cmdline.Command{
-	Run:   runWithDBConn(runMigrate(migrate.Up)),
-	Name:  "up",
-	Short: "Apply new database schema migrations",
+var cmdMigrateUp = &cmdline2.Command{
+	Runner: runWithDBConn(runMigrate(migrate.Up, &flagMigrationsLimitUp)),
+	Name:   "up",
+	Short:  "Apply new database schema migrations",
 	Long: `
 See github.com/rubenv/sql-migrate
 ` + mysqlWarning,
 }
 
-var cmdMigrateDown = &cmdline.Command{
-	Run:   runWithDBConn(runMigrate(migrate.Down)),
-	Name:  "down",
-	Short: "Roll back database schema migrations",
+var cmdMigrateDown = &cmdline2.Command{
+	Runner: runWithDBConn(runMigrate(migrate.Down, &flagMigrationsLimitDown)),
+	Name:   "down",
+	Short:  "Roll back database schema migrations",
 	Long: `
 See github.com/rubenv/sql-migrate
 ` + mysqlWarning,
@@ -66,19 +66,20 @@
 )
 
 var (
-	flagMigrationsDir   string
-	flagMigrationsLimit int
+	flagMigrationsDir       string
+	flagMigrationsLimitUp   int
+	flagMigrationsLimitDown int
 )
 
 func init() {
 	cmdMigrate.Flags.StringVar(&flagMigrationsDir, "dir", pgMigrationsDir, "Path to directory containing migrations.")
-	cmdMigrateUp.Flags.IntVar(&flagMigrationsLimit, "limit", 0, "Maximum number of up migrations to apply. 0 for unlimited.")
-	cmdMigrateDown.Flags.IntVar(&flagMigrationsLimit, "limit", 1, "Maximum number of down migrations to apply. 0 for unlimited.")
+	cmdMigrateUp.Flags.IntVar(&flagMigrationsLimitUp, "limit", 0, "Maximum number of up migrations to apply. 0 for unlimited.")
+	cmdMigrateDown.Flags.IntVar(&flagMigrationsLimitDown, "limit", 1, "Maximum number of down migrations to apply. 0 for unlimited.")
 }
 
 // Returns a DBCommand for applying migrations in the provided direction.
-func runMigrate(direction migrate.MigrationDirection) DBCommand {
-	return func(db *sql.DB, cmd *cmdline.Command, args []string) error {
+func runMigrate(direction migrate.MigrationDirection, limit *int) DBCommand {
+	return func(db *sql.DB, env *cmdline2.Env, args []string) error {
 		migrate.SetTable(migrationsTable)
 
 		source := migrate.FileMigrationSource{
@@ -86,37 +87,37 @@
 		}
 
 		if *flagDryRun {
-			planned, _, err := migrate.PlanMigration(db, sqlDialect, source, direction, flagMigrationsLimit)
+			planned, _, err := migrate.PlanMigration(db, sqlDialect, source, direction, *limit)
 			if err != nil {
 				return fmt.Errorf("Failed getting migrations to apply: %v", err)
 			}
 			for i, m := range planned {
-				fmt.Fprintf(cmd.Stdout(), "#%d: %q\n", i, m.Migration.Id)
+				fmt.Fprintf(env.Stdout, "#%d: %q\n", i, m.Migration.Id)
 				for _, q := range m.Queries {
-					fmt.Fprint(cmd.Stdout(), q)
+					fmt.Fprint(env.Stdout, q)
 				}
 			}
 			return nil
 		} else {
-			amount, err := migrate.ExecMax(db, sqlDialect, source, direction, flagMigrationsLimit)
+			amount, err := migrate.ExecMax(db, sqlDialect, source, direction, *limit)
 			if err != nil {
 				return fmt.Errorf("Migration FAILED (applied %d migrations): %v", amount, err)
 			}
-			fmt.Fprintf(cmd.Stdout(), "Successfully applied %d migrations\n", amount)
+			fmt.Fprintf(env.Stdout, "Successfully applied %d migrations\n", amount)
 			return nil
 		}
 	}
 }
 
 // Command to be wrapped with runWithDBConn().
-type DBCommand func(db *sql.DB, cmd *cmdline.Command, args []string) error
+type DBCommand func(db *sql.DB, env *cmdline2.Env, args []string) error
 
 // runWithDBConn is a wrapper method that handles opening and closing the
 // database connection.
-func runWithDBConn(fx DBCommand) cmdline.Runner {
-	return func(cmd *cmdline.Command, args []string) (rerr error) {
+func runWithDBConn(fx DBCommand) cmdline2.RunnerFunc {
+	return func(env *cmdline2.Env, args []string) (rerr error) {
 		if *flagSQLConf == "" {
-			return cmd.UsageErrorf("SQL configuration file (-sqlconf) must be provided")
+			return env.UsageErrorf("SQL configuration file (-sqlconf) must be provided")
 		}
 
 		// Open database connection from config,
@@ -142,6 +143,6 @@
 		}
 
 		// Run wrapped function.
-		return fx(db, cmd, args)
+		return fx(db, env, args)
 	}
 }