From 1d6880b1a66f0053fa82b5116b1e01187e0fc95a Mon Sep 17 00:00:00 2001
From: Michael Kriese <michael.kriese@visualon.de>
Date: Mon, 24 Jun 2019 18:28:24 +0200
Subject: [PATCH] fix(bitbucket-server): store pr versions (#3957)

---
 lib/platform/bitbucket-server/index.ts        | 40 +++++++----
 .../__snapshots__/index.spec.ts.snap          | 72 -------------------
 2 files changed, 27 insertions(+), 85 deletions(-)

diff --git a/lib/platform/bitbucket-server/index.ts b/lib/platform/bitbucket-server/index.ts
index d0534d2f36..5cdb3ed318 100644
--- a/lib/platform/bitbucket-server/index.ts
+++ b/lib/platform/bitbucket-server/index.ts
@@ -18,6 +18,8 @@ interface BbsConfig {
   repository: string;
   repositorySlug: string;
   storage: GitStorage;
+
+  prVersions: Map<number, number>;
 }
 
 let config: BbsConfig = {} as any;
@@ -26,6 +28,13 @@ const defaults: any = {
   hostType: 'bitbucket-server',
 };
 
+/* istanbul ignore next */
+function updatePrVersion(pr: number, version: number) {
+  const res = Math.max(config.prVersions.get(pr) || 0, version);
+  config.prVersions.set(pr, res);
+  return res;
+}
+
 export function initPlatform({
   endpoint,
   username,
@@ -100,7 +109,13 @@ export async function initRepo({
   });
 
   const [projectKey, repositorySlug] = repository.split('/');
-  config = { projectKey, repositorySlug, gitPrivateKey, repository } as any;
+  config = {
+    projectKey,
+    repositorySlug,
+    gitPrivateKey,
+    repository,
+    prVersions: new Map<number, number>(),
+  } as any;
 
   /* istanbul ignore else */
   if (bbUseDefaultReviewers !== false) {
@@ -250,13 +265,11 @@ export async function deleteBranch(branchName: string, closePr = false) {
     // getBranchPr
     const pr = await getBranchPr(branchName);
     if (pr) {
-      await api.post(
+      const { body } = await api.post(
         `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${pr.number}/decline?version=${pr.version}`
       );
 
-      // wait for pr change propagation
-      await delay(1000);
-      await getPr(pr.number, true);
+      updatePrVersion(pr, body);
     }
   }
   return config.storage.deleteBranch(branchName);
@@ -733,6 +746,8 @@ export async function createPr(
     ...utils.prInfo(prInfoRes.body),
   };
 
+  updatePrVersion(pr.number, pr.version);
+
   // istanbul ignore if
   if (config.prList) {
     config.prList.push(pr);
@@ -761,6 +776,8 @@ export async function getPr(prNo: number, refreshCache?: boolean) {
     ),
   };
 
+  pr.version = updatePrVersion(pr.number, pr.version);
+
   if (pr.state === 'open') {
     const mergeRes = await api.get(
       `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${prNo}/merge`,
@@ -841,7 +858,7 @@ export async function updatePr(
       throw Object.assign(new Error('not-found'), { statusCode: 404 });
     }
 
-    await api.put(
+    const { body } = await api.put(
       `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${prNo}`,
       {
         body: {
@@ -852,9 +869,8 @@ export async function updatePr(
         },
       }
     );
-    // wait for pr change propagation
-    await delay(1000);
-    await getPr(prNo, true);
+
+    updatePrVersion(prNo, body.version);
   } catch (err) {
     if (err.statusCode === 404) {
       throw new Error('not-found');
@@ -876,12 +892,10 @@ export async function mergePr(prNo: number, branchName: string) {
     if (!pr) {
       throw Object.assign(new Error('not-found'), { statusCode: 404 });
     }
-    await api.post(
+    const { body } = await api.post(
       `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${prNo}/merge?version=${pr.version}`
     );
-    // wait for pr change propagation
-    await delay(1000);
-    await getPr(prNo, true);
+    updatePrVersion(prNo, body.version);
   } catch (err) {
     if (err.statusCode === 404) {
       throw new Error('not-found');
diff --git a/test/platform/bitbucket-server/__snapshots__/index.spec.ts.snap b/test/platform/bitbucket-server/__snapshots__/index.spec.ts.snap
index 998f20b2ef..61e05a9102 100644
--- a/test/platform/bitbucket-server/__snapshots__/index.spec.ts.snap
+++ b/test/platform/bitbucket-server/__snapshots__/index.spec.ts.snap
@@ -1016,24 +1016,6 @@ Array [
       "useCache": true,
     },
   ],
-  Array [
-    "./rest/api/1.0/projects/SOME/repos/repo/pull-requests/5",
-    Object {
-      "useCache": false,
-    },
-  ],
-  Array [
-    "./rest/api/1.0/projects/SOME/repos/repo/pull-requests/5/merge",
-    Object {
-      "useCache": false,
-    },
-  ],
-  Array [
-    "./rest/api/1.0/projects/SOME/repos/repo/pull-requests/5/commits?withCounts=true",
-    Object {
-      "useCache": false,
-    },
-  ],
 ]
 `;
 
@@ -1288,24 +1270,6 @@ Array [
       "useCache": true,
     },
   ],
-  Array [
-    "./rest/api/1.0/projects/SOME/repos/repo/pull-requests/5",
-    Object {
-      "useCache": false,
-    },
-  ],
-  Array [
-    "./rest/api/1.0/projects/SOME/repos/repo/pull-requests/5/merge",
-    Object {
-      "useCache": false,
-    },
-  ],
-  Array [
-    "./rest/api/1.0/projects/SOME/repos/repo/pull-requests/5/commits?withCounts=true",
-    Object {
-      "useCache": false,
-    },
-  ],
 ]
 `;
 
@@ -2506,24 +2470,6 @@ Array [
       "useCache": true,
     },
   ],
-  Array [
-    "./rest/api/1.0/projects/SOME/repos/repo/pull-requests/5",
-    Object {
-      "useCache": false,
-    },
-  ],
-  Array [
-    "./rest/api/1.0/projects/SOME/repos/repo/pull-requests/5/merge",
-    Object {
-      "useCache": false,
-    },
-  ],
-  Array [
-    "./rest/api/1.0/projects/SOME/repos/repo/pull-requests/5/commits?withCounts=true",
-    Object {
-      "useCache": false,
-    },
-  ],
 ]
 `;
 
@@ -2778,24 +2724,6 @@ Array [
       "useCache": true,
     },
   ],
-  Array [
-    "./rest/api/1.0/projects/SOME/repos/repo/pull-requests/5",
-    Object {
-      "useCache": false,
-    },
-  ],
-  Array [
-    "./rest/api/1.0/projects/SOME/repos/repo/pull-requests/5/merge",
-    Object {
-      "useCache": false,
-    },
-  ],
-  Array [
-    "./rest/api/1.0/projects/SOME/repos/repo/pull-requests/5/commits?withCounts=true",
-    Object {
-      "useCache": false,
-    },
-  ],
 ]
 `;
 
-- 
GitLab