diff --git a/.docker.metadata b/.docker.metadata index a7675d7..bd853e6 100644 --- a/.docker.metadata +++ b/.docker.metadata @@ -1,7 +1,4 @@ -ea6af872200a1b7b6b371b1b3a47dcf38bb3cc4f SOURCES/011a826ff8b35f1d206a3de6f37fdb0292c948c9.tar.gz -14e8c28533777782d48a97a5c41f75cc645251ac SOURCES/446ad9bd9e8ec218aff5b22529c0bdc6df69d0e2.tar.gz -1a00c6b67a8b874cdbfc5d5a73c9d8775bb2f332 SOURCES/54a154d8b251df5e4788570dac4bea3cfa70b199.tar.gz +511dc35272b3949eb48a5dd5115c06e29bbcbdb9 SOURCES/bb472f05c975b343fb13e55325a985f4ac1d0ca2.tar.gz 18870c5eeee96c30dca0812c1ad4fd469595cbd6 SOURCES/dab51acd1b1a77f7cb01a1b7e2129ec85c846b71.tar.gz -062f6b3918b31da158c58d4f288de85351eb1124 SOURCES/docker-selinux-6267b83.tar.gz -1c2605ad4e26953f5d63fc2531c26fa47f71ddcf SOURCES/docker-storage-setup-d3b9ba7.tar.gz -9df03f0e64167be9fabe113c99297a4a8774f4fb SOURCES/websocket_client-0.32.0.tar.gz +b267c131454bcbf2c752c065fcadcfd4f7462c35 SOURCES/docker-selinux-44abd21.tar.gz +e3a90d52c646cd099d668efa2075f92314609498 SOURCES/docker-storage-setup-6898d43.tar.gz diff --git a/.gitignore b/.gitignore index 07759ee..8c8339a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,4 @@ -SOURCES/011a826ff8b35f1d206a3de6f37fdb0292c948c9.tar.gz -SOURCES/446ad9bd9e8ec218aff5b22529c0bdc6df69d0e2.tar.gz -SOURCES/54a154d8b251df5e4788570dac4bea3cfa70b199.tar.gz +SOURCES/bb472f05c975b343fb13e55325a985f4ac1d0ca2.tar.gz SOURCES/dab51acd1b1a77f7cb01a1b7e2129ec85c846b71.tar.gz -SOURCES/docker-selinux-6267b83.tar.gz -SOURCES/docker-storage-setup-d3b9ba7.tar.gz -SOURCES/websocket_client-0.32.0.tar.gz +SOURCES/docker-selinux-44abd21.tar.gz +SOURCES/docker-storage-setup-6898d43.tar.gz diff --git a/SOURCES/0001-Rework-patch-for-rhbz-1194445.patch b/SOURCES/0001-Rework-patch-for-rhbz-1194445.patch deleted file mode 100644 index 4c9aebb..0000000 --- a/SOURCES/0001-Rework-patch-for-rhbz-1194445.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 5e24a5214db77a021ab12faea417e5f6f6ab57ba Mon Sep 17 00:00:00 2001 -From: Lokesh Mandvekar -Date: Mon, 20 Jul 2015 14:56:35 -0400 -Subject: [PATCH] Rework patch for rhbz#1194445 - -- make docker-py work well with older python-requests - -Signed-off-by: Lokesh Mandvekar ---- - docker/clientbase.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/docker/clientbase.py b/docker/clientbase.py -index c81ee0c..fd861bc 100644 ---- a/docker/clientbase.py -+++ b/docker/clientbase.py -@@ -166,7 +166,7 @@ class ClientBase(requests.Session): - """Generator for data coming from a chunked-encoded HTTP response.""" - if response.raw._fp.chunked: - reader = response.raw -- while not reader.closed: -+ while not reader._fp.isclosed(): - # this read call will block until we get a chunk - data = reader.read(1) - if not data: --- -1.8.3.1 - diff --git a/SOURCES/0001-atomic.sysconfig-use-rhel-tools-as-the-TOOLSIMG.patch b/SOURCES/0001-atomic.sysconfig-use-rhel-tools-as-the-TOOLSIMG.patch deleted file mode 100644 index a1c5c48..0000000 --- a/SOURCES/0001-atomic.sysconfig-use-rhel-tools-as-the-TOOLSIMG.patch +++ /dev/null @@ -1,24 +0,0 @@ -From d7e19069a5a4b7ae97b938e109a282d025023fb3 Mon Sep 17 00:00:00 2001 -From: Jonathan Lebon -Date: Fri, 17 Jul 2015 15:28:03 -0400 -Subject: [PATCH] atomic.sysconfig: use rhel-tools as the TOOLSIMG - -Related: https://github.com/projectatomic/atomic/pull/94 - ---- - atomic.sysconfig | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/atomic.sysconfig b/atomic.sysconfig -index 8926e1c..36982f3 100644 ---- a/atomic.sysconfig -+++ b/atomic.sysconfig -@@ -2,4 +2,4 @@ - # A missing command on an atomic host platform will execute - # atomic run ${TOOLSIMG} COMMAND - # If the TOOLSIMG is defined --# export TOOLSIMG= -+# export TOOLSIMG=rhel7/rhel-tools --- -2.1.0 - diff --git a/SOURCES/codegangsta-cli.patch b/SOURCES/codegangsta-cli.patch deleted file mode 100644 index efa62a4..0000000 --- a/SOURCES/codegangsta-cli.patch +++ /dev/null @@ -1,2359 +0,0 @@ -diff -uNr docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/app.go docker-1/vendor/src/github.com/codegangsta/cli/app.go ---- docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/app.go 1969-12-31 19:00:00.000000000 -0500 -+++ docker-1/vendor/src/github.com/codegangsta/cli/app.go 2015-01-16 03:56:49.105152140 -0500 -@@ -0,0 +1,248 @@ -+package cli -+ -+import ( -+ "fmt" -+ "io/ioutil" -+ "os" -+ "time" -+) -+ -+// App is the main structure of a cli application. It is recomended that -+// and app be created with the cli.NewApp() function -+type App struct { -+ // The name of the program. Defaults to os.Args[0] -+ Name string -+ // Description of the program. -+ Usage string -+ // Version of the program -+ Version string -+ // List of commands to execute -+ Commands []Command -+ // List of flags to parse -+ Flags []Flag -+ // Boolean to enable bash completion commands -+ EnableBashCompletion bool -+ // Boolean to hide built-in help command -+ HideHelp bool -+ // An action to execute when the bash-completion flag is set -+ BashComplete func(context *Context) -+ // An action to execute before any subcommands are run, but after the context is ready -+ // If a non-nil error is returned, no subcommands are run -+ Before func(context *Context) error -+ // The action to execute when no subcommands are specified -+ Action func(context *Context) -+ // Execute this function if the proper command cannot be found -+ CommandNotFound func(context *Context, command string) -+ // Compilation date -+ Compiled time.Time -+ // Author -+ Author string -+ // Author e-mail -+ Email string -+} -+ -+// Tries to find out when this binary was compiled. -+// Returns the current time if it fails to find it. -+func compileTime() time.Time { -+ info, err := os.Stat(os.Args[0]) -+ if err != nil { -+ return time.Now() -+ } -+ return info.ModTime() -+} -+ -+// Creates a new cli Application with some reasonable defaults for Name, Usage, Version and Action. -+func NewApp() *App { -+ return &App{ -+ Name: os.Args[0], -+ Usage: "A new cli application", -+ Version: "0.0.0", -+ BashComplete: DefaultAppComplete, -+ Action: helpCommand.Action, -+ Compiled: compileTime(), -+ Author: "Author", -+ Email: "unknown@email", -+ } -+} -+ -+// Entry point to the cli app. Parses the arguments slice and routes to the proper flag/args combination -+func (a *App) Run(arguments []string) error { -+ // append help to commands -+ if a.Command(helpCommand.Name) == nil && !a.HideHelp { -+ a.Commands = append(a.Commands, helpCommand) -+ a.appendFlag(HelpFlag) -+ } -+ -+ //append version/help flags -+ if a.EnableBashCompletion { -+ a.appendFlag(BashCompletionFlag) -+ } -+ a.appendFlag(VersionFlag) -+ -+ // parse flags -+ set := flagSet(a.Name, a.Flags) -+ set.SetOutput(ioutil.Discard) -+ err := set.Parse(arguments[1:]) -+ nerr := normalizeFlags(a.Flags, set) -+ if nerr != nil { -+ fmt.Println(nerr) -+ context := NewContext(a, set, set) -+ ShowAppHelp(context) -+ fmt.Println("") -+ return nerr -+ } -+ context := NewContext(a, set, set) -+ -+ if err != nil { -+ fmt.Printf("Incorrect Usage.\n\n") -+ ShowAppHelp(context) -+ fmt.Println("") -+ return err -+ } -+ -+ if checkCompletions(context) { -+ return nil -+ } -+ -+ if checkHelp(context) { -+ return nil -+ } -+ -+ if checkVersion(context) { -+ return nil -+ } -+ -+ if a.Before != nil { -+ err := a.Before(context) -+ if err != nil { -+ return err -+ } -+ } -+ -+ args := context.Args() -+ if args.Present() { -+ name := args.First() -+ c := a.Command(name) -+ if c != nil { -+ return c.Run(context) -+ } -+ } -+ -+ // Run default Action -+ a.Action(context) -+ return nil -+} -+ -+// Another entry point to the cli app, takes care of passing arguments and error handling -+func (a *App) RunAndExitOnError() { -+ if err := a.Run(os.Args); err != nil { -+ os.Stderr.WriteString(fmt.Sprintln(err)) -+ os.Exit(1) -+ } -+} -+ -+// Invokes the subcommand given the context, parses ctx.Args() to generate command-specific flags -+func (a *App) RunAsSubcommand(ctx *Context) error { -+ // append help to commands -+ if len(a.Commands) > 0 { -+ if a.Command(helpCommand.Name) == nil && !a.HideHelp { -+ a.Commands = append(a.Commands, helpCommand) -+ a.appendFlag(HelpFlag) -+ } -+ } -+ -+ // append flags -+ if a.EnableBashCompletion { -+ a.appendFlag(BashCompletionFlag) -+ } -+ -+ // parse flags -+ set := flagSet(a.Name, a.Flags) -+ set.SetOutput(ioutil.Discard) -+ err := set.Parse(ctx.Args().Tail()) -+ nerr := normalizeFlags(a.Flags, set) -+ context := NewContext(a, set, ctx.globalSet) -+ -+ if nerr != nil { -+ fmt.Println(nerr) -+ if len(a.Commands) > 0 { -+ ShowSubcommandHelp(context) -+ } else { -+ ShowCommandHelp(ctx, context.Args().First()) -+ } -+ fmt.Println("") -+ return nerr -+ } -+ -+ if err != nil { -+ fmt.Printf("Incorrect Usage.\n\n") -+ ShowSubcommandHelp(context) -+ return err -+ } -+ -+ if checkCompletions(context) { -+ return nil -+ } -+ -+ if len(a.Commands) > 0 { -+ if checkSubcommandHelp(context) { -+ return nil -+ } -+ } else { -+ if checkCommandHelp(ctx, context.Args().First()) { -+ return nil -+ } -+ } -+ -+ if a.Before != nil { -+ err := a.Before(context) -+ if err != nil { -+ return err -+ } -+ } -+ -+ args := context.Args() -+ if args.Present() { -+ name := args.First() -+ c := a.Command(name) -+ if c != nil { -+ return c.Run(context) -+ } -+ } -+ -+ // Run default Action -+ if len(a.Commands) > 0 { -+ a.Action(context) -+ } else { -+ a.Action(ctx) -+ } -+ -+ return nil -+} -+ -+// Returns the named command on App. Returns nil if the command does not exist -+func (a *App) Command(name string) *Command { -+ for _, c := range a.Commands { -+ if c.HasName(name) { -+ return &c -+ } -+ } -+ -+ return nil -+} -+ -+func (a *App) hasFlag(flag Flag) bool { -+ for _, f := range a.Flags { -+ if flag == f { -+ return true -+ } -+ } -+ -+ return false -+} -+ -+func (a *App) appendFlag(flag Flag) { -+ if !a.hasFlag(flag) { -+ a.Flags = append(a.Flags, flag) -+ } -+} -diff -uNr docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/app_test.go docker-1/vendor/src/github.com/codegangsta/cli/app_test.go ---- docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/app_test.go 1969-12-31 19:00:00.000000000 -0500 -+++ docker-1/vendor/src/github.com/codegangsta/cli/app_test.go 2015-01-16 03:56:49.104152140 -0500 -@@ -0,0 +1,399 @@ -+package cli_test -+ -+import ( -+ "fmt" -+ "os" -+ "testing" -+ -+ "github.com/codegangsta/cli" -+) -+ -+func ExampleApp() { -+ // set args for examples sake -+ os.Args = []string{"greet", "--name", "Jeremy"} -+ -+ app := cli.NewApp() -+ app.Name = "greet" -+ app.Flags = []cli.Flag{ -+ cli.StringFlag{Name: "name", Value: "bob", Usage: "a name to say"}, -+ } -+ app.Action = func(c *cli.Context) { -+ fmt.Printf("Hello %v\n", c.String("name")) -+ } -+ app.Run(os.Args) -+ // Output: -+ // Hello Jeremy -+} -+ -+func ExampleAppSubcommand() { -+ // set args for examples sake -+ os.Args = []string{"say", "hi", "english", "--name", "Jeremy"} -+ app := cli.NewApp() -+ app.Name = "say" -+ app.Commands = []cli.Command{ -+ { -+ Name: "hello", -+ ShortName: "hi", -+ Usage: "use it to see a description", -+ Description: "This is how we describe hello the function", -+ Subcommands: []cli.Command{ -+ { -+ Name: "english", -+ ShortName: "en", -+ Usage: "sends a greeting in english", -+ Description: "greets someone in english", -+ Flags: []cli.Flag{ -+ cli.StringFlag{Name: "name", Value: "Bob", Usage: "Name of the person to greet"}, -+ }, -+ Action: func(c *cli.Context) { -+ fmt.Println("Hello,", c.String("name")) -+ }, -+ }, -+ }, -+ }, -+ } -+ -+ app.Run(os.Args) -+ // Output: -+ // Hello, Jeremy -+} -+ -+func ExampleAppHelp() { -+ // set args for examples sake -+ os.Args = []string{"greet", "h", "describeit"} -+ -+ app := cli.NewApp() -+ app.Name = "greet" -+ app.Flags = []cli.Flag{ -+ cli.StringFlag{Name: "name", Value: "bob", Usage: "a name to say"}, -+ } -+ app.Commands = []cli.Command{ -+ { -+ Name: "describeit", -+ ShortName: "d", -+ Usage: "use it to see a description", -+ Description: "This is how we describe describeit the function", -+ Action: func(c *cli.Context) { -+ fmt.Printf("i like to describe things") -+ }, -+ }, -+ } -+ app.Run(os.Args) -+ // Output: -+ // NAME: -+ // describeit - use it to see a description -+ // -+ // USAGE: -+ // command describeit [arguments...] -+ // -+ // DESCRIPTION: -+ // This is how we describe describeit the function -+} -+ -+func ExampleAppBashComplete() { -+ // set args for examples sake -+ os.Args = []string{"greet", "--generate-bash-completion"} -+ -+ app := cli.NewApp() -+ app.Name = "greet" -+ app.EnableBashCompletion = true -+ app.Commands = []cli.Command{ -+ { -+ Name: "describeit", -+ ShortName: "d", -+ Usage: "use it to see a description", -+ Description: "This is how we describe describeit the function", -+ Action: func(c *cli.Context) { -+ fmt.Printf("i like to describe things") -+ }, -+ }, { -+ Name: "next", -+ Usage: "next example", -+ Description: "more stuff to see when generating bash completion", -+ Action: func(c *cli.Context) { -+ fmt.Printf("the next example") -+ }, -+ }, -+ } -+ -+ app.Run(os.Args) -+ // Output: -+ // describeit -+ // d -+ // next -+ // help -+ // h -+} -+ -+func TestApp_Run(t *testing.T) { -+ s := "" -+ -+ app := cli.NewApp() -+ app.Action = func(c *cli.Context) { -+ s = s + c.Args().First() -+ } -+ -+ err := app.Run([]string{"command", "foo"}) -+ expect(t, err, nil) -+ err = app.Run([]string{"command", "bar"}) -+ expect(t, err, nil) -+ expect(t, s, "foobar") -+} -+ -+var commandAppTests = []struct { -+ name string -+ expected bool -+}{ -+ {"foobar", true}, -+ {"batbaz", true}, -+ {"b", true}, -+ {"f", true}, -+ {"bat", false}, -+ {"nothing", false}, -+} -+ -+func TestApp_Command(t *testing.T) { -+ app := cli.NewApp() -+ fooCommand := cli.Command{Name: "foobar", ShortName: "f"} -+ batCommand := cli.Command{Name: "batbaz", ShortName: "b"} -+ app.Commands = []cli.Command{ -+ fooCommand, -+ batCommand, -+ } -+ -+ for _, test := range commandAppTests { -+ expect(t, app.Command(test.name) != nil, test.expected) -+ } -+} -+ -+func TestApp_CommandWithArgBeforeFlags(t *testing.T) { -+ var parsedOption, firstArg string -+ -+ app := cli.NewApp() -+ command := cli.Command{ -+ Name: "cmd", -+ Flags: []cli.Flag{ -+ cli.StringFlag{Name: "option", Value: "", Usage: "some option"}, -+ }, -+ Action: func(c *cli.Context) { -+ parsedOption = c.String("option") -+ firstArg = c.Args().First() -+ }, -+ } -+ app.Commands = []cli.Command{command} -+ -+ app.Run([]string{"", "cmd", "my-arg", "--option", "my-option"}) -+ -+ expect(t, parsedOption, "my-option") -+ expect(t, firstArg, "my-arg") -+} -+ -+func TestApp_Float64Flag(t *testing.T) { -+ var meters float64 -+ -+ app := cli.NewApp() -+ app.Flags = []cli.Flag{ -+ cli.Float64Flag{Name: "height", Value: 1.5, Usage: "Set the height, in meters"}, -+ } -+ app.Action = func(c *cli.Context) { -+ meters = c.Float64("height") -+ } -+ -+ app.Run([]string{"", "--height", "1.93"}) -+ expect(t, meters, 1.93) -+} -+ -+func TestApp_ParseSliceFlags(t *testing.T) { -+ var parsedOption, firstArg string -+ var parsedIntSlice []int -+ var parsedStringSlice []string -+ -+ app := cli.NewApp() -+ command := cli.Command{ -+ Name: "cmd", -+ Flags: []cli.Flag{ -+ cli.IntSliceFlag{Name: "p", Value: &cli.IntSlice{}, Usage: "set one or more ip addr"}, -+ cli.StringSliceFlag{Name: "ip", Value: &cli.StringSlice{}, Usage: "set one or more ports to open"}, -+ }, -+ Action: func(c *cli.Context) { -+ parsedIntSlice = c.IntSlice("p") -+ parsedStringSlice = c.StringSlice("ip") -+ parsedOption = c.String("option") -+ firstArg = c.Args().First() -+ }, -+ } -+ app.Commands = []cli.Command{command} -+ -+ app.Run([]string{"", "cmd", "my-arg", "-p", "22", "-p", "80", "-ip", "8.8.8.8", "-ip", "8.8.4.4"}) -+ -+ IntsEquals := func(a, b []int) bool { -+ if len(a) != len(b) { -+ return false -+ } -+ for i, v := range a { -+ if v != b[i] { -+ return false -+ } -+ } -+ return true -+ } -+ -+ StrsEquals := func(a, b []string) bool { -+ if len(a) != len(b) { -+ return false -+ } -+ for i, v := range a { -+ if v != b[i] { -+ return false -+ } -+ } -+ return true -+ } -+ var expectedIntSlice = []int{22, 80} -+ var expectedStringSlice = []string{"8.8.8.8", "8.8.4.4"} -+ -+ if !IntsEquals(parsedIntSlice, expectedIntSlice) { -+ t.Errorf("%v does not match %v", parsedIntSlice, expectedIntSlice) -+ } -+ -+ if !StrsEquals(parsedStringSlice, expectedStringSlice) { -+ t.Errorf("%v does not match %v", parsedStringSlice, expectedStringSlice) -+ } -+} -+ -+func TestApp_BeforeFunc(t *testing.T) { -+ beforeRun, subcommandRun := false, false -+ beforeError := fmt.Errorf("fail") -+ var err error -+ -+ app := cli.NewApp() -+ -+ app.Before = func(c *cli.Context) error { -+ beforeRun = true -+ s := c.String("opt") -+ if s == "fail" { -+ return beforeError -+ } -+ -+ return nil -+ } -+ -+ app.Commands = []cli.Command{ -+ cli.Command{ -+ Name: "sub", -+ Action: func(c *cli.Context) { -+ subcommandRun = true -+ }, -+ }, -+ } -+ -+ app.Flags = []cli.Flag{ -+ cli.StringFlag{Name: "opt"}, -+ } -+ -+ // run with the Before() func succeeding -+ err = app.Run([]string{"command", "--opt", "succeed", "sub"}) -+ -+ if err != nil { -+ t.Fatalf("Run error: %s", err) -+ } -+ -+ if beforeRun == false { -+ t.Errorf("Before() not executed when expected") -+ } -+ -+ if subcommandRun == false { -+ t.Errorf("Subcommand not executed when expected") -+ } -+ -+ // reset -+ beforeRun, subcommandRun = false, false -+ -+ // run with the Before() func failing -+ err = app.Run([]string{"command", "--opt", "fail", "sub"}) -+ -+ // should be the same error produced by the Before func -+ if err != beforeError { -+ t.Errorf("Run error expected, but not received") -+ } -+ -+ if beforeRun == false { -+ t.Errorf("Before() not executed when expected") -+ } -+ -+ if subcommandRun == true { -+ t.Errorf("Subcommand executed when NOT expected") -+ } -+ -+} -+ -+func TestAppHelpPrinter(t *testing.T) { -+ oldPrinter := cli.HelpPrinter -+ defer func() { -+ cli.HelpPrinter = oldPrinter -+ }() -+ -+ var wasCalled = false -+ cli.HelpPrinter = func(template string, data interface{}) { -+ wasCalled = true -+ } -+ -+ app := cli.NewApp() -+ app.Run([]string{"-h"}) -+ -+ if wasCalled == false { -+ t.Errorf("Help printer expected to be called, but was not") -+ } -+} -+ -+func TestAppCommandNotFound(t *testing.T) { -+ beforeRun, subcommandRun := false, false -+ app := cli.NewApp() -+ -+ app.CommandNotFound = func(c *cli.Context, command string) { -+ beforeRun = true -+ } -+ -+ app.Commands = []cli.Command{ -+ cli.Command{ -+ Name: "bar", -+ Action: func(c *cli.Context) { -+ subcommandRun = true -+ }, -+ }, -+ } -+ -+ app.Run([]string{"command", "foo"}) -+ -+ expect(t, beforeRun, true) -+ expect(t, subcommandRun, false) -+} -+ -+func TestGlobalFlagsInSubcommands(t *testing.T) { -+ subcommandRun := false -+ app := cli.NewApp() -+ -+ app.Flags = []cli.Flag{ -+ cli.BoolFlag{Name: "debug, d", Usage: "Enable debugging"}, -+ } -+ -+ app.Commands = []cli.Command{ -+ cli.Command{ -+ Name: "foo", -+ Subcommands: []cli.Command{ -+ { -+ Name: "bar", -+ Action: func(c *cli.Context) { -+ if c.GlobalBool("debug") { -+ subcommandRun = true -+ } -+ }, -+ }, -+ }, -+ }, -+ } -+ -+ app.Run([]string{"command", "-d", "foo", "bar"}) -+ -+ expect(t, subcommandRun, true) -+} -diff -uNr docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/autocomplete/bash_autocomplete docker-1/vendor/src/github.com/codegangsta/cli/autocomplete/bash_autocomplete ---- docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/autocomplete/bash_autocomplete 1969-12-31 19:00:00.000000000 -0500 -+++ docker-1/vendor/src/github.com/codegangsta/cli/autocomplete/bash_autocomplete 2015-01-16 03:56:49.103152140 -0500 -@@ -0,0 +1,13 @@ -+#! /bin/bash -+ -+_cli_bash_autocomplete() { -+ local cur prev opts base -+ COMPREPLY=() -+ cur="${COMP_WORDS[COMP_CWORD]}" -+ prev="${COMP_WORDS[COMP_CWORD-1]}" -+ opts=$( ${COMP_WORDS[@]:0:COMP_CWORD} --generate-bash-completion ) -+ COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) -+ return 0 -+ } -+ -+ complete -F _cli_bash_autocomplete $PROG -\ No newline at end of file -diff -uNr docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/cli.go docker-1/vendor/src/github.com/codegangsta/cli/cli.go ---- docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/cli.go 1969-12-31 19:00:00.000000000 -0500 -+++ docker-1/vendor/src/github.com/codegangsta/cli/cli.go 2015-01-16 03:56:49.104152140 -0500 -@@ -0,0 +1,19 @@ -+// Package cli provides a minimal framework for creating and organizing command line -+// Go applications. cli is designed to be easy to understand and write, the most simple -+// cli application can be written as follows: -+// func main() { -+// cli.NewApp().Run(os.Args) -+// } -+// -+// Of course this application does not do much, so let's make this an actual application: -+// func main() { -+// app := cli.NewApp() -+// app.Name = "greet" -+// app.Usage = "say a greeting" -+// app.Action = func(c *cli.Context) { -+// println("Greetings") -+// } -+// -+// app.Run(os.Args) -+// } -+package cli -diff -uNr docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/cli_test.go docker-1/vendor/src/github.com/codegangsta/cli/cli_test.go ---- docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/cli_test.go 1969-12-31 19:00:00.000000000 -0500 -+++ docker-1/vendor/src/github.com/codegangsta/cli/cli_test.go 2015-01-16 03:56:49.105152140 -0500 -@@ -0,0 +1,88 @@ -+package cli_test -+ -+import ( -+ "os" -+ -+ "github.com/codegangsta/cli" -+) -+ -+func Example() { -+ app := cli.NewApp() -+ app.Name = "todo" -+ app.Usage = "task list on the command line" -+ app.Commands = []cli.Command{ -+ { -+ Name: "add", -+ ShortName: "a", -+ Usage: "add a task to the list", -+ Action: func(c *cli.Context) { -+ println("added task: ", c.Args().First()) -+ }, -+ }, -+ { -+ Name: "complete", -+ ShortName: "c", -+ Usage: "complete a task on the list", -+ Action: func(c *cli.Context) { -+ println("completed task: ", c.Args().First()) -+ }, -+ }, -+ } -+ -+ app.Run(os.Args) -+} -+ -+func ExampleSubcommand() { -+ app := cli.NewApp() -+ app.Name = "say" -+ app.Commands = []cli.Command{ -+ { -+ Name: "hello", -+ ShortName: "hi", -+ Usage: "use it to see a description", -+ Description: "This is how we describe hello the function", -+ Subcommands: []cli.Command{ -+ { -+ Name: "english", -+ ShortName: "en", -+ Usage: "sends a greeting in english", -+ Description: "greets someone in english", -+ Flags: []cli.Flag{ -+ cli.StringFlag{Name: "name", Value: "Bob", Usage: "Name of the person to greet"}, -+ }, -+ Action: func(c *cli.Context) { -+ println("Hello, ", c.String("name")) -+ }, -+ }, { -+ Name: "spanish", -+ ShortName: "sp", -+ Usage: "sends a greeting in spanish", -+ Flags: []cli.Flag{ -+ cli.StringFlag{Name: "surname", Value: "Jones", Usage: "Surname of the person to greet"}, -+ }, -+ Action: func(c *cli.Context) { -+ println("Hola, ", c.String("surname")) -+ }, -+ }, { -+ Name: "french", -+ ShortName: "fr", -+ Usage: "sends a greeting in french", -+ Flags: []cli.Flag{ -+ cli.StringFlag{Name: "nickname", Value: "Stevie", Usage: "Nickname of the person to greet"}, -+ }, -+ Action: func(c *cli.Context) { -+ println("Bonjour, ", c.String("nickname")) -+ }, -+ }, -+ }, -+ }, { -+ Name: "bye", -+ Usage: "says goodbye", -+ Action: func(c *cli.Context) { -+ println("bye") -+ }, -+ }, -+ } -+ -+ app.Run(os.Args) -+} -diff -uNr docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/command.go docker-1/vendor/src/github.com/codegangsta/cli/command.go ---- docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/command.go 1969-12-31 19:00:00.000000000 -0500 -+++ docker-1/vendor/src/github.com/codegangsta/cli/command.go 2015-01-16 03:56:49.105152140 -0500 -@@ -0,0 +1,141 @@ -+package cli -+ -+import ( -+ "fmt" -+ "io/ioutil" -+ "strings" -+) -+ -+// Command is a subcommand for a cli.App. -+type Command struct { -+ // The name of the command -+ Name string -+ // short name of the command. Typically one character -+ ShortName string -+ // A short description of the usage of this command -+ Usage string -+ // A longer explanation of how the command works -+ Description string -+ // The function to call when checking for bash command completions -+ BashComplete func(context *Context) -+ // An action to execute before any sub-subcommands are run, but after the context is ready -+ // If a non-nil error is returned, no sub-subcommands are run -+ Before func(context *Context) error -+ // The function to call when this command is invoked -+ Action func(context *Context) -+ // List of child commands -+ Subcommands []Command -+ // List of flags to parse -+ Flags []Flag -+ // Treat all flags as normal arguments if true -+ SkipFlagParsing bool -+ // Boolean to hide built-in help command -+ HideHelp bool -+} -+ -+// Invokes the command given the context, parses ctx.Args() to generate command-specific flags -+func (c Command) Run(ctx *Context) error { -+ -+ if len(c.Subcommands) > 0 || c.Before != nil { -+ return c.startApp(ctx) -+ } -+ -+ if !c.HideHelp { -+ // append help to flags -+ c.Flags = append( -+ c.Flags, -+ HelpFlag, -+ ) -+ } -+ -+ if ctx.App.EnableBashCompletion { -+ c.Flags = append(c.Flags, BashCompletionFlag) -+ } -+ -+ set := flagSet(c.Name, c.Flags) -+ set.SetOutput(ioutil.Discard) -+ -+ firstFlagIndex := -1 -+ for index, arg := range ctx.Args() { -+ if strings.HasPrefix(arg, "-") { -+ firstFlagIndex = index -+ break -+ } -+ } -+ -+ var err error -+ if firstFlagIndex > -1 && !c.SkipFlagParsing { -+ args := ctx.Args() -+ regularArgs := args[1:firstFlagIndex] -+ flagArgs := args[firstFlagIndex:] -+ err = set.Parse(append(flagArgs, regularArgs...)) -+ } else { -+ err = set.Parse(ctx.Args().Tail()) -+ } -+ -+ if err != nil { -+ fmt.Printf("Incorrect Usage.\n\n") -+ ShowCommandHelp(ctx, c.Name) -+ fmt.Println("") -+ return err -+ } -+ -+ nerr := normalizeFlags(c.Flags, set) -+ if nerr != nil { -+ fmt.Println(nerr) -+ fmt.Println("") -+ ShowCommandHelp(ctx, c.Name) -+ fmt.Println("") -+ return nerr -+ } -+ context := NewContext(ctx.App, set, ctx.globalSet) -+ -+ if checkCommandCompletions(context, c.Name) { -+ return nil -+ } -+ -+ if checkCommandHelp(context, c.Name) { -+ return nil -+ } -+ context.Command = c -+ c.Action(context) -+ return nil -+} -+ -+// Returns true if Command.Name or Command.ShortName matches given name -+func (c Command) HasName(name string) bool { -+ return c.Name == name || c.ShortName == name -+} -+ -+func (c Command) startApp(ctx *Context) error { -+ app := NewApp() -+ -+ // set the name and usage -+ app.Name = fmt.Sprintf("%s %s", ctx.App.Name, c.Name) -+ if c.Description != "" { -+ app.Usage = c.Description -+ } else { -+ app.Usage = c.Usage -+ } -+ -+ // set the flags and commands -+ app.Commands = c.Subcommands -+ app.Flags = c.Flags -+ app.HideHelp = c.HideHelp -+ -+ // bash completion -+ app.EnableBashCompletion = ctx.App.EnableBashCompletion -+ if c.BashComplete != nil { -+ app.BashComplete = c.BashComplete -+ } -+ -+ // set the actions -+ app.Before = c.Before -+ if c.Action != nil { -+ app.Action = c.Action -+ } else { -+ app.Action = helpSubcommand.Action -+ } -+ -+ return app.RunAsSubcommand(ctx) -+} -diff -uNr docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/command_test.go docker-1/vendor/src/github.com/codegangsta/cli/command_test.go ---- docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/command_test.go 1969-12-31 19:00:00.000000000 -0500 -+++ docker-1/vendor/src/github.com/codegangsta/cli/command_test.go 2015-01-16 03:56:49.104152140 -0500 -@@ -0,0 +1,48 @@ -+package cli_test -+ -+import ( -+ "flag" -+ "github.com/codegangsta/cli" -+ "testing" -+) -+ -+func TestCommandDoNotIgnoreFlags(t *testing.T) { -+ app := cli.NewApp() -+ set := flag.NewFlagSet("test", 0) -+ test := []string{"blah", "blah", "-break"} -+ set.Parse(test) -+ -+ c := cli.NewContext(app, set, set) -+ -+ command := cli.Command { -+ Name: "test-cmd", -+ ShortName: "tc", -+ Usage: "this is for testing", -+ Description: "testing", -+ Action: func(_ *cli.Context) { }, -+ } -+ err := command.Run(c) -+ -+ expect(t, err.Error(), "flag provided but not defined: -break") -+} -+ -+func TestCommandIgnoreFlags(t *testing.T) { -+ app := cli.NewApp() -+ set := flag.NewFlagSet("test", 0) -+ test := []string{"blah", "blah"} -+ set.Parse(test) -+ -+ c := cli.NewContext(app, set, set) -+ -+ command := cli.Command { -+ Name: "test-cmd", -+ ShortName: "tc", -+ Usage: "this is for testing", -+ Description: "testing", -+ Action: func(_ *cli.Context) { }, -+ SkipFlagParsing: true, -+ } -+ err := command.Run(c) -+ -+ expect(t, err, nil) -+} -diff -uNr docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/context.go docker-1/vendor/src/github.com/codegangsta/cli/context.go ---- docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/context.go 1969-12-31 19:00:00.000000000 -0500 -+++ docker-1/vendor/src/github.com/codegangsta/cli/context.go 2015-01-16 03:56:49.104152140 -0500 -@@ -0,0 +1,280 @@ -+package cli -+ -+import ( -+ "errors" -+ "flag" -+ "strconv" -+ "strings" -+) -+ -+// Context is a type that is passed through to -+// each Handler action in a cli application. Context -+// can be used to retrieve context-specific Args and -+// parsed command-line options. -+type Context struct { -+ App *App -+ Command Command -+ flagSet *flag.FlagSet -+ globalSet *flag.FlagSet -+ setFlags map[string]bool -+} -+ -+// Creates a new context. For use in when invoking an App or Command action. -+func NewContext(app *App, set *flag.FlagSet, globalSet *flag.FlagSet) *Context { -+ return &Context{App: app, flagSet: set, globalSet: globalSet} -+} -+ -+// Looks up the value of a local int flag, returns 0 if no int flag exists -+func (c *Context) Int(name string) int { -+ return lookupInt(name, c.flagSet) -+} -+ -+// Looks up the value of a local float64 flag, returns 0 if no float64 flag exists -+func (c *Context) Float64(name string) float64 { -+ return lookupFloat64(name, c.flagSet) -+} -+ -+// Looks up the value of a local bool flag, returns false if no bool flag exists -+func (c *Context) Bool(name string) bool { -+ return lookupBool(name, c.flagSet) -+} -+ -+// Looks up the value of a local boolT flag, returns false if no bool flag exists -+func (c *Context) BoolT(name string) bool { -+ return lookupBoolT(name, c.flagSet) -+} -+ -+// Looks up the value of a local string flag, returns "" if no string flag exists -+func (c *Context) String(name string) string { -+ return lookupString(name, c.flagSet) -+} -+ -+// Looks up the value of a local string slice flag, returns nil if no string slice flag exists -+func (c *Context) StringSlice(name string) []string { -+ return lookupStringSlice(name, c.flagSet) -+} -+ -+// Looks up the value of a local int slice flag, returns nil if no int slice flag exists -+func (c *Context) IntSlice(name string) []int { -+ return lookupIntSlice(name, c.flagSet) -+} -+ -+// Looks up the value of a local generic flag, returns nil if no generic flag exists -+func (c *Context) Generic(name string) interface{} { -+ return lookupGeneric(name, c.flagSet) -+} -+ -+// Looks up the value of a global int flag, returns 0 if no int flag exists -+func (c *Context) GlobalInt(name string) int { -+ return lookupInt(name, c.globalSet) -+} -+ -+// Looks up the value of a global bool flag, returns false if no bool flag exists -+func (c *Context) GlobalBool(name string) bool { -+ return lookupBool(name, c.globalSet) -+} -+ -+// Looks up the value of a global string flag, returns "" if no string flag exists -+func (c *Context) GlobalString(name string) string { -+ return lookupString(name, c.globalSet) -+} -+ -+// Looks up the value of a global string slice flag, returns nil if no string slice flag exists -+func (c *Context) GlobalStringSlice(name string) []string { -+ return lookupStringSlice(name, c.globalSet) -+} -+ -+// Looks up the value of a global int slice flag, returns nil if no int slice flag exists -+func (c *Context) GlobalIntSlice(name string) []int { -+ return lookupIntSlice(name, c.globalSet) -+} -+ -+// Looks up the value of a global generic flag, returns nil if no generic flag exists -+func (c *Context) GlobalGeneric(name string) interface{} { -+ return lookupGeneric(name, c.globalSet) -+} -+ -+// Determines if the flag was actually set exists -+func (c *Context) IsSet(name string) bool { -+ if c.setFlags == nil { -+ c.setFlags = make(map[string]bool) -+ c.flagSet.Visit(func(f *flag.Flag) { -+ c.setFlags[f.Name] = true -+ }) -+ } -+ return c.setFlags[name] == true -+} -+ -+type Args []string -+ -+// Returns the command line arguments associated with the context. -+func (c *Context) Args() Args { -+ args := Args(c.flagSet.Args()) -+ return args -+} -+ -+// Returns the nth argument, or else a blank string -+func (a Args) Get(n int) string { -+ if len(a) > n { -+ return a[n] -+ } -+ return "" -+} -+ -+// Returns the first argument, or else a blank string -+func (a Args) First() string { -+ return a.Get(0) -+} -+ -+// Return the rest of the arguments (not the first one) -+// or else an empty string slice -+func (a Args) Tail() []string { -+ if len(a) >= 2 { -+ return []string(a)[1:] -+ } -+ return []string{} -+} -+ -+// Checks if there are any arguments present -+func (a Args) Present() bool { -+ return len(a) != 0 -+} -+ -+// Swaps arguments at the given indexes -+func (a Args) Swap(from, to int) error { -+ if from >= len(a) || to >= len(a) { -+ return errors.New("index out of range") -+ } -+ a[from], a[to] = a[to], a[from] -+ return nil -+} -+ -+func lookupInt(name string, set *flag.FlagSet) int { -+ f := set.Lookup(name) -+ if f != nil { -+ val, err := strconv.Atoi(f.Value.String()) -+ if err != nil { -+ return 0 -+ } -+ return val -+ } -+ -+ return 0 -+} -+ -+func lookupFloat64(name string, set *flag.FlagSet) float64 { -+ f := set.Lookup(name) -+ if f != nil { -+ val, err := strconv.ParseFloat(f.Value.String(), 64) -+ if err != nil { -+ return 0 -+ } -+ return val -+ } -+ -+ return 0 -+} -+ -+func lookupString(name string, set *flag.FlagSet) string { -+ f := set.Lookup(name) -+ if f != nil { -+ return f.Value.String() -+ } -+ -+ return "" -+} -+ -+func lookupStringSlice(name string, set *flag.FlagSet) []string { -+ f := set.Lookup(name) -+ if f != nil { -+ return (f.Value.(*StringSlice)).Value() -+ -+ } -+ -+ return nil -+} -+ -+func lookupIntSlice(name string, set *flag.FlagSet) []int { -+ f := set.Lookup(name) -+ if f != nil { -+ return (f.Value.(*IntSlice)).Value() -+ -+ } -+ -+ return nil -+} -+ -+func lookupGeneric(name string, set *flag.FlagSet) interface{} { -+ f := set.Lookup(name) -+ if f != nil { -+ return f.Value -+ } -+ return nil -+} -+ -+func lookupBool(name string, set *flag.FlagSet) bool { -+ f := set.Lookup(name) -+ if f != nil { -+ val, err := strconv.ParseBool(f.Value.String()) -+ if err != nil { -+ return false -+ } -+ return val -+ } -+ -+ return false -+} -+ -+func lookupBoolT(name string, set *flag.FlagSet) bool { -+ f := set.Lookup(name) -+ if f != nil { -+ val, err := strconv.ParseBool(f.Value.String()) -+ if err != nil { -+ return true -+ } -+ return val -+ } -+ -+ return false -+} -+ -+func copyFlag(name string, ff *flag.Flag, set *flag.FlagSet) { -+ switch ff.Value.(type) { -+ case *StringSlice: -+ default: -+ set.Set(name, ff.Value.String()) -+ } -+} -+ -+func normalizeFlags(flags []Flag, set *flag.FlagSet) error { -+ visited := make(map[string]bool) -+ set.Visit(func(f *flag.Flag) { -+ visited[f.Name] = true -+ }) -+ for _, f := range flags { -+ parts := strings.Split(f.getName(), ",") -+ if len(parts) == 1 { -+ continue -+ } -+ var ff *flag.Flag -+ for _, name := range parts { -+ name = strings.Trim(name, " ") -+ if visited[name] { -+ if ff != nil { -+ return errors.New("Cannot use two forms of the same flag: " + name + " " + ff.Name) -+ } -+ ff = set.Lookup(name) -+ } -+ } -+ if ff == nil { -+ continue -+ } -+ for _, name := range parts { -+ name = strings.Trim(name, " ") -+ if !visited[name] { -+ copyFlag(name, ff, set) -+ } -+ } -+ } -+ return nil -+} -diff -uNr docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/context_test.go docker-1/vendor/src/github.com/codegangsta/cli/context_test.go ---- docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/context_test.go 1969-12-31 19:00:00.000000000 -0500 -+++ docker-1/vendor/src/github.com/codegangsta/cli/context_test.go 2015-01-16 03:56:49.104152140 -0500 -@@ -0,0 +1,68 @@ -+package cli_test -+ -+import ( -+ "flag" -+ "github.com/codegangsta/cli" -+ "testing" -+) -+ -+func TestNewContext(t *testing.T) { -+ set := flag.NewFlagSet("test", 0) -+ set.Int("myflag", 12, "doc") -+ globalSet := flag.NewFlagSet("test", 0) -+ globalSet.Int("myflag", 42, "doc") -+ command := cli.Command{Name: "mycommand"} -+ c := cli.NewContext(nil, set, globalSet) -+ c.Command = command -+ expect(t, c.Int("myflag"), 12) -+ expect(t, c.GlobalInt("myflag"), 42) -+ expect(t, c.Command.Name, "mycommand") -+} -+ -+func TestContext_Int(t *testing.T) { -+ set := flag.NewFlagSet("test", 0) -+ set.Int("myflag", 12, "doc") -+ c := cli.NewContext(nil, set, set) -+ expect(t, c.Int("myflag"), 12) -+} -+ -+func TestContext_String(t *testing.T) { -+ set := flag.NewFlagSet("test", 0) -+ set.String("myflag", "hello world", "doc") -+ c := cli.NewContext(nil, set, set) -+ expect(t, c.String("myflag"), "hello world") -+} -+ -+func TestContext_Bool(t *testing.T) { -+ set := flag.NewFlagSet("test", 0) -+ set.Bool("myflag", false, "doc") -+ c := cli.NewContext(nil, set, set) -+ expect(t, c.Bool("myflag"), false) -+} -+ -+func TestContext_BoolT(t *testing.T) { -+ set := flag.NewFlagSet("test", 0) -+ set.Bool("myflag", true, "doc") -+ c := cli.NewContext(nil, set, set) -+ expect(t, c.BoolT("myflag"), true) -+} -+ -+func TestContext_Args(t *testing.T) { -+ set := flag.NewFlagSet("test", 0) -+ set.Bool("myflag", false, "doc") -+ c := cli.NewContext(nil, set, set) -+ set.Parse([]string{"--myflag", "bat", "baz"}) -+ expect(t, len(c.Args()), 2) -+ expect(t, c.Bool("myflag"), true) -+} -+ -+func TestContext_IsSet(t *testing.T) { -+ set := flag.NewFlagSet("test", 0) -+ set.Bool("myflag", false, "doc") -+ set.String("otherflag", "hello world", "doc") -+ c := cli.NewContext(nil, set, set) -+ set.Parse([]string{"--myflag", "bat", "baz"}) -+ expect(t, c.IsSet("myflag"), true) -+ expect(t, c.IsSet("otherflag"), false) -+ expect(t, c.IsSet("bogusflag"), false) -+} -diff -uNr docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/flag.go docker-1/vendor/src/github.com/codegangsta/cli/flag.go ---- docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/flag.go 1969-12-31 19:00:00.000000000 -0500 -+++ docker-1/vendor/src/github.com/codegangsta/cli/flag.go 2015-01-16 03:56:49.103152140 -0500 -@@ -0,0 +1,280 @@ -+package cli -+ -+import ( -+ "flag" -+ "fmt" -+ "strconv" -+ "strings" -+) -+ -+// This flag enables bash-completion for all commands and subcommands -+var BashCompletionFlag = BoolFlag{"generate-bash-completion", ""} -+ -+// This flag prints the version for the application -+var VersionFlag = BoolFlag{"version, v", "print the version"} -+ -+// This flag prints the help for all commands and subcommands -+var HelpFlag = BoolFlag{"help, h", "show help"} -+ -+// Flag is a common interface related to parsing flags in cli. -+// For more advanced flag parsing techniques, it is recomended that -+// this interface be implemented. -+type Flag interface { -+ fmt.Stringer -+ // Apply Flag settings to the given flag set -+ Apply(*flag.FlagSet) -+ getName() string -+} -+ -+func flagSet(name string, flags []Flag) *flag.FlagSet { -+ set := flag.NewFlagSet(name, flag.ContinueOnError) -+ -+ for _, f := range flags { -+ f.Apply(set) -+ } -+ return set -+} -+ -+func eachName(longName string, fn func(string)) { -+ parts := strings.Split(longName, ",") -+ for _, name := range parts { -+ name = strings.Trim(name, " ") -+ fn(name) -+ } -+} -+ -+// Generic is a generic parseable type identified by a specific flag -+type Generic interface { -+ Set(value string) error -+ String() string -+} -+ -+// GenericFlag is the flag type for types implementing Generic -+type GenericFlag struct { -+ Name string -+ Value Generic -+ Usage string -+} -+ -+func (f GenericFlag) String() string { -+ return fmt.Sprintf("%s%s %v\t`%v` %s", prefixFor(f.Name), f.Name, f.Value, "-"+f.Name+" option -"+f.Name+" option", f.Usage) -+} -+ -+func (f GenericFlag) Apply(set *flag.FlagSet) { -+ eachName(f.Name, func(name string) { -+ set.Var(f.Value, name, f.Usage) -+ }) -+} -+ -+func (f GenericFlag) getName() string { -+ return f.Name -+} -+ -+type StringSlice []string -+ -+func (f *StringSlice) Set(value string) error { -+ *f = append(*f, value) -+ return nil -+} -+ -+func (f *StringSlice) String() string { -+ return fmt.Sprintf("%s", *f) -+} -+ -+func (f *StringSlice) Value() []string { -+ return *f -+} -+ -+type StringSliceFlag struct { -+ Name string -+ Value *StringSlice -+ Usage string -+} -+ -+func (f StringSliceFlag) String() string { -+ firstName := strings.Trim(strings.Split(f.Name, ",")[0], " ") -+ pref := prefixFor(firstName) -+ return fmt.Sprintf("%s '%v'\t%v", prefixedNames(f.Name), pref+firstName+" option "+pref+firstName+" option", f.Usage) -+} -+ -+func (f StringSliceFlag) Apply(set *flag.FlagSet) { -+ eachName(f.Name, func(name string) { -+ set.Var(f.Value, name, f.Usage) -+ }) -+} -+ -+func (f StringSliceFlag) getName() string { -+ return f.Name -+} -+ -+type IntSlice []int -+ -+func (f *IntSlice) Set(value string) error { -+ -+ tmp, err := strconv.Atoi(value) -+ if err != nil { -+ return err -+ } else { -+ *f = append(*f, tmp) -+ } -+ return nil -+} -+ -+func (f *IntSlice) String() string { -+ return fmt.Sprintf("%d", *f) -+} -+ -+func (f *IntSlice) Value() []int { -+ return *f -+} -+ -+type IntSliceFlag struct { -+ Name string -+ Value *IntSlice -+ Usage string -+} -+ -+func (f IntSliceFlag) String() string { -+ firstName := strings.Trim(strings.Split(f.Name, ",")[0], " ") -+ pref := prefixFor(firstName) -+ return fmt.Sprintf("%s '%v'\t%v", prefixedNames(f.Name), pref+firstName+" option "+pref+firstName+" option", f.Usage) -+} -+ -+func (f IntSliceFlag) Apply(set *flag.FlagSet) { -+ eachName(f.Name, func(name string) { -+ set.Var(f.Value, name, f.Usage) -+ }) -+} -+ -+func (f IntSliceFlag) getName() string { -+ return f.Name -+} -+ -+type BoolFlag struct { -+ Name string -+ Usage string -+} -+ -+func (f BoolFlag) String() string { -+ return fmt.Sprintf("%s\t%v", prefixedNames(f.Name), f.Usage) -+} -+ -+func (f BoolFlag) Apply(set *flag.FlagSet) { -+ eachName(f.Name, func(name string) { -+ set.Bool(name, false, f.Usage) -+ }) -+} -+ -+func (f BoolFlag) getName() string { -+ return f.Name -+} -+ -+type BoolTFlag struct { -+ Name string -+ Usage string -+} -+ -+func (f BoolTFlag) String() string { -+ return fmt.Sprintf("%s\t%v", prefixedNames(f.Name), f.Usage) -+} -+ -+func (f BoolTFlag) Apply(set *flag.FlagSet) { -+ eachName(f.Name, func(name string) { -+ set.Bool(name, true, f.Usage) -+ }) -+} -+ -+func (f BoolTFlag) getName() string { -+ return f.Name -+} -+ -+type StringFlag struct { -+ Name string -+ Value string -+ Usage string -+} -+ -+func (f StringFlag) String() string { -+ var fmtString string -+ fmtString = "%s %v\t%v" -+ -+ if len(f.Value) > 0 { -+ fmtString = "%s '%v'\t%v" -+ } else { -+ fmtString = "%s %v\t%v" -+ } -+ -+ return fmt.Sprintf(fmtString, prefixedNames(f.Name), f.Value, f.Usage) -+} -+ -+func (f StringFlag) Apply(set *flag.FlagSet) { -+ eachName(f.Name, func(name string) { -+ set.String(name, f.Value, f.Usage) -+ }) -+} -+ -+func (f StringFlag) getName() string { -+ return f.Name -+} -+ -+type IntFlag struct { -+ Name string -+ Value int -+ Usage string -+} -+ -+func (f IntFlag) String() string { -+ return fmt.Sprintf("%s '%v'\t%v", prefixedNames(f.Name), f.Value, f.Usage) -+} -+ -+func (f IntFlag) Apply(set *flag.FlagSet) { -+ eachName(f.Name, func(name string) { -+ set.Int(name, f.Value, f.Usage) -+ }) -+} -+ -+func (f IntFlag) getName() string { -+ return f.Name -+} -+ -+type Float64Flag struct { -+ Name string -+ Value float64 -+ Usage string -+} -+ -+func (f Float64Flag) String() string { -+ return fmt.Sprintf("%s '%v'\t%v", prefixedNames(f.Name), f.Value, f.Usage) -+} -+ -+func (f Float64Flag) Apply(set *flag.FlagSet) { -+ eachName(f.Name, func(name string) { -+ set.Float64(name, f.Value, f.Usage) -+ }) -+} -+ -+func (f Float64Flag) getName() string { -+ return f.Name -+} -+ -+func prefixFor(name string) (prefix string) { -+ if len(name) == 1 { -+ prefix = "-" -+ } else { -+ prefix = "--" -+ } -+ -+ return -+} -+ -+func prefixedNames(fullName string) (prefixed string) { -+ parts := strings.Split(fullName, ",") -+ for i, name := range parts { -+ name = strings.Trim(name, " ") -+ prefixed += prefixFor(name) + name -+ if i < len(parts)-1 { -+ prefixed += ", " -+ } -+ } -+ return -+} -diff -uNr docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/flag_test.go docker-1/vendor/src/github.com/codegangsta/cli/flag_test.go ---- docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/flag_test.go 1969-12-31 19:00:00.000000000 -0500 -+++ docker-1/vendor/src/github.com/codegangsta/cli/flag_test.go 2015-01-16 03:56:49.103152140 -0500 -@@ -0,0 +1,194 @@ -+package cli_test -+ -+import ( -+ "github.com/codegangsta/cli" -+ -+ "fmt" -+ "reflect" -+ "strings" -+ "testing" -+) -+ -+var boolFlagTests = []struct { -+ name string -+ expected string -+}{ -+ {"help", "--help\t"}, -+ {"h", "-h\t"}, -+} -+ -+func TestBoolFlagHelpOutput(t *testing.T) { -+ -+ for _, test := range boolFlagTests { -+ flag := cli.BoolFlag{Name: test.name} -+ output := flag.String() -+ -+ if output != test.expected { -+ t.Errorf("%s does not match %s", output, test.expected) -+ } -+ } -+} -+ -+var stringFlagTests = []struct { -+ name string -+ value string -+ expected string -+}{ -+ {"help", "", "--help \t"}, -+ {"h", "", "-h \t"}, -+ {"h", "", "-h \t"}, -+ {"test", "Something", "--test 'Something'\t"}, -+} -+ -+func TestStringFlagHelpOutput(t *testing.T) { -+ -+ for _, test := range stringFlagTests { -+ flag := cli.StringFlag{Name: test.name, Value: test.value} -+ output := flag.String() -+ -+ if output != test.expected { -+ t.Errorf("%s does not match %s", output, test.expected) -+ } -+ } -+} -+ -+var intFlagTests = []struct { -+ name string -+ expected string -+}{ -+ {"help", "--help '0'\t"}, -+ {"h", "-h '0'\t"}, -+} -+ -+func TestIntFlagHelpOutput(t *testing.T) { -+ -+ for _, test := range intFlagTests { -+ flag := cli.IntFlag{Name: test.name} -+ output := flag.String() -+ -+ if output != test.expected { -+ t.Errorf("%s does not match %s", output, test.expected) -+ } -+ } -+} -+ -+var float64FlagTests = []struct { -+ name string -+ expected string -+}{ -+ {"help", "--help '0'\t"}, -+ {"h", "-h '0'\t"}, -+} -+ -+func TestFloat64FlagHelpOutput(t *testing.T) { -+ -+ for _, test := range float64FlagTests { -+ flag := cli.Float64Flag{Name: test.name} -+ output := flag.String() -+ -+ if output != test.expected { -+ t.Errorf("%s does not match %s", output, test.expected) -+ } -+ } -+} -+ -+func TestParseMultiString(t *testing.T) { -+ (&cli.App{ -+ Flags: []cli.Flag{ -+ cli.StringFlag{Name: "serve, s"}, -+ }, -+ Action: func(ctx *cli.Context) { -+ if ctx.String("serve") != "10" { -+ t.Errorf("main name not set") -+ } -+ if ctx.String("s") != "10" { -+ t.Errorf("short name not set") -+ } -+ }, -+ }).Run([]string{"run", "-s", "10"}) -+} -+ -+func TestParseMultiStringSlice(t *testing.T) { -+ (&cli.App{ -+ Flags: []cli.Flag{ -+ cli.StringSliceFlag{Name: "serve, s", Value: &cli.StringSlice{}}, -+ }, -+ Action: func(ctx *cli.Context) { -+ if !reflect.DeepEqual(ctx.StringSlice("serve"), []string{"10", "20"}) { -+ t.Errorf("main name not set") -+ } -+ if !reflect.DeepEqual(ctx.StringSlice("s"), []string{"10", "20"}) { -+ t.Errorf("short name not set") -+ } -+ }, -+ }).Run([]string{"run", "-s", "10", "-s", "20"}) -+} -+ -+func TestParseMultiInt(t *testing.T) { -+ a := cli.App{ -+ Flags: []cli.Flag{ -+ cli.IntFlag{Name: "serve, s"}, -+ }, -+ Action: func(ctx *cli.Context) { -+ if ctx.Int("serve") != 10 { -+ t.Errorf("main name not set") -+ } -+ if ctx.Int("s") != 10 { -+ t.Errorf("short name not set") -+ } -+ }, -+ } -+ a.Run([]string{"run", "-s", "10"}) -+} -+ -+func TestParseMultiBool(t *testing.T) { -+ a := cli.App{ -+ Flags: []cli.Flag{ -+ cli.BoolFlag{Name: "serve, s"}, -+ }, -+ Action: func(ctx *cli.Context) { -+ if ctx.Bool("serve") != true { -+ t.Errorf("main name not set") -+ } -+ if ctx.Bool("s") != true { -+ t.Errorf("short name not set") -+ } -+ }, -+ } -+ a.Run([]string{"run", "--serve"}) -+} -+ -+type Parser [2]string -+ -+func (p *Parser) Set(value string) error { -+ parts := strings.Split(value, ",") -+ if len(parts) != 2 { -+ return fmt.Errorf("invalid format") -+ } -+ -+ (*p)[0] = parts[0] -+ (*p)[1] = parts[1] -+ -+ return nil -+} -+ -+func (p *Parser) String() string { -+ return fmt.Sprintf("%s,%s", p[0], p[1]) -+} -+ -+func TestParseGeneric(t *testing.T) { -+ a := cli.App{ -+ Flags: []cli.Flag{ -+ cli.GenericFlag{Name: "serve, s", Value: &Parser{}}, -+ }, -+ Action: func(ctx *cli.Context) { -+ if !reflect.DeepEqual(ctx.Generic("serve"), &Parser{"10", "20"}) { -+ t.Errorf("main name not set") -+ } -+ if !reflect.DeepEqual(ctx.Generic("s"), &Parser{"10", "20"}) { -+ t.Errorf("short name not set") -+ } -+ }, -+ } -+ a.Run([]string{"run", "-s", "10,20"}) -+} -diff -uNr docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/helpers_test.go docker-1/vendor/src/github.com/codegangsta/cli/helpers_test.go ---- docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/helpers_test.go 1969-12-31 19:00:00.000000000 -0500 -+++ docker-1/vendor/src/github.com/codegangsta/cli/helpers_test.go 2015-01-16 03:56:49.104152140 -0500 -@@ -0,0 +1,19 @@ -+package cli_test -+ -+import ( -+ "reflect" -+ "testing" -+) -+ -+/* Test Helpers */ -+func expect(t *testing.T, a interface{}, b interface{}) { -+ if a != b { -+ t.Errorf("Expected %v (type %v) - Got %v (type %v)", b, reflect.TypeOf(b), a, reflect.TypeOf(a)) -+ } -+} -+ -+func refute(t *testing.T, a interface{}, b interface{}) { -+ if a == b { -+ t.Errorf("Did not expect %v (type %v) - Got %v (type %v)", b, reflect.TypeOf(b), a, reflect.TypeOf(a)) -+ } -+} -diff -uNr docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/help.go docker-1/vendor/src/github.com/codegangsta/cli/help.go ---- docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/help.go 1969-12-31 19:00:00.000000000 -0500 -+++ docker-1/vendor/src/github.com/codegangsta/cli/help.go 2015-01-16 03:56:49.104152140 -0500 -@@ -0,0 +1,213 @@ -+package cli -+ -+import ( -+ "fmt" -+ "os" -+ "text/tabwriter" -+ "text/template" -+) -+ -+// The text template for the Default help topic. -+// cli.go uses text/template to render templates. You can -+// render custom help text by setting this variable. -+var AppHelpTemplate = `NAME: -+ {{.Name}} - {{.Usage}} -+ -+USAGE: -+ {{.Name}} {{ if .Flags }}[global options] {{ end }}command{{ if .Flags }} [command options]{{ end }} [arguments...] -+ -+VERSION: -+ {{.Version}} -+ -+COMMANDS: -+ {{range .Commands}}{{.Name}}{{with .ShortName}}, {{.}}{{end}}{{ "\t" }}{{.Usage}} -+ {{end}}{{ if .Flags }} -+GLOBAL OPTIONS: -+ {{range .Flags}}{{.}} -+ {{end}}{{ end }} -+` -+ -+// The text template for the command help topic. -+// cli.go uses text/template to render templates. You can -+// render custom help text by setting this variable. -+var CommandHelpTemplate = `NAME: -+ {{.Name}} - {{.Usage}} -+ -+USAGE: -+ command {{.Name}}{{ if .Flags }} [command options]{{ end }} [arguments...] -+ -+DESCRIPTION: -+ {{.Description}}{{ if .Flags }} -+ -+OPTIONS: -+ {{range .Flags}}{{.}} -+ {{end}}{{ end }} -+` -+ -+// The text template for the subcommand help topic. -+// cli.go uses text/template to render templates. You can -+// render custom help text by setting this variable. -+var SubcommandHelpTemplate = `NAME: -+ {{.Name}} - {{.Usage}} -+ -+USAGE: -+ {{.Name}} command{{ if .Flags }} [command options]{{ end }} [arguments...] -+ -+COMMANDS: -+ {{range .Commands}}{{.Name}}{{with .ShortName}}, {{.}}{{end}}{{ "\t" }}{{.Usage}} -+ {{end}}{{ if .Flags }} -+OPTIONS: -+ {{range .Flags}}{{.}} -+ {{end}}{{ end }} -+` -+ -+var helpCommand = Command{ -+ Name: "help", -+ ShortName: "h", -+ Usage: "Shows a list of commands or help for one command", -+ Action: func(c *Context) { -+ args := c.Args() -+ if args.Present() { -+ ShowCommandHelp(c, args.First()) -+ } else { -+ ShowAppHelp(c) -+ } -+ }, -+} -+ -+var helpSubcommand = Command{ -+ Name: "help", -+ ShortName: "h", -+ Usage: "Shows a list of commands or help for one command", -+ Action: func(c *Context) { -+ args := c.Args() -+ if args.Present() { -+ ShowCommandHelp(c, args.First()) -+ } else { -+ ShowSubcommandHelp(c) -+ } -+ }, -+} -+ -+// Prints help for the App -+var HelpPrinter = printHelp -+ -+func ShowAppHelp(c *Context) { -+ HelpPrinter(AppHelpTemplate, c.App) -+} -+ -+// Prints the list of subcommands as the default app completion method -+func DefaultAppComplete(c *Context) { -+ for _, command := range c.App.Commands { -+ fmt.Println(command.Name) -+ if command.ShortName != "" { -+ fmt.Println(command.ShortName) -+ } -+ } -+} -+ -+// Prints help for the given command -+func ShowCommandHelp(c *Context, command string) { -+ for _, c := range c.App.Commands { -+ if c.HasName(command) { -+ HelpPrinter(CommandHelpTemplate, c) -+ return -+ } -+ } -+ -+ if c.App.CommandNotFound != nil { -+ c.App.CommandNotFound(c, command) -+ } else { -+ fmt.Printf("No help topic for '%v'\n", command) -+ } -+} -+ -+// Prints help for the given subcommand -+func ShowSubcommandHelp(c *Context) { -+ HelpPrinter(SubcommandHelpTemplate, c.App) -+} -+ -+// Prints the version number of the App -+func ShowVersion(c *Context) { -+ fmt.Printf("%v version %v\n", c.App.Name, c.App.Version) -+} -+ -+// Prints the lists of commands within a given context -+func ShowCompletions(c *Context) { -+ a := c.App -+ if a != nil && a.BashComplete != nil { -+ a.BashComplete(c) -+ } -+} -+ -+// Prints the custom completions for a given command -+func ShowCommandCompletions(ctx *Context, command string) { -+ c := ctx.App.Command(command) -+ if c != nil && c.BashComplete != nil { -+ c.BashComplete(ctx) -+ } -+} -+ -+func printHelp(templ string, data interface{}) { -+ w := tabwriter.NewWriter(os.Stdout, 0, 8, 1, '\t', 0) -+ t := template.Must(template.New("help").Parse(templ)) -+ err := t.Execute(w, data) -+ if err != nil { -+ panic(err) -+ } -+ w.Flush() -+} -+ -+func checkVersion(c *Context) bool { -+ if c.GlobalBool("version") { -+ ShowVersion(c) -+ return true -+ } -+ -+ return false -+} -+ -+func checkHelp(c *Context) bool { -+ if c.GlobalBool("h") || c.GlobalBool("help") { -+ ShowAppHelp(c) -+ return true -+ } -+ -+ return false -+} -+ -+func checkCommandHelp(c *Context, name string) bool { -+ if c.Bool("h") || c.Bool("help") { -+ ShowCommandHelp(c, name) -+ return true -+ } -+ -+ return false -+} -+ -+func checkSubcommandHelp(c *Context) bool { -+ if c.GlobalBool("h") || c.GlobalBool("help") { -+ ShowSubcommandHelp(c) -+ return true -+ } -+ -+ return false -+} -+ -+func checkCompletions(c *Context) bool { -+ if c.GlobalBool(BashCompletionFlag.Name) && c.App.EnableBashCompletion { -+ ShowCompletions(c) -+ return true -+ } -+ -+ return false -+} -+ -+func checkCommandCompletions(c *Context, name string) bool { -+ if c.Bool(BashCompletionFlag.Name) && c.App.EnableBashCompletion { -+ ShowCommandCompletions(c, name) -+ return true -+ } -+ -+ return false -+} -diff -uNr docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/LICENSE docker-1/vendor/src/github.com/codegangsta/cli/LICENSE ---- docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/LICENSE 1969-12-31 19:00:00.000000000 -0500 -+++ docker-1/vendor/src/github.com/codegangsta/cli/LICENSE 2015-01-16 03:56:49.105152140 -0500 -@@ -0,0 +1,21 @@ -+Copyright (C) 2013 Jeremy Saenz -+All Rights Reserved. -+ -+MIT LICENSE -+ -+Permission is hereby granted, free of charge, to any person obtaining a copy of -+this software and associated documentation files (the "Software"), to deal in -+the Software without restriction, including without limitation the rights to -+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -+the Software, and to permit persons to whom the Software is furnished to do so, -+subject to the following conditions: -+ -+The above copyright notice and this permission notice shall be included in all -+copies or substantial portions of the Software. -+ -+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -diff -uNr docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/README.md docker-1/vendor/src/github.com/codegangsta/cli/README.md ---- docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/README.md 1969-12-31 19:00:00.000000000 -0500 -+++ docker-1/vendor/src/github.com/codegangsta/cli/README.md 2015-01-16 03:56:49.105152140 -0500 -@@ -0,0 +1,257 @@ -+[![Build Status](https://travis-ci.org/codegangsta/cli.png?branch=master)](https://travis-ci.org/codegangsta/cli) -+ -+# cli.go -+cli.go is simple, fast, and fun package for building command line apps in Go. The goal is to enable developers to write fast and distributable command line applications in an expressive way. -+ -+You can view the API docs here: -+http://godoc.org/github.com/codegangsta/cli -+ -+## Overview -+Command line apps are usually so tiny that there is absolutely no reason why your code should *not* be self-documenting. Things like generating help text and parsing command flags/options should not hinder productivity when writing a command line app. -+ -+This is where cli.go comes into play. cli.go makes command line programming fun, organized, and expressive! -+ -+## Installation -+Make sure you have a working Go environment (go 1.1 is *required*). [See the install instructions](http://golang.org/doc/install.html). -+ -+To install cli.go, simply run: -+``` -+$ go get github.com/codegangsta/cli -+``` -+ -+Make sure your PATH includes to the `$GOPATH/bin` directory so your commands can be easily used: -+``` -+export PATH=$PATH:$GOPATH/bin -+``` -+ -+## Getting Started -+One of the philosophies behind cli.go is that an API should be playful and full of discovery. So a cli.go app can be as little as one line of code in `main()`. -+ -+``` go -+package main -+ -+import ( -+ "os" -+ "github.com/codegangsta/cli" -+) -+ -+func main() { -+ cli.NewApp().Run(os.Args) -+} -+``` -+ -+This app will run and show help text, but is not very useful. Let's give an action to execute and some help documentation: -+ -+``` go -+package main -+ -+import ( -+ "os" -+ "github.com/codegangsta/cli" -+) -+ -+func main() { -+ app := cli.NewApp() -+ app.Name = "boom" -+ app.Usage = "make an explosive entrance" -+ app.Action = func(c *cli.Context) { -+ println("boom! I say!") -+ } -+ -+ app.Run(os.Args) -+} -+``` -+ -+Running this already gives you a ton of functionality, plus support for things like subcommands and flags, which are covered below. -+ -+## Example -+ -+Being a programmer can be a lonely job. Thankfully by the power of automation that is not the case! Let's create a greeter app to fend off our demons of loneliness! -+ -+``` go -+/* greet.go */ -+package main -+ -+import ( -+ "os" -+ "github.com/codegangsta/cli" -+) -+ -+func main() { -+ app := cli.NewApp() -+ app.Name = "greet" -+ app.Usage = "fight the loneliness!" -+ app.Action = func(c *cli.Context) { -+ println("Hello friend!") -+ } -+ -+ app.Run(os.Args) -+} -+``` -+ -+Install our command to the `$GOPATH/bin` directory: -+ -+``` -+$ go install -+``` -+ -+Finally run our new command: -+ -+``` -+$ greet -+Hello friend! -+``` -+ -+cli.go also generates some bitchass help text: -+``` -+$ greet help -+NAME: -+ greet - fight the loneliness! -+ -+USAGE: -+ greet [global options] command [command options] [arguments...] -+ -+VERSION: -+ 0.0.0 -+ -+COMMANDS: -+ help, h Shows a list of commands or help for one command -+ -+GLOBAL OPTIONS -+ --version Shows version information -+``` -+ -+### Arguments -+You can lookup arguments by calling the `Args` function on cli.Context. -+ -+``` go -+... -+app.Action = func(c *cli.Context) { -+ println("Hello", c.Args()[0]) -+} -+... -+``` -+ -+### Flags -+Setting and querying flags is simple. -+``` go -+... -+app.Flags = []cli.Flag { -+ cli.StringFlag{Name: "lang", Value: "english", Usage: "language for the greeting"}, -+} -+app.Action = func(c *cli.Context) { -+ name := "someone" -+ if len(c.Args()) > 0 { -+ name = c.Args()[0] -+ } -+ if c.String("lang") == "spanish" { -+ println("Hola", name) -+ } else { -+ println("Hello", name) -+ } -+} -+... -+``` -+ -+#### Alternate Names -+ -+You can set alternate (or short) names for flags by providing a comma-delimited list for the Name. e.g. -+ -+``` go -+app.Flags = []cli.Flag { -+ cli.StringFlag{Name: "lang, l", Value: "english", Usage: "language for the greeting"}, -+} -+``` -+ -+That flag can then be set with `--lang spanish` or `-l spanish`. Note that giving two different forms of the same flag in the same command invocation is an error. -+ -+### Subcommands -+ -+Subcommands can be defined for a more git-like command line app. -+```go -+... -+app.Commands = []cli.Command{ -+ { -+ Name: "add", -+ ShortName: "a", -+ Usage: "add a task to the list", -+ Action: func(c *cli.Context) { -+ println("added task: ", c.Args().First()) -+ }, -+ }, -+ { -+ Name: "complete", -+ ShortName: "c", -+ Usage: "complete a task on the list", -+ Action: func(c *cli.Context) { -+ println("completed task: ", c.Args().First()) -+ }, -+ }, -+ { -+ Name: "template", -+ ShortName: "r", -+ Usage: "options for task templates", -+ Subcommands: []cli.Command{ -+ { -+ Name: "add", -+ Usage: "add a new template", -+ Action: func(c *cli.Context) { -+ println("new task template: ", c.Args().First()) -+ }, -+ }, -+ { -+ Name: "remove", -+ Usage: "remove an existing template", -+ Action: func(c *cli.Context) { -+ println("removed task template: ", c.Args().First()) -+ }, -+ }, -+ }, -+ }, -+} -+... -+``` -+ -+### Bash Completion -+ -+You can enable completion commands by setting the EnableBashCompletion -+flag on the App object. By default, this setting will only auto-complete to -+show an app's subcommands, but you can write your own completion methods for -+the App or its subcommands. -+```go -+... -+var tasks = []string{"cook", "clean", "laundry", "eat", "sleep", "code"} -+app := cli.NewApp() -+app.EnableBashCompletion = true -+app.Commands = []cli.Command{ -+ { -+ Name: "complete", -+ ShortName: "c", -+ Usage: "complete a task on the list", -+ Action: func(c *cli.Context) { -+ println("completed task: ", c.Args().First()) -+ }, -+ BashComplete: func(c *cli.Context) { -+ // This will complete if no args are passed -+ if len(c.Args()) > 0 { -+ return -+ } -+ for _, t := range tasks { -+ println(t) -+ } -+ }, -+ } -+} -+... -+``` -+ -+#### To Enable -+ -+Source the autocomplete/bash_autocomplete file in your .bashrc file while -+setting the PROG variable to the name of your program: -+ -+`PROG=myprogram source /.../cli/autocomplete/bash_autocomplete` -+ -+ -+## About -+cli.go is written by none other than the [Code Gangsta](http://codegangsta.io) -diff -uNr docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/.travis.yml docker-1/vendor/src/github.com/codegangsta/cli/.travis.yml ---- docker-6ee24211b4111e0b1e1bd7a46c5a3c4ced1b2ffa/vendor/src/github.com/codegangsta/cli/.travis.yml 1969-12-31 19:00:00.000000000 -0500 -+++ docker-1/vendor/src/github.com/codegangsta/cli/.travis.yml 2015-01-16 03:56:49.104152140 -0500 -@@ -0,0 +1,6 @@ -+language: go -+go: 1.1 -+ -+script: -+- go vet ./... -+- go test -v ./... diff --git a/SOURCES/dev.patch b/SOURCES/dev.patch new file mode 100644 index 0000000..b7c19d2 --- /dev/null +++ b/SOURCES/dev.patch @@ -0,0 +1,78 @@ +From 40b0f129f5a6e005a949dc0ba808fb9ee557ebe4 Mon Sep 17 00:00:00 2001 +From: Mrunal Patel +Date: Fri, 9 Oct 2015 17:57:44 -0400 +Subject: [PATCH] Cherry pick changes for allowing /dev mount from host + +docker #16639 + +runc commit id c9d58506297e + +Signed-off-by: Mrunal Patel +--- + daemon/execdriver/native/create.go | 1 + + .../runc/libcontainer/rootfs_linux.go | 26 +++++++++++++--------- + 2 files changed, 17 insertions(+), 10 deletions(-) + +diff --git a/daemon/execdriver/native/create.go b/daemon/execdriver/native/create.go +index bbc83fe..ca8d7fd 100644 +--- a/daemon/execdriver/native/create.go ++++ b/daemon/execdriver/native/create.go +@@ -234,6 +234,7 @@ func (d *driver) setupMounts(container *configs.Config, c *execdriver.Command) e + for _, m := range container.Mounts { + if _, ok := userMounts[m.Destination]; !ok { + if mountDev && strings.HasPrefix(m.Destination, "/dev/") { ++ container.Devices = nil + continue + } + defaultMounts = append(defaultMounts, m) +diff --git a/vendor/src/github.com/opencontainers/runc/libcontainer/rootfs_linux.go b/vendor/src/github.com/opencontainers/runc/libcontainer/rootfs_linux.go +index a211d8d..9fd7058 100644 +--- a/vendor/src/github.com/opencontainers/runc/libcontainer/rootfs_linux.go ++++ b/vendor/src/github.com/opencontainers/runc/libcontainer/rootfs_linux.go +@@ -27,6 +27,8 @@ func setupRootfs(config *configs.Config, console *linuxConsole) (err error) { + if err := prepareRoot(config); err != nil { + return newSystemError(err) + } ++ ++ setupDev := len(config.Devices) == 0 + for _, m := range config.Mounts { + for _, precmd := range m.PremountCmds { + if err := mountCmd(precmd); err != nil { +@@ -43,14 +45,16 @@ func setupRootfs(config *configs.Config, console *linuxConsole) (err error) { + } + } + } +- if err := createDevices(config); err != nil { +- return newSystemError(err) +- } +- if err := setupPtmx(config, console); err != nil { +- return newSystemError(err) +- } +- if err := setupDevSymlinks(config.Rootfs); err != nil { +- return newSystemError(err) ++ if !setupDev { ++ if err := createDevices(config); err != nil { ++ return newSystemError(err) ++ } ++ if err := setupPtmx(config, console); err != nil { ++ return newSystemError(err) ++ } ++ if err := setupDevSymlinks(config.Rootfs); err != nil { ++ return newSystemError(err) ++ } + } + if err := syscall.Chdir(config.Rootfs); err != nil { + return newSystemError(err) +@@ -63,8 +67,10 @@ func setupRootfs(config *configs.Config, console *linuxConsole) (err error) { + if err != nil { + return newSystemError(err) + } +- if err := reOpenDevNull(config.Rootfs); err != nil { +- return newSystemError(err) ++ if !setupDev { ++ if err := reOpenDevNull(config.Rootfs); err != nil { ++ return newSystemError(err) ++ } + } + if config.Readonlyfs { + if err := setReadonly(); err != nil { diff --git a/SOURCES/docker-logrotate.sh b/SOURCES/docker-logrotate.sh index 27fb979..f6fc50c 100644 --- a/SOURCES/docker-logrotate.sh +++ b/SOURCES/docker-logrotate.sh @@ -5,7 +5,7 @@ LOGROTATE=true if [ $LOGROTATE == true ]; then for id in $(docker ps -q); do - exec $(docker exec $id logrotate -s /var/log/logstatus /etc/logrotate.conf > /dev/null 2&>1) + exec $(docker exec $id logrotate -s /var/log/logstatus /etc/logrotate.conf > /dev/null 2>&1) done fi exit 0 diff --git a/SOURCES/docker-py-remove-lock.patch b/SOURCES/docker-py-remove-lock.patch deleted file mode 100644 index 596a056..0000000 --- a/SOURCES/docker-py-remove-lock.patch +++ /dev/null @@ -1,43 +0,0 @@ -From cb75275827e762a716a15459bb540a423f1fed3c Mon Sep 17 00:00:00 2001 -From: Lokesh Mandvekar -Date: Wed, 8 Jul 2015 12:04:17 -0500 -Subject: [PATCH] remove lock - -atomic doesn't work on rhel without this :( - -Signed-off-by: Lokesh Mandvekar ---- - docker/unixconn/unixconn.py | 17 ++++++++--------- - 1 file changed, 8 insertions(+), 9 deletions(-) - -diff --git a/docker/unixconn/unixconn.py b/docker/unixconn/unixconn.py -index 551bd29..4c4c8e5 100644 ---- a/docker/unixconn/unixconn.py -+++ b/docker/unixconn/unixconn.py -@@ -68,15 +68,14 @@ class UnixAdapter(requests.adapters.HTTPAdapter): - super(UnixAdapter, self).__init__() - - def get_connection(self, url, proxies=None): -- with self.pools.lock: -- pool = self.pools.get(url) -- if pool: -- return pool -- -- pool = UnixHTTPConnectionPool(url, -- self.socket_path, -- self.timeout) -- self.pools[url] = pool -+ pool = self.pools.get(url) -+ if pool: -+ return pool -+ -+ pool = UnixHTTPConnectionPool(url, -+ self.socket_path, -+ self.timeout) -+ self.pools[url] = pool - - return pool - --- -2.4.5 - diff --git a/SOURCES/docker.service b/SOURCES/docker.service index c93bfdc..7a19251 100644 --- a/SOURCES/docker.service +++ b/SOURCES/docker.service @@ -10,7 +10,7 @@ EnvironmentFile=-/etc/sysconfig/docker EnvironmentFile=-/etc/sysconfig/docker-storage EnvironmentFile=-/etc/sysconfig/docker-network Environment=GOTRACEBACK=crash -ExecStart=/usr/bin/docker -d $OPTIONS \ +ExecStart=/usr/bin/docker daemon $OPTIONS \ $DOCKER_STORAGE_OPTIONS \ $DOCKER_NETWORK_OPTIONS \ $ADD_REGISTRY \ @@ -20,6 +20,7 @@ LimitNOFILE=1048576 LimitNPROC=1048576 LimitCORE=infinity MountFlags=slave +TimeoutStartSec=1min [Install] WantedBy=multi-user.target diff --git a/SOURCES/docker.sysconfig b/SOURCES/docker.sysconfig index 6e83766..196c66f 100644 --- a/SOURCES/docker.sysconfig +++ b/SOURCES/docker.sysconfig @@ -9,7 +9,7 @@ DOCKER_CERT_PATH=/etc/docker # pull use the ADD_REGISTRY option to list a set of registries, each prepended # with --add-registry flag. The first registry added will be the first registry # searched. -# ADD_REGISTRY='--add-registry registry.access.redhat.com' +ADD_REGISTRY='--add-registry registry.access.redhat.com' # If you want to block registries from being used, uncomment the BLOCK_REGISTRY # option and give it a set of registries, each prepended with --block-registry diff --git a/SOURCES/go-md2man.patch b/SOURCES/go-md2man.patch deleted file mode 100644 index 00c0cca..0000000 --- a/SOURCES/go-md2man.patch +++ /dev/null @@ -1,12414 +0,0 @@ -From 4e3b8e37a34c9b6678320e6fcdad686fb481a58f Mon Sep 17 00:00:00 2001 -From: Lokesh Mandvekar -Date: Thu, 30 Apr 2015 10:35:34 -0400 -Subject: [PATCH] include updated go-md2man and deps - -Signed-off-by: Lokesh Mandvekar ---- - .../src/github.com/cpuguy83/go-md2man/LICENSE.md | 21 + - vendor/src/github.com/cpuguy83/go-md2man/README.md | 11 + - .../github.com/cpuguy83/go-md2man/go-md2man.1.md | 21 + - .../github.com/cpuguy83/go-md2man/mangen/mangen.go | 272 ++++ - vendor/src/github.com/cpuguy83/go-md2man/md2man.go | 55 + - .../github.com/russross/blackfriday/.travis.yml | 17 + - .../github.com/russross/blackfriday/LICENSE.txt | 29 + - .../src/github.com/russross/blackfriday/README.md | 246 ++++ - .../src/github.com/russross/blackfriday/block.go | 1339 ++++++++++++++++++++ - .../github.com/russross/blackfriday/block_test.go | 1296 +++++++++++++++++++ - vendor/src/github.com/russross/blackfriday/html.go | 922 ++++++++++++++ - .../src/github.com/russross/blackfriday/inline.go | 1096 ++++++++++++++++ - .../github.com/russross/blackfriday/inline_test.go | 958 ++++++++++++++ - .../src/github.com/russross/blackfriday/latex.go | 332 +++++ - .../github.com/russross/blackfriday/markdown.go | 838 ++++++++++++ - .../github.com/russross/blackfriday/ref_test.go | 128 ++ - .../github.com/russross/blackfriday/smartypants.go | 398 ++++++ - .../testdata/Amps and angle encoding.html | 17 + - .../testdata/Amps and angle encoding.text | 21 + - .../russross/blackfriday/testdata/Auto links.html | 18 + - .../russross/blackfriday/testdata/Auto links.text | 13 + - .../blackfriday/testdata/Backslash escapes.html | 123 ++ - .../blackfriday/testdata/Backslash escapes.text | 126 ++ - .../testdata/Blockquotes with code blocks.html | 15 + - .../testdata/Blockquotes with code blocks.text | 11 + - .../russross/blackfriday/testdata/Code Blocks.html | 18 + - .../russross/blackfriday/testdata/Code Blocks.text | 14 + - .../russross/blackfriday/testdata/Code Spans.html | 5 + - .../russross/blackfriday/testdata/Code Spans.text | 6 + - ...list-like lines no empty line before block.html | 14 + - ...list-like lines no empty line before block.text | 8 + - ...rd-wrapped paragraphs with list-like lines.html | 8 + - ...rd-wrapped paragraphs with list-like lines.text | 8 + - .../blackfriday/testdata/Horizontal rules.html | 71 ++ - .../blackfriday/testdata/Horizontal rules.text | 67 + - .../testdata/Inline HTML (Advanced).html | 15 + - .../testdata/Inline HTML (Advanced).text | 15 + - .../blackfriday/testdata/Inline HTML (Simple).html | 72 ++ - .../blackfriday/testdata/Inline HTML (Simple).text | 69 + - .../blackfriday/testdata/Inline HTML comments.html | 13 + - .../blackfriday/testdata/Inline HTML comments.text | 13 + - .../blackfriday/testdata/Links, inline style.html | 11 + - .../blackfriday/testdata/Links, inline style.text | 12 + - .../testdata/Links, reference style.html | 52 + - .../testdata/Links, reference style.text | 71 ++ - .../testdata/Links, shortcut references.html | 9 + - .../testdata/Links, shortcut references.text | 20 + - .../testdata/Literal quotes in titles.html | 3 + - .../testdata/Literal quotes in titles.text | 7 + - .../testdata/Markdown Documentation - Basics.html | 314 +++++ - .../testdata/Markdown Documentation - Basics.text | 306 +++++ - .../testdata/Markdown Documentation - Syntax.html | 946 ++++++++++++++ - .../testdata/Markdown Documentation - Syntax.text | 888 +++++++++++++ - .../blackfriday/testdata/Nested blockquotes.html | 9 + - .../blackfriday/testdata/Nested blockquotes.text | 5 + - .../testdata/Ordered and unordered lists.html | 166 +++ - .../testdata/Ordered and unordered lists.text | 131 ++ - .../testdata/Strong and em together.html | 7 + - .../testdata/Strong and em together.text | 7 + - .../russross/blackfriday/testdata/Tabs.html | 26 + - .../russross/blackfriday/testdata/Tabs.text | 21 + - .../russross/blackfriday/testdata/Tidyness.html | 9 + - .../russross/blackfriday/testdata/Tidyness.text | 5 + - .../shurcooL/sanitized_anchor_name/.travis.yml | 10 + - .../shurcooL/sanitized_anchor_name/README.md | 25 + - .../shurcooL/sanitized_anchor_name/main.go | 29 + - .../shurcooL/sanitized_anchor_name/main_test.go | 35 + - 67 files changed, 11863 insertions(+) - create mode 100644 vendor/src/github.com/cpuguy83/go-md2man/LICENSE.md - create mode 100644 vendor/src/github.com/cpuguy83/go-md2man/README.md - create mode 100644 vendor/src/github.com/cpuguy83/go-md2man/go-md2man.1.md - create mode 100644 vendor/src/github.com/cpuguy83/go-md2man/mangen/mangen.go - create mode 100644 vendor/src/github.com/cpuguy83/go-md2man/md2man.go - create mode 100644 vendor/src/github.com/russross/blackfriday/.travis.yml - create mode 100644 vendor/src/github.com/russross/blackfriday/LICENSE.txt - create mode 100644 vendor/src/github.com/russross/blackfriday/README.md - create mode 100644 vendor/src/github.com/russross/blackfriday/block.go - create mode 100644 vendor/src/github.com/russross/blackfriday/block_test.go - create mode 100644 vendor/src/github.com/russross/blackfriday/html.go - create mode 100644 vendor/src/github.com/russross/blackfriday/inline.go - create mode 100644 vendor/src/github.com/russross/blackfriday/inline_test.go - create mode 100644 vendor/src/github.com/russross/blackfriday/latex.go - create mode 100644 vendor/src/github.com/russross/blackfriday/markdown.go - create mode 100644 vendor/src/github.com/russross/blackfriday/ref_test.go - create mode 100644 vendor/src/github.com/russross/blackfriday/smartypants.go - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Amps and angle encoding.html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Amps and angle encoding.text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Auto links.html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Auto links.text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Backslash escapes.html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Backslash escapes.text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Blockquotes with code blocks.html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Blockquotes with code blocks.text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Code Blocks.html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Code Blocks.text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Code Spans.html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Code Spans.text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines no empty line before block.html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines no empty line before block.text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines.html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines.text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Horizontal rules.html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Horizontal rules.text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Inline HTML (Advanced).html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Inline HTML (Advanced).text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Inline HTML (Simple).html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Inline HTML (Simple).text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Inline HTML comments.html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Inline HTML comments.text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Links, inline style.html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Links, inline style.text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Links, reference style.html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Links, reference style.text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Links, shortcut references.html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Links, shortcut references.text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Literal quotes in titles.html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Literal quotes in titles.text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Markdown Documentation - Basics.html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Markdown Documentation - Basics.text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Markdown Documentation - Syntax.html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Markdown Documentation - Syntax.text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Nested blockquotes.html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Nested blockquotes.text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Ordered and unordered lists.html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Ordered and unordered lists.text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Strong and em together.html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Strong and em together.text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Tabs.html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Tabs.text - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Tidyness.html - create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Tidyness.text - create mode 100644 vendor/src/github.com/shurcooL/sanitized_anchor_name/.travis.yml - create mode 100644 vendor/src/github.com/shurcooL/sanitized_anchor_name/README.md - create mode 100644 vendor/src/github.com/shurcooL/sanitized_anchor_name/main.go - create mode 100644 vendor/src/github.com/shurcooL/sanitized_anchor_name/main_test.go - -diff --git a/vendor/src/github.com/cpuguy83/go-md2man/LICENSE.md b/vendor/src/github.com/cpuguy83/go-md2man/LICENSE.md -new file mode 100644 -index 0000000..1cade6c ---- /dev/null -+++ b/vendor/src/github.com/cpuguy83/go-md2man/LICENSE.md -@@ -0,0 +1,21 @@ -+The MIT License (MIT) -+ -+Copyright (c) 2014 Brian Goff -+ -+Permission is hereby granted, free of charge, to any person obtaining a copy -+of this software and associated documentation files (the "Software"), to deal -+in the Software without restriction, including without limitation the rights -+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -+copies of the Software, and to permit persons to whom the Software is -+furnished to do so, subject to the following conditions: -+ -+The above copyright notice and this permission notice shall be included in all -+copies or substantial portions of the Software. -+ -+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -+SOFTWARE. -diff --git a/vendor/src/github.com/cpuguy83/go-md2man/README.md b/vendor/src/github.com/cpuguy83/go-md2man/README.md -new file mode 100644 -index 0000000..8eb4b2e ---- /dev/null -+++ b/vendor/src/github.com/cpuguy83/go-md2man/README.md -@@ -0,0 +1,11 @@ -+go-md2man -+========= -+ -+** Work in Progress ** -+This still needs a lot of help to be complete, or even usable! -+ -+Uses blackfriday to process markdown into man pages. -+ -+### Usage -+ -+./md2man -in /path/to/markdownfile.md -out /manfile/output/path -diff --git a/vendor/src/github.com/cpuguy83/go-md2man/go-md2man.1.md b/vendor/src/github.com/cpuguy83/go-md2man/go-md2man.1.md -new file mode 100644 -index 0000000..1f7096a ---- /dev/null -+++ b/vendor/src/github.com/cpuguy83/go-md2man/go-md2man.1.md -@@ -0,0 +1,21 @@ -+go-md2man 1 "January 2015" go-md2man "User Manual" -+================================================== -+ -+# NAME -+ go-md2man - Convert mardown files into manpages -+ -+# SYNOPSIS -+ go-md2man -in=[/path/to/md/file] -out=[/path/to/output] -+ -+# Description -+ go-md2man converts standard markdown formatted documents into manpages. It is -+ written purely in Go so as to reduce dependencies on 3rd party libs. -+ -+# Example -+ Convert the markdown file "go-md2man.1.md" into a manpage. -+ -+ go-md2man -in=README.md -out=go-md2man.1.out -+ -+# HISTORY -+ January 2015, Originally compiled by Brian Goff( cpuguy83@gmail.com ) -+ -diff --git a/vendor/src/github.com/cpuguy83/go-md2man/mangen/mangen.go b/vendor/src/github.com/cpuguy83/go-md2man/mangen/mangen.go -new file mode 100644 -index 0000000..d436eed ---- /dev/null -+++ b/vendor/src/github.com/cpuguy83/go-md2man/mangen/mangen.go -@@ -0,0 +1,272 @@ -+package mangen -+ -+import ( -+ "bytes" -+ "fmt" -+ "strings" -+ -+ "github.com/russross/blackfriday" -+) -+ -+type Man struct{} -+ -+func ManRenderer(flags int) blackfriday.Renderer { -+ return &Man{} -+} -+ -+func (m *Man) GetFlags() int { -+ return 0 -+} -+ -+func (m *Man) TitleBlock(out *bytes.Buffer, text []byte) { -+ out.WriteString(".TH ") -+ -+ splitText := bytes.Split(text, []byte("\n")) -+ for i, line := range splitText { -+ line = bytes.TrimPrefix(line, []byte("% ")) -+ if i == 0 { -+ line = bytes.Replace(line, []byte("("), []byte("\" \""), 1) -+ line = bytes.Replace(line, []byte(")"), []byte("\" \""), 1) -+ } -+ line = append([]byte("\""), line...) -+ line = append(line, []byte("\" ")...) -+ out.Write(line) -+ } -+ -+ out.WriteString(" \"\"\n") -+} -+ -+func (m *Man) BlockCode(out *bytes.Buffer, text []byte, lang string) { -+ out.WriteString("\n.PP\n.RS\n\n.nf\n") -+ escapeSpecialChars(out, text) -+ out.WriteString("\n.fi\n.RE\n") -+} -+ -+func (m *Man) BlockQuote(out *bytes.Buffer, text []byte) { -+ out.WriteString("\n.PP\n.RS\n") -+ out.Write(text) -+ out.WriteString("\n.RE\n") -+} -+ -+func (m *Man) BlockHtml(out *bytes.Buffer, text []byte) { -+ fmt.Errorf("man: BlockHtml not supported") -+ out.Write(text) -+} -+ -+func (m *Man) Header(out *bytes.Buffer, text func() bool, level int, id string) { -+ marker := out.Len() -+ -+ switch { -+ case marker == 0: -+ // This is the doc header -+ out.WriteString(".TH ") -+ case level == 1: -+ out.WriteString("\n\n.SH ") -+ case level == 2: -+ out.WriteString("\n.SH ") -+ default: -+ out.WriteString("\n.SS ") -+ } -+ -+ if !text() { -+ out.Truncate(marker) -+ return -+ } -+} -+ -+func (m *Man) HRule(out *bytes.Buffer) { -+ out.WriteString("\n.ti 0\n\\l'\\n(.lu'\n") -+} -+ -+func (m *Man) List(out *bytes.Buffer, text func() bool, flags int) { -+ marker := out.Len() -+ out.WriteString(".IP ") -+ if flags&blackfriday.LIST_TYPE_ORDERED != 0 { -+ out.WriteString("\\(bu 2") -+ } else { -+ out.WriteString("\\n+[step" + string(flags) + "]") -+ } -+ out.WriteString("\n") -+ if !text() { -+ out.Truncate(marker) -+ return -+ } -+ -+} -+ -+func (m *Man) ListItem(out *bytes.Buffer, text []byte, flags int) { -+ out.WriteString("\n\\item ") -+ out.Write(text) -+} -+ -+func (m *Man) Paragraph(out *bytes.Buffer, text func() bool) { -+ marker := out.Len() -+ out.WriteString("\n.PP\n") -+ if !text() { -+ out.Truncate(marker) -+ return -+ } -+ if marker != 0 { -+ out.WriteString("\n") -+ } -+} -+ -+// TODO: This might now work -+func (m *Man) Table(out *bytes.Buffer, header []byte, body []byte, columnData []int) { -+ out.WriteString(".TS\nallbox;\n") -+ -+ out.Write(header) -+ out.Write(body) -+ out.WriteString("\n.TE\n") -+} -+ -+func (m *Man) TableRow(out *bytes.Buffer, text []byte) { -+ if out.Len() > 0 { -+ out.WriteString("\n") -+ } -+ out.Write(text) -+ out.WriteString("\n") -+} -+ -+func (m *Man) TableHeaderCell(out *bytes.Buffer, text []byte, align int) { -+ if out.Len() > 0 { -+ out.WriteString(" ") -+ } -+ out.Write(text) -+ out.WriteString(" ") -+} -+ -+// TODO: This is probably broken -+func (m *Man) TableCell(out *bytes.Buffer, text []byte, align int) { -+ if out.Len() > 0 { -+ out.WriteString("\t") -+ } -+ out.Write(text) -+ out.WriteString("\t") -+} -+ -+func (m *Man) Footnotes(out *bytes.Buffer, text func() bool) { -+ -+} -+ -+func (m *Man) FootnoteItem(out *bytes.Buffer, name, text []byte, flags int) { -+ -+} -+ -+func (m *Man) AutoLink(out *bytes.Buffer, link []byte, kind int) { -+ out.WriteString("\n\\[la]") -+ out.Write(link) -+ out.WriteString("\\[ra]") -+} -+ -+func (m *Man) CodeSpan(out *bytes.Buffer, text []byte) { -+ out.WriteString("\\fB\\fC") -+ escapeSpecialChars(out, text) -+ out.WriteString("\\fR") -+} -+ -+func (m *Man) DoubleEmphasis(out *bytes.Buffer, text []byte) { -+ out.WriteString("\\fB") -+ out.Write(text) -+ out.WriteString("\\fP") -+} -+ -+func (m *Man) Emphasis(out *bytes.Buffer, text []byte) { -+ out.WriteString("\\fI") -+ out.Write(text) -+ out.WriteString("\\fP") -+} -+ -+func (m *Man) Image(out *bytes.Buffer, link []byte, title []byte, alt []byte) { -+ fmt.Errorf("man: Image not supported") -+} -+ -+func (m *Man) LineBreak(out *bytes.Buffer) { -+ out.WriteString("\n.br\n") -+} -+ -+func (m *Man) Link(out *bytes.Buffer, link []byte, title []byte, content []byte) { -+ m.AutoLink(out, link, 0) -+} -+ -+func (m *Man) RawHtmlTag(out *bytes.Buffer, tag []byte) { -+ out.Write(tag) -+} -+ -+func (m *Man) TripleEmphasis(out *bytes.Buffer, text []byte) { -+ out.WriteString("\\s+2") -+ out.Write(text) -+ out.WriteString("\\s-2") -+} -+ -+func (m *Man) StrikeThrough(out *bytes.Buffer, text []byte) { -+ fmt.Errorf("man: strikethrough not supported") -+} -+ -+func (m *Man) FootnoteRef(out *bytes.Buffer, ref []byte, id int) { -+ -+} -+ -+func (m *Man) Entity(out *bytes.Buffer, entity []byte) { -+ // TODO: convert this into a unicode character or something -+ out.Write(entity) -+} -+ -+func processFooterText(text []byte) []byte { -+ text = bytes.TrimPrefix(text, []byte("% ")) -+ newText := []byte{} -+ textArr := strings.Split(string(text), ") ") -+ -+ for i, w := range textArr { -+ if i == 0 { -+ w = strings.Replace(w, "(", "\" \"", 1) -+ w = fmt.Sprintf("\"%s\"", w) -+ } else { -+ w = fmt.Sprintf(" \"%s\"", w) -+ } -+ newText = append(newText, []byte(w)...) -+ } -+ newText = append(newText, []byte(" \"\"")...) -+ -+ return newText -+} -+ -+func (m *Man) NormalText(out *bytes.Buffer, text []byte) { -+ escapeSpecialChars(out, text) -+} -+ -+func (m *Man) DocumentHeader(out *bytes.Buffer) { -+} -+ -+func (m *Man) DocumentFooter(out *bytes.Buffer) { -+} -+ -+func needsBackslash(c byte) bool { -+ for _, r := range []byte("-_{}&\\~") { -+ if c == r { -+ return true -+ } -+ } -+ return false -+} -+ -+func escapeSpecialChars(out *bytes.Buffer, text []byte) { -+ for i := 0; i < len(text); i++ { -+ // directly copy normal characters -+ org := i -+ -+ for i < len(text) && !needsBackslash(text[i]) { -+ i++ -+ } -+ if i > org { -+ out.Write(text[org:i]) -+ } -+ -+ // escape a character -+ if i >= len(text) { -+ break -+ } -+ out.WriteByte('\\') -+ out.WriteByte(text[i]) -+ } -+} -diff --git a/vendor/src/github.com/cpuguy83/go-md2man/md2man.go b/vendor/src/github.com/cpuguy83/go-md2man/md2man.go -new file mode 100644 -index 0000000..f8b1722 ---- /dev/null -+++ b/vendor/src/github.com/cpuguy83/go-md2man/md2man.go -@@ -0,0 +1,55 @@ -+package main -+ -+import ( -+ "flag" -+ "fmt" -+ "io/ioutil" -+ "os" -+ -+ "github.com/cpuguy83/go-md2man/mangen" -+ "github.com/russross/blackfriday" -+) -+ -+var inFilePath = flag.String("in", "", "Path to file to be processed") -+var outFilePath = flag.String("out", "", "Path to output processed file") -+ -+func main() { -+ flag.Parse() -+ -+ inFile, err := os.Open(*inFilePath) -+ if err != nil { -+ fmt.Println(err) -+ os.Exit(1) -+ } -+ defer inFile.Close() -+ -+ doc, err := ioutil.ReadAll(inFile) -+ if err != nil { -+ fmt.Println(err) -+ os.Exit(1) -+ } -+ -+ renderer := mangen.ManRenderer(0) -+ extensions := 0 -+ extensions |= blackfriday.EXTENSION_NO_INTRA_EMPHASIS -+ extensions |= blackfriday.EXTENSION_TABLES -+ extensions |= blackfriday.EXTENSION_FENCED_CODE -+ extensions |= blackfriday.EXTENSION_AUTOLINK -+ extensions |= blackfriday.EXTENSION_SPACE_HEADERS -+ extensions |= blackfriday.EXTENSION_FOOTNOTES -+ extensions |= blackfriday.EXTENSION_TITLEBLOCK -+ -+ out := blackfriday.Markdown(doc, renderer, extensions) -+ -+ outFile, err := os.Create(*outFilePath) -+ if err != nil { -+ fmt.Println(err) -+ os.Exit(1) -+ } -+ defer outFile.Close() -+ _, err = outFile.Write(out) -+ if err != nil { -+ fmt.Println(err) -+ os.Exit(1) -+ } -+} -diff --git a/vendor/src/github.com/russross/blackfriday/.travis.yml b/vendor/src/github.com/russross/blackfriday/.travis.yml -new file mode 100644 -index 0000000..4dd7a1c ---- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/.travis.yml -@@ -0,0 +1,17 @@ -+# Travis CI (http://travis-ci.org/) is a continuous integration service for -+# open source projects. This file configures it to run unit tests for -+# blackfriday. -+ -+language: go -+ -+go: -+ - 1.2 -+ - 1.3 -+ - 1.4 -+ -+install: -+ - go get -d -t -v ./... -+ - go build -v ./... -+ -+script: -+ - go test -v ./... -diff --git a/vendor/src/github.com/russross/blackfriday/LICENSE.txt b/vendor/src/github.com/russross/blackfriday/LICENSE.txt -new file mode 100644 -index 0000000..2885af3 ---- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/LICENSE.txt -@@ -0,0 +1,29 @@ -+Blackfriday is distributed under the Simplified BSD License: -+ -+> Copyright © 2011 Russ Ross -+> All rights reserved. -+> -+> Redistribution and use in source and binary forms, with or without -+> modification, are permitted provided that the following conditions -+> are met: -+> -+> 1. Redistributions of source code must retain the above copyright -+> notice, this list of conditions and the following disclaimer. -+> -+> 2. Redistributions in binary form must reproduce the above -+> copyright notice, this list of conditions and the following -+> disclaimer in the documentation and/or other materials provided with -+> the distribution. -+> -+> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -+> "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -+> LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -+> FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -+> COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -+> INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -+> BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -+> LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -+> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -+> LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -+> ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -+> POSSIBILITY OF SUCH DAMAGE. -diff --git a/vendor/src/github.com/russross/blackfriday/README.md b/vendor/src/github.com/russross/blackfriday/README.md -new file mode 100644 -index 0000000..1bb985d ---- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/README.md -@@ -0,0 +1,246 @@ -+Blackfriday [![Build Status](https://travis-ci.org/russross/blackfriday.svg?branch=master)](https://travis-ci.org/russross/blackfriday) -+=========== -+ -+Blackfriday is a [Markdown][1] processor implemented in [Go][2]. It -+is paranoid about its input (so you can safely feed it user-supplied -+data), it is fast, it supports common extensions (tables, smart -+punctuation substitutions, etc.), and it is safe for all utf-8 -+(unicode) input. -+ -+HTML output is currently supported, along with Smartypants -+extensions. An experimental LaTeX output engine is also included. -+ -+It started as a translation from C of [Sundown][3]. -+ -+ -+Installation -+------------ -+ -+Blackfriday is compatible with Go 1. If you are using an older -+release of Go, consider using v1.1 of blackfriday, which was based -+on the last stable release of Go prior to Go 1. You can find it as a -+tagged commit on github. -+ -+With Go 1 and git installed: -+ -+ go get github.com/russross/blackfriday -+ -+will download, compile, and install the package into your `$GOPATH` -+directory hierarchy. Alternatively, you can achieve the same if you -+import it into a project: -+ -+ import "github.com/russross/blackfriday" -+ -+and `go get` without parameters. -+ -+Usage -+----- -+ -+For basic usage, it is as simple as getting your input into a byte -+slice and calling: -+ -+ output := blackfriday.MarkdownBasic(input) -+ -+This renders it with no extensions enabled. To get a more useful -+feature set, use this instead: -+ -+ output := blackfriday.MarkdownCommon(input) -+ -+### Sanitize untrusted content -+ -+Blackfriday itself does nothing to protect against malicious content. If you are -+dealing with user-supplied markdown, we recommend running blackfriday's output -+through HTML sanitizer such as -+[Bluemonday](https://github.com/microcosm-cc/bluemonday). -+ -+Here's an example of simple usage of blackfriday together with bluemonday: -+ -+``` go -+import ( -+ "github.com/microcosm-cc/bluemonday" -+ "github.com/russross/blackfriday" -+) -+ -+// ... -+unsafe := blackfriday.MarkdownCommon(input) -+html := bluemonday.UGCPolicy().SanitizeBytes(unsafe) -+``` -+ -+### Custom options -+ -+If you want to customize the set of options, first get a renderer -+(currently either the HTML or LaTeX output engines), then use it to -+call the more general `Markdown` function. For examples, see the -+implementations of `MarkdownBasic` and `MarkdownCommon` in -+`markdown.go`. -+ -+You can also check out `blackfriday-tool` for a more complete example -+of how to use it. Download and install it using: -+ -+ go get github.com/russross/blackfriday-tool -+ -+This is a simple command-line tool that allows you to process a -+markdown file using a standalone program. You can also browse the -+source directly on github if you are just looking for some example -+code: -+ -+* -+ -+Note that if you have not already done so, installing -+`blackfriday-tool` will be sufficient to download and install -+blackfriday in addition to the tool itself. The tool binary will be -+installed in `$GOPATH/bin`. This is a statically-linked binary that -+can be copied to wherever you need it without worrying about -+dependencies and library versions. -+ -+ -+Features -+-------- -+ -+All features of Sundown are supported, including: -+ -+* **Compatibility**. The Markdown v1.0.3 test suite passes with -+ the `--tidy` option. Without `--tidy`, the differences are -+ mostly in whitespace and entity escaping, where blackfriday is -+ more consistent and cleaner. -+ -+* **Common extensions**, including table support, fenced code -+ blocks, autolinks, strikethroughs, non-strict emphasis, etc. -+ -+* **Safety**. Blackfriday is paranoid when parsing, making it safe -+ to feed untrusted user input without fear of bad things -+ happening. The test suite stress tests this and there are no -+ known inputs that make it crash. If you find one, please let me -+ know and send me the input that does it. -+ -+ NOTE: "safety" in this context means *runtime safety only*. In order to -+ protect yourself agains JavaScript injection in untrusted content, see -+ [this example](https://github.com/russross/blackfriday#sanitize-untrusted-content). -+ -+* **Fast processing**. It is fast enough to render on-demand in -+ most web applications without having to cache the output. -+ -+* **Thread safety**. You can run multiple parsers in different -+ goroutines without ill effect. There is no dependence on global -+ shared state. -+ -+* **Minimal dependencies**. Blackfriday only depends on standard -+ library packages in Go. The source code is pretty -+ self-contained, so it is easy to add to any project, including -+ Google App Engine projects. -+ -+* **Standards compliant**. Output successfully validates using the -+ W3C validation tool for HTML 4.01 and XHTML 1.0 Transitional. -+ -+ -+Extensions -+---------- -+ -+In addition to the standard markdown syntax, this package -+implements the following extensions: -+ -+* **Intra-word emphasis supression**. The `_` character is -+ commonly used inside words when discussing code, so having -+ markdown interpret it as an emphasis command is usually the -+ wrong thing. Blackfriday lets you treat all emphasis markers as -+ normal characters when they occur inside a word. -+ -+* **Tables**. Tables can be created by drawing them in the input -+ using a simple syntax: -+ -+ ``` -+ Name | Age -+ --------|------ -+ Bob | 27 -+ Alice | 23 -+ ``` -+ -+* **Fenced code blocks**. In addition to the normal 4-space -+ indentation to mark code blocks, you can explicitly mark them -+ and supply a language (to make syntax highlighting simple). Just -+ mark it like this: -+ -+ ``` go -+ func getTrue() bool { -+ return true -+ } -+ ``` -+ -+ You can use 3 or more backticks to mark the beginning of the -+ block, and the same number to mark the end of the block. -+ -+* **Autolinking**. Blackfriday can find URLs that have not been -+ explicitly marked as links and turn them into links. -+ -+* **Strikethrough**. Use two tildes (`~~`) to mark text that -+ should be crossed out. -+ -+* **Hard line breaks**. With this extension enabled (it is off by -+ default in the `MarkdownBasic` and `MarkdownCommon` convenience -+ functions), newlines in the input translate into line breaks in -+ the output. -+ -+* **Smart quotes**. Smartypants-style punctuation substitution is -+ supported, turning normal double- and single-quote marks into -+ curly quotes, etc. -+ -+* **LaTeX-style dash parsing** is an additional option, where `--` -+ is translated into `–`, and `---` is translated into -+ `—`. This differs from most smartypants processors, which -+ turn a single hyphen into an ndash and a double hyphen into an -+ mdash. -+ -+* **Smart fractions**, where anything that looks like a fraction -+ is translated into suitable HTML (instead of just a few special -+ cases like most smartypant processors). For example, `4/5` -+ becomes `45`, which renders as -+ 45. -+ -+ -+Other renderers -+--------------- -+ -+Blackfriday is structured to allow alternative rendering engines. Here -+are a few of note: -+ -+* [github_flavored_markdown](https://godoc.org/github.com/shurcooL/go/github_flavored_markdown): -+ provides a GitHub Flavored Markdown renderer with fenced code block -+ highlighting, clickable header anchor links. -+ -+ It's not customizable, and its goal is to produce HTML output -+ equivalent to the [GitHub Markdown API endpoint](https://developer.github.com/v3/markdown/#render-a-markdown-document-in-raw-mode), -+ except the rendering is performed locally. -+ -+* [markdownfmt](https://github.com/shurcooL/markdownfmt): like gofmt, -+ but for markdown. -+ -+* LaTeX output: renders output as LaTeX. This is currently part of the -+ main Blackfriday repository, but may be split into its own project -+ in the future. If you are interested in owning and maintaining the -+ LaTeX output component, please be in touch. -+ -+ It renders some basic documents, but is only experimental at this -+ point. In particular, it does not do any inline escaping, so input -+ that happens to look like LaTeX code will be passed through without -+ modification. -+ -+ -+Todo -+---- -+ -+* More unit testing -+* Improve unicode support. It does not understand all unicode -+ rules (about what constitutes a letter, a punctuation symbol, -+ etc.), so it may fail to detect word boundaries correctly in -+ some instances. It is safe on all utf-8 input. -+ -+ -+License -+------- -+ -+[Blackfriday is distributed under the Simplified BSD License](LICENSE.txt) -+ -+ -+ [1]: http://daringfireball.net/projects/markdown/ "Markdown" -+ [2]: http://golang.org/ "Go Language" -+ [3]: https://github.com/vmg/sundown "Sundown" -diff --git a/vendor/src/github.com/russross/blackfriday/block.go b/vendor/src/github.com/russross/blackfriday/block.go -new file mode 100644 -index 0000000..59c6d28 ---- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/block.go -@@ -0,0 +1,1339 @@ -+// -+// Blackfriday Markdown Processor -+// Available at http://github.com/russross/blackfriday -+// -+// Copyright © 2011 Russ Ross . -+// Distributed under the Simplified BSD License. -+// See README.md for details. -+// -+ -+// -+// Functions to parse block-level elements. -+// -+ -+package blackfriday -+ -+import ( -+ "bytes" -+ -+ "github.com/shurcooL/sanitized_anchor_name" -+) -+ -+// Parse block-level data. -+// Note: this function and many that it calls assume that -+// the input buffer ends with a newline. -+func (p *parser) block(out *bytes.Buffer, data []byte) { -+ if len(data) == 0 || data[len(data)-1] != '\n' { -+ panic("block input is missing terminating newline") -+ } -+ -+ // this is called recursively: enforce a maximum depth -+ if p.nesting >= p.maxNesting { -+ return -+ } -+ p.nesting++ -+ -+ // parse out one block-level construct at a time -+ for len(data) > 0 { -+ // prefixed header: -+ // -+ // # Header 1 -+ // ## Header 2 -+ // ... -+ // ###### Header 6 -+ if p.isPrefixHeader(data) { -+ data = data[p.prefixHeader(out, data):] -+ continue -+ } -+ -+ // block of preformatted HTML: -+ // -+ //
-+ // ... -+ //
-+ if data[0] == '<' { -+ if i := p.html(out, data, true); i > 0 { -+ data = data[i:] -+ continue -+ } -+ } -+ -+ // title block -+ // -+ // % stuff -+ // % more stuff -+ // % even more stuff -+ if p.flags&EXTENSION_TITLEBLOCK != 0 { -+ if data[0] == '%' { -+ if i := p.titleBlock(out, data, true); i > 0 { -+ data = data[i:] -+ continue -+ } -+ } -+ } -+ -+ // blank lines. note: returns the # of bytes to skip -+ if i := p.isEmpty(data); i > 0 { -+ data = data[i:] -+ continue -+ } -+ -+ // indented code block: -+ // -+ // func max(a, b int) int { -+ // if a > b { -+ // return a -+ // } -+ // return b -+ // } -+ if p.codePrefix(data) > 0 { -+ data = data[p.code(out, data):] -+ continue -+ } -+ -+ // fenced code block: -+ // -+ // ``` go -+ // func fact(n int) int { -+ // if n <= 1 { -+ // return n -+ // } -+ // return n * fact(n-1) -+ // } -+ // ``` -+ if p.flags&EXTENSION_FENCED_CODE != 0 { -+ if i := p.fencedCode(out, data, true); i > 0 { -+ data = data[i:] -+ continue -+ } -+ } -+ -+ // horizontal rule: -+ // -+ // ------ -+ // or -+ // ****** -+ // or -+ // ______ -+ if p.isHRule(data) { -+ p.r.HRule(out) -+ var i int -+ for i = 0; data[i] != '\n'; i++ { -+ } -+ data = data[i:] -+ continue -+ } -+ -+ // block quote: -+ // -+ // > A big quote I found somewhere -+ // > on the web -+ if p.quotePrefix(data) > 0 { -+ data = data[p.quote(out, data):] -+ continue -+ } -+ -+ // table: -+ // -+ // Name | Age | Phone -+ // ------|-----|--------- -+ // Bob | 31 | 555-1234 -+ // Alice | 27 | 555-4321 -+ if p.flags&EXTENSION_TABLES != 0 { -+ if i := p.table(out, data); i > 0 { -+ data = data[i:] -+ continue -+ } -+ } -+ -+ // an itemized/unordered list: -+ // -+ // * Item 1 -+ // * Item 2 -+ // -+ // also works with + or - -+ if p.uliPrefix(data) > 0 { -+ data = data[p.list(out, data, 0):] -+ continue -+ } -+ -+ // a numbered/ordered list: -+ // -+ // 1. Item 1 -+ // 2. Item 2 -+ if p.oliPrefix(data) > 0 { -+ data = data[p.list(out, data, LIST_TYPE_ORDERED):] -+ continue -+ } -+ -+ // anything else must look like a normal paragraph -+ // note: this finds underlined headers, too -+ data = data[p.paragraph(out, data):] -+ } -+ -+ p.nesting-- -+} -+ -+func (p *parser) isPrefixHeader(data []byte) bool { -+ if data[0] != '#' { -+ return false -+ } -+ -+ if p.flags&EXTENSION_SPACE_HEADERS != 0 { -+ level := 0 -+ for level < 6 && data[level] == '#' { -+ level++ -+ } -+ if data[level] != ' ' { -+ return false -+ } -+ } -+ return true -+} -+ -+func (p *parser) prefixHeader(out *bytes.Buffer, data []byte) int { -+ level := 0 -+ for level < 6 && data[level] == '#' { -+ level++ -+ } -+ i, end := 0, 0 -+ for i = level; data[i] == ' '; i++ { -+ } -+ for end = i; data[end] != '\n'; end++ { -+ } -+ skip := end -+ id := "" -+ if p.flags&EXTENSION_HEADER_IDS != 0 { -+ j, k := 0, 0 -+ // find start/end of header id -+ for j = i; j < end-1 && (data[j] != '{' || data[j+1] != '#'); j++ { -+ } -+ for k = j + 1; k < end && data[k] != '}'; k++ { -+ } -+ // extract header id iff found -+ if j < end && k < end { -+ id = string(data[j+2 : k]) -+ end = j -+ skip = k + 1 -+ for end > 0 && data[end-1] == ' ' { -+ end-- -+ } -+ } -+ } -+ for end > 0 && data[end-1] == '#' { -+ end-- -+ } -+ for end > 0 && data[end-1] == ' ' { -+ end-- -+ } -+ if end > i { -+ if id == "" && p.flags&EXTENSION_AUTO_HEADER_IDS != 0 { -+ id = sanitized_anchor_name.Create(string(data[i:end])) -+ } -+ work := func() bool { -+ p.inline(out, data[i:end]) -+ return true -+ } -+ p.r.Header(out, work, level, id) -+ } -+ return skip -+} -+ -+func (p *parser) isUnderlinedHeader(data []byte) int { -+ // test of level 1 header -+ if data[0] == '=' { -+ i := 1 -+ for data[i] == '=' { -+ i++ -+ } -+ for data[i] == ' ' { -+ i++ -+ } -+ if data[i] == '\n' { -+ return 1 -+ } else { -+ return 0 -+ } -+ } -+ -+ // test of level 2 header -+ if data[0] == '-' { -+ i := 1 -+ for data[i] == '-' { -+ i++ -+ } -+ for data[i] == ' ' { -+ i++ -+ } -+ if data[i] == '\n' { -+ return 2 -+ } else { -+ return 0 -+ } -+ } -+ -+ return 0 -+} -+ -+func (p *parser) titleBlock(out *bytes.Buffer, data []byte, doRender bool) int { -+ if data[0] != '%' { -+ return 0 -+ } -+ splitData := bytes.Split(data, []byte("\n")) -+ var i int -+ for idx, b := range splitData { -+ if !bytes.HasPrefix(b, []byte("%")) { -+ i = idx // - 1 -+ break -+ } -+ } -+ -+ data = bytes.Join(splitData[0:i], []byte("\n")) -+ p.r.TitleBlock(out, data) -+ -+ return len(data) -+} -+ -+func (p *parser) html(out *bytes.Buffer, data []byte, doRender bool) int { -+ var i, j int -+ -+ // identify the opening tag -+ if data[0] != '<' { -+ return 0 -+ } -+ curtag, tagfound := p.htmlFindTag(data[1:]) -+ -+ // handle special cases -+ if !tagfound { -+ // check for an HTML comment -+ if size := p.htmlComment(out, data, doRender); size > 0 { -+ return size -+ } -+ -+ // check for an
tag -+ if size := p.htmlHr(out, data, doRender); size > 0 { -+ return size -+ } -+ -+ // no special case recognized -+ return 0 -+ } -+ -+ // look for an unindented matching closing tag -+ // followed by a blank line -+ found := false -+ /* -+ closetag := []byte("\n") -+ j = len(curtag) + 1 -+ for !found { -+ // scan for a closing tag at the beginning of a line -+ if skip := bytes.Index(data[j:], closetag); skip >= 0 { -+ j += skip + len(closetag) -+ } else { -+ break -+ } -+ -+ // see if it is the only thing on the line -+ if skip := p.isEmpty(data[j:]); skip > 0 { -+ // see if it is followed by a blank line/eof -+ j += skip -+ if j >= len(data) { -+ found = true -+ i = j -+ } else { -+ if skip := p.isEmpty(data[j:]); skip > 0 { -+ j += skip -+ found = true -+ i = j -+ } -+ } -+ } -+ } -+ */ -+ -+ // if not found, try a second pass looking for indented match -+ // but not if tag is "ins" or "del" (following original Markdown.pl) -+ if !found && curtag != "ins" && curtag != "del" { -+ i = 1 -+ for i < len(data) { -+ i++ -+ for i < len(data) && !(data[i-1] == '<' && data[i] == '/') { -+ i++ -+ } -+ -+ if i+2+len(curtag) >= len(data) { -+ break -+ } -+ -+ j = p.htmlFindEnd(curtag, data[i-1:]) -+ -+ if j > 0 { -+ i += j - 1 -+ found = true -+ break -+ } -+ } -+ } -+ -+ if !found { -+ return 0 -+ } -+ -+ // the end of the block has been found -+ if doRender { -+ // trim newlines -+ end := i -+ for end > 0 && data[end-1] == '\n' { -+ end-- -+ } -+ p.r.BlockHtml(out, data[:end]) -+ } -+ -+ return i -+} -+ -+// HTML comment, lax form -+func (p *parser) htmlComment(out *bytes.Buffer, data []byte, doRender bool) int { -+ if data[0] != '<' || data[1] != '!' || data[2] != '-' || data[3] != '-' { -+ return 0 -+ } -+ -+ i := 5 -+ -+ // scan for an end-of-comment marker, across lines if necessary -+ for i < len(data) && !(data[i-2] == '-' && data[i-1] == '-' && data[i] == '>') { -+ i++ -+ } -+ i++ -+ -+ // no end-of-comment marker -+ if i >= len(data) { -+ return 0 -+ } -+ -+ // needs to end with a blank line -+ if j := p.isEmpty(data[i:]); j > 0 { -+ size := i + j -+ if doRender { -+ // trim trailing newlines -+ end := size -+ for end > 0 && data[end-1] == '\n' { -+ end-- -+ } -+ p.r.BlockHtml(out, data[:end]) -+ } -+ return size -+ } -+ -+ return 0 -+} -+ -+// HR, which is the only self-closing block tag considered -+func (p *parser) htmlHr(out *bytes.Buffer, data []byte, doRender bool) int { -+ if data[0] != '<' || (data[1] != 'h' && data[1] != 'H') || (data[2] != 'r' && data[2] != 'R') { -+ return 0 -+ } -+ if data[3] != ' ' && data[3] != '/' && data[3] != '>' { -+ // not an
tag after all; at least not a valid one -+ return 0 -+ } -+ -+ i := 3 -+ for data[i] != '>' && data[i] != '\n' { -+ i++ -+ } -+ -+ if data[i] == '>' { -+ i++ -+ if j := p.isEmpty(data[i:]); j > 0 { -+ size := i + j -+ if doRender { -+ // trim newlines -+ end := size -+ for end > 0 && data[end-1] == '\n' { -+ end-- -+ } -+ p.r.BlockHtml(out, data[:end]) -+ } -+ return size -+ } -+ } -+ -+ return 0 -+} -+ -+func (p *parser) htmlFindTag(data []byte) (string, bool) { -+ i := 0 -+ for isalnum(data[i]) { -+ i++ -+ } -+ key := string(data[:i]) -+ if blockTags[key] { -+ return key, true -+ } -+ return "", false -+} -+ -+func (p *parser) htmlFindEnd(tag string, data []byte) int { -+ // assume data[0] == '<' && data[1] == '/' already tested -+ -+ // check if tag is a match -+ closetag := []byte("") -+ if !bytes.HasPrefix(data, closetag) { -+ return 0 -+ } -+ i := len(closetag) -+ -+ // check that the rest of the line is blank -+ skip := 0 -+ if skip = p.isEmpty(data[i:]); skip == 0 { -+ return 0 -+ } -+ i += skip -+ skip = 0 -+ -+ if i >= len(data) { -+ return i -+ } -+ -+ if p.flags&EXTENSION_LAX_HTML_BLOCKS != 0 { -+ return i -+ } -+ if skip = p.isEmpty(data[i:]); skip == 0 { -+ // following line must be blank -+ return 0 -+ } -+ -+ return i + skip -+} -+ -+func (p *parser) isEmpty(data []byte) int { -+ // it is okay to call isEmpty on an empty buffer -+ if len(data) == 0 { -+ return 0 -+ } -+ -+ var i int -+ for i = 0; i < len(data) && data[i] != '\n'; i++ { -+ if data[i] != ' ' && data[i] != '\t' { -+ return 0 -+ } -+ } -+ return i + 1 -+} -+ -+func (p *parser) isHRule(data []byte) bool { -+ i := 0 -+ -+ // skip up to three spaces -+ for i < 3 && data[i] == ' ' { -+ i++ -+ } -+ -+ // look at the hrule char -+ if data[i] != '*' && data[i] != '-' && data[i] != '_' { -+ return false -+ } -+ c := data[i] -+ -+ // the whole line must be the char or whitespace -+ n := 0 -+ for data[i] != '\n' { -+ switch { -+ case data[i] == c: -+ n++ -+ case data[i] != ' ': -+ return false -+ } -+ i++ -+ } -+ -+ return n >= 3 -+} -+ -+func (p *parser) isFencedCode(data []byte, syntax **string, oldmarker string) (skip int, marker string) { -+ i, size := 0, 0 -+ skip = 0 -+ -+ // skip up to three spaces -+ for i < len(data) && i < 3 && data[i] == ' ' { -+ i++ -+ } -+ if i >= len(data) { -+ return -+ } -+ -+ // check for the marker characters: ~ or ` -+ if data[i] != '~' && data[i] != '`' { -+ return -+ } -+ -+ c := data[i] -+ -+ // the whole line must be the same char or whitespace -+ for i < len(data) && data[i] == c { -+ size++ -+ i++ -+ } -+ -+ if i >= len(data) { -+ return -+ } -+ -+ // the marker char must occur at least 3 times -+ if size < 3 { -+ return -+ } -+ marker = string(data[i-size : i]) -+ -+ // if this is the end marker, it must match the beginning marker -+ if oldmarker != "" && marker != oldmarker { -+ return -+ } -+ -+ if syntax != nil { -+ syn := 0 -+ -+ for i < len(data) && data[i] == ' ' { -+ i++ -+ } -+ -+ if i >= len(data) { -+ return -+ } -+ -+ syntaxStart := i -+ -+ if data[i] == '{' { -+ i++ -+ syntaxStart++ -+ -+ for i < len(data) && data[i] != '}' && data[i] != '\n' { -+ syn++ -+ i++ -+ } -+ -+ if i >= len(data) || data[i] != '}' { -+ return -+ } -+ -+ // strip all whitespace at the beginning and the end -+ // of the {} block -+ for syn > 0 && isspace(data[syntaxStart]) { -+ syntaxStart++ -+ syn-- -+ } -+ -+ for syn > 0 && isspace(data[syntaxStart+syn-1]) { -+ syn-- -+ } -+ -+ i++ -+ } else { -+ for i < len(data) && !isspace(data[i]) { -+ syn++ -+ i++ -+ } -+ } -+ -+ language := string(data[syntaxStart : syntaxStart+syn]) -+ *syntax = &language -+ } -+ -+ for i < len(data) && data[i] == ' ' { -+ i++ -+ } -+ if i >= len(data) || data[i] != '\n' { -+ return -+ } -+ -+ skip = i + 1 -+ return -+} -+ -+func (p *parser) fencedCode(out *bytes.Buffer, data []byte, doRender bool) int { -+ var lang *string -+ beg, marker := p.isFencedCode(data, &lang, "") -+ if beg == 0 || beg >= len(data) { -+ return 0 -+ } -+ -+ var work bytes.Buffer -+ -+ for { -+ // safe to assume beg < len(data) -+ -+ // check for the end of the code block -+ fenceEnd, _ := p.isFencedCode(data[beg:], nil, marker) -+ if fenceEnd != 0 { -+ beg += fenceEnd -+ break -+ } -+ -+ // copy the current line -+ end := beg -+ for end < len(data) && data[end] != '\n' { -+ end++ -+ } -+ end++ -+ -+ // did we reach the end of the buffer without a closing marker? -+ if end >= len(data) { -+ return 0 -+ } -+ -+ // verbatim copy to the working buffer -+ if doRender { -+ work.Write(data[beg:end]) -+ } -+ beg = end -+ } -+ -+ syntax := "" -+ if lang != nil { -+ syntax = *lang -+ } -+ -+ if doRender { -+ p.r.BlockCode(out, work.Bytes(), syntax) -+ } -+ -+ return beg -+} -+ -+func (p *parser) table(out *bytes.Buffer, data []byte) int { -+ var header bytes.Buffer -+ i, columns := p.tableHeader(&header, data) -+ if i == 0 { -+ return 0 -+ } -+ -+ var body bytes.Buffer -+ -+ for i < len(data) { -+ pipes, rowStart := 0, i -+ for ; data[i] != '\n'; i++ { -+ if data[i] == '|' { -+ pipes++ -+ } -+ } -+ -+ if pipes == 0 { -+ i = rowStart -+ break -+ } -+ -+ // include the newline in data sent to tableRow -+ i++ -+ p.tableRow(&body, data[rowStart:i], columns, false) -+ } -+ -+ p.r.Table(out, header.Bytes(), body.Bytes(), columns) -+ -+ return i -+} -+ -+// check if the specified position is preceeded by an odd number of backslashes -+func isBackslashEscaped(data []byte, i int) bool { -+ backslashes := 0 -+ for i-backslashes-1 >= 0 && data[i-backslashes-1] == '\\' { -+ backslashes++ -+ } -+ return backslashes&1 == 1 -+} -+ -+func (p *parser) tableHeader(out *bytes.Buffer, data []byte) (size int, columns []int) { -+ i := 0 -+ colCount := 1 -+ for i = 0; data[i] != '\n'; i++ { -+ if data[i] == '|' && !isBackslashEscaped(data, i) { -+ colCount++ -+ } -+ } -+ -+ // doesn't look like a table header -+ if colCount == 1 { -+ return -+ } -+ -+ // include the newline in the data sent to tableRow -+ header := data[:i+1] -+ -+ // column count ignores pipes at beginning or end of line -+ if data[0] == '|' { -+ colCount-- -+ } -+ if i > 2 && data[i-1] == '|' && !isBackslashEscaped(data, i-1) { -+ colCount-- -+ } -+ -+ columns = make([]int, colCount) -+ -+ // move on to the header underline -+ i++ -+ if i >= len(data) { -+ return -+ } -+ -+ if data[i] == '|' && !isBackslashEscaped(data, i) { -+ i++ -+ } -+ for data[i] == ' ' { -+ i++ -+ } -+ -+ // each column header is of form: / *:?-+:? *|/ with # dashes + # colons >= 3 -+ // and trailing | optional on last column -+ col := 0 -+ for data[i] != '\n' { -+ dashes := 0 -+ -+ if data[i] == ':' { -+ i++ -+ columns[col] |= TABLE_ALIGNMENT_LEFT -+ dashes++ -+ } -+ for data[i] == '-' { -+ i++ -+ dashes++ -+ } -+ if data[i] == ':' { -+ i++ -+ columns[col] |= TABLE_ALIGNMENT_RIGHT -+ dashes++ -+ } -+ for data[i] == ' ' { -+ i++ -+ } -+ -+ // end of column test is messy -+ switch { -+ case dashes < 3: -+ // not a valid column -+ return -+ -+ case data[i] == '|' && !isBackslashEscaped(data, i): -+ // marker found, now skip past trailing whitespace -+ col++ -+ i++ -+ for data[i] == ' ' { -+ i++ -+ } -+ -+ // trailing junk found after last column -+ if col >= colCount && data[i] != '\n' { -+ return -+ } -+ -+ case (data[i] != '|' || isBackslashEscaped(data, i)) && col+1 < colCount: -+ // something else found where marker was required -+ return -+ -+ case data[i] == '\n': -+ // marker is optional for the last column -+ col++ -+ -+ default: -+ // trailing junk found after last column -+ return -+ } -+ } -+ if col != colCount { -+ return -+ } -+ -+ p.tableRow(out, header, columns, true) -+ size = i + 1 -+ return -+} -+ -+func (p *parser) tableRow(out *bytes.Buffer, data []byte, columns []int, header bool) { -+ i, col := 0, 0 -+ var rowWork bytes.Buffer -+ -+ if data[i] == '|' && !isBackslashEscaped(data, i) { -+ i++ -+ } -+ -+ for col = 0; col < len(columns) && i < len(data); col++ { -+ for data[i] == ' ' { -+ i++ -+ } -+ -+ cellStart := i -+ -+ for (data[i] != '|' || isBackslashEscaped(data, i)) && data[i] != '\n' { -+ i++ -+ } -+ -+ cellEnd := i -+ -+ // skip the end-of-cell marker, possibly taking us past end of buffer -+ i++ -+ -+ for cellEnd > cellStart && data[cellEnd-1] == ' ' { -+ cellEnd-- -+ } -+ -+ var cellWork bytes.Buffer -+ p.inline(&cellWork, data[cellStart:cellEnd]) -+ -+ if header { -+ p.r.TableHeaderCell(&rowWork, cellWork.Bytes(), columns[col]) -+ } else { -+ p.r.TableCell(&rowWork, cellWork.Bytes(), columns[col]) -+ } -+ } -+ -+ // pad it out with empty columns to get the right number -+ for ; col < len(columns); col++ { -+ if header { -+ p.r.TableHeaderCell(&rowWork, nil, columns[col]) -+ } else { -+ p.r.TableCell(&rowWork, nil, columns[col]) -+ } -+ } -+ -+ // silently ignore rows with too many cells -+ -+ p.r.TableRow(out, rowWork.Bytes()) -+} -+ -+// returns blockquote prefix length -+func (p *parser) quotePrefix(data []byte) int { -+ i := 0 -+ for i < 3 && data[i] == ' ' { -+ i++ -+ } -+ if data[i] == '>' { -+ if data[i+1] == ' ' { -+ return i + 2 -+ } -+ return i + 1 -+ } -+ return 0 -+} -+ -+// parse a blockquote fragment -+func (p *parser) quote(out *bytes.Buffer, data []byte) int { -+ var raw bytes.Buffer -+ beg, end := 0, 0 -+ for beg < len(data) { -+ end = beg -+ for data[end] != '\n' { -+ end++ -+ } -+ end++ -+ -+ if pre := p.quotePrefix(data[beg:]); pre > 0 { -+ // skip the prefix -+ beg += pre -+ } else if p.isEmpty(data[beg:]) > 0 && -+ (end >= len(data) || -+ (p.quotePrefix(data[end:]) == 0 && p.isEmpty(data[end:]) == 0)) { -+ // blockquote ends with at least one blank line -+ // followed by something without a blockquote prefix -+ break -+ } -+ -+ // this line is part of the blockquote -+ raw.Write(data[beg:end]) -+ beg = end -+ } -+ -+ var cooked bytes.Buffer -+ p.block(&cooked, raw.Bytes()) -+ p.r.BlockQuote(out, cooked.Bytes()) -+ return end -+} -+ -+// returns prefix length for block code -+func (p *parser) codePrefix(data []byte) int { -+ if data[0] == ' ' && data[1] == ' ' && data[2] == ' ' && data[3] == ' ' { -+ return 4 -+ } -+ return 0 -+} -+ -+func (p *parser) code(out *bytes.Buffer, data []byte) int { -+ var work bytes.Buffer -+ -+ i := 0 -+ for i < len(data) { -+ beg := i -+ for data[i] != '\n' { -+ i++ -+ } -+ i++ -+ -+ blankline := p.isEmpty(data[beg:i]) > 0 -+ if pre := p.codePrefix(data[beg:i]); pre > 0 { -+ beg += pre -+ } else if !blankline { -+ // non-empty, non-prefixed line breaks the pre -+ i = beg -+ break -+ } -+ -+ // verbatim copy to the working buffeu -+ if blankline { -+ work.WriteByte('\n') -+ } else { -+ work.Write(data[beg:i]) -+ } -+ } -+ -+ // trim all the \n off the end of work -+ workbytes := work.Bytes() -+ eol := len(workbytes) -+ for eol > 0 && workbytes[eol-1] == '\n' { -+ eol-- -+ } -+ if eol != len(workbytes) { -+ work.Truncate(eol) -+ } -+ -+ work.WriteByte('\n') -+ -+ p.r.BlockCode(out, work.Bytes(), "") -+ -+ return i -+} -+ -+// returns unordered list item prefix -+func (p *parser) uliPrefix(data []byte) int { -+ i := 0 -+ -+ // start with up to 3 spaces -+ for i < 3 && data[i] == ' ' { -+ i++ -+ } -+ -+ // need a *, +, or - followed by a space -+ if (data[i] != '*' && data[i] != '+' && data[i] != '-') || -+ data[i+1] != ' ' { -+ return 0 -+ } -+ return i + 2 -+} -+ -+// returns ordered list item prefix -+func (p *parser) oliPrefix(data []byte) int { -+ i := 0 -+ -+ // start with up to 3 spaces -+ for i < 3 && data[i] == ' ' { -+ i++ -+ } -+ -+ // count the digits -+ start := i -+ for data[i] >= '0' && data[i] <= '9' { -+ i++ -+ } -+ -+ // we need >= 1 digits followed by a dot and a space -+ if start == i || data[i] != '.' || data[i+1] != ' ' { -+ return 0 -+ } -+ return i + 2 -+} -+ -+// parse ordered or unordered list block -+func (p *parser) list(out *bytes.Buffer, data []byte, flags int) int { -+ i := 0 -+ flags |= LIST_ITEM_BEGINNING_OF_LIST -+ work := func() bool { -+ for i < len(data) { -+ skip := p.listItem(out, data[i:], &flags) -+ i += skip -+ -+ if skip == 0 || flags&LIST_ITEM_END_OF_LIST != 0 { -+ break -+ } -+ flags &= ^LIST_ITEM_BEGINNING_OF_LIST -+ } -+ return true -+ } -+ -+ p.r.List(out, work, flags) -+ return i -+} -+ -+// Parse a single list item. -+// Assumes initial prefix is already removed if this is a sublist. -+func (p *parser) listItem(out *bytes.Buffer, data []byte, flags *int) int { -+ // keep track of the indentation of the first line -+ itemIndent := 0 -+ for itemIndent < 3 && data[itemIndent] == ' ' { -+ itemIndent++ -+ } -+ -+ i := p.uliPrefix(data) -+ if i == 0 { -+ i = p.oliPrefix(data) -+ } -+ if i == 0 { -+ return 0 -+ } -+ -+ // skip leading whitespace on first line -+ for data[i] == ' ' { -+ i++ -+ } -+ -+ // find the end of the line -+ line := i -+ for data[i-1] != '\n' { -+ i++ -+ } -+ -+ // get working buffer -+ var raw bytes.Buffer -+ -+ // put the first line into the working buffer -+ raw.Write(data[line:i]) -+ line = i -+ -+ // process the following lines -+ containsBlankLine := false -+ sublist := 0 -+ -+gatherlines: -+ for line < len(data) { -+ i++ -+ -+ // find the end of this line -+ for data[i-1] != '\n' { -+ i++ -+ } -+ -+ // if it is an empty line, guess that it is part of this item -+ // and move on to the next line -+ if p.isEmpty(data[line:i]) > 0 { -+ containsBlankLine = true -+ line = i -+ continue -+ } -+ -+ // calculate the indentation -+ indent := 0 -+ for indent < 4 && line+indent < i && data[line+indent] == ' ' { -+ indent++ -+ } -+ -+ chunk := data[line+indent : i] -+ -+ // evaluate how this line fits in -+ switch { -+ // is this a nested list item? -+ case (p.uliPrefix(chunk) > 0 && !p.isHRule(chunk)) || -+ p.oliPrefix(chunk) > 0: -+ -+ if containsBlankLine { -+ *flags |= LIST_ITEM_CONTAINS_BLOCK -+ } -+ -+ // to be a nested list, it must be indented more -+ // if not, it is the next item in the same list -+ if indent <= itemIndent { -+ break gatherlines -+ } -+ -+ // is this the first item in the the nested list? -+ if sublist == 0 { -+ sublist = raw.Len() -+ } -+ -+ // is this a nested prefix header? -+ case p.isPrefixHeader(chunk): -+ // if the header is not indented, it is not nested in the list -+ // and thus ends the list -+ if containsBlankLine && indent < 4 { -+ *flags |= LIST_ITEM_END_OF_LIST -+ break gatherlines -+ } -+ *flags |= LIST_ITEM_CONTAINS_BLOCK -+ -+ // anything following an empty line is only part -+ // of this item if it is indented 4 spaces -+ // (regardless of the indentation of the beginning of the item) -+ case containsBlankLine && indent < 4: -+ *flags |= LIST_ITEM_END_OF_LIST -+ break gatherlines -+ -+ // a blank line means this should be parsed as a block -+ case containsBlankLine: -+ raw.WriteByte('\n') -+ *flags |= LIST_ITEM_CONTAINS_BLOCK -+ } -+ -+ // if this line was preceeded by one or more blanks, -+ // re-introduce the blank into the buffer -+ if containsBlankLine { -+ containsBlankLine = false -+ raw.WriteByte('\n') -+ } -+ -+ // add the line into the working buffer without prefix -+ raw.Write(data[line+indent : i]) -+ -+ line = i -+ } -+ -+ rawBytes := raw.Bytes() -+ -+ // render the contents of the list item -+ var cooked bytes.Buffer -+ if *flags&LIST_ITEM_CONTAINS_BLOCK != 0 { -+ // intermediate render of block li -+ if sublist > 0 { -+ p.block(&cooked, rawBytes[:sublist]) -+ p.block(&cooked, rawBytes[sublist:]) -+ } else { -+ p.block(&cooked, rawBytes) -+ } -+ } else { -+ // intermediate render of inline li -+ if sublist > 0 { -+ p.inline(&cooked, rawBytes[:sublist]) -+ p.block(&cooked, rawBytes[sublist:]) -+ } else { -+ p.inline(&cooked, rawBytes) -+ } -+ } -+ -+ // render the actual list item -+ cookedBytes := cooked.Bytes() -+ parsedEnd := len(cookedBytes) -+ -+ // strip trailing newlines -+ for parsedEnd > 0 && cookedBytes[parsedEnd-1] == '\n' { -+ parsedEnd-- -+ } -+ p.r.ListItem(out, cookedBytes[:parsedEnd], *flags) -+ -+ return line -+} -+ -+// render a single paragraph that has already been parsed out -+func (p *parser) renderParagraph(out *bytes.Buffer, data []byte) { -+ if len(data) == 0 { -+ return -+ } -+ -+ // trim leading spaces -+ beg := 0 -+ for data[beg] == ' ' { -+ beg++ -+ } -+ -+ // trim trailing newline -+ end := len(data) - 1 -+ -+ // trim trailing spaces -+ for end > beg && data[end-1] == ' ' { -+ end-- -+ } -+ -+ work := func() bool { -+ p.inline(out, data[beg:end]) -+ return true -+ } -+ p.r.Paragraph(out, work) -+} -+ -+func (p *parser) paragraph(out *bytes.Buffer, data []byte) int { -+ // prev: index of 1st char of previous line -+ // line: index of 1st char of current line -+ // i: index of cursor/end of current line -+ var prev, line, i int -+ -+ // keep going until we find something to mark the end of the paragraph -+ for i < len(data) { -+ // mark the beginning of the current line -+ prev = line -+ current := data[i:] -+ line = i -+ -+ // did we find a blank line marking the end of the paragraph? -+ if n := p.isEmpty(current); n > 0 { -+ p.renderParagraph(out, data[:i]) -+ return i + n -+ } -+ -+ // an underline under some text marks a header, so our paragraph ended on prev line -+ if i > 0 { -+ if level := p.isUnderlinedHeader(current); level > 0 { -+ // render the paragraph -+ p.renderParagraph(out, data[:prev]) -+ -+ // ignore leading and trailing whitespace -+ eol := i - 1 -+ for prev < eol && data[prev] == ' ' { -+ prev++ -+ } -+ for eol > prev && data[eol-1] == ' ' { -+ eol-- -+ } -+ -+ // render the header -+ // this ugly double closure avoids forcing variables onto the heap -+ work := func(o *bytes.Buffer, pp *parser, d []byte) func() bool { -+ return func() bool { -+ pp.inline(o, d) -+ return true -+ } -+ }(out, p, data[prev:eol]) -+ -+ id := "" -+ if p.flags&EXTENSION_AUTO_HEADER_IDS != 0 { -+ id = sanitized_anchor_name.Create(string(data[prev:eol])) -+ } -+ -+ p.r.Header(out, work, level, id) -+ -+ // find the end of the underline -+ for data[i] != '\n' { -+ i++ -+ } -+ return i -+ } -+ } -+ -+ // if the next line starts a block of HTML, then the paragraph ends here -+ if p.flags&EXTENSION_LAX_HTML_BLOCKS != 0 { -+ if data[i] == '<' && p.html(out, current, false) > 0 { -+ // rewind to before the HTML block -+ p.renderParagraph(out, data[:i]) -+ return i -+ } -+ } -+ -+ // if there's a prefixed header or a horizontal rule after this, paragraph is over -+ if p.isPrefixHeader(current) || p.isHRule(current) { -+ p.renderParagraph(out, data[:i]) -+ return i -+ } -+ -+ // if there's a list after this, paragraph is over -+ if p.flags&EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK != 0 { -+ if p.uliPrefix(current) != 0 || -+ p.oliPrefix(current) != 0 || -+ p.quotePrefix(current) != 0 || -+ p.codePrefix(current) != 0 { -+ p.renderParagraph(out, data[:i]) -+ return i -+ } -+ } -+ -+ // otherwise, scan to the beginning of the next line -+ for data[i] != '\n' { -+ i++ -+ } -+ i++ -+ } -+ -+ p.renderParagraph(out, data[:i]) -+ return i -+} -diff --git a/vendor/src/github.com/russross/blackfriday/block_test.go b/vendor/src/github.com/russross/blackfriday/block_test.go -new file mode 100644 -index 0000000..b726c07 ---- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/block_test.go -@@ -0,0 +1,1296 @@ -+// -+// Blackfriday Markdown Processor -+// Available at http://github.com/russross/blackfriday -+// -+// Copyright © 2011 Russ Ross . -+// Distributed under the Simplified BSD License. -+// See README.md for details. -+// -+ -+// -+// Unit tests for block parsing -+// -+ -+package blackfriday -+ -+import ( -+ "testing" -+) -+ -+func runMarkdownBlockWithRenderer(input string, extensions int, renderer Renderer) string { -+ return string(Markdown([]byte(input), renderer, extensions)) -+} -+ -+func runMarkdownBlock(input string, extensions int) string { -+ htmlFlags := 0 -+ htmlFlags |= HTML_USE_XHTML -+ -+ renderer := HtmlRenderer(htmlFlags, "", "") -+ -+ return runMarkdownBlockWithRenderer(input, extensions, renderer) -+} -+ -+func runnerWithRendererParameters(parameters HtmlRendererParameters) func(string, int) string { -+ return func(input string, extensions int) string { -+ htmlFlags := 0 -+ htmlFlags |= HTML_USE_XHTML -+ -+ renderer := HtmlRendererWithParameters(htmlFlags, "", "", parameters) -+ -+ return runMarkdownBlockWithRenderer(input, extensions, renderer) -+ } -+} -+ -+func doTestsBlock(t *testing.T, tests []string, extensions int) { -+ doTestsBlockWithRunner(t, tests, extensions, runMarkdownBlock) -+} -+ -+func doTestsBlockWithRunner(t *testing.T, tests []string, extensions int, runner func(string, int) string) { -+ // catch and report panics -+ var candidate string -+ defer func() { -+ if err := recover(); err != nil { -+ t.Errorf("\npanic while processing [%#v]: %s\n", candidate, err) -+ } -+ }() -+ -+ for i := 0; i+1 < len(tests); i += 2 { -+ input := tests[i] -+ candidate = input -+ expected := tests[i+1] -+ actual := runner(candidate, extensions) -+ if actual != expected { -+ t.Errorf("\nInput [%#v]\nExpected[%#v]\nActual [%#v]", -+ candidate, expected, actual) -+ } -+ -+ // now test every substring to stress test bounds checking -+ if !testing.Short() { -+ for start := 0; start < len(input); start++ { -+ for end := start + 1; end <= len(input); end++ { -+ candidate = input[start:end] -+ _ = runMarkdownBlock(candidate, extensions) -+ } -+ } -+ } -+ } -+} -+ -+func TestPrefixHeaderNoExtensions(t *testing.T) { -+ var tests = []string{ -+ "# Header 1\n", -+ "

Header 1

\n", -+ -+ "## Header 2\n", -+ "

Header 2

\n", -+ -+ "### Header 3\n", -+ "

Header 3

\n", -+ -+ "#### Header 4\n", -+ "

Header 4

\n", -+ -+ "##### Header 5\n", -+ "
Header 5
\n", -+ -+ "###### Header 6\n", -+ "
Header 6
\n", -+ -+ "####### Header 7\n", -+ "
# Header 7
\n", -+ -+ "#Header 1\n", -+ "

Header 1

\n", -+ -+ "##Header 2\n", -+ "

Header 2

\n", -+ -+ "###Header 3\n", -+ "

Header 3

\n", -+ -+ "####Header 4\n", -+ "

Header 4

\n", -+ -+ "#####Header 5\n", -+ "
Header 5
\n", -+ -+ "######Header 6\n", -+ "
Header 6
\n", -+ -+ "#######Header 7\n", -+ "
#Header 7
\n", -+ -+ "Hello\n# Header 1\nGoodbye\n", -+ "

Hello

\n\n

Header 1

\n\n

Goodbye

\n", -+ -+ "* List\n# Header\n* List\n", -+ "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", -+ -+ "* List\n#Header\n* List\n", -+ "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", -+ -+ "* List\n * Nested list\n # Nested header\n", -+ "
    \n
  • List

    \n\n
      \n
    • Nested list

      \n\n" + -+ "

      Nested header

    • \n
  • \n
\n", -+ } -+ doTestsBlock(t, tests, 0) -+} -+ -+func TestPrefixHeaderSpaceExtension(t *testing.T) { -+ var tests = []string{ -+ "# Header 1\n", -+ "

Header 1

\n", -+ -+ "## Header 2\n", -+ "

Header 2

\n", -+ -+ "### Header 3\n", -+ "

Header 3

\n", -+ -+ "#### Header 4\n", -+ "

Header 4

\n", -+ -+ "##### Header 5\n", -+ "
Header 5
\n", -+ -+ "###### Header 6\n", -+ "
Header 6
\n", -+ -+ "####### Header 7\n", -+ "

####### Header 7

\n", -+ -+ "#Header 1\n", -+ "

#Header 1

\n", -+ -+ "##Header 2\n", -+ "

##Header 2

\n", -+ -+ "###Header 3\n", -+ "

###Header 3

\n", -+ -+ "####Header 4\n", -+ "

####Header 4

\n", -+ -+ "#####Header 5\n", -+ "

#####Header 5

\n", -+ -+ "######Header 6\n", -+ "

######Header 6

\n", -+ -+ "#######Header 7\n", -+ "

#######Header 7

\n", -+ -+ "Hello\n# Header 1\nGoodbye\n", -+ "

Hello

\n\n

Header 1

\n\n

Goodbye

\n", -+ -+ "* List\n# Header\n* List\n", -+ "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", -+ -+ "* List\n#Header\n* List\n", -+ "
    \n
  • List\n#Header
  • \n
  • List
  • \n
\n", -+ -+ "* List\n * Nested list\n # Nested header\n", -+ "
    \n
  • List

    \n\n
      \n
    • Nested list

      \n\n" + -+ "

      Nested header

    • \n
  • \n
\n", -+ } -+ doTestsBlock(t, tests, EXTENSION_SPACE_HEADERS) -+} -+ -+func TestPrefixHeaderIdExtension(t *testing.T) { -+ var tests = []string{ -+ "# Header 1 {#someid}\n", -+ "

Header 1

\n", -+ -+ "# Header 1 {#someid} \n", -+ "

Header 1

\n", -+ -+ "# Header 1 {#someid}\n", -+ "

Header 1

\n", -+ -+ "# Header 1 {#someid\n", -+ "

Header 1 {#someid

\n", -+ -+ "# Header 1 {#someid\n", -+ "

Header 1 {#someid

\n", -+ -+ "# Header 1 {#someid}}\n", -+ "

Header 1

\n\n

}

\n", -+ -+ "## Header 2 {#someid}\n", -+ "

Header 2

\n", -+ -+ "### Header 3 {#someid}\n", -+ "

Header 3

\n", -+ -+ "#### Header 4 {#someid}\n", -+ "

Header 4

\n", -+ -+ "##### Header 5 {#someid}\n", -+ "
Header 5
\n", -+ -+ "###### Header 6 {#someid}\n", -+ "
Header 6
\n", -+ -+ "####### Header 7 {#someid}\n", -+ "
# Header 7
\n", -+ -+ "# Header 1 # {#someid}\n", -+ "

Header 1

\n", -+ -+ "## Header 2 ## {#someid}\n", -+ "

Header 2

\n", -+ -+ "Hello\n# Header 1\nGoodbye\n", -+ "

Hello

\n\n

Header 1

\n\n

Goodbye

\n", -+ -+ "* List\n# Header {#someid}\n* List\n", -+ "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", -+ -+ "* List\n#Header {#someid}\n* List\n", -+ "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", -+ -+ "* List\n * Nested list\n # Nested header {#someid}\n", -+ "
    \n
  • List

    \n\n
      \n
    • Nested list

      \n\n" + -+ "

      Nested header

    • \n
  • \n
\n", -+ } -+ doTestsBlock(t, tests, EXTENSION_HEADER_IDS) -+} -+ -+func TestPrefixHeaderIdExtensionWithPrefixAndSuffix(t *testing.T) { -+ var tests = []string{ -+ "# header 1 {#someid}\n", -+ "

header 1

\n", -+ -+ "## header 2 {#someid}\n", -+ "

header 2

\n", -+ -+ "### header 3 {#someid}\n", -+ "

header 3

\n", -+ -+ "#### header 4 {#someid}\n", -+ "

header 4

\n", -+ -+ "##### header 5 {#someid}\n", -+ "
header 5
\n", -+ -+ "###### header 6 {#someid}\n", -+ "
header 6
\n", -+ -+ "####### header 7 {#someid}\n", -+ "
# header 7
\n", -+ -+ "# header 1 # {#someid}\n", -+ "

header 1

\n", -+ -+ "## header 2 ## {#someid}\n", -+ "

header 2

\n", -+ -+ "* List\n# Header {#someid}\n* List\n", -+ "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", -+ -+ "* List\n#Header {#someid}\n* List\n", -+ "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", -+ -+ "* List\n * Nested list\n # Nested header {#someid}\n", -+ "
    \n
  • List

    \n\n
      \n
    • Nested list

      \n\n" + -+ "

      Nested header

    • \n
  • \n
\n", -+ } -+ -+ parameters := HtmlRendererParameters{ -+ HeaderIDPrefix: "PRE:", -+ HeaderIDSuffix: ":POST", -+ } -+ -+ doTestsBlockWithRunner(t, tests, EXTENSION_HEADER_IDS, runnerWithRendererParameters(parameters)) -+} -+ -+func TestPrefixAutoHeaderIdExtension(t *testing.T) { -+ var tests = []string{ -+ "# Header 1\n", -+ "

Header 1

\n", -+ -+ "# Header 1 \n", -+ "

Header 1

\n", -+ -+ "## Header 2\n", -+ "

Header 2

\n", -+ -+ "### Header 3\n", -+ "

Header 3

\n", -+ -+ "#### Header 4\n", -+ "

Header 4

\n", -+ -+ "##### Header 5\n", -+ "
Header 5
\n", -+ -+ "###### Header 6\n", -+ "
Header 6
\n", -+ -+ "####### Header 7\n", -+ "
# Header 7
\n", -+ -+ "Hello\n# Header 1\nGoodbye\n", -+ "

Hello

\n\n

Header 1

\n\n

Goodbye

\n", -+ -+ "* List\n# Header\n* List\n", -+ "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", -+ -+ "* List\n#Header\n* List\n", -+ "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", -+ -+ "* List\n * Nested list\n # Nested header\n", -+ "
    \n
  • List

    \n\n
      \n
    • Nested list

      \n\n" + -+ "

      Nested header

    • \n
  • \n
\n", -+ -+ "# Header\n\n# Header\n", -+ "

Header

\n\n

Header

\n", -+ -+ "# Header 1\n\n# Header 1", -+ "

Header 1

\n\n

Header 1

\n", -+ -+ "# Header\n\n# Header 1\n\n# Header\n\n# Header", -+ "

Header

\n\n

Header 1

\n\n

Header

\n\n

Header

\n", -+ } -+ doTestsBlock(t, tests, EXTENSION_AUTO_HEADER_IDS) -+} -+ -+func TestPrefixAutoHeaderIdExtensionWithPrefixAndSuffix(t *testing.T) { -+ var tests = []string{ -+ "# Header 1\n", -+ "

Header 1

\n", -+ -+ "# Header 1 \n", -+ "

Header 1

\n", -+ -+ "## Header 2\n", -+ "

Header 2

\n", -+ -+ "### Header 3\n", -+ "

Header 3

\n", -+ -+ "#### Header 4\n", -+ "

Header 4

\n", -+ -+ "##### Header 5\n", -+ "
Header 5
\n", -+ -+ "###### Header 6\n", -+ "
Header 6
\n", -+ -+ "####### Header 7\n", -+ "
# Header 7
\n", -+ -+ "Hello\n# Header 1\nGoodbye\n", -+ "

Hello

\n\n

Header 1

\n\n

Goodbye

\n", -+ -+ "* List\n# Header\n* List\n", -+ "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", -+ -+ "* List\n#Header\n* List\n", -+ "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", -+ -+ "* List\n * Nested list\n # Nested header\n", -+ "
    \n
  • List

    \n\n
      \n
    • Nested list

      \n\n" + -+ "

      Nested header

    • \n
  • \n
\n", -+ -+ "# Header\n\n# Header\n", -+ "

Header

\n\n

Header

\n", -+ -+ "# Header 1\n\n# Header 1", -+ "

Header 1

\n\n

Header 1

\n", -+ -+ "# Header\n\n# Header 1\n\n# Header\n\n# Header", -+ "

Header

\n\n

Header 1

\n\n

Header

\n\n

Header

\n", -+ } -+ -+ parameters := HtmlRendererParameters{ -+ HeaderIDPrefix: "PRE:", -+ HeaderIDSuffix: ":POST", -+ } -+ -+ doTestsBlockWithRunner(t, tests, EXTENSION_AUTO_HEADER_IDS, runnerWithRendererParameters(parameters)) -+} -+ -+func TestPrefixMultipleHeaderExtensions(t *testing.T) { -+ var tests = []string{ -+ "# Header\n\n# Header {#header}\n\n# Header 1", -+ "

Header

\n\n

Header

\n\n

Header 1

\n", -+ } -+ doTestsBlock(t, tests, EXTENSION_AUTO_HEADER_IDS|EXTENSION_HEADER_IDS) -+} -+ -+func TestUnderlineHeaders(t *testing.T) { -+ var tests = []string{ -+ "Header 1\n========\n", -+ "

Header 1

\n", -+ -+ "Header 2\n--------\n", -+ "

Header 2

\n", -+ -+ "A\n=\n", -+ "

A

\n", -+ -+ "B\n-\n", -+ "

B

\n", -+ -+ "Paragraph\nHeader\n=\n", -+ "

Paragraph

\n\n

Header

\n", -+ -+ "Header\n===\nParagraph\n", -+ "

Header

\n\n

Paragraph

\n", -+ -+ "Header\n===\nAnother header\n---\n", -+ "

Header

\n\n

Another header

\n", -+ -+ " Header\n======\n", -+ "

Header

\n", -+ -+ " Code\n========\n", -+ "
Code\n
\n\n

========

\n", -+ -+ "Header with *inline*\n=====\n", -+ "

Header with inline

\n", -+ -+ "* List\n * Sublist\n Not a header\n ------\n", -+ "
    \n
  • List\n\n
      \n
    • Sublist\nNot a header\n------
    • \n
  • \n
\n", -+ -+ "Paragraph\n\n\n\n\nHeader\n===\n", -+ "

Paragraph

\n\n

Header

\n", -+ -+ "Trailing space \n==== \n\n", -+ "

Trailing space

\n", -+ -+ "Trailing spaces\n==== \n\n", -+ "

Trailing spaces

\n", -+ -+ "Double underline\n=====\n=====\n", -+ "

Double underline

\n\n

=====

\n", -+ } -+ doTestsBlock(t, tests, 0) -+} -+ -+func TestUnderlineHeadersAutoIDs(t *testing.T) { -+ var tests = []string{ -+ "Header 1\n========\n", -+ "

Header 1

\n", -+ -+ "Header 2\n--------\n", -+ "

Header 2

\n", -+ -+ "A\n=\n", -+ "

A

\n", -+ -+ "B\n-\n", -+ "

B

\n", -+ -+ "Paragraph\nHeader\n=\n", -+ "

Paragraph

\n\n

Header

\n", -+ -+ "Header\n===\nParagraph\n", -+ "

Header

\n\n

Paragraph

\n", -+ -+ "Header\n===\nAnother header\n---\n", -+ "

Header

\n\n

Another header

\n", -+ -+ " Header\n======\n", -+ "

Header

\n", -+ -+ "Header with *inline*\n=====\n", -+ "

Header with inline

\n", -+ -+ "Paragraph\n\n\n\n\nHeader\n===\n", -+ "

Paragraph

\n\n

Header

\n", -+ -+ "Trailing space \n==== \n\n", -+ "

Trailing space

\n", -+ -+ "Trailing spaces\n==== \n\n", -+ "

Trailing spaces

\n", -+ -+ "Double underline\n=====\n=====\n", -+ "

Double underline

\n\n

=====

\n", -+ -+ "Header\n======\n\nHeader\n======\n", -+ "

Header

\n\n

Header

\n", -+ -+ "Header 1\n========\n\nHeader 1\n========\n", -+ "

Header 1

\n\n

Header 1

\n", -+ } -+ doTestsBlock(t, tests, EXTENSION_AUTO_HEADER_IDS) -+} -+ -+func TestHorizontalRule(t *testing.T) { -+ var tests = []string{ -+ "-\n", -+ "

-

\n", -+ -+ "--\n", -+ "

--

\n", -+ -+ "---\n", -+ "
\n", -+ -+ "----\n", -+ "
\n", -+ -+ "*\n", -+ "

*

\n", -+ -+ "**\n", -+ "

**

\n", -+ -+ "***\n", -+ "
\n", -+ -+ "****\n", -+ "
\n", -+ -+ "_\n", -+ "

_

\n", -+ -+ "__\n", -+ "

__

\n", -+ -+ "___\n", -+ "
\n", -+ -+ "____\n", -+ "
\n", -+ -+ "-*-\n", -+ "

-*-

\n", -+ -+ "- - -\n", -+ "
\n", -+ -+ "* * *\n", -+ "
\n", -+ -+ "_ _ _\n", -+ "
\n", -+ -+ "-----*\n", -+ "

-----*

\n", -+ -+ " ------ \n", -+ "
\n", -+ -+ "Hello\n***\n", -+ "

Hello

\n\n
\n", -+ -+ "---\n***\n___\n", -+ "
\n\n
\n\n
\n", -+ } -+ doTestsBlock(t, tests, 0) -+} -+ -+func TestUnorderedList(t *testing.T) { -+ var tests = []string{ -+ "* Hello\n", -+ "
    \n
  • Hello
  • \n
\n", -+ -+ "* Yin\n* Yang\n", -+ "
    \n
  • Yin
  • \n
  • Yang
  • \n
\n", -+ -+ "* Ting\n* Bong\n* Goo\n", -+ "
    \n
  • Ting
  • \n
  • Bong
  • \n
  • Goo
  • \n
\n", -+ -+ "* Yin\n\n* Yang\n", -+ "
    \n
  • Yin

  • \n\n
  • Yang

  • \n
\n", -+ -+ "* Ting\n\n* Bong\n* Goo\n", -+ "
    \n
  • Ting

  • \n\n
  • Bong

  • \n\n
  • Goo

  • \n
\n", -+ -+ "+ Hello\n", -+ "
    \n
  • Hello
  • \n
\n", -+ -+ "+ Yin\n+ Yang\n", -+ "
    \n
  • Yin
  • \n
  • Yang
  • \n
\n", -+ -+ "+ Ting\n+ Bong\n+ Goo\n", -+ "
    \n
  • Ting
  • \n
  • Bong
  • \n
  • Goo
  • \n
\n", -+ -+ "+ Yin\n\n+ Yang\n", -+ "
    \n
  • Yin

  • \n\n
  • Yang

  • \n
\n", -+ -+ "+ Ting\n\n+ Bong\n+ Goo\n", -+ "
    \n
  • Ting

  • \n\n
  • Bong

  • \n\n
  • Goo

  • \n
\n", -+ -+ "- Hello\n", -+ "
    \n
  • Hello
  • \n
\n", -+ -+ "- Yin\n- Yang\n", -+ "
    \n
  • Yin
  • \n
  • Yang
  • \n
\n", -+ -+ "- Ting\n- Bong\n- Goo\n", -+ "
    \n
  • Ting
  • \n
  • Bong
  • \n
  • Goo
  • \n
\n", -+ -+ "- Yin\n\n- Yang\n", -+ "
    \n
  • Yin

  • \n\n
  • Yang

  • \n
\n", -+ -+ "- Ting\n\n- Bong\n- Goo\n", -+ "
    \n
  • Ting

  • \n\n
  • Bong

  • \n\n
  • Goo

  • \n
\n", -+ -+ "*Hello\n", -+ "

*Hello

\n", -+ -+ "* Hello \n", -+ "
    \n
  • Hello
  • \n
\n", -+ -+ "* Hello \n Next line \n", -+ "
    \n
  • Hello\nNext line
  • \n
\n", -+ -+ "Paragraph\n* No linebreak\n", -+ "

Paragraph\n* No linebreak

\n", -+ -+ "Paragraph\n\n* Linebreak\n", -+ "

Paragraph

\n\n
    \n
  • Linebreak
  • \n
\n", -+ -+ "* List\n * Nested list\n", -+ "
    \n
  • List\n\n
      \n
    • Nested list
    • \n
  • \n
\n", -+ -+ "* List\n\n * Nested list\n", -+ "
    \n
  • List

    \n\n
      \n
    • Nested list
    • \n
  • \n
\n", -+ -+ "* List\n Second line\n\n + Nested\n", -+ "
    \n
  • List\nSecond line

    \n\n
      \n
    • Nested
    • \n
  • \n
\n", -+ -+ "* List\n + Nested\n\n Continued\n", -+ "
    \n
  • List

    \n\n
      \n
    • Nested
    • \n
    \n\n

    Continued

  • \n
\n", -+ -+ "* List\n * shallow indent\n", -+ "
    \n
  • List\n\n
      \n
    • shallow indent
    • \n
  • \n
\n", -+ -+ "* List\n" + -+ " * shallow indent\n" + -+ " * part of second list\n" + -+ " * still second\n" + -+ " * almost there\n" + -+ " * third level\n", -+ "
    \n" + -+ "
  • List\n\n" + -+ "
      \n" + -+ "
    • shallow indent
    • \n" + -+ "
    • part of second list
    • \n" + -+ "
    • still second
    • \n" + -+ "
    • almost there\n\n" + -+ "
        \n" + -+ "
      • third level
      • \n" + -+ "
    • \n" + -+ "
  • \n" + -+ "
\n", -+ -+ "* List\n extra indent, same paragraph\n", -+ "
    \n
  • List\n extra indent, same paragraph
  • \n
\n", -+ -+ "* List\n\n code block\n", -+ "
    \n
  • List

    \n\n
    code block\n
  • \n
\n", -+ -+ "* List\n\n code block with spaces\n", -+ "
    \n
  • List

    \n\n
      code block with spaces\n
  • \n
\n", -+ -+ "* List\n\n * sublist\n\n normal text\n\n * another sublist\n", -+ "
    \n
  • List

    \n\n
      \n
    • sublist
    • \n
    \n\n

    normal text

    \n\n
      \n
    • another sublist
    • \n
  • \n
\n", -+ } -+ doTestsBlock(t, tests, 0) -+} -+ -+func TestOrderedList(t *testing.T) { -+ var tests = []string{ -+ "1. Hello\n", -+ "
    \n
  1. Hello
  2. \n
\n", -+ -+ "1. Yin\n2. Yang\n", -+ "
    \n
  1. Yin
  2. \n
  3. Yang
  4. \n
\n", -+ -+ "1. Ting\n2. Bong\n3. Goo\n", -+ "
    \n
  1. Ting
  2. \n
  3. Bong
  4. \n
  5. Goo
  6. \n
\n", -+ -+ "1. Yin\n\n2. Yang\n", -+ "
    \n
  1. Yin

  2. \n\n
  3. Yang

  4. \n
\n", -+ -+ "1. Ting\n\n2. Bong\n3. Goo\n", -+ "
    \n
  1. Ting

  2. \n\n
  3. Bong

  4. \n\n
  5. Goo

  6. \n
\n", -+ -+ "1 Hello\n", -+ "

1 Hello

\n", -+ -+ "1.Hello\n", -+ "

1.Hello

\n", -+ -+ "1. Hello \n", -+ "
    \n
  1. Hello
  2. \n
\n", -+ -+ "1. Hello \n Next line \n", -+ "
    \n
  1. Hello\nNext line
  2. \n
\n", -+ -+ "Paragraph\n1. No linebreak\n", -+ "

Paragraph\n1. No linebreak

\n", -+ -+ "Paragraph\n\n1. Linebreak\n", -+ "

Paragraph

\n\n
    \n
  1. Linebreak
  2. \n
\n", -+ -+ "1. List\n 1. Nested list\n", -+ "
    \n
  1. List\n\n
      \n
    1. Nested list
    2. \n
  2. \n
\n", -+ -+ "1. List\n\n 1. Nested list\n", -+ "
    \n
  1. List

    \n\n
      \n
    1. Nested list
    2. \n
  2. \n
\n", -+ -+ "1. List\n Second line\n\n 1. Nested\n", -+ "
    \n
  1. List\nSecond line

    \n\n
      \n
    1. Nested
    2. \n
  2. \n
\n", -+ -+ "1. List\n 1. Nested\n\n Continued\n", -+ "
    \n
  1. List

    \n\n
      \n
    1. Nested
    2. \n
    \n\n

    Continued

  2. \n
\n", -+ -+ "1. List\n 1. shallow indent\n", -+ "
    \n
  1. List\n\n
      \n
    1. shallow indent
    2. \n
  2. \n
\n", -+ -+ "1. List\n" + -+ " 1. shallow indent\n" + -+ " 2. part of second list\n" + -+ " 3. still second\n" + -+ " 4. almost there\n" + -+ " 1. third level\n", -+ "
    \n" + -+ "
  1. List\n\n" + -+ "
      \n" + -+ "
    1. shallow indent
    2. \n" + -+ "
    3. part of second list
    4. \n" + -+ "
    5. still second
    6. \n" + -+ "
    7. almost there\n\n" + -+ "
        \n" + -+ "
      1. third level
      2. \n" + -+ "
    8. \n" + -+ "
  2. \n" + -+ "
\n", -+ -+ "1. List\n extra indent, same paragraph\n", -+ "
    \n
  1. List\n extra indent, same paragraph
  2. \n
\n", -+ -+ "1. List\n\n code block\n", -+ "
    \n
  1. List

    \n\n
    code block\n
  2. \n
\n", -+ -+ "1. List\n\n code block with spaces\n", -+ "
    \n
  1. List

    \n\n
      code block with spaces\n
  2. \n
\n", -+ -+ "1. List\n * Mixted list\n", -+ "
    \n
  1. List\n\n
      \n
    • Mixted list
    • \n
  2. \n
\n", -+ -+ "1. List\n * Mixed list\n", -+ "
    \n
  1. List\n\n
      \n
    • Mixed list
    • \n
  2. \n
\n", -+ -+ "* Start with unordered\n 1. Ordered\n", -+ "
    \n
  • Start with unordered\n\n
      \n
    1. Ordered
    2. \n
  • \n
\n", -+ -+ "* Start with unordered\n 1. Ordered\n", -+ "
    \n
  • Start with unordered\n\n
      \n
    1. Ordered
    2. \n
  • \n
\n", -+ -+ "1. numbers\n1. are ignored\n", -+ "
    \n
  1. numbers
  2. \n
  3. are ignored
  4. \n
\n", -+ } -+ doTestsBlock(t, tests, 0) -+} -+ -+func TestPreformattedHtml(t *testing.T) { -+ var tests = []string{ -+ "
\n", -+ "
\n", -+ -+ "
\n
\n", -+ "
\n
\n", -+ -+ "
\n
\nParagraph\n", -+ "

\n
\nParagraph

\n", -+ -+ "
\n
\n", -+ "
\n
\n", -+ -+ "
\nAnything here\n
\n", -+ "
\nAnything here\n
\n", -+ -+ "
\n Anything here\n
\n", -+ "
\n Anything here\n
\n", -+ -+ "
\nAnything here\n
\n", -+ "
\nAnything here\n
\n", -+ -+ "
\nThis is *not* &proceessed\n
\n", -+ "
\nThis is *not* &proceessed\n
\n", -+ -+ "\n Something\n\n", -+ "

\n Something\n

\n", -+ -+ "
\n Something here\n\n", -+ "

\n Something here\n

\n", -+ -+ "Paragraph\n
\nHere? >&<\n
\n", -+ "

Paragraph\n

\nHere? >&<\n

\n", -+ -+ "Paragraph\n\n
\nHow about here? >&<\n
\n", -+ "

Paragraph

\n\n
\nHow about here? >&<\n
\n", -+ -+ "Paragraph\n
\nHere? >&<\n
\nAnd here?\n", -+ "

Paragraph\n

\nHere? >&<\n
\nAnd here?

\n", -+ -+ "Paragraph\n\n
\nHow about here? >&<\n
\nAnd here?\n", -+ "

Paragraph

\n\n

\nHow about here? >&<\n
\nAnd here?

\n", -+ -+ "Paragraph\n
\nHere? >&<\n
\n\nAnd here?\n", -+ "

Paragraph\n

\nHere? >&<\n

\n\n

And here?

\n", -+ -+ "Paragraph\n\n
\nHow about here? >&<\n
\n\nAnd here?\n", -+ "

Paragraph

\n\n
\nHow about here? >&<\n
\n\n

And here?

\n", -+ } -+ doTestsBlock(t, tests, 0) -+} -+ -+func TestPreformattedHtmlLax(t *testing.T) { -+ var tests = []string{ -+ "Paragraph\n
\nHere? >&<\n
\n", -+ "

Paragraph

\n\n
\nHere? >&<\n
\n", -+ -+ "Paragraph\n\n
\nHow about here? >&<\n
\n", -+ "

Paragraph

\n\n
\nHow about here? >&<\n
\n", -+ -+ "Paragraph\n
\nHere? >&<\n
\nAnd here?\n", -+ "

Paragraph

\n\n
\nHere? >&<\n
\n\n

And here?

\n", -+ -+ "Paragraph\n\n
\nHow about here? >&<\n
\nAnd here?\n", -+ "

Paragraph

\n\n
\nHow about here? >&<\n
\n\n

And here?

\n", -+ -+ "Paragraph\n
\nHere? >&<\n
\n\nAnd here?\n", -+ "

Paragraph

\n\n
\nHere? >&<\n
\n\n

And here?

\n", -+ -+ "Paragraph\n\n
\nHow about here? >&<\n
\n\nAnd here?\n", -+ "

Paragraph

\n\n
\nHow about here? >&<\n
\n\n

And here?

\n", -+ } -+ doTestsBlock(t, tests, EXTENSION_LAX_HTML_BLOCKS) -+} -+ -+func TestFencedCodeBlock(t *testing.T) { -+ var tests = []string{ -+ "``` go\nfunc foo() bool {\n\treturn true;\n}\n```\n", -+ "
func foo() bool {\n\treturn true;\n}\n
\n", -+ -+ "``` c\n/* special & char < > \" escaping */\n```\n", -+ "
/* special & char < > " escaping */\n
\n", -+ -+ "``` c\nno *inline* processing ~~of text~~\n```\n", -+ "
no *inline* processing ~~of text~~\n
\n", -+ -+ "```\nNo language\n```\n", -+ "
No language\n
\n", -+ -+ "``` {ocaml}\nlanguage in braces\n```\n", -+ "
language in braces\n
\n", -+ -+ "``` {ocaml} \nwith extra whitespace\n```\n", -+ "
with extra whitespace\n
\n", -+ -+ "```{ ocaml }\nwith extra whitespace\n```\n", -+ "
with extra whitespace\n
\n", -+ -+ "~ ~~ java\nWith whitespace\n~~~\n", -+ "

~ ~~ java\nWith whitespace\n~~~

\n", -+ -+ "~~\nonly two\n~~\n", -+ "

~~\nonly two\n~~

\n", -+ -+ "```` python\nextra\n````\n", -+ "
extra\n
\n", -+ -+ "~~~ perl\nthree to start, four to end\n~~~~\n", -+ "

~~~ perl\nthree to start, four to end\n~~~~

\n", -+ -+ "~~~~ perl\nfour to start, three to end\n~~~\n", -+ "

~~~~ perl\nfour to start, three to end\n~~~

\n", -+ -+ "~~~ bash\ntildes\n~~~\n", -+ "
tildes\n
\n", -+ -+ "``` lisp\nno ending\n", -+ "

``` lisp\nno ending

\n", -+ -+ "~~~ lisp\nend with language\n~~~ lisp\n", -+ "

~~~ lisp\nend with language\n~~~ lisp

\n", -+ -+ "```\nmismatched begin and end\n~~~\n", -+ "

```\nmismatched begin and end\n~~~

\n", -+ -+ "~~~\nmismatched begin and end\n```\n", -+ "

~~~\nmismatched begin and end\n```

\n", -+ -+ " ``` oz\nleading spaces\n```\n", -+ "
leading spaces\n
\n", -+ -+ " ``` oz\nleading spaces\n ```\n", -+ "
leading spaces\n
\n", -+ -+ " ``` oz\nleading spaces\n ```\n", -+ "
leading spaces\n
\n", -+ -+ "``` oz\nleading spaces\n ```\n", -+ "
leading spaces\n
\n", -+ -+ " ``` oz\nleading spaces\n ```\n", -+ "
``` oz\n
\n\n

leading spaces\n ```

\n", -+ -+ "Bla bla\n\n``` oz\ncode blocks breakup paragraphs\n```\n\nBla Bla\n", -+ "

Bla bla

\n\n
code blocks breakup paragraphs\n
\n\n

Bla Bla

\n", -+ -+ "Some text before a fenced code block\n``` oz\ncode blocks breakup paragraphs\n```\nAnd some text after a fenced code block", -+ "

Some text before a fenced code block

\n\n
code blocks breakup paragraphs\n
\n\n

And some text after a fenced code block

\n", -+ -+ "`", -+ "

`

\n", -+ -+ "Bla bla\n\n``` oz\ncode blocks breakup paragraphs\n```\n\nBla Bla\n\n``` oz\nmultiple code blocks work okay\n```\n\nBla Bla\n", -+ "

Bla bla

\n\n
code blocks breakup paragraphs\n
\n\n

Bla Bla

\n\n
multiple code blocks work okay\n
\n\n

Bla Bla

\n", -+ -+ "Some text before a fenced code block\n``` oz\ncode blocks breakup paragraphs\n```\nSome text in between\n``` oz\nmultiple code blocks work okay\n```\nAnd some text after a fenced code block", -+ "

Some text before a fenced code block

\n\n
code blocks breakup paragraphs\n
\n\n

Some text in between

\n\n
multiple code blocks work okay\n
\n\n

And some text after a fenced code block

\n", -+ } -+ doTestsBlock(t, tests, EXTENSION_FENCED_CODE) -+} -+ -+func TestTable(t *testing.T) { -+ var tests = []string{ -+ "a | b\n---|---\nc | d\n", -+ "\n\n\n\n\n\n\n\n" + -+ "\n\n\n\n\n\n
ab
cd
\n", -+ -+ "a | b\n---|--\nc | d\n", -+ "

a | b\n---|--\nc | d

\n", -+ -+ "|a|b|c|d|\n|----|----|----|---|\n|e|f|g|h|\n", -+ "\n\n\n\n\n\n\n\n\n\n" + -+ "\n\n\n\n\n\n\n\n
abcd
efgh
\n", -+ -+ "*a*|__b__|[c](C)|d\n---|---|---|---\ne|f|g|h\n", -+ "\n\n\n\n\n\n\n\n\n\n" + -+ "\n\n\n\n\n\n\n\n
abcd
efgh
\n", -+ -+ "a|b|c\n---|---|---\nd|e|f\ng|h\ni|j|k|l|m\nn|o|p\n", -+ "\n\n\n\n\n\n\n\n\n" + -+ "\n\n\n\n\n\n\n" + -+ "\n\n\n\n\n\n" + -+ "\n\n\n\n\n\n" + -+ "\n\n\n\n\n\n
abc
def
gh
ijk
nop
\n", -+ -+ "a|b|c\n---|---|---\n*d*|__e__|f\n", -+ "\n\n\n\n\n\n\n\n\n" + -+ "\n\n\n\n\n\n\n
abc
def
\n", -+ -+ "a|b|c|d\n:--|--:|:-:|---\ne|f|g|h\n", -+ "\n\n\n\n\n" + -+ "\n\n\n\n\n" + -+ "\n\n\n\n" + -+ "\n\n\n\n
abcd
efgh
\n", -+ -+ "a|b|c\n---|---|---\n", -+ "\n\n\n\n\n\n\n\n\n\n\n
abc
\n", -+ -+ "a| b|c | d | e\n---|---|---|---|---\nf| g|h | i |j\n", -+ "\n\n\n\n\n\n\n\n\n\n\n" + -+ "\n\n\n\n\n\n\n\n\n
abcde
fghij
\n", -+ -+ "a|b\\|c|d\n---|---|---\nf|g\\|h|i\n", -+ "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ab|cd
fg|hi
\n", -+ } -+ doTestsBlock(t, tests, EXTENSION_TABLES) -+} -+ -+func TestUnorderedListWith_EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK(t *testing.T) { -+ var tests = []string{ -+ "* Hello\n", -+ "
    \n
  • Hello
  • \n
\n", -+ -+ "* Yin\n* Yang\n", -+ "
    \n
  • Yin
  • \n
  • Yang
  • \n
\n", -+ -+ "* Ting\n* Bong\n* Goo\n", -+ "
    \n
  • Ting
  • \n
  • Bong
  • \n
  • Goo
  • \n
\n", -+ -+ "* Yin\n\n* Yang\n", -+ "
    \n
  • Yin

  • \n\n
  • Yang

  • \n
\n", -+ -+ "* Ting\n\n* Bong\n* Goo\n", -+ "
    \n
  • Ting

  • \n\n
  • Bong

  • \n\n
  • Goo

  • \n
\n", -+ -+ "+ Hello\n", -+ "
    \n
  • Hello
  • \n
\n", -+ -+ "+ Yin\n+ Yang\n", -+ "
    \n
  • Yin
  • \n
  • Yang
  • \n
\n", -+ -+ "+ Ting\n+ Bong\n+ Goo\n", -+ "
    \n
  • Ting
  • \n
  • Bong
  • \n
  • Goo
  • \n
\n", -+ -+ "+ Yin\n\n+ Yang\n", -+ "
    \n
  • Yin

  • \n\n
  • Yang

  • \n
\n", -+ -+ "+ Ting\n\n+ Bong\n+ Goo\n", -+ "
    \n
  • Ting

  • \n\n
  • Bong

  • \n\n
  • Goo

  • \n
\n", -+ -+ "- Hello\n", -+ "
    \n
  • Hello
  • \n
\n", -+ -+ "- Yin\n- Yang\n", -+ "
    \n
  • Yin
  • \n
  • Yang
  • \n
\n", -+ -+ "- Ting\n- Bong\n- Goo\n", -+ "
    \n
  • Ting
  • \n
  • Bong
  • \n
  • Goo
  • \n
\n", -+ -+ "- Yin\n\n- Yang\n", -+ "
    \n
  • Yin

  • \n\n
  • Yang

  • \n
\n", -+ -+ "- Ting\n\n- Bong\n- Goo\n", -+ "
    \n
  • Ting

  • \n\n
  • Bong

  • \n\n
  • Goo

  • \n
\n", -+ -+ "*Hello\n", -+ "

*Hello

\n", -+ -+ "* Hello \n", -+ "
    \n
  • Hello
  • \n
\n", -+ -+ "* Hello \n Next line \n", -+ "
    \n
  • Hello\nNext line
  • \n
\n", -+ -+ "Paragraph\n* No linebreak\n", -+ "

Paragraph

\n\n
    \n
  • No linebreak
  • \n
\n", -+ -+ "Paragraph\n\n* Linebreak\n", -+ "

Paragraph

\n\n
    \n
  • Linebreak
  • \n
\n", -+ -+ "* List\n * Nested list\n", -+ "
    \n
  • List\n\n
      \n
    • Nested list
    • \n
  • \n
\n", -+ -+ "* List\n\n * Nested list\n", -+ "
    \n
  • List

    \n\n
      \n
    • Nested list
    • \n
  • \n
\n", -+ -+ "* List\n Second line\n\n + Nested\n", -+ "
    \n
  • List\nSecond line

    \n\n
      \n
    • Nested
    • \n
  • \n
\n", -+ -+ "* List\n + Nested\n\n Continued\n", -+ "
    \n
  • List

    \n\n
      \n
    • Nested
    • \n
    \n\n

    Continued

  • \n
\n", -+ -+ "* List\n * shallow indent\n", -+ "
    \n
  • List\n\n
      \n
    • shallow indent
    • \n
  • \n
\n", -+ -+ "* List\n" + -+ " * shallow indent\n" + -+ " * part of second list\n" + -+ " * still second\n" + -+ " * almost there\n" + -+ " * third level\n", -+ "
    \n" + -+ "
  • List\n\n" + -+ "
      \n" + -+ "
    • shallow indent
    • \n" + -+ "
    • part of second list
    • \n" + -+ "
    • still second
    • \n" + -+ "
    • almost there\n\n" + -+ "
        \n" + -+ "
      • third level
      • \n" + -+ "
    • \n" + -+ "
  • \n" + -+ "
\n", -+ -+ "* List\n extra indent, same paragraph\n", -+ "
    \n
  • List\n extra indent, same paragraph
  • \n
\n", -+ -+ "* List\n\n code block\n", -+ "
    \n
  • List

    \n\n
    code block\n
  • \n
\n", -+ -+ "* List\n\n code block with spaces\n", -+ "
    \n
  • List

    \n\n
      code block with spaces\n
  • \n
\n", -+ -+ "* List\n\n * sublist\n\n normal text\n\n * another sublist\n", -+ "
    \n
  • List

    \n\n
      \n
    • sublist
    • \n
    \n\n

    normal text

    \n\n
      \n
    • another sublist
    • \n
  • \n
\n", -+ } -+ doTestsBlock(t, tests, EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK) -+} -+ -+func TestOrderedList_EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK(t *testing.T) { -+ var tests = []string{ -+ "1. Hello\n", -+ "
    \n
  1. Hello
  2. \n
\n", -+ -+ "1. Yin\n2. Yang\n", -+ "
    \n
  1. Yin
  2. \n
  3. Yang
  4. \n
\n", -+ -+ "1. Ting\n2. Bong\n3. Goo\n", -+ "
    \n
  1. Ting
  2. \n
  3. Bong
  4. \n
  5. Goo
  6. \n
\n", -+ -+ "1. Yin\n\n2. Yang\n", -+ "
    \n
  1. Yin

  2. \n\n
  3. Yang

  4. \n
\n", -+ -+ "1. Ting\n\n2. Bong\n3. Goo\n", -+ "
    \n
  1. Ting

  2. \n\n
  3. Bong

  4. \n\n
  5. Goo

  6. \n
\n", -+ -+ "1 Hello\n", -+ "

1 Hello

\n", -+ -+ "1.Hello\n", -+ "

1.Hello

\n", -+ -+ "1. Hello \n", -+ "
    \n
  1. Hello
  2. \n
\n", -+ -+ "1. Hello \n Next line \n", -+ "
    \n
  1. Hello\nNext line
  2. \n
\n", -+ -+ "Paragraph\n1. No linebreak\n", -+ "

Paragraph

\n\n
    \n
  1. No linebreak
  2. \n
\n", -+ -+ "Paragraph\n\n1. Linebreak\n", -+ "

Paragraph

\n\n
    \n
  1. Linebreak
  2. \n
\n", -+ -+ "1. List\n 1. Nested list\n", -+ "
    \n
  1. List\n\n
      \n
    1. Nested list
    2. \n
  2. \n
\n", -+ -+ "1. List\n\n 1. Nested list\n", -+ "
    \n
  1. List

    \n\n
      \n
    1. Nested list
    2. \n
  2. \n
\n", -+ -+ "1. List\n Second line\n\n 1. Nested\n", -+ "
    \n
  1. List\nSecond line

    \n\n
      \n
    1. Nested
    2. \n
  2. \n
\n", -+ -+ "1. List\n 1. Nested\n\n Continued\n", -+ "
    \n
  1. List

    \n\n
      \n
    1. Nested
    2. \n
    \n\n

    Continued

  2. \n
\n", -+ -+ "1. List\n 1. shallow indent\n", -+ "
    \n
  1. List\n\n
      \n
    1. shallow indent
    2. \n
  2. \n
\n", -+ -+ "1. List\n" + -+ " 1. shallow indent\n" + -+ " 2. part of second list\n" + -+ " 3. still second\n" + -+ " 4. almost there\n" + -+ " 1. third level\n", -+ "
    \n" + -+ "
  1. List\n\n" + -+ "
      \n" + -+ "
    1. shallow indent
    2. \n" + -+ "
    3. part of second list
    4. \n" + -+ "
    5. still second
    6. \n" + -+ "
    7. almost there\n\n" + -+ "
        \n" + -+ "
      1. third level
      2. \n" + -+ "
    8. \n" + -+ "
  2. \n" + -+ "
\n", -+ -+ "1. List\n extra indent, same paragraph\n", -+ "
    \n
  1. List\n extra indent, same paragraph
  2. \n
\n", -+ -+ "1. List\n\n code block\n", -+ "
    \n
  1. List

    \n\n
    code block\n
  2. \n
\n", -+ -+ "1. List\n\n code block with spaces\n", -+ "
    \n
  1. List

    \n\n
      code block with spaces\n
  2. \n
\n", -+ -+ "1. List\n * Mixted list\n", -+ "
    \n
  1. List\n\n
      \n
    • Mixted list
    • \n
  2. \n
\n", -+ -+ "1. List\n * Mixed list\n", -+ "
    \n
  1. List\n\n
      \n
    • Mixed list
    • \n
  2. \n
\n", -+ -+ "* Start with unordered\n 1. Ordered\n", -+ "
    \n
  • Start with unordered\n\n
      \n
    1. Ordered
    2. \n
  • \n
\n", -+ -+ "* Start with unordered\n 1. Ordered\n", -+ "
    \n
  • Start with unordered\n\n
      \n
    1. Ordered
    2. \n
  • \n
\n", -+ -+ "1. numbers\n1. are ignored\n", -+ "
    \n
  1. numbers
  2. \n
  3. are ignored
  4. \n
\n", -+ } -+ doTestsBlock(t, tests, EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK) -+} -+ -+func TestFencedCodeBlock_EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK(t *testing.T) { -+ var tests = []string{ -+ "``` go\nfunc foo() bool {\n\treturn true;\n}\n```\n", -+ "
func foo() bool {\n\treturn true;\n}\n
\n", -+ -+ "``` c\n/* special & char < > \" escaping */\n```\n", -+ "
/* special & char < > " escaping */\n
\n", -+ -+ "``` c\nno *inline* processing ~~of text~~\n```\n", -+ "
no *inline* processing ~~of text~~\n
\n", -+ -+ "```\nNo language\n```\n", -+ "
No language\n
\n", -+ -+ "``` {ocaml}\nlanguage in braces\n```\n", -+ "
language in braces\n
\n", -+ -+ "``` {ocaml} \nwith extra whitespace\n```\n", -+ "
with extra whitespace\n
\n", -+ -+ "```{ ocaml }\nwith extra whitespace\n```\n", -+ "
with extra whitespace\n
\n", -+ -+ "~ ~~ java\nWith whitespace\n~~~\n", -+ "

~ ~~ java\nWith whitespace\n~~~

\n", -+ -+ "~~\nonly two\n~~\n", -+ "

~~\nonly two\n~~

\n", -+ -+ "```` python\nextra\n````\n", -+ "
extra\n
\n", -+ -+ "~~~ perl\nthree to start, four to end\n~~~~\n", -+ "

~~~ perl\nthree to start, four to end\n~~~~

\n", -+ -+ "~~~~ perl\nfour to start, three to end\n~~~\n", -+ "

~~~~ perl\nfour to start, three to end\n~~~

\n", -+ -+ "~~~ bash\ntildes\n~~~\n", -+ "
tildes\n
\n", -+ -+ "``` lisp\nno ending\n", -+ "

``` lisp\nno ending

\n", -+ -+ "~~~ lisp\nend with language\n~~~ lisp\n", -+ "

~~~ lisp\nend with language\n~~~ lisp

\n", -+ -+ "```\nmismatched begin and end\n~~~\n", -+ "

```\nmismatched begin and end\n~~~

\n", -+ -+ "~~~\nmismatched begin and end\n```\n", -+ "

~~~\nmismatched begin and end\n```

\n", -+ -+ " ``` oz\nleading spaces\n```\n", -+ "
leading spaces\n
\n", -+ -+ " ``` oz\nleading spaces\n ```\n", -+ "
leading spaces\n
\n", -+ -+ " ``` oz\nleading spaces\n ```\n", -+ "
leading spaces\n
\n", -+ -+ "``` oz\nleading spaces\n ```\n", -+ "
leading spaces\n
\n", -+ -+ " ``` oz\nleading spaces\n ```\n", -+ "
``` oz\n
\n\n

leading spaces

\n\n
```\n
\n", -+ } -+ doTestsBlock(t, tests, EXTENSION_FENCED_CODE|EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK) -+} -+ -+func TestTitleBlock_EXTENSION_TITLEBLOCK(t *testing.T) { -+ var tests = []string{ -+ "% Some title\n" + -+ "% Another title line\n" + -+ "% Yep, more here too\n", -+ "

" + -+ "Some title\n" + -+ "Another title line\n" + -+ "Yep, more here too\n" + -+ "

", -+ } -+ -+ doTestsBlock(t, tests, EXTENSION_TITLEBLOCK) -+ -+} -diff --git a/vendor/src/github.com/russross/blackfriday/html.go b/vendor/src/github.com/russross/blackfriday/html.go -new file mode 100644 -index 0000000..3655a10 ---- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/html.go -@@ -0,0 +1,922 @@ -+// -+// Blackfriday Markdown Processor -+// Available at http://github.com/russross/blackfriday -+// -+// Copyright © 2011 Russ Ross . -+// Distributed under the Simplified BSD License. -+// See README.md for details. -+// -+ -+// -+// -+// HTML rendering backend -+// -+// -+ -+package blackfriday -+ -+import ( -+ "bytes" -+ "fmt" -+ "regexp" -+ "strconv" -+ "strings" -+) -+ -+// Html renderer configuration options. -+const ( -+ HTML_SKIP_HTML = 1 << iota // skip preformatted HTML blocks -+ HTML_SKIP_STYLE // skip embedded