From 82189c27fe51c67efda16f111b22e258f339e296 Mon Sep 17 00:00:00 2001 From: Joachim Hill-Grannec Date: Thu, 23 Feb 2017 13:12:31 -0800 Subject: [PATCH] =?UTF-8?q?Fix=20to=20check=20if=20the=20repo=20is=20enabl?= =?UTF-8?q?ed=20and=20don=E2=80=99t=20make=20a=20call=20to=20the=20setting?= =?UTF-8?q?s=20it=20isn=E2=80=99t.=20=20The=20API=20works=20differently=20?= =?UTF-8?q?the=20first=20time=20vs=20if=20it=E2=80=99s=20ever=20been=20ena?= =?UTF-8?q?bled.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- remote/bitbucketserver/internal/client.go | 29 +++++++++++++++++++++-- remote/bitbucketserver/internal/types.go | 13 ++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/remote/bitbucketserver/internal/client.go b/remote/bitbucketserver/internal/client.go index d536cb4ef..f652268c9 100644 --- a/remote/bitbucketserver/internal/client.go +++ b/remote/bitbucketserver/internal/client.go @@ -23,6 +23,7 @@ const ( pathHook = "%s/rest/api/1.0/projects/%s/repos/%s/settings/hooks/%s" pathSource = "%s/projects/%s/repos/%s/browse/%s?at=%s&raw" hookName = "com.atlassian.stash.plugin.stash-web-post-receive-hooks-plugin:postReceiveHook" + pathHookDetails = "%s/rest/api/1.0/projects/%s/repos/%s/settings/hooks/%s" pathHookEnabled = "%s/rest/api/1.0/projects/%s/repos/%s/settings/hooks/%s/enabled" pathHookSettings = "%s/rest/api/1.0/projects/%s/repos/%s/settings/hooks/%s/settings" pathStatus = "%s/rest/build-status/1.0/commits/%s" @@ -131,15 +132,23 @@ func (c *Client) FindFileForRepo(owner string, repo string, fileName string, ref } func (c *Client) CreateHook(owner string, name string, callBackLink string) error { - hookSettings, err := c.GetHooks(owner, name) + hookDetails , err := c.GetHookDetails(owner, name) if err != nil { return err } - hooks := hookSettingsToArray(hookSettings) + hooks := make([]string, 0) + if (hookDetails.Enabled) { + hookSettings, err := c.GetHooks(owner, name) + if err != nil { + return err + } + hooks = hookSettingsToArray(hookSettings) + } if !stringInSlice(callBackLink, hooks) { hooks = append(hooks, callBackLink) } + putHookSettings := arrayToHookSettings(hooks) hookBytes, err := json.Marshal(putHookSettings) return c.doPut(fmt.Sprintf(pathHookEnabled, c.base, owner, name, hookName), hookBytes) @@ -165,6 +174,22 @@ func (c *Client) DeleteHook(owner string, name string, link string) error { return c.doPut(fmt.Sprintf(pathHookEnabled, c.base, owner, name, hookName), hookBytes) } +func (c *Client) GetHookDetails(owner string, name string) (*HookPluginDetails, error) { + urlString := fmt.Sprintf(pathHookDetails, c.base, owner, name, hookName) + response, err := c.client.Get(urlString) + if err != nil { + return nil, err + } + defer response.Body.Close() + contents, err := ioutil.ReadAll(response.Body) + hookDetails := HookPluginDetails{} + err = json.Unmarshal(contents, &hookDetails) + if err != nil { + return nil, err + } + return &hookDetails, nil +} + func (c *Client) GetHooks(owner string, name string) (*HookSettings, error) { urlString := fmt.Sprintf(pathHookSettings, c.base, owner, name, hookName) response, err := c.client.Get(urlString) diff --git a/remote/bitbucketserver/internal/types.go b/remote/bitbucketserver/internal/types.go index cfa2e587d..43d7a1366 100644 --- a/remote/bitbucketserver/internal/types.go +++ b/remote/bitbucketserver/internal/types.go @@ -170,6 +170,19 @@ type RefChange struct { Type string `json:"type"` } +type HookPluginDetails struct { + Details struct { + Key string `json:"key"` + Name string `json:"name"` + Type string `json:"type"` + Description string `json:"description"` + Version string `json:"version"` + ConfigFormKey string `json:"configFormKey"` + } `json:"details"` + Enabled bool `json:"enabled"` + Configured bool `json:"configured"` +} + type HookSettings struct { HookURL0 string `json:"hook-url-0,omitempty"` HookURL1 string `json:"hook-url-1,omitempty"`