Commit f2236886 authored by Lennard Sprong's avatar Lennard Sprong
Browse files

fix: Read showClosedMergeRequests setting

parent f5747ef0
Loading
Loading
Loading
Loading
+5 −11
Original line number Diff line number Diff line
@@ -12,9 +12,8 @@ import { Repository } from '../api/git';
import { WarningError } from '../errors/warning_error';
import { getProjectWithRepositoryInfo } from '../gitlab/api/get_projects_with_repository_info';
import { getPipelineAndMrForBranch } from '../gitlab/get_pipeline_and_mr_for_branch';
import { getMergeRequestsForBranch } from '../gitlab/api/get_merge_requests_for_branch';
import { currentUserRequest } from '../../common/gitlab/api/get_current_user';
import { getMostRelevantMergeRequest } from '../utils/get_most_relevant_merge_request';
import { findOpenMrForCurrentBranch } from '../gitlab/utils/mr_lookup_helpers';
import {
  ProjectCommand,
  ProjectFileCommand,
@@ -124,15 +123,10 @@ export const openCommitInGitLab = async (projectUrl: string, commit: string): Pr
};

export const openCurrentMergeRequest: ProjectCommand = async projectInRepository => {
  const { repository } = projectInRepository.pointer;
  const mr = getMostRelevantMergeRequest(
    await getGitLabService(projectInRepository).fetchFromApi(
      getMergeRequestsForBranch(
        projectInRepository.project,
        await getTrackingBranchNameOrThrow(repository.rawRepository),
      ),
    ),
  );
  const gitlabService = getGitLabService(projectInRepository);
  const { project, pointer } = projectInRepository;
  const trackingBranchName = await getTrackingBranchNameOrThrow(pointer.repository.rawRepository);
  const mr = await findOpenMrForCurrentBranch(gitlabService, project, trackingBranchName);

  if (mr) {
    await openUrl(mr.web_url);
+5 −1
Original line number Diff line number Diff line
import * as vscode from 'vscode';
import { log } from '../../../common/log';
import { GitLabProject } from '../../../common/platform/gitlab_project';
import { GitLabService } from '../gitlab_service';
@@ -73,8 +74,11 @@ export const findOpenMrForCurrentBranch = async (
        getMergeRequestsForBranch(project, normalizedBranch),
      );

      const includeClosed = vscode.workspace.getConfiguration('gitlab').showClosedMergeRequests;
      const filtered = includeClosed ? mrs : mrs.filter(i => i.state === 'opened');

      // Select most recent MR deterministically
      const selectedMr = selectMostRecentMr(mrs);
      const selectedMr = selectMostRecentMr(filtered);
      if (selectedMr) {
        log.debug(`MR lookup: found MR !${selectedMr.iid} for branch "${normalizedBranch}"`);
      }
+0 −51
Original line number Diff line number Diff line
import * as vscode from 'vscode';
import { createFakeWorkspaceConfiguration } from '../../common/test_utils/vscode_fakes';
import { mr } from '../test_utils/entities';
import { getMostRelevantMergeRequest } from './get_most_relevant_merge_request';

describe('getMostRelevantMergeRequest', () => {
  beforeEach(() => {
    jest
      .mocked(vscode.workspace.getConfiguration)
      .mockReturnValue(createFakeWorkspaceConfiguration({ showClosedMergeRequests: true }));
  });

  it('returns undefined when the list is empty', () => {
    expect(getMostRelevantMergeRequest(undefined)).toBeUndefined();
    expect(getMostRelevantMergeRequest([])).toBeUndefined();
  });

  it('returns an open MR', () => {
    const mrs: RestMr[] = [{ ...mr, state: 'closed' }, mr, { ...mr, state: 'merged' }];
    expect(getMostRelevantMergeRequest(mrs)).toBe(mrs[1]);
  });

  it('returns a merged MR', () => {
    const mrs: RestMr[] = [
      { ...mr, state: 'closed' },
      { ...mr, state: 'merged' },
    ];
    expect(getMostRelevantMergeRequest(mrs)).toBe(mrs[1]);
  });

  it('returns the most recent MR', () => {
    const mrs: RestMr[] = [
      { ...mr, iid: 8, state: 'closed' },
      { ...mr, iid: 9, state: 'merged' },
      { ...mr, iid: 10, state: 'merged' },
    ];
    expect(getMostRelevantMergeRequest(mrs)).toBe(mrs[2]);
  });

  it('does not return a merged MR when disabled', () => {
    jest
      .mocked(vscode.workspace.getConfiguration)
      .mockReturnValue(createFakeWorkspaceConfiguration({ showClosedMergeRequests: false }));

    const mrs: RestMr[] = [
      { ...mr, state: 'closed' },
      { ...mr, state: 'merged' },
    ];
    expect(getMostRelevantMergeRequest(mrs)).toBeUndefined();
  });
});
+0 −29
Original line number Diff line number Diff line
import * as vscode from 'vscode';

export function getMostRelevantMergeRequest(items?: RestMr[]): RestMr | undefined {
  if (!items || items.length === 0) {
    return undefined;
  }

  const includeClosed = vscode.workspace.getConfiguration('gitlab').showClosedMergeRequests;

  const filtered = includeClosed ? items : items.filter(i => i.state === 'opened');

  const sorted = [...filtered].sort((a, b) => {
    // `state` is being compared as a string, but the alphabetical order
    // also matches the priority.
    //
    // opened > merged > closed

    if (b.state > a.state) {
      return +1;
    }
    if (b.state < a.state) {
      return -1;
    }

    return b.iid - a.iid;
  });

  return sorted[0];
}