diff options
Diffstat (limited to 'cmd/hook.go')
-rw-r--r-- | cmd/hook.go | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/cmd/hook.go b/cmd/hook.go new file mode 100644 index 0000000000..15ad74f8e0 --- /dev/null +++ b/cmd/hook.go @@ -0,0 +1,106 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package cmd + +import ( + "fmt" + "os" + + "code.gitea.io/gitea/models" + + "github.com/urfave/cli" +) + +var ( + // CmdHook represents the available hooks sub-command. + CmdHook = cli.Command{ + Name: "hook", + Usage: "Delegate commands to corresponding Git hooks", + Description: "This should only be called by Git", + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "config, c", + Value: "custom/conf/app.ini", + Usage: "Custom configuration file path", + }, + }, + Subcommands: []cli.Command{ + subcmdHookPreReceive, + subcmdHookUpadte, + subcmdHookPostReceive, + }, + } + + subcmdHookPreReceive = cli.Command{ + Name: "pre-receive", + Usage: "Delegate pre-receive Git hook", + Description: "This command should only be called by Git", + Action: runHookPreReceive, + } + subcmdHookUpadte = cli.Command{ + Name: "update", + Usage: "Delegate update Git hook", + Description: "This command should only be called by Git", + Action: runHookUpdate, + } + subcmdHookPostReceive = cli.Command{ + Name: "post-receive", + Usage: "Delegate post-receive Git hook", + Description: "This command should only be called by Git", + Action: runHookPostReceive, + } +) + +func runHookPreReceive(c *cli.Context) error { + if len(os.Getenv("SSH_ORIGINAL_COMMAND")) == 0 { + return nil + } + if err := setup("hooks/pre-receive.log"); err != nil { + fail("Hook pre-receive init failed", fmt.Sprintf("setup: %v", err)) + } + + return nil +} + +func runHookUpdate(c *cli.Context) error { + if len(os.Getenv("SSH_ORIGINAL_COMMAND")) == 0 { + return nil + } + + if err := setup("hooks/update.log"); err != nil { + fail("Hook update init failed", fmt.Sprintf("setup: %v", err)) + } + + args := c.Args() + if len(args) != 3 { + fail("Arguments received are not equal to three", "Arguments received are not equal to three") + } else if len(args[0]) == 0 { + fail("First argument 'refName' is empty", "First argument 'refName' is empty") + } + + uuid := os.Getenv(envUpdateTaskUUID) + if err := models.AddUpdateTask(&models.UpdateTask{ + UUID: uuid, + RefName: args[0], + OldCommitID: args[1], + NewCommitID: args[2], + }); err != nil { + fail("Internal error", "Fail to add update task '%s': %v", uuid, err) + } + + return nil +} + +func runHookPostReceive(c *cli.Context) error { + if len(os.Getenv("SSH_ORIGINAL_COMMAND")) == 0 { + return nil + } + + if err := setup("hooks/post-receive.log"); err != nil { + fail("Hook post-receive init failed", fmt.Sprintf("setup: %v", err)) + } + + return nil +} |