Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,8 @@ state, never that MRs live elsewhere. To list every MR on a project, pass the
project path instead: `mr:list project/drupal`.

`--format=llm` output includes IID, title, source branch, state, mergeability,
author, and last-updated timestamp for each MR.
conflicts, whether blocking discussions are resolved, detailed merge status,
author, last-updated timestamp, and description for each MR.

### Review MR content

Expand Down
3 changes: 2 additions & 1 deletion skills/drupalorg-cli/references/gitlab-mr-contribution.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,8 @@ state, never that MRs live elsewhere. To list every MR on a project, pass the
project path instead: `mr:list project/drupal`.

`--format=llm` output includes IID, title, source branch, state, mergeability,
author, and last-updated timestamp for each MR.
conflicts, whether blocking discussions are resolved, detailed merge status,
author, last-updated timestamp, and description for each MR.

### Review MR content

Expand Down
12 changes: 12 additions & 0 deletions src/Api/Result/MergeRequest/MergeRequestItem.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ public function __construct(
public readonly bool $isMergeable,
public readonly string $author,
public readonly string $updatedAt,
public readonly string $description = '',
public readonly bool $hasConflicts = false,
public readonly bool $blockingDiscussionsResolved = true,
public readonly string $detailedMergeStatus = '',
) {
}

Expand All @@ -29,6 +33,10 @@ public static function fromStdClass(\stdClass $mr): self
isMergeable: ($mr->merge_status ?? '') === 'can_be_merged',
author: (string) ($mr->author->username ?? ''),
updatedAt: (string) ($mr->updated_at ?? ''),
description: (string) ($mr->description ?? ''),
hasConflicts: (bool) ($mr->has_conflicts ?? false),
blockingDiscussionsResolved: (bool) ($mr->blocking_discussions_resolved ?? true),
detailedMergeStatus: (string) ($mr->detailed_merge_status ?? ''),
);
}

Expand All @@ -47,6 +55,10 @@ public function toArray(): array
'is_mergeable' => $this->isMergeable,
'author' => $this->author,
'updated_at' => $this->updatedAt,
'description' => $this->description,
'has_conflicts' => $this->hasConflicts,
'blocking_discussions_resolved' => $this->blockingDiscussionsResolved,
'detailed_merge_status' => $this->detailedMergeStatus,
];
}
}
8 changes: 8 additions & 0 deletions src/Cli/Formatter/LlmFormatter.php
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,10 @@ protected function formatMergeRequestList(MergeRequestListResult $result): strin
$targetBranch = $this->xmlEscape($mr->targetBranch);
$author = $this->xmlEscape($mr->author);
$mergeable = $mr->isMergeable ? 'yes' : 'no';
$hasConflicts = $mr->hasConflicts ? 'yes' : 'no';
$discussionsResolved = $mr->blockingDiscussionsResolved ? 'yes' : 'no';
$detailedMergeStatus = $this->xmlEscape($mr->detailedMergeStatus);
$description = $this->xmlEscape($mr->description);
$items .= " <merge_request>\n";
$items .= " <iid>{$mr->iid}</iid>\n";
$items .= " <title>{$title}</title>\n";
Expand All @@ -186,9 +190,13 @@ protected function formatMergeRequestList(MergeRequestListResult $result): strin
$updatedAt = $this->xmlEscape($mr->updatedAt);
$items .= " <state>{$state}</state>\n";
$items .= " <mergeable>{$mergeable}</mergeable>\n";
$items .= " <has_conflicts>{$hasConflicts}</has_conflicts>\n";
$items .= " <blocking_discussions_resolved>{$discussionsResolved}</blocking_discussions_resolved>\n";
$items .= " <detailed_merge_status>{$detailedMergeStatus}</detailed_merge_status>\n";
$items .= " <author>{$author}</author>\n";
$items .= " <url>" . $this->xmlEscape($mr->webUrl) . "</url>\n";
$items .= " <updated_at>{$updatedAt}</updated_at>\n";
$items .= " <description>{$description}</description>\n";
$items .= " </merge_request>\n";
}
return "<drupal_context>\n <project_path>{$projectPath}</project_path>\n{$issueFork} <merge_requests>\n{$items} </merge_requests>\n</drupal_context>";
Expand Down
10 changes: 10 additions & 0 deletions src/Cli/Formatter/MarkdownFormatter.php
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,16 @@ protected function formatMergeRequestList(MergeRequestListResult $result): strin
$lines[] = "- **!{$mr->iid}** [{$mr->state}{$mergeable}] [{$mr->title}]({$mr->webUrl})";
$lines[] = " - Branch: `{$mr->sourceBranch}` → `{$mr->targetBranch}`";
$lines[] = " - Author: {$mr->author} | Updated: {$mr->updatedAt}";
$conflicts = $mr->hasConflicts ? 'yes' : 'no';
$discussions = $mr->blockingDiscussionsResolved ? 'resolved' : 'unresolved';
$mergeStatus = $mr->detailedMergeStatus !== '' ? $mr->detailedMergeStatus : 'unknown';
$lines[] = " - Conflicts: {$conflicts} | Discussions: {$discussions} | Merge status: {$mergeStatus}";
if ($mr->description !== '') {
$lines[] = '';
foreach (explode("\n", $mr->description) as $descriptionLine) {
$lines[] = ' ' . $descriptionLine;
}
}
}
return implode("\n", $lines);
}
Expand Down
8 changes: 8 additions & 0 deletions tests/src/Action/MergeRequest/ListMergeRequestsActionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@ private static function makeMrObject(int $iid = 7, string $state = 'opened'): \s
$mr->state = $state;
$mr->web_url = 'https://git.drupalcode.org/project/drupal/-/merge_requests/' . $iid;
$mr->merge_status = 'can_be_merged';
$mr->description = 'Closes #3383637';
$mr->has_conflicts = false;
$mr->blocking_discussions_resolved = true;
$mr->detailed_merge_status = 'mergeable';
$mr->author = $author;
$mr->updated_at = '2024-01-15T10:00:00Z';
return $mr;
Expand Down Expand Up @@ -110,6 +114,10 @@ public function testListsOnlyMergeRequestsFromTheIssueFork(): void
self::assertSame('opened', $result->mergeRequests[0]->state);
self::assertSame('mglaman', $result->mergeRequests[0]->author);
self::assertTrue($result->mergeRequests[0]->isMergeable);
self::assertSame('Closes #3383637', $result->mergeRequests[0]->description);
self::assertFalse($result->mergeRequests[0]->hasConflicts);
self::assertTrue($result->mergeRequests[0]->blockingDiscussionsResolved);
self::assertSame('mergeable', $result->mergeRequests[0]->detailedMergeStatus);
self::assertSame('issue/drupal-3383637', $result->jsonSerialize()['issue_fork']);
}

Expand Down
8 changes: 8 additions & 0 deletions tests/src/Formatter/LlmFormatterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,10 @@ public function testMergeRequestListResult(): void
isMergeable: true,
author: 'mglaman',
updatedAt: '2024-01-15T10:00:00Z',
description: 'Closes #3383637 & <fixes> it',
hasConflicts: true,
blockingDiscussionsResolved: false,
detailedMergeStatus: 'conflict',
);

$result = new MergeRequestListResult(
Expand All @@ -275,6 +279,10 @@ public function testMergeRequestListResult(): void
self::assertStringContainsString('<author>mglaman</author>', $output);
self::assertStringContainsString('<url>https://git.drupalcode.org/issue/drupal-3383637/-/merge_requests/7</url>', $output);
self::assertStringContainsString('<updated_at>2024-01-15T10:00:00Z</updated_at>', $output);
self::assertStringContainsString('<has_conflicts>yes</has_conflicts>', $output);
self::assertStringContainsString('<blocking_discussions_resolved>no</blocking_discussions_resolved>', $output);
self::assertStringContainsString('<detailed_merge_status>conflict</detailed_merge_status>', $output);
self::assertStringContainsString('<description>Closes #3383637 &amp; &lt;fixes&gt; it</description>', $output);
// Raw < must not appear inside tag values.
self::assertStringNotContainsString('<b>', $output);
}
Expand Down
6 changes: 6 additions & 0 deletions tests/src/Formatter/MarkdownFormatterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,10 @@ public function testMergeRequestListResult(): void
isMergeable: true,
author: 'mglaman',
updatedAt: '2024-01-15T10:00:00Z',
description: "Closes #3383637\n\nAdds the missing null check.",
hasConflicts: true,
blockingDiscussionsResolved: false,
detailedMergeStatus: 'conflict',
);

$result = new MergeRequestListResult(
Expand All @@ -240,6 +244,8 @@ public function testMergeRequestListResult(): void
self::assertStringContainsString('`3383637-fix-the-thing` → `11.x`', $output);
self::assertStringContainsString('mglaman', $output);
self::assertStringContainsString('2024-01-15T10:00:00Z', $output);
self::assertStringContainsString('Conflicts: yes | Discussions: unresolved | Merge status: conflict', $output);
self::assertStringContainsString("\n Closes #3383637\n \n Adds the missing null check.", $output);
}

public function testMergeRequestStatusResult(): void
Expand Down